File

projects/cobbler-frontend/src/app/settings/view/settings-view.component.ts

Implements

AfterViewInit OnDestroy

Metadata

Index

Properties
Methods

Constructor

constructor(service: ItemSettingsService)
Parameters :
Name Type Optional
service ItemSettingsService No

Methods

applyFilter
applyFilter(event: Event)
Parameters :
Name Type Optional
event Event No
Returns : void
isArray
isArray(input: any)
Parameters :
Name Type Optional
input any No
Returns : boolean
ngAfterViewInit
ngAfterViewInit()
Returns : void
ngOnDestroy
ngOnDestroy()
Returns : void

Properties

data
Default value : new MatTableDataSource<SettingsTableRowData>([])
displayedColumns
Type : string[]
Default value : ['name', 'value', 'actions']
Private ngUnsubscribe
Default value : new Subject<void>()
paginator
Type : MatPaginator
Decorators :
@ViewChild(MatPaginator)
sort
Type : MatSort
Decorators :
@ViewChild(MatSort)
import { AfterViewInit, Component, OnDestroy, ViewChild } from '@angular/core';
import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
import { MatTableDataSource, MatTableModule } from '@angular/material/table';
import { MatSort, MatSortModule } from '@angular/material/sort';
import { Settings } from '../../../../../cobbler-api/src/lib/custom-types/settings';
import { ItemSettingsService } from '../../services/item-settings.service';
import { RouterOutlet } from '@angular/router';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatSlideToggleModule } from '@angular/material/slide-toggle';
import { MatListModule } from '@angular/material/list';
import { ViewableTreeComponent } from '../../common/viewable-tree/viewable-tree.component';
import { MatInputModule } from '@angular/material/input';
import { MatButtonModule } from '@angular/material/button';
import { MatTooltipModule } from '@angular/material/tooltip';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';

interface SettingsTableRowData {
  name: string;
  value: any;
  type: any;
}

@Component({
  selector: 'cobbler-settings-view',
  templateUrl: './settings-view.component.html',
  styleUrls: ['./settings-view.component.css'],

  standalone: true,
  imports: [
    RouterOutlet,
    MatFormFieldModule,
    MatPaginatorModule,
    MatIconModule,
    MatSlideToggleModule,
    MatListModule,
    MatInputModule,
    MatTableModule,
    MatButtonModule,
    ViewableTreeComponent,
    MatTooltipModule,
    MatSortModule,
  ],
})
export class SettingsViewComponent implements AfterViewInit, OnDestroy {
  // Unsubscribe
  private ngUnsubscribe = new Subject<void>();

  // Table
  data = new MatTableDataSource<SettingsTableRowData>([]);
  displayedColumns: string[] = ['name', 'value', 'actions'];

  @ViewChild(MatPaginator) paginator: MatPaginator;
  @ViewChild(MatSort) sort: MatSort;

  constructor(service: ItemSettingsService) {
    service
      .getAll()
      .pipe(takeUntil(this.ngUnsubscribe))
      .subscribe((data: Settings) => {
        const settings_data: SettingsTableRowData[] = [];
        for (const key in data) {
          settings_data.push({
            name: key,
            value: data[key],
            type: typeof data[key],
          });
        }
        this.data.data = settings_data;
      });
  }

  ngAfterViewInit() {
    this.data.paginator = this.paginator;
    this.data.sort = this.sort;
  }

  ngOnDestroy() {
    this.ngUnsubscribe.next();
    this.ngUnsubscribe.complete();
  }

  applyFilter(event: Event) {
    const filterValue = (event.target as HTMLInputElement).value;
    this.data.filter = filterValue.trim().toLowerCase();

    if (this.data.paginator) {
      this.data.paginator.firstPage();
    }
  }

  isArray(input: any): boolean {
    return Array.isArray(input);
  }
}
<div class="right-column" id="dataScreen">
  <div class="Settings-div">
    <router-outlet></router-outlet>
    <div class="title-table">
      <div class="title-row">
        <h1 class="title title-cell-text">Settings</h1>
        <span class="title-cell-button">
          <button
            mat-icon-button
            matTooltip="This functionality is not yet implemented."
          >
            <mat-icon>add</mat-icon>
          </button>
        </span>
      </div>
    </div>
    <div>
      <mat-form-field appearance="fill">
        <mat-label>Filter</mat-label>
        <input
          matInput
          (keyup)="applyFilter($event)"
          placeholder="Ex. auto_migrate_settings"
          #input
        />
      </mat-form-field>
      <!-- TODO -  [dataSource]="data" -->
      <table mat-table [dataSource]="data" class="mat-elevation-z8" matSort>
        <!-- Name Column -->
        <ng-container matColumnDef="name">
          <th mat-header-cell *matHeaderCellDef mat-sort-header>Name</th>
          <td mat-cell *matCellDef="let element">{{ element.name }}</td>
        </ng-container>

        <!-- Value Column -->
        <ng-container matColumnDef="value">
          <th mat-header-cell *matHeaderCellDef mat-sort-header>Value</th>
          <td mat-cell *matCellDef="let element">
            <!-- View -->
            @if (element.type === "string" || element.type === "number") {
              <code class="settings-values"> "{{ element.value }}" </code>
            }

            <!-- View - Boolean -->
            @if (element.type === "boolean") {
              <mat-slide-toggle [checked]="element.value" disabled="true">
              </mat-slide-toggle>
            }

            <!-- View Array-->
            @if (isArray(element.value)) {
              <mat-list role="list">
                @for (c of element.value; track c) {
                  <mat-list-item> {{ c }} </mat-list-item>
                }
              </mat-list>
            }

            <!-- View - Object -->
            @if (element.type === "object" && !isArray(element.value)) {
              <cobbler-viewable-tree
                [inputObject]="element.value"
              ></cobbler-viewable-tree>
            }
          </td>
        </ng-container>

        <!-- Edit Actions -->
        <ng-container matColumnDef="actions">
          <th mat-header-cell *matHeaderCellDef>Actions</th>
          <td mat-cell *matCellDef="let element">
            <div style="display: flex; justify-content: flex-end">
              <button
                mat-icon-button
                matTooltip="This functionality is not yet implemented."
              >
                <mat-icon>edit</mat-icon>
              </button>
              <button
                style=""
                mat-icon-button
                matTooltip="This functionality is not yet implemented."
              >
                <mat-icon>clear_all</mat-icon>
              </button>
            </div>
          </td>
        </ng-container>

        <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
        <tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>

        <!-- Row shown when there is no matching data. -->
        <tr class="mat-row" *matNoDataRow>
          <td class="mat-cell" colspan="4">
            No data matching the filter "{{ input.value }}"
          </td>
        </tr>
      </table>
      <mat-paginator
        [pageSizeOptions]="[5, 10, 25, 100]"
        aria-label="Select page of users"
      ></mat-paginator>
    </div>
  </div>
</div>

./settings-view.component.css

table {
  width: 100%;
}

.mat-form-field {
  font-size: 14px;
  width: 100%;
}

.title-table {
  display: table;
  width: 100%;
}

.title-row {
  display: table-cell;
  width: 100%;
}

.title-cell-text {
  display: table-cell;
  width: 100%;
  vertical-align: middle;
}

.title-cell-button {
  display: table-cell;
}
Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""