src/app/core/admin/admin-entity-list/admin-entity-list.component.ts

Metadata

Relationships

Index

Properties
Methods
Inputs

Constructor

constructor()

Inputs

config
Type : EntityListConfig
Required :  true
entityConstructor
Type : EntityConstructor
Required :  true

Methods

newColumnGroupFactory
newColumnGroupFactory()
Returns : GroupConfig
updateColumns
updateColumns(columns: string[], group: GroupConfig)
Parameters :
Name Type Optional
columns string[] No
group GroupConfig No
Returns : void
updateFilters
updateFilters(filters: string[])
Parameters :
Name Type Optional
filters string[] No
Returns : void
updateGroups
updateGroups(groups: GroupConfig[])
Parameters :
Name Type Optional
groups GroupConfig[] No
Returns : void

Properties

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>

./admin-entity-list.component.scss


Legend
Html element
Component
Html element with directive

results matching ""

    No results matching ""