Methods
|
newColumnGroupFactory
|
newColumnGroupFactory()
|
|
|
|
|
|
updateColumns
|
updateColumns(columns: string[], group: GroupConfig)
|
|
|
Parameters :
| Name |
Type |
Optional |
| columns |
string[]
|
No
|
| group |
GroupConfig
|
No
|
|
|
updateFilters
|
updateFilters(filters: string[])
|
|
|
Parameters :
| Name |
Type |
Optional |
| filters |
string[]
|
No
|
|
|
columnGroups
|
Type : unknown
|
Default value : linkedSignal(
() =>
this.config().columnGroups ?? {
groups: [
{
name: "",
columns: (this.config().columns ?? []).map((c) =>
typeof c === "string" ? c : c.id,
),
},
],
},
)
|
|
|
|
filters
|
Type : unknown
|
Default value : linkedSignal(() => (this.config().filters ?? []).map((f) => f.id))
|
|
|
import {
Component,
input,
effect,
linkedSignal,
ChangeDetectionStrategy,
} from "@angular/core";
import { EntityConstructor } from "../../entity/model/entity";
import {
EntityListConfig,
GroupConfig,
} from "../../entity-list/EntityListConfig";
import { MatTableModule } from "@angular/material/table";
import { AdminTabsComponent } from "../building-blocks/admin-tabs/admin-tabs.component";
import { AdminTabTemplateDirective } from "../building-blocks/admin-tabs/admin-tab-template.directive";
import { ViewTitleComponent } from "../../common-components/view-title/view-title.component";
import { Logging } from "../../logging/logging.service";
import { AdminListManagerComponent } from "#src/app/core/admin/admin-list-manager/admin-list-manager.component";
import { HintBoxComponent } from "#src/app/core/common-components/hint-box/hint-box.component";
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
selector: "app-admin-entity-list",
imports: [
MatTableModule,
AdminTabsComponent,
AdminTabTemplateDirective,
ViewTitleComponent,
AdminListManagerComponent,
HintBoxComponent,
],
templateUrl: "./admin-entity-list.component.html",
styleUrls: ["./admin-entity-list.component.scss"],
})
export class AdminEntityListComponent {
entityConstructor = input.required<EntityConstructor>();
config = input.required<EntityListConfig>();
filters = linkedSignal(() => (this.config().filters ?? []).map((f) => f.id));
columnGroups = linkedSignal(
() =>
this.config().columnGroups ?? {
groups: [
{
name: "",
columns: (this.config().columns ?? []).map((c) =>
typeof c === "string" ? c : c.id,
),
},
],
},
);
constructor() {
// keep the config object updated in-place while using signals for the component
effect(() => {
const config = this.config();
config.entityType ??= this.entityConstructor().ENTITY_TYPE;
config.filters = this.filters().map(
(f) => config.filters?.find((ef) => ef.id === f) ?? { id: f },
);
config.columnGroups = this.columnGroups();
});
}
updateFilters(filters: string[]) {
if (!Array.isArray(filters)) {
Logging.warn(
"AdminEntityListComponent: updateFilters: filters is not an array",
);
filters = [];
}
this.filters.set([...filters]);
}
updateColumns(columns: string[], group: GroupConfig) {
if (!Array.isArray(columns)) {
Logging.warn(
"AdminEntityListComponent: updateColumns: columns is not an array",
);
return;
}
this.columnGroups.update((cg) => ({
...cg,
groups: cg.groups.map((g) => (g === group ? { ...g, columns } : g)),
}));
}
newColumnGroupFactory(): GroupConfig {
return { name: "", columns: [] };
}
updateGroups(groups: GroupConfig[]) {
this.columnGroups.update((cg) => ({ ...cg, groups }));
}
}
<app-hint-box i18n>
You can edit how users will see the list of all records of this type. Drag and
drop filters and change table columns in this preview. The editor below
closely resembles how the list will look for users later.
<br />
To create new fields, use the "Details View" section.
</app-hint-box>
<app-view-title [disableBackButton]="true" [displayInPlace]="true">
{{ entityConstructor().labelPlural }}
</app-view-title>
<div>
<app-admin-list-manager
[items]="filters()"
[additionalFields]="config().columns"
[entityType]="entityConstructor()"
templateType="filter"
fieldLabel="Add Filter:"
i18n-fieldLabel
(idsChange)="updateFilters($event)"
></app-admin-list-manager>
<div class="mat-elevation-z1">
<app-admin-tabs
[tabs]="columnGroups().groups"
(tabsChange)="updateGroups($event)"
[newTabFactory]="newColumnGroupFactory"
>
<ng-template [appAdminTabTemplate]="columnGroups().groups" let-item>
<app-admin-list-manager
[items]="item.columns"
[additionalFields]="config().columns"
[entityType]="entityConstructor()"
fieldLabel="Drag & drop table column headers. Add columns:"
i18n-fieldLabel
(idsChange)="updateColumns($event, item)"
></app-admin-list-manager>
</ng-template>
</app-admin-tabs>
</div>
</div>
Legend
Html element with directive