File
Implements
Methods
applyFilter
|
applyFilter(event: Event)
|
|
Parameters :
Name |
Type |
Optional |
event |
Event
|
No
|
|
isArray
|
isArray(input: any)
|
|
Parameters :
Name |
Type |
Optional |
input |
any
|
No
|
|
ngAfterViewInit
|
ngAfterViewInit()
|
|
|
ngOnDestroy
|
ngOnDestroy()
|
|
|
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>
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 with directive