@meshmakers/octo-ui 3.5.0 → 3.5.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -43,6 +43,7 @@ const DEFAULT_ENTITY_FORMS_MESSAGES = {
43
43
  cancel: 'Cancel',
44
44
  delete: 'Delete',
45
45
  new: 'New',
46
+ newEntity: 'New {title}',
46
47
  edit: 'Edit',
47
48
  duplicate: 'Duplicate',
48
49
  export: 'Export',
@@ -6514,6 +6515,14 @@ function toEntityListColumn(column, labels = {}, unsetPlaceholders, options = {}
6514
6515
  return { ...base, dataType: 'text', truncate: true, ...(isFormattedType(column) ? { formatter: format } : {}) };
6515
6516
  }
6516
6517
  }
6518
+ /**
6519
+ * Label of a list's create action (AB#6211): `newEntity` with the form title ("New Discord
6520
+ * configuration"), or `new` when the form has no title.
6521
+ */
6522
+ function entityListCreateLabel(messages, formTitle) {
6523
+ const title = formTitle?.trim();
6524
+ return title ? formatEntityFormsMessage(messages.newEntity, { title }) : messages.new;
6525
+ }
6517
6526
  /**
6518
6527
  * `<mm-entity-list>` — the list view of a resolved entity form.
6519
6528
  *
@@ -6578,6 +6587,20 @@ class EntityListComponent {
6578
6587
  /** Host toolbar actions, shown after "New" (AB#5623). */
6579
6588
  toolbarActions = input([], /* @ts-ignore */
6580
6589
  ...(ngDevMode ? [{ debugName: "toolbarActions" }] : /* istanbul ignore next */ []));
6590
+ /**
6591
+ * Whether the list's toolbar carries the create action ("New {form title}", AB#6211). Default
6592
+ * `true`. `<mm-entity-page>` sets `false` and shows the action as the page's one solid primary
6593
+ * in its header instead (Studio action guideline §9). In the toolbar it renders flat.
6594
+ */
6595
+ showCreateAction = input(true, /* @ts-ignore */
6596
+ ...(ngDevMode ? [{ debugName: "showCreateAction" }] : /* istanbul ignore next */ []));
6597
+ /**
6598
+ * The row "open" action (AB#6222): `'auto'` (default) = Edit with write permission and an
6599
+ * editable form, else View; `'edit'` = always Edit (pencil) for lists whose rows open a
6600
+ * host-written editor although the generic form is read-only (Studio service accounts).
6601
+ */
6602
+ openAction = input('auto', /* @ts-ignore */
6603
+ ...(ngDevMode ? [{ debugName: "openAction" }] : /* istanbul ignore next */ []));
6581
6604
  /**
6582
6605
  * Host row actions (AB#5623): icon buttons in the actions column after Edit / View. Set
6583
6606
  * `svgIcon` and `text` (tooltip / aria-label); `onClick` gets the row as `e.data`.
@@ -6653,6 +6676,9 @@ class EntityListComponent {
6653
6676
  ...(ngDevMode ? [{ debugName: "canDelete" }] : /* istanbul ignore next */ []));
6654
6677
  editable = computed(() => this.canWrite() && this.model().capabilities.canEdit, /* @ts-ignore */
6655
6678
  ...(ngDevMode ? [{ debugName: "editable" }] : /* istanbul ignore next */ []));
6679
+ /** Whether the row action reads "Edit" (see {@link openAction}). */
6680
+ opensForEdit = computed(() => this.openAction() === 'edit' ? this.canWrite() : this.editable(), /* @ts-ignore */
6681
+ ...(ngDevMode ? [{ debugName: "opensForEdit" }] : /* istanbul ignore next */ []));
6656
6682
  /** Copy ID submenu (Studio convention, see the refinery-studio CLAUDE.md). */
6657
6683
  copyIdMenuItem = computed(() => {
6658
6684
  const m = this.msgs();
@@ -6694,8 +6720,8 @@ class EntityListComponent {
6694
6720
  {
6695
6721
  id: 'open',
6696
6722
  type: 'link',
6697
- text: this.editable() ? this.msgs().edit : this.msgs().viewTitle,
6698
- svgIcon: this.editable() ? MM_ACTION_ICONS.edit : MM_ACTION_ICONS.view,
6723
+ text: this.opensForEdit() ? this.msgs().edit : this.msgs().viewTitle,
6724
+ svgIcon: this.opensForEdit() ? MM_ACTION_ICONS.edit : MM_ACTION_ICONS.view,
6699
6725
  onClick: async (e) => this.open(e.data),
6700
6726
  },
6701
6727
  ...this.rowActions(),
@@ -6707,10 +6733,16 @@ class EntityListComponent {
6707
6733
  /** Width of the actions column: Edit/View + the row menu, plus one icon button per host row action. */
6708
6734
  actionsColumnWidth = computed(() => 80 + 40 * this.rowActions().length, /* @ts-ignore */
6709
6735
  ...(ngDevMode ? [{ debugName: "actionsColumnWidth" }] : /* istanbul ignore next */ []));
6710
- /** Toolbar: New (only with `canCreate && canWrite`), then the host's `toolbarActions`. */
6736
+ /** Label of the create action: "New {form title}" (AB#6211), "New" without a title. */
6737
+ createLabel = computed(() => entityListCreateLabel(this.msgs(), localizeEntityFormTitle(this.model(), this.labelResolver() ?? this.injectedLabelResolver)), /* @ts-ignore */
6738
+ ...(ngDevMode ? [{ debugName: "createLabel" }] : /* istanbul ignore next */ []));
6739
+ /**
6740
+ * Toolbar: New (only with `canCreate && canWrite` and `showCreateAction`), then the host's
6741
+ * `toolbarActions`.
6742
+ */
6711
6743
  toolbarItems = computed(() => [
6712
- ...(this.canCreate()
6713
- ? [{ id: 'new', type: 'link', text: this.msgs().new, svgIcon: MM_ACTION_ICONS.add, onClick: async () => this.requestCreate() }]
6744
+ ...(this.canCreate() && this.showCreateAction()
6745
+ ? [{ id: 'new', type: 'link', text: this.createLabel(), svgIcon: MM_ACTION_ICONS.add, onClick: async () => this.requestCreate() }]
6714
6746
  : []),
6715
6747
  ...this.toolbarActions(),
6716
6748
  ], /* @ts-ignore */
@@ -6848,12 +6880,12 @@ class EntityListComponent {
6848
6880
  }
6849
6881
  }
6850
6882
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6851
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.5", type: EntityListComponent, isStandalone: true, selector: "mm-entity-list", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, canWrite: { classPropertyName: "canWrite", publicName: "canWrite", isSignal: true, isRequired: false, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null }, listStateKey: { classPropertyName: "listStateKey", publicName: "listStateKey", isSignal: true, isRequired: false, transformFunction: null }, showTypeColumn: { classPropertyName: "showTypeColumn", publicName: "showTypeColumn", isSignal: true, isRequired: false, transformFunction: null }, defaultSort: { classPropertyName: "defaultSort", publicName: "defaultSort", isSignal: true, isRequired: false, transformFunction: null }, labelResolver: { classPropertyName: "labelResolver", publicName: "labelResolver", isSignal: true, isRequired: false, transformFunction: null }, toolbarActions: { classPropertyName: "toolbarActions", publicName: "toolbarActions", isSignal: true, isRequired: false, transformFunction: null }, rowActions: { classPropertyName: "rowActions", publicName: "rowActions", isSignal: true, isRequired: false, transformFunction: null }, rowMenuActions: { classPropertyName: "rowMenuActions", publicName: "rowMenuActions", isSignal: true, isRequired: false, transformFunction: null }, rowClass: { classPropertyName: "rowClass", publicName: "rowClass", isSignal: true, isRequired: false, transformFunction: null }, booleanDisplay: { classPropertyName: "booleanDisplay", publicName: "booleanDisplay", isSignal: true, isRequired: false, transformFunction: null }, rowLabelField: { classPropertyName: "rowLabelField", publicName: "rowLabelField", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { createRequested: "createRequested", openRequested: "openRequested", deleted: "deleted" }, viewQueries: [{ propertyName: "dataSource", first: true, predicate: EntityListDataSourceDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<mm-list-view\n mmEntityListDataSource\n [columns]=\"columns()\"\n [sortable]=\"true\"\n [rowFilterEnabled]=\"true\"\n [searchTextBoxEnabled]=\"true\"\n [autoPageSize]=\"true\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [showRowCheckBoxes]=\"false\"\n [actionsColumnWidth]=\"actionsColumnWidth()\"\n [actionCommandItems]=\"actionItems()\"\n [contextMenuCommandItems]=\"contextMenuItems()\"\n [leftToolbarActions]=\"toolbarItems()\"\n [listStateKey]=\"listStateKey()\"\n [messages]=\"listViewMessages()\"\n [rowClass]=\"listViewRowClass()\"\n [rowLabelField]=\"rowLabelField() || 'name'\"\n (rowClicked)=\"onRowClicked($event)\"\n>\n</mm-list-view>\n", styles: [":host{display:flex;flex-direction:column;min-height:0;height:100%}mm-list-view{flex:1 1 auto;min-height:0}\n"], dependencies: [{ kind: "component", type: ListViewComponent, selector: "mm-list-view", inputs: ["pageSize", "skip", "autoPageSize", "rowIsClickable", "showRowCheckBoxes", "showRowSelectAllCheckBox", "contextMenuType", "leftToolbarActions", "rightToolbarActions", "actionCommandItems", "contextMenuCommandItems", "rowActions", "maxInlineRowActions", "excelExportFileName", "pdfExportFileName", "pageable", "sortable", "rowFilterEnabled", "searchTextBoxEnabled", "persistListState", "listStateKey", "resizable", "actionsColumnWidth", "hideCheckboxesBelow", "cardModeBelow", "collapseCommandsBelow", "hasExternalFilters", "emptyState", "emptyTemplate", "rowClass", "messages", "selectable", "columns", "rowLabelField"], outputs: ["rowClicked", "rowAction", "resetFilters"] }, { kind: "directive", type: EntityListDataSourceDirective, selector: "[mmEntityListDataSource]", exportAs: ["mmEntityListDataSource"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6883
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.1.5", type: EntityListComponent, isStandalone: true, selector: "mm-entity-list", inputs: { model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, canWrite: { classPropertyName: "canWrite", publicName: "canWrite", isSignal: true, isRequired: false, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null }, listStateKey: { classPropertyName: "listStateKey", publicName: "listStateKey", isSignal: true, isRequired: false, transformFunction: null }, showTypeColumn: { classPropertyName: "showTypeColumn", publicName: "showTypeColumn", isSignal: true, isRequired: false, transformFunction: null }, defaultSort: { classPropertyName: "defaultSort", publicName: "defaultSort", isSignal: true, isRequired: false, transformFunction: null }, labelResolver: { classPropertyName: "labelResolver", publicName: "labelResolver", isSignal: true, isRequired: false, transformFunction: null }, toolbarActions: { classPropertyName: "toolbarActions", publicName: "toolbarActions", isSignal: true, isRequired: false, transformFunction: null }, showCreateAction: { classPropertyName: "showCreateAction", publicName: "showCreateAction", isSignal: true, isRequired: false, transformFunction: null }, openAction: { classPropertyName: "openAction", publicName: "openAction", isSignal: true, isRequired: false, transformFunction: null }, rowActions: { classPropertyName: "rowActions", publicName: "rowActions", isSignal: true, isRequired: false, transformFunction: null }, rowMenuActions: { classPropertyName: "rowMenuActions", publicName: "rowMenuActions", isSignal: true, isRequired: false, transformFunction: null }, rowClass: { classPropertyName: "rowClass", publicName: "rowClass", isSignal: true, isRequired: false, transformFunction: null }, booleanDisplay: { classPropertyName: "booleanDisplay", publicName: "booleanDisplay", isSignal: true, isRequired: false, transformFunction: null }, rowLabelField: { classPropertyName: "rowLabelField", publicName: "rowLabelField", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { createRequested: "createRequested", openRequested: "openRequested", deleted: "deleted" }, viewQueries: [{ propertyName: "dataSource", first: true, predicate: EntityListDataSourceDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<mm-list-view\n mmEntityListDataSource\n [columns]=\"columns()\"\n [sortable]=\"true\"\n [rowFilterEnabled]=\"true\"\n [searchTextBoxEnabled]=\"true\"\n [autoPageSize]=\"true\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [showRowCheckBoxes]=\"false\"\n [actionsColumnWidth]=\"actionsColumnWidth()\"\n [actionCommandItems]=\"actionItems()\"\n [contextMenuCommandItems]=\"contextMenuItems()\"\n [leftToolbarActions]=\"toolbarItems()\"\n [listStateKey]=\"listStateKey()\"\n [messages]=\"listViewMessages()\"\n [rowClass]=\"listViewRowClass()\"\n [rowLabelField]=\"rowLabelField() || 'name'\"\n (rowClicked)=\"onRowClicked($event)\"\n>\n</mm-list-view>\n", styles: [":host{display:flex;flex-direction:column;min-height:0;height:100%}mm-list-view{flex:1 1 auto;min-height:0}\n"], dependencies: [{ kind: "component", type: ListViewComponent, selector: "mm-list-view", inputs: ["pageSize", "skip", "autoPageSize", "rowIsClickable", "showRowCheckBoxes", "showRowSelectAllCheckBox", "contextMenuType", "leftToolbarActions", "rightToolbarActions", "actionCommandItems", "contextMenuCommandItems", "rowActions", "maxInlineRowActions", "excelExportFileName", "pdfExportFileName", "pageable", "sortable", "rowFilterEnabled", "searchTextBoxEnabled", "persistListState", "listStateKey", "resizable", "actionsColumnWidth", "hideCheckboxesBelow", "cardModeBelow", "collapseCommandsBelow", "hasExternalFilters", "emptyState", "emptyTemplate", "rowClass", "messages", "selectable", "columns", "rowLabelField"], outputs: ["rowClicked", "rowAction", "resetFilters"] }, { kind: "directive", type: EntityListDataSourceDirective, selector: "[mmEntityListDataSource]", exportAs: ["mmEntityListDataSource"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6852
6884
  }
6853
6885
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityListComponent, decorators: [{
6854
6886
  type: Component,
6855
6887
  args: [{ selector: 'mm-entity-list', standalone: true, imports: [ListViewComponent, EntityListDataSourceDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<mm-list-view\n mmEntityListDataSource\n [columns]=\"columns()\"\n [sortable]=\"true\"\n [rowFilterEnabled]=\"true\"\n [searchTextBoxEnabled]=\"true\"\n [autoPageSize]=\"true\"\n [selectable]=\"{ mode: 'single', enabled: true }\"\n [showRowCheckBoxes]=\"false\"\n [actionsColumnWidth]=\"actionsColumnWidth()\"\n [actionCommandItems]=\"actionItems()\"\n [contextMenuCommandItems]=\"contextMenuItems()\"\n [leftToolbarActions]=\"toolbarItems()\"\n [listStateKey]=\"listStateKey()\"\n [messages]=\"listViewMessages()\"\n [rowClass]=\"listViewRowClass()\"\n [rowLabelField]=\"rowLabelField() || 'name'\"\n (rowClicked)=\"onRowClicked($event)\"\n>\n</mm-list-view>\n", styles: [":host{display:flex;flex-direction:column;min-height:0;height:100%}mm-list-view{flex:1 1 auto;min-height:0}\n"] }]
6856
- }], ctorParameters: () => [], propDecorators: { model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: true }] }], canWrite: [{ type: i0.Input, args: [{ isSignal: true, alias: "canWrite", required: false }] }], messages: [{ type: i0.Input, args: [{ isSignal: true, alias: "messages", required: false }] }], listStateKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "listStateKey", required: false }] }], showTypeColumn: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTypeColumn", required: false }] }], defaultSort: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultSort", required: false }] }], labelResolver: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelResolver", required: false }] }], toolbarActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbarActions", required: false }] }], rowActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowActions", required: false }] }], rowMenuActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowMenuActions", required: false }] }], rowClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowClass", required: false }] }], booleanDisplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "booleanDisplay", required: false }] }], rowLabelField: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowLabelField", required: false }] }], createRequested: [{ type: i0.Output, args: ["createRequested"] }], openRequested: [{ type: i0.Output, args: ["openRequested"] }], deleted: [{ type: i0.Output, args: ["deleted"] }], dataSource: [{ type: i0.ViewChild, args: [i0.forwardRef(() => EntityListDataSourceDirective), { isSignal: true }] }] } });
6888
+ }], ctorParameters: () => [], propDecorators: { model: [{ type: i0.Input, args: [{ isSignal: true, alias: "model", required: true }] }], canWrite: [{ type: i0.Input, args: [{ isSignal: true, alias: "canWrite", required: false }] }], messages: [{ type: i0.Input, args: [{ isSignal: true, alias: "messages", required: false }] }], listStateKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "listStateKey", required: false }] }], showTypeColumn: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTypeColumn", required: false }] }], defaultSort: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultSort", required: false }] }], labelResolver: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelResolver", required: false }] }], toolbarActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbarActions", required: false }] }], showCreateAction: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCreateAction", required: false }] }], openAction: [{ type: i0.Input, args: [{ isSignal: true, alias: "openAction", required: false }] }], rowActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowActions", required: false }] }], rowMenuActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowMenuActions", required: false }] }], rowClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowClass", required: false }] }], booleanDisplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "booleanDisplay", required: false }] }], rowLabelField: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowLabelField", required: false }] }], createRequested: [{ type: i0.Output, args: ["createRequested"] }], openRequested: [{ type: i0.Output, args: ["openRequested"] }], deleted: [{ type: i0.Output, args: ["deleted"] }], dataSource: [{ type: i0.ViewChild, args: [i0.forwardRef(() => EntityListDataSourceDirective), { isSignal: true }] }] } });
6857
6889
  function rowName(row, labelField) {
6858
6890
  const label = labelField ? resolveListRowLabel(row, labelField, []) : '';
6859
6891
  if (label) {
@@ -6997,7 +7029,7 @@ class EntityPageComponent {
6997
7029
  */
6998
7030
  beforeSave = input(undefined, /* @ts-ignore */
6999
7031
  ...(ngDevMode ? [{ debugName: "beforeSave" }] : /* istanbul ignore next */ []));
7000
- /** Host toolbar actions of the list, after "New" (AB#5623). */
7032
+ /** Host toolbar actions of the list (AB#5623); "New {form title}" sits in the page header (AB#6211). */
7001
7033
  listToolbarActions = input([], /* @ts-ignore */
7002
7034
  ...(ngDevMode ? [{ debugName: "listToolbarActions" }] : /* istanbul ignore next */ []));
7003
7035
  /** Host row actions of the list (icon buttons after Edit / View, AB#5623). */
@@ -7087,6 +7119,7 @@ class EntityPageComponent {
7087
7119
  saveIcon = saveIcon;
7088
7120
  backIcon = arrowLeftIcon;
7089
7121
  deleteIcon = MM_ACTION_ICONS.delete;
7122
+ addIcon = MM_ACTION_ICONS.add;
7090
7123
  msgs = computed(() => mergeEntityFormsMessages(this.messages() ?? this.inheritedData('messages')), /* @ts-ignore */
7091
7124
  ...(ngDevMode ? [{ debugName: "msgs" }] : /* istanbul ignore next */ []));
7092
7125
  effectiveCanWrite = computed(() => {
@@ -7148,6 +7181,12 @@ class EntityPageComponent {
7148
7181
  return typeof bound === 'string' && bound.trim() ? bound.trim() : undefined;
7149
7182
  }, /* @ts-ignore */
7150
7183
  ...(ngDevMode ? [{ debugName: "effectiveRowLabelField" }] : /* istanbul ignore next */ []));
7184
+ /** Row open action of the list (AB#6222): route data `entityListOpenAction` (`'edit'`), else auto. */
7185
+ effectiveListOpenAction = computed(() => {
7186
+ this.routeData();
7187
+ return this.inheritedData('entityListOpenAction') === 'edit' ? 'edit' : 'auto';
7188
+ }, /* @ts-ignore */
7189
+ ...(ngDevMode ? [{ debugName: "effectiveListOpenAction" }] : /* istanbul ignore next */ []));
7151
7190
  /** Boolean columns of the list: input, else route data `entityListBooleanDisplay`, else text. */
7152
7191
  effectiveListBooleanDisplay = computed(() => {
7153
7192
  this.routeData();
@@ -7205,6 +7244,19 @@ class EntityPageComponent {
7205
7244
  }
7206
7245
  isSingleton = computed(() => !!this.baseModel()?.singleton, /* @ts-ignore */
7207
7246
  ...(ngDevMode ? [{ debugName: "isSingleton" }] : /* istanbul ignore next */ []));
7247
+ /**
7248
+ * The list's create action sits in the page header as the page's one solid primary (AB#6211,
7249
+ * Studio action guideline §9): only with write permission and a creatable form.
7250
+ */
7251
+ canCreateFromList = computed(() => this.effectiveCanWrite() && !!this.baseModel()?.capabilities.canCreate, /* @ts-ignore */
7252
+ ...(ngDevMode ? [{ debugName: "canCreateFromList" }] : /* istanbul ignore next */ []));
7253
+ /** "New {form title}" (AB#6211), e.g. "New Discord configuration". */
7254
+ createLabel = computed(() => entityListCreateLabel(this.msgs(), this.localizedBase()?.title), /* @ts-ignore */
7255
+ ...(ngDevMode ? [{ debugName: "createLabel" }] : /* istanbul ignore next */ []));
7256
+ /** Header create action: same flow as the list's former toolbar "New" (subtype picker, dialog mode). */
7257
+ onCreateFromHeader() {
7258
+ void this.list()?.requestCreate();
7259
+ }
7208
7260
  /** Host heading override (`entityListTitle` route data), else the resolved form title. */
7209
7261
  listTitle = computed(() => {
7210
7262
  this.routeData();
@@ -7814,11 +7866,11 @@ class EntityPageComponent {
7814
7866
  }
7815
7867
  }
7816
7868
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
7817
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: EntityPageComponent, isStandalone: true, selector: "mm-entity-page", inputs: { formKey: { classPropertyName: "formKey", publicName: "formKey", isSignal: true, isRequired: false, transformFunction: null }, ckTypeId: { classPropertyName: "ckTypeId", publicName: "ckTypeId", isSignal: true, isRequired: false, transformFunction: null }, rtId: { classPropertyName: "rtId", publicName: "rtId", isSignal: true, isRequired: false, transformFunction: null }, canWrite: { classPropertyName: "canWrite", publicName: "canWrite", isSignal: true, isRequired: false, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null }, routerNavigation: { classPropertyName: "routerNavigation", publicName: "routerNavigation", isSignal: true, isRequired: false, transformFunction: null }, actionBarPosition: { classPropertyName: "actionBarPosition", publicName: "actionBarPosition", isSignal: true, isRequired: false, transformFunction: null }, labelResolver: { classPropertyName: "labelResolver", publicName: "labelResolver", isSignal: true, isRequired: false, transformFunction: null }, defaultSort: { classPropertyName: "defaultSort", publicName: "defaultSort", isSignal: true, isRequired: false, transformFunction: null }, initialValues: { classPropertyName: "initialValues", publicName: "initialValues", isSignal: true, isRequired: false, transformFunction: null }, beforeSave: { classPropertyName: "beforeSave", publicName: "beforeSave", isSignal: true, isRequired: false, transformFunction: null }, listToolbarActions: { classPropertyName: "listToolbarActions", publicName: "listToolbarActions", isSignal: true, isRequired: false, transformFunction: null }, listRowActions: { classPropertyName: "listRowActions", publicName: "listRowActions", isSignal: true, isRequired: false, transformFunction: null }, listRowMenuActions: { classPropertyName: "listRowMenuActions", publicName: "listRowMenuActions", isSignal: true, isRequired: false, transformFunction: null }, editMode: { classPropertyName: "editMode", publicName: "editMode", isSignal: true, isRequired: false, transformFunction: null }, listRowClass: { classPropertyName: "listRowClass", publicName: "listRowClass", isSignal: true, isRequired: false, transformFunction: null }, listBooleanDisplay: { classPropertyName: "listBooleanDisplay", publicName: "listBooleanDisplay", isSignal: true, isRequired: false, transformFunction: null }, listRowLabelField: { classPropertyName: "listRowLabelField", publicName: "listRowLabelField", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { navigate: "navigate", saved: "saved", deleted: "deleted" }, providers: [{ provide: HAS_UNSAVED_CHANGES, useExisting: EntityPageComponent }], queries: [{ propertyName: "pageActions", first: true, predicate: EntityPageActionsDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "form", first: true, predicate: ["entityForm"], descendants: true, isSignal: true }, { propertyName: "list", first: true, predicate: ["entityList"], descendants: true, isSignal: true }, { propertyName: "listElement", first: true, predicate: ["entityList"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div class=\"mm-entity-page\">\n @switch (view()) {\n @case ('loading') {\n <div class=\"mm-entity-page__state\">{{ msgs().loading }}</div>\n }\n\n @case ('error') {\n <div class=\"mm-entity-page__state mm-entity-page__state--error\" role=\"alert\">\n <p>{{ errorMessage() }}</p>\n @if (baseModel() && !isSingleton()) {\n <button kendoButton fillMode=\"flat\" [svgIcon]=\"backIcon\" (click)=\"onBack()\">{{ msgs().back }}</button>\n }\n </div>\n }\n\n @case ('list') {\n @if (baseModel(); as model) {\n <header class=\"mm-entity-page__header\">\n <div class=\"mm-entity-page__titles\">\n <h2 class=\"mm-entity-page__title\">{{ listTitle() }}</h2>\n @if (localizedBase()?.description; as description) {\n <p class=\"mm-entity-page__description\">{{ description }}</p>\n }\n </div>\n @if (pageActions(); as actions) {\n <div class=\"mm-entity-page__actions\" data-entity-page-host-actions>\n <ng-container *ngTemplateOutlet=\"actions.templateRef; context: actionsContext()\" />\n </div>\n }\n </header>\n <mm-entity-list\n #entityList\n class=\"mm-entity-page__list\"\n [model]=\"model\"\n [canWrite]=\"effectiveCanWrite()\"\n [messages]=\"msgs()\"\n [showTypeColumn]=\"showTypeColumn()\"\n [defaultSort]=\"effectiveDefaultSort()\"\n [labelResolver]=\"effectiveLabelResolver()\"\n [toolbarActions]=\"listToolbarActions()\"\n [rowActions]=\"listRowActions()\"\n [rowMenuActions]=\"listRowMenuActions()\"\n [rowClass]=\"effectiveListRowClass()\"\n [booleanDisplay]=\"effectiveListBooleanDisplay()\"\n [rowLabelField]=\"effectiveRowLabelField()\"\n (createRequested)=\"onCreateRequested($event)\"\n (openRequested)=\"onOpenRequested($event)\"\n />\n\n <!-- Dialog mode (editMode 'dialog', AB#5623): create / edit over the list, actions in the\n dialog's bottom bar (Cancel left of the primary Save, as in the record row dialog). -->\n @if (dialogOpen()) {\n @if (formModel(); as formModelInDialog) {\n <kendo-dialog\n class=\"mm-entity-page__dialog\"\n data-entity-page-dialog\n [title]=\"title()\"\n [width]=\"760\"\n [maxWidth]=\"'95vw'\"\n [maxHeight]=\"'90vh'\"\n (close)=\"onDialogCancel()\"\n >\n <kendo-dialog-messages [closeTitle]=\"msgs().close\" />\n <div class=\"mm-entity-page__dialog-body\">\n @if (mode() === 'view') {\n <p class=\"mm-entity-page__notice\">{{ msgs().readOnlyNotice }}</p>\n }\n <mm-entity-form\n #entityForm\n class=\"mm-entity-page__form\"\n [model]=\"formModelInDialog\"\n [mode]=\"mode()\"\n [state]=\"state()\"\n [readOnly]=\"readOnly()\"\n [messages]=\"msgs()\"\n [records]=\"records()\"\n [labelResolver]=\"effectiveLabelResolver()\"\n [initialValues]=\"createInitialValues()\"\n />\n </div>\n <kendo-dialog-actions layout=\"end\">\n @if (pageActions(); as actions) {\n <ng-container *ngTemplateOutlet=\"actions.templateRef; context: dialogActionsContext()\" />\n }\n <button kendoButton type=\"button\" data-entity-page-dialog-cancel (click)=\"onDialogCancel()\">\n {{ mode() === 'view' ? msgs().close : msgs().cancel }}\n </button>\n @if (canDeleteEntity()) {\n <button kendoButton type=\"button\" fillMode=\"outline\" themeColor=\"error\" [svgIcon]=\"deleteIcon\" (click)=\"onDelete()\">\n {{ msgs().delete }}\n </button>\n }\n @if (mode() !== 'view') {\n <button kendoButton type=\"button\" themeColor=\"primary\" [svgIcon]=\"saveIcon\"\n [disabled]=\"saving() || !!saveBlockedReason()\" [attr.title]=\"saveBlockedReason()\"\n data-entity-page-save (click)=\"onSave()\">\n {{ msgs().save }}\n </button>\n }\n </kendo-dialog-actions>\n </kendo-dialog>\n }\n }\n }\n }\n\n @case ('form') {\n @if (formModel(); as model) {\n <header class=\"mm-entity-page__header\">\n <div class=\"mm-entity-page__titles\">\n <h2 class=\"mm-entity-page__title\">{{ title() }}</h2>\n @if (mode() !== 'create' && entityRtId()) {\n <mm-entity-id-info\n [rtId]=\"entityRtId()!\"\n [rtCkTypeId]=\"entityCkTypeId() ?? model.rtCkTypeId\"\n [ckTypeId]=\"entityCkTypeId() ?? model.rtCkTypeId\"\n [buttonText]=\"msgs().copyId\"\n [tooltip]=\"msgs().copyIdTooltip\"\n [copiedMessage]=\"msgs().copiedId\"\n [copyFailedMessage]=\"msgs().copyFailed\"\n />\n }\n </div>\n @if (effectiveActionBarPosition() === 'top') {\n <ng-container *ngTemplateOutlet=\"formActions\" />\n }\n </header>\n @if (mode() === 'view') {\n <p class=\"mm-entity-page__notice\">{{ msgs().readOnlyNotice }}</p>\n }\n @if (mode() === 'create' && singletonWellKnownName()) {\n <p class=\"mm-entity-page__notice\">{{ msgs().singletonCreateHint }}</p>\n }\n <mm-entity-form\n #entityForm\n class=\"mm-entity-page__form\"\n [model]=\"model\"\n [mode]=\"mode()\"\n [state]=\"state()\"\n [readOnly]=\"readOnly()\"\n [messages]=\"msgs()\"\n [records]=\"records()\"\n [labelResolver]=\"effectiveLabelResolver()\"\n [initialValues]=\"createInitialValues()\"\n />\n @if (effectiveActionBarPosition() === 'bottom') {\n <footer class=\"mm-entity-page__footer\" data-entity-page-footer>\n <ng-container *ngTemplateOutlet=\"formActions\" />\n </footer>\n }\n\n <ng-template #formActions>\n <div class=\"mm-entity-page__actions\">\n @if (pageActions(); as actions) {\n <ng-container *ngTemplateOutlet=\"actions.templateRef; context: actionsContext()\" />\n }\n @if (!isSingleton()) {\n <button kendoButton fillMode=\"flat\" [svgIcon]=\"backIcon\" data-entity-page-back (click)=\"onBack()\">\n {{ mode() === 'view' ? msgs().back : msgs().cancel }}\n </button>\n }\n @if (canDeleteEntity()) {\n <button kendoButton fillMode=\"outline\" themeColor=\"error\" [svgIcon]=\"deleteIcon\" (click)=\"onDelete()\">\n {{ msgs().delete }}\n </button>\n }\n @if (mode() !== 'view') {\n <button kendoButton themeColor=\"primary\" [svgIcon]=\"saveIcon\" [disabled]=\"saving() || !!saveBlockedReason()\"\n [attr.title]=\"saveBlockedReason()\" data-entity-page-save (click)=\"onSave()\">\n {{ msgs().save }}\n </button>\n }\n </div>\n </ng-template>\n }\n }\n }\n</div>\n", styles: [":host{display:block;height:100%;min-height:0}.mm-entity-page{display:flex;flex-direction:column;gap:12px;height:100%;min-height:0;padding:16px;box-sizing:border-box;color:var(--theme-text-primary, inherit)}.mm-entity-page__header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:12px}.mm-entity-page__titles{display:flex;flex-direction:column;gap:4px;min-width:0}.mm-entity-page__title{margin:0;font-size:1.25rem;font-weight:600;overflow-wrap:anywhere}.mm-entity-page__description,.mm-entity-page__notice{margin:0;color:var(--theme-text-secondary, inherit);opacity:.85}.mm-entity-page__actions{display:flex;flex-wrap:wrap;gap:8px}.mm-entity-page__list{flex:1 1 auto;min-height:300px}.mm-entity-page__form{flex:1 1 auto;min-height:0;overflow:auto}.mm-entity-page__state{padding:24px 0;color:var(--theme-text-secondary, inherit)}.mm-entity-page__state--error{color:var(--theme-status-error, inherit)}.mm-entity-page__footer{display:flex;justify-content:flex-end;flex-shrink:0;padding-top:12px;border-top:1px solid var(--theme-border-subtle, rgba(0, 0, 0, .12))}.mm-entity-page__dialog-body{display:flex;flex-direction:column;gap:12px}\n"], dependencies: [{ kind: "component", type: EntityListComponent, selector: "mm-entity-list", inputs: ["model", "canWrite", "messages", "listStateKey", "showTypeColumn", "defaultSort", "labelResolver", "toolbarActions", "rowActions", "rowMenuActions", "rowClass", "booleanDisplay", "rowLabelField"], outputs: ["createRequested", "openRequested", "deleted"] }, { kind: "component", type: EntityFormComponent, selector: "mm-entity-form", inputs: ["model", "mode", "state", "readOnly", "messages", "records", "labelResolver", "initialValues", "beforeSave"], outputs: ["changeSetChange", "validChange", "dirtyChange"] }, { kind: "component", type: EntityIdInfoComponent, selector: "mm-entity-id-info", inputs: ["rtId", "rtCkTypeId", "ckTypeId", "buttonText", "tooltip", "copiedMessage", "copyFailedMessage"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1$3.DialogComponent, selector: "kendo-dialog", inputs: ["actions", "actionsLayout", "autoFocusedElement", "closable", "title", "width", "minWidth", "maxWidth", "height", "minHeight", "maxHeight", "animation"], outputs: ["action", "close"], exportAs: ["kendoDialog"] }, { kind: "component", type: i1$3.DialogActionsComponent, selector: "kendo-dialog-actions", inputs: ["actions", "layout"], outputs: ["action"] }, { kind: "directive", type: i1$3.CustomMessagesComponent, selector: "kendo-dialog-messages, kendo-window-messages" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7869
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: EntityPageComponent, isStandalone: true, selector: "mm-entity-page", inputs: { formKey: { classPropertyName: "formKey", publicName: "formKey", isSignal: true, isRequired: false, transformFunction: null }, ckTypeId: { classPropertyName: "ckTypeId", publicName: "ckTypeId", isSignal: true, isRequired: false, transformFunction: null }, rtId: { classPropertyName: "rtId", publicName: "rtId", isSignal: true, isRequired: false, transformFunction: null }, canWrite: { classPropertyName: "canWrite", publicName: "canWrite", isSignal: true, isRequired: false, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null }, routerNavigation: { classPropertyName: "routerNavigation", publicName: "routerNavigation", isSignal: true, isRequired: false, transformFunction: null }, actionBarPosition: { classPropertyName: "actionBarPosition", publicName: "actionBarPosition", isSignal: true, isRequired: false, transformFunction: null }, labelResolver: { classPropertyName: "labelResolver", publicName: "labelResolver", isSignal: true, isRequired: false, transformFunction: null }, defaultSort: { classPropertyName: "defaultSort", publicName: "defaultSort", isSignal: true, isRequired: false, transformFunction: null }, initialValues: { classPropertyName: "initialValues", publicName: "initialValues", isSignal: true, isRequired: false, transformFunction: null }, beforeSave: { classPropertyName: "beforeSave", publicName: "beforeSave", isSignal: true, isRequired: false, transformFunction: null }, listToolbarActions: { classPropertyName: "listToolbarActions", publicName: "listToolbarActions", isSignal: true, isRequired: false, transformFunction: null }, listRowActions: { classPropertyName: "listRowActions", publicName: "listRowActions", isSignal: true, isRequired: false, transformFunction: null }, listRowMenuActions: { classPropertyName: "listRowMenuActions", publicName: "listRowMenuActions", isSignal: true, isRequired: false, transformFunction: null }, editMode: { classPropertyName: "editMode", publicName: "editMode", isSignal: true, isRequired: false, transformFunction: null }, listRowClass: { classPropertyName: "listRowClass", publicName: "listRowClass", isSignal: true, isRequired: false, transformFunction: null }, listBooleanDisplay: { classPropertyName: "listBooleanDisplay", publicName: "listBooleanDisplay", isSignal: true, isRequired: false, transformFunction: null }, listRowLabelField: { classPropertyName: "listRowLabelField", publicName: "listRowLabelField", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { navigate: "navigate", saved: "saved", deleted: "deleted" }, providers: [{ provide: HAS_UNSAVED_CHANGES, useExisting: EntityPageComponent }], queries: [{ propertyName: "pageActions", first: true, predicate: EntityPageActionsDirective, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "form", first: true, predicate: ["entityForm"], descendants: true, isSignal: true }, { propertyName: "list", first: true, predicate: ["entityList"], descendants: true, isSignal: true }, { propertyName: "listElement", first: true, predicate: ["entityList"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<div class=\"mm-entity-page\">\n @switch (view()) {\n @case ('loading') {\n <div class=\"mm-entity-page__state\">{{ msgs().loading }}</div>\n }\n\n @case ('error') {\n <div class=\"mm-entity-page__state mm-entity-page__state--error\" role=\"alert\">\n <p>{{ errorMessage() }}</p>\n @if (baseModel() && !isSingleton()) {\n <button kendoButton fillMode=\"flat\" [svgIcon]=\"backIcon\" (click)=\"onBack()\">{{ msgs().back }}</button>\n }\n </div>\n }\n\n @case ('list') {\n @if (baseModel(); as model) {\n <header class=\"mm-entity-page__header\">\n <div class=\"mm-entity-page__titles\">\n <h2 class=\"mm-entity-page__title\">{{ listTitle() }}</h2>\n @if (localizedBase()?.description; as description) {\n <p class=\"mm-entity-page__description\">{{ description }}</p>\n }\n </div>\n @if (pageActions() || canCreateFromList()) {\n <div class=\"mm-entity-page__header-actions\">\n @if (pageActions(); as actions) {\n <div class=\"mm-entity-page__actions\" data-entity-page-host-actions>\n <ng-container *ngTemplateOutlet=\"actions.templateRef; context: actionsContext()\" />\n </div>\n }\n <!-- The page's one solid primary action (AB#6211, action guideline \u00A79). -->\n @if (canCreateFromList()) {\n <button kendoButton type=\"button\" themeColor=\"primary\" [svgIcon]=\"addIcon\"\n data-entity-page-create (click)=\"onCreateFromHeader()\">{{ createLabel() }}</button>\n }\n </div>\n }\n </header>\n <mm-entity-list\n #entityList\n class=\"mm-entity-page__list\"\n [model]=\"model\"\n [canWrite]=\"effectiveCanWrite()\"\n [messages]=\"msgs()\"\n [showTypeColumn]=\"showTypeColumn()\"\n [defaultSort]=\"effectiveDefaultSort()\"\n [labelResolver]=\"effectiveLabelResolver()\"\n [showCreateAction]=\"false\"\n [openAction]=\"effectiveListOpenAction()\"\n [toolbarActions]=\"listToolbarActions()\"\n [rowActions]=\"listRowActions()\"\n [rowMenuActions]=\"listRowMenuActions()\"\n [rowClass]=\"effectiveListRowClass()\"\n [booleanDisplay]=\"effectiveListBooleanDisplay()\"\n [rowLabelField]=\"effectiveRowLabelField()\"\n (createRequested)=\"onCreateRequested($event)\"\n (openRequested)=\"onOpenRequested($event)\"\n />\n\n <!-- Dialog mode (editMode 'dialog', AB#5623): create / edit over the list, actions in the\n dialog's bottom bar (Cancel left of the primary Save, as in the record row dialog). -->\n @if (dialogOpen()) {\n @if (formModel(); as formModelInDialog) {\n <kendo-dialog\n class=\"mm-entity-page__dialog\"\n data-entity-page-dialog\n [title]=\"title()\"\n [width]=\"760\"\n [maxWidth]=\"'95vw'\"\n [maxHeight]=\"'90vh'\"\n (close)=\"onDialogCancel()\"\n >\n <kendo-dialog-messages [closeTitle]=\"msgs().close\" />\n <div class=\"mm-entity-page__dialog-body\">\n @if (mode() === 'view') {\n <p class=\"mm-entity-page__notice\">{{ msgs().readOnlyNotice }}</p>\n }\n <mm-entity-form\n #entityForm\n class=\"mm-entity-page__form\"\n [model]=\"formModelInDialog\"\n [mode]=\"mode()\"\n [state]=\"state()\"\n [readOnly]=\"readOnly()\"\n [messages]=\"msgs()\"\n [records]=\"records()\"\n [labelResolver]=\"effectiveLabelResolver()\"\n [initialValues]=\"createInitialValues()\"\n />\n </div>\n <kendo-dialog-actions layout=\"end\">\n @if (pageActions(); as actions) {\n <ng-container *ngTemplateOutlet=\"actions.templateRef; context: dialogActionsContext()\" />\n }\n <button kendoButton type=\"button\" data-entity-page-dialog-cancel (click)=\"onDialogCancel()\">\n {{ mode() === 'view' ? msgs().close : msgs().cancel }}\n </button>\n @if (canDeleteEntity()) {\n <button kendoButton type=\"button\" fillMode=\"outline\" themeColor=\"error\" [svgIcon]=\"deleteIcon\" (click)=\"onDelete()\">\n {{ msgs().delete }}\n </button>\n }\n @if (mode() !== 'view') {\n <button kendoButton type=\"button\" themeColor=\"primary\" [svgIcon]=\"saveIcon\"\n [disabled]=\"saving() || !!saveBlockedReason()\" [attr.title]=\"saveBlockedReason()\"\n data-entity-page-save (click)=\"onSave()\">\n {{ msgs().save }}\n </button>\n }\n </kendo-dialog-actions>\n </kendo-dialog>\n }\n }\n }\n }\n\n @case ('form') {\n @if (formModel(); as model) {\n <header class=\"mm-entity-page__header\">\n <div class=\"mm-entity-page__titles\">\n <h2 class=\"mm-entity-page__title\">{{ title() }}</h2>\n @if (mode() !== 'create' && entityRtId()) {\n <mm-entity-id-info\n [rtId]=\"entityRtId()!\"\n [rtCkTypeId]=\"entityCkTypeId() ?? model.rtCkTypeId\"\n [ckTypeId]=\"entityCkTypeId() ?? model.rtCkTypeId\"\n [buttonText]=\"msgs().copyId\"\n [tooltip]=\"msgs().copyIdTooltip\"\n [copiedMessage]=\"msgs().copiedId\"\n [copyFailedMessage]=\"msgs().copyFailed\"\n />\n }\n </div>\n @if (effectiveActionBarPosition() === 'top') {\n <ng-container *ngTemplateOutlet=\"formActions\" />\n }\n </header>\n @if (mode() === 'view') {\n <p class=\"mm-entity-page__notice\">{{ msgs().readOnlyNotice }}</p>\n }\n @if (mode() === 'create' && singletonWellKnownName()) {\n <p class=\"mm-entity-page__notice\">{{ msgs().singletonCreateHint }}</p>\n }\n <mm-entity-form\n #entityForm\n class=\"mm-entity-page__form\"\n [model]=\"model\"\n [mode]=\"mode()\"\n [state]=\"state()\"\n [readOnly]=\"readOnly()\"\n [messages]=\"msgs()\"\n [records]=\"records()\"\n [labelResolver]=\"effectiveLabelResolver()\"\n [initialValues]=\"createInitialValues()\"\n />\n @if (effectiveActionBarPosition() === 'bottom') {\n <footer class=\"mm-entity-page__footer\" data-entity-page-footer>\n <ng-container *ngTemplateOutlet=\"formActions\" />\n </footer>\n }\n\n <ng-template #formActions>\n <div class=\"mm-entity-page__actions\">\n @if (pageActions(); as actions) {\n <ng-container *ngTemplateOutlet=\"actions.templateRef; context: actionsContext()\" />\n }\n @if (!isSingleton()) {\n <button kendoButton fillMode=\"flat\" [svgIcon]=\"backIcon\" data-entity-page-back (click)=\"onBack()\">\n {{ mode() === 'view' ? msgs().back : msgs().cancel }}\n </button>\n }\n @if (canDeleteEntity()) {\n <button kendoButton fillMode=\"outline\" themeColor=\"error\" [svgIcon]=\"deleteIcon\" (click)=\"onDelete()\">\n {{ msgs().delete }}\n </button>\n }\n @if (mode() !== 'view') {\n <button kendoButton themeColor=\"primary\" [svgIcon]=\"saveIcon\" [disabled]=\"saving() || !!saveBlockedReason()\"\n [attr.title]=\"saveBlockedReason()\" data-entity-page-save (click)=\"onSave()\">\n {{ msgs().save }}\n </button>\n }\n </div>\n </ng-template>\n }\n }\n }\n</div>\n", styles: [":host{display:block;height:100%;min-height:0}.mm-entity-page{display:flex;flex-direction:column;gap:12px;height:100%;min-height:0;padding:16px;box-sizing:border-box;color:var(--theme-text-primary, inherit)}.mm-entity-page__header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:12px}.mm-entity-page__titles{display:flex;flex-direction:column;gap:4px;min-width:0}.mm-entity-page__title{margin:0;font-size:1.25rem;font-weight:600;overflow-wrap:anywhere}.mm-entity-page__description,.mm-entity-page__notice{margin:0;color:var(--theme-text-secondary, inherit);opacity:.85}.mm-entity-page__actions,.mm-entity-page__header-actions{display:flex;flex-wrap:wrap;gap:8px}.mm-entity-page__list{flex:1 1 auto;min-height:300px}.mm-entity-page__form{flex:1 1 auto;min-height:0;overflow:auto}.mm-entity-page__state{padding:24px 0;color:var(--theme-text-secondary, inherit)}.mm-entity-page__state--error{color:var(--theme-status-error, inherit)}.mm-entity-page__footer{display:flex;justify-content:flex-end;flex-shrink:0;padding-top:12px;border-top:1px solid var(--theme-border-subtle, rgba(0, 0, 0, .12))}.mm-entity-page__dialog-body{display:flex;flex-direction:column;gap:12px}\n"], dependencies: [{ kind: "component", type: EntityListComponent, selector: "mm-entity-list", inputs: ["model", "canWrite", "messages", "listStateKey", "showTypeColumn", "defaultSort", "labelResolver", "toolbarActions", "showCreateAction", "openAction", "rowActions", "rowMenuActions", "rowClass", "booleanDisplay", "rowLabelField"], outputs: ["createRequested", "openRequested", "deleted"] }, { kind: "component", type: EntityFormComponent, selector: "mm-entity-form", inputs: ["model", "mode", "state", "readOnly", "messages", "records", "labelResolver", "initialValues", "beforeSave"], outputs: ["changeSetChange", "validChange", "dirtyChange"] }, { kind: "component", type: EntityIdInfoComponent, selector: "mm-entity-id-info", inputs: ["rtId", "rtCkTypeId", "ckTypeId", "buttonText", "tooltip", "copiedMessage", "copyFailedMessage"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconPosition", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i1$3.DialogComponent, selector: "kendo-dialog", inputs: ["actions", "actionsLayout", "autoFocusedElement", "closable", "title", "width", "minWidth", "maxWidth", "height", "minHeight", "maxHeight", "animation"], outputs: ["action", "close"], exportAs: ["kendoDialog"] }, { kind: "component", type: i1$3.DialogActionsComponent, selector: "kendo-dialog-actions", inputs: ["actions", "layout"], outputs: ["action"] }, { kind: "directive", type: i1$3.CustomMessagesComponent, selector: "kendo-dialog-messages, kendo-window-messages" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7818
7870
  }
7819
7871
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: EntityPageComponent, decorators: [{
7820
7872
  type: Component,
7821
- args: [{ selector: 'mm-entity-page', standalone: true, imports: [EntityListComponent, EntityFormComponent, EntityIdInfoComponent, ButtonComponent, NgTemplateOutlet, KENDO_DIALOG], providers: [{ provide: HAS_UNSAVED_CHANGES, useExisting: EntityPageComponent }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mm-entity-page\">\n @switch (view()) {\n @case ('loading') {\n <div class=\"mm-entity-page__state\">{{ msgs().loading }}</div>\n }\n\n @case ('error') {\n <div class=\"mm-entity-page__state mm-entity-page__state--error\" role=\"alert\">\n <p>{{ errorMessage() }}</p>\n @if (baseModel() && !isSingleton()) {\n <button kendoButton fillMode=\"flat\" [svgIcon]=\"backIcon\" (click)=\"onBack()\">{{ msgs().back }}</button>\n }\n </div>\n }\n\n @case ('list') {\n @if (baseModel(); as model) {\n <header class=\"mm-entity-page__header\">\n <div class=\"mm-entity-page__titles\">\n <h2 class=\"mm-entity-page__title\">{{ listTitle() }}</h2>\n @if (localizedBase()?.description; as description) {\n <p class=\"mm-entity-page__description\">{{ description }}</p>\n }\n </div>\n @if (pageActions(); as actions) {\n <div class=\"mm-entity-page__actions\" data-entity-page-host-actions>\n <ng-container *ngTemplateOutlet=\"actions.templateRef; context: actionsContext()\" />\n </div>\n }\n </header>\n <mm-entity-list\n #entityList\n class=\"mm-entity-page__list\"\n [model]=\"model\"\n [canWrite]=\"effectiveCanWrite()\"\n [messages]=\"msgs()\"\n [showTypeColumn]=\"showTypeColumn()\"\n [defaultSort]=\"effectiveDefaultSort()\"\n [labelResolver]=\"effectiveLabelResolver()\"\n [toolbarActions]=\"listToolbarActions()\"\n [rowActions]=\"listRowActions()\"\n [rowMenuActions]=\"listRowMenuActions()\"\n [rowClass]=\"effectiveListRowClass()\"\n [booleanDisplay]=\"effectiveListBooleanDisplay()\"\n [rowLabelField]=\"effectiveRowLabelField()\"\n (createRequested)=\"onCreateRequested($event)\"\n (openRequested)=\"onOpenRequested($event)\"\n />\n\n <!-- Dialog mode (editMode 'dialog', AB#5623): create / edit over the list, actions in the\n dialog's bottom bar (Cancel left of the primary Save, as in the record row dialog). -->\n @if (dialogOpen()) {\n @if (formModel(); as formModelInDialog) {\n <kendo-dialog\n class=\"mm-entity-page__dialog\"\n data-entity-page-dialog\n [title]=\"title()\"\n [width]=\"760\"\n [maxWidth]=\"'95vw'\"\n [maxHeight]=\"'90vh'\"\n (close)=\"onDialogCancel()\"\n >\n <kendo-dialog-messages [closeTitle]=\"msgs().close\" />\n <div class=\"mm-entity-page__dialog-body\">\n @if (mode() === 'view') {\n <p class=\"mm-entity-page__notice\">{{ msgs().readOnlyNotice }}</p>\n }\n <mm-entity-form\n #entityForm\n class=\"mm-entity-page__form\"\n [model]=\"formModelInDialog\"\n [mode]=\"mode()\"\n [state]=\"state()\"\n [readOnly]=\"readOnly()\"\n [messages]=\"msgs()\"\n [records]=\"records()\"\n [labelResolver]=\"effectiveLabelResolver()\"\n [initialValues]=\"createInitialValues()\"\n />\n </div>\n <kendo-dialog-actions layout=\"end\">\n @if (pageActions(); as actions) {\n <ng-container *ngTemplateOutlet=\"actions.templateRef; context: dialogActionsContext()\" />\n }\n <button kendoButton type=\"button\" data-entity-page-dialog-cancel (click)=\"onDialogCancel()\">\n {{ mode() === 'view' ? msgs().close : msgs().cancel }}\n </button>\n @if (canDeleteEntity()) {\n <button kendoButton type=\"button\" fillMode=\"outline\" themeColor=\"error\" [svgIcon]=\"deleteIcon\" (click)=\"onDelete()\">\n {{ msgs().delete }}\n </button>\n }\n @if (mode() !== 'view') {\n <button kendoButton type=\"button\" themeColor=\"primary\" [svgIcon]=\"saveIcon\"\n [disabled]=\"saving() || !!saveBlockedReason()\" [attr.title]=\"saveBlockedReason()\"\n data-entity-page-save (click)=\"onSave()\">\n {{ msgs().save }}\n </button>\n }\n </kendo-dialog-actions>\n </kendo-dialog>\n }\n }\n }\n }\n\n @case ('form') {\n @if (formModel(); as model) {\n <header class=\"mm-entity-page__header\">\n <div class=\"mm-entity-page__titles\">\n <h2 class=\"mm-entity-page__title\">{{ title() }}</h2>\n @if (mode() !== 'create' && entityRtId()) {\n <mm-entity-id-info\n [rtId]=\"entityRtId()!\"\n [rtCkTypeId]=\"entityCkTypeId() ?? model.rtCkTypeId\"\n [ckTypeId]=\"entityCkTypeId() ?? model.rtCkTypeId\"\n [buttonText]=\"msgs().copyId\"\n [tooltip]=\"msgs().copyIdTooltip\"\n [copiedMessage]=\"msgs().copiedId\"\n [copyFailedMessage]=\"msgs().copyFailed\"\n />\n }\n </div>\n @if (effectiveActionBarPosition() === 'top') {\n <ng-container *ngTemplateOutlet=\"formActions\" />\n }\n </header>\n @if (mode() === 'view') {\n <p class=\"mm-entity-page__notice\">{{ msgs().readOnlyNotice }}</p>\n }\n @if (mode() === 'create' && singletonWellKnownName()) {\n <p class=\"mm-entity-page__notice\">{{ msgs().singletonCreateHint }}</p>\n }\n <mm-entity-form\n #entityForm\n class=\"mm-entity-page__form\"\n [model]=\"model\"\n [mode]=\"mode()\"\n [state]=\"state()\"\n [readOnly]=\"readOnly()\"\n [messages]=\"msgs()\"\n [records]=\"records()\"\n [labelResolver]=\"effectiveLabelResolver()\"\n [initialValues]=\"createInitialValues()\"\n />\n @if (effectiveActionBarPosition() === 'bottom') {\n <footer class=\"mm-entity-page__footer\" data-entity-page-footer>\n <ng-container *ngTemplateOutlet=\"formActions\" />\n </footer>\n }\n\n <ng-template #formActions>\n <div class=\"mm-entity-page__actions\">\n @if (pageActions(); as actions) {\n <ng-container *ngTemplateOutlet=\"actions.templateRef; context: actionsContext()\" />\n }\n @if (!isSingleton()) {\n <button kendoButton fillMode=\"flat\" [svgIcon]=\"backIcon\" data-entity-page-back (click)=\"onBack()\">\n {{ mode() === 'view' ? msgs().back : msgs().cancel }}\n </button>\n }\n @if (canDeleteEntity()) {\n <button kendoButton fillMode=\"outline\" themeColor=\"error\" [svgIcon]=\"deleteIcon\" (click)=\"onDelete()\">\n {{ msgs().delete }}\n </button>\n }\n @if (mode() !== 'view') {\n <button kendoButton themeColor=\"primary\" [svgIcon]=\"saveIcon\" [disabled]=\"saving() || !!saveBlockedReason()\"\n [attr.title]=\"saveBlockedReason()\" data-entity-page-save (click)=\"onSave()\">\n {{ msgs().save }}\n </button>\n }\n </div>\n </ng-template>\n }\n }\n }\n</div>\n", styles: [":host{display:block;height:100%;min-height:0}.mm-entity-page{display:flex;flex-direction:column;gap:12px;height:100%;min-height:0;padding:16px;box-sizing:border-box;color:var(--theme-text-primary, inherit)}.mm-entity-page__header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:12px}.mm-entity-page__titles{display:flex;flex-direction:column;gap:4px;min-width:0}.mm-entity-page__title{margin:0;font-size:1.25rem;font-weight:600;overflow-wrap:anywhere}.mm-entity-page__description,.mm-entity-page__notice{margin:0;color:var(--theme-text-secondary, inherit);opacity:.85}.mm-entity-page__actions{display:flex;flex-wrap:wrap;gap:8px}.mm-entity-page__list{flex:1 1 auto;min-height:300px}.mm-entity-page__form{flex:1 1 auto;min-height:0;overflow:auto}.mm-entity-page__state{padding:24px 0;color:var(--theme-text-secondary, inherit)}.mm-entity-page__state--error{color:var(--theme-status-error, inherit)}.mm-entity-page__footer{display:flex;justify-content:flex-end;flex-shrink:0;padding-top:12px;border-top:1px solid var(--theme-border-subtle, rgba(0, 0, 0, .12))}.mm-entity-page__dialog-body{display:flex;flex-direction:column;gap:12px}\n"] }]
7873
+ args: [{ selector: 'mm-entity-page', standalone: true, imports: [EntityListComponent, EntityFormComponent, EntityIdInfoComponent, ButtonComponent, NgTemplateOutlet, KENDO_DIALOG], providers: [{ provide: HAS_UNSAVED_CHANGES, useExisting: EntityPageComponent }], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mm-entity-page\">\n @switch (view()) {\n @case ('loading') {\n <div class=\"mm-entity-page__state\">{{ msgs().loading }}</div>\n }\n\n @case ('error') {\n <div class=\"mm-entity-page__state mm-entity-page__state--error\" role=\"alert\">\n <p>{{ errorMessage() }}</p>\n @if (baseModel() && !isSingleton()) {\n <button kendoButton fillMode=\"flat\" [svgIcon]=\"backIcon\" (click)=\"onBack()\">{{ msgs().back }}</button>\n }\n </div>\n }\n\n @case ('list') {\n @if (baseModel(); as model) {\n <header class=\"mm-entity-page__header\">\n <div class=\"mm-entity-page__titles\">\n <h2 class=\"mm-entity-page__title\">{{ listTitle() }}</h2>\n @if (localizedBase()?.description; as description) {\n <p class=\"mm-entity-page__description\">{{ description }}</p>\n }\n </div>\n @if (pageActions() || canCreateFromList()) {\n <div class=\"mm-entity-page__header-actions\">\n @if (pageActions(); as actions) {\n <div class=\"mm-entity-page__actions\" data-entity-page-host-actions>\n <ng-container *ngTemplateOutlet=\"actions.templateRef; context: actionsContext()\" />\n </div>\n }\n <!-- The page's one solid primary action (AB#6211, action guideline \u00A79). -->\n @if (canCreateFromList()) {\n <button kendoButton type=\"button\" themeColor=\"primary\" [svgIcon]=\"addIcon\"\n data-entity-page-create (click)=\"onCreateFromHeader()\">{{ createLabel() }}</button>\n }\n </div>\n }\n </header>\n <mm-entity-list\n #entityList\n class=\"mm-entity-page__list\"\n [model]=\"model\"\n [canWrite]=\"effectiveCanWrite()\"\n [messages]=\"msgs()\"\n [showTypeColumn]=\"showTypeColumn()\"\n [defaultSort]=\"effectiveDefaultSort()\"\n [labelResolver]=\"effectiveLabelResolver()\"\n [showCreateAction]=\"false\"\n [openAction]=\"effectiveListOpenAction()\"\n [toolbarActions]=\"listToolbarActions()\"\n [rowActions]=\"listRowActions()\"\n [rowMenuActions]=\"listRowMenuActions()\"\n [rowClass]=\"effectiveListRowClass()\"\n [booleanDisplay]=\"effectiveListBooleanDisplay()\"\n [rowLabelField]=\"effectiveRowLabelField()\"\n (createRequested)=\"onCreateRequested($event)\"\n (openRequested)=\"onOpenRequested($event)\"\n />\n\n <!-- Dialog mode (editMode 'dialog', AB#5623): create / edit over the list, actions in the\n dialog's bottom bar (Cancel left of the primary Save, as in the record row dialog). -->\n @if (dialogOpen()) {\n @if (formModel(); as formModelInDialog) {\n <kendo-dialog\n class=\"mm-entity-page__dialog\"\n data-entity-page-dialog\n [title]=\"title()\"\n [width]=\"760\"\n [maxWidth]=\"'95vw'\"\n [maxHeight]=\"'90vh'\"\n (close)=\"onDialogCancel()\"\n >\n <kendo-dialog-messages [closeTitle]=\"msgs().close\" />\n <div class=\"mm-entity-page__dialog-body\">\n @if (mode() === 'view') {\n <p class=\"mm-entity-page__notice\">{{ msgs().readOnlyNotice }}</p>\n }\n <mm-entity-form\n #entityForm\n class=\"mm-entity-page__form\"\n [model]=\"formModelInDialog\"\n [mode]=\"mode()\"\n [state]=\"state()\"\n [readOnly]=\"readOnly()\"\n [messages]=\"msgs()\"\n [records]=\"records()\"\n [labelResolver]=\"effectiveLabelResolver()\"\n [initialValues]=\"createInitialValues()\"\n />\n </div>\n <kendo-dialog-actions layout=\"end\">\n @if (pageActions(); as actions) {\n <ng-container *ngTemplateOutlet=\"actions.templateRef; context: dialogActionsContext()\" />\n }\n <button kendoButton type=\"button\" data-entity-page-dialog-cancel (click)=\"onDialogCancel()\">\n {{ mode() === 'view' ? msgs().close : msgs().cancel }}\n </button>\n @if (canDeleteEntity()) {\n <button kendoButton type=\"button\" fillMode=\"outline\" themeColor=\"error\" [svgIcon]=\"deleteIcon\" (click)=\"onDelete()\">\n {{ msgs().delete }}\n </button>\n }\n @if (mode() !== 'view') {\n <button kendoButton type=\"button\" themeColor=\"primary\" [svgIcon]=\"saveIcon\"\n [disabled]=\"saving() || !!saveBlockedReason()\" [attr.title]=\"saveBlockedReason()\"\n data-entity-page-save (click)=\"onSave()\">\n {{ msgs().save }}\n </button>\n }\n </kendo-dialog-actions>\n </kendo-dialog>\n }\n }\n }\n }\n\n @case ('form') {\n @if (formModel(); as model) {\n <header class=\"mm-entity-page__header\">\n <div class=\"mm-entity-page__titles\">\n <h2 class=\"mm-entity-page__title\">{{ title() }}</h2>\n @if (mode() !== 'create' && entityRtId()) {\n <mm-entity-id-info\n [rtId]=\"entityRtId()!\"\n [rtCkTypeId]=\"entityCkTypeId() ?? model.rtCkTypeId\"\n [ckTypeId]=\"entityCkTypeId() ?? model.rtCkTypeId\"\n [buttonText]=\"msgs().copyId\"\n [tooltip]=\"msgs().copyIdTooltip\"\n [copiedMessage]=\"msgs().copiedId\"\n [copyFailedMessage]=\"msgs().copyFailed\"\n />\n }\n </div>\n @if (effectiveActionBarPosition() === 'top') {\n <ng-container *ngTemplateOutlet=\"formActions\" />\n }\n </header>\n @if (mode() === 'view') {\n <p class=\"mm-entity-page__notice\">{{ msgs().readOnlyNotice }}</p>\n }\n @if (mode() === 'create' && singletonWellKnownName()) {\n <p class=\"mm-entity-page__notice\">{{ msgs().singletonCreateHint }}</p>\n }\n <mm-entity-form\n #entityForm\n class=\"mm-entity-page__form\"\n [model]=\"model\"\n [mode]=\"mode()\"\n [state]=\"state()\"\n [readOnly]=\"readOnly()\"\n [messages]=\"msgs()\"\n [records]=\"records()\"\n [labelResolver]=\"effectiveLabelResolver()\"\n [initialValues]=\"createInitialValues()\"\n />\n @if (effectiveActionBarPosition() === 'bottom') {\n <footer class=\"mm-entity-page__footer\" data-entity-page-footer>\n <ng-container *ngTemplateOutlet=\"formActions\" />\n </footer>\n }\n\n <ng-template #formActions>\n <div class=\"mm-entity-page__actions\">\n @if (pageActions(); as actions) {\n <ng-container *ngTemplateOutlet=\"actions.templateRef; context: actionsContext()\" />\n }\n @if (!isSingleton()) {\n <button kendoButton fillMode=\"flat\" [svgIcon]=\"backIcon\" data-entity-page-back (click)=\"onBack()\">\n {{ mode() === 'view' ? msgs().back : msgs().cancel }}\n </button>\n }\n @if (canDeleteEntity()) {\n <button kendoButton fillMode=\"outline\" themeColor=\"error\" [svgIcon]=\"deleteIcon\" (click)=\"onDelete()\">\n {{ msgs().delete }}\n </button>\n }\n @if (mode() !== 'view') {\n <button kendoButton themeColor=\"primary\" [svgIcon]=\"saveIcon\" [disabled]=\"saving() || !!saveBlockedReason()\"\n [attr.title]=\"saveBlockedReason()\" data-entity-page-save (click)=\"onSave()\">\n {{ msgs().save }}\n </button>\n }\n </div>\n </ng-template>\n }\n }\n }\n</div>\n", styles: [":host{display:block;height:100%;min-height:0}.mm-entity-page{display:flex;flex-direction:column;gap:12px;height:100%;min-height:0;padding:16px;box-sizing:border-box;color:var(--theme-text-primary, inherit)}.mm-entity-page__header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:12px}.mm-entity-page__titles{display:flex;flex-direction:column;gap:4px;min-width:0}.mm-entity-page__title{margin:0;font-size:1.25rem;font-weight:600;overflow-wrap:anywhere}.mm-entity-page__description,.mm-entity-page__notice{margin:0;color:var(--theme-text-secondary, inherit);opacity:.85}.mm-entity-page__actions,.mm-entity-page__header-actions{display:flex;flex-wrap:wrap;gap:8px}.mm-entity-page__list{flex:1 1 auto;min-height:300px}.mm-entity-page__form{flex:1 1 auto;min-height:0;overflow:auto}.mm-entity-page__state{padding:24px 0;color:var(--theme-text-secondary, inherit)}.mm-entity-page__state--error{color:var(--theme-status-error, inherit)}.mm-entity-page__footer{display:flex;justify-content:flex-end;flex-shrink:0;padding-top:12px;border-top:1px solid var(--theme-border-subtle, rgba(0, 0, 0, .12))}.mm-entity-page__dialog-body{display:flex;flex-direction:column;gap:12px}\n"] }]
7822
7874
  }], ctorParameters: () => [], propDecorators: { formKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "formKey", required: false }] }], ckTypeId: [{ type: i0.Input, args: [{ isSignal: true, alias: "ckTypeId", required: false }] }], rtId: [{ type: i0.Input, args: [{ isSignal: true, alias: "rtId", required: false }] }], canWrite: [{ type: i0.Input, args: [{ isSignal: true, alias: "canWrite", required: false }] }], messages: [{ type: i0.Input, args: [{ isSignal: true, alias: "messages", required: false }] }], routerNavigation: [{ type: i0.Input, args: [{ isSignal: true, alias: "routerNavigation", required: false }] }], actionBarPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "actionBarPosition", required: false }] }], labelResolver: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelResolver", required: false }] }], defaultSort: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultSort", required: false }] }], initialValues: [{ type: i0.Input, args: [{ isSignal: true, alias: "initialValues", required: false }] }], beforeSave: [{ type: i0.Input, args: [{ isSignal: true, alias: "beforeSave", required: false }] }], listToolbarActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "listToolbarActions", required: false }] }], listRowActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "listRowActions", required: false }] }], listRowMenuActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "listRowMenuActions", required: false }] }], editMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "editMode", required: false }] }], listRowClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "listRowClass", required: false }] }], listBooleanDisplay: [{ type: i0.Input, args: [{ isSignal: true, alias: "listBooleanDisplay", required: false }] }], listRowLabelField: [{ type: i0.Input, args: [{ isSignal: true, alias: "listRowLabelField", required: false }] }], navigate: [{ type: i0.Output, args: ["navigate"] }], saved: [{ type: i0.Output, args: ["saved"] }], deleted: [{ type: i0.Output, args: ["deleted"] }], form: [{ type: i0.ViewChild, args: ['entityForm', { isSignal: true }] }], list: [{ type: i0.ViewChild, args: ['entityList', { isSignal: true }] }], listElement: [{ type: i0.ViewChild, args: ['entityList', { ...{ read: ElementRef }, isSignal: true }] }], pageActions: [{ type: i0.ContentChild, args: [i0.forwardRef(() => EntityPageActionsDirective), { isSignal: true }] }] } });
7823
7875
  /** The focused element (the dialog's trigger), or `null` outside a browser. */
7824
7876
  function activeElement() {
@@ -7870,7 +7922,7 @@ var entityPage_component = /*#__PURE__*/Object.freeze({
7870
7922
  * ```
7871
7923
  */
7872
7924
  function entityFormRoutes(opts = {}) {
7873
- const { formKey, ckTypeId, canWrite, messages, breadcrumbUrl, breadcrumbLabel = '{{entityFormTitle}}', newBreadcrumbLabel = 'New', entityBreadcrumbLabel = '{{entityName}}', svgIcon, title, showTypeColumn, defaultSort, actionBarPosition, initialValues, beforeSave, rowClass, editMode, booleanDisplay, rowLabelField, data = {}, } = opts;
7925
+ const { formKey, ckTypeId, canWrite, messages, breadcrumbUrl, breadcrumbLabel = '{{entityFormTitle}}', newBreadcrumbLabel = 'New', entityBreadcrumbLabel = '{{entityName}}', svgIcon, title, showTypeColumn, defaultSort, actionBarPosition, initialValues, beforeSave, rowClass, editMode, booleanDisplay, rowLabelField, openAction, data = {}, } = opts;
7874
7926
  const baseData = {
7875
7927
  ...data,
7876
7928
  ...(formKey !== undefined && { formKey }),
@@ -7887,6 +7939,7 @@ function entityFormRoutes(opts = {}) {
7887
7939
  ...(editMode !== undefined && { entityPageEditMode: editMode }),
7888
7940
  ...(booleanDisplay !== undefined && { entityListBooleanDisplay: booleanDisplay }),
7889
7941
  ...(rowLabelField !== undefined && { entityListRowLabelField: rowLabelField }),
7942
+ ...(openAction !== undefined && { entityListOpenAction: openAction }),
7890
7943
  };
7891
7944
  const listCrumb = breadcrumbUrl !== undefined
7892
7945
  ? { label: breadcrumbLabel, url: breadcrumbUrl, ...(svgIcon && { svgIcon }) }
@@ -7940,5 +7993,5 @@ function entityFormRoutes(opts = {}) {
7940
7993
  * Generated bundle index. Do not edit.
7941
7994
  */
7942
7995
 
7943
- export { BUILT_IN_DEFAULT_FORM, DEFAULT_ENTITY_FORMS_MESSAGES, DEFAULT_GENERATED_SECTION_TITLE, DEFAULT_SECTION_KEY, ENTITY_FORM_ACTION_CONFIRMATION, ENTITY_FORM_BEFORE_SAVE, ENTITY_FORM_DANGER_CONFIRMATION, ENTITY_FORM_FALLBACK_FORMS, ENTITY_FORM_LABEL_RESOLVER, ENTITY_FORM_SECRET_KEY_RING_CONFIGURED, ENTITY_FORM_SECRET_PLACEHOLDER_VALUES, ENTITY_FORM_UNSET_PLACEHOLDER_VALUES, ENTITY_LIST_ROW_CLASS, ENTITY_PAGE_NEW, ENTITY_PAGE_TYPE_QUERY_PARAM, EntityFormComponent, EntityFormDataService, EntityFormRecordsFieldComponent, EntityFormReferenceFieldComponent, EntityFormSaveVeto, EntityFormSecretEditorComponent, EntityFormService, EntityListComponent, EntityListDataSourceDirective, EntityPageActionsDirective, EntityPageComponent, GENERATED_SECTION_KEY, SYSTEM_PROPERTIES, associationFieldKey, associationRoleName, autoEditorFor, buildChangeSet, canonicaliseEntityFormPrefill, canonicalisePath, ckTypeDisplayName, ckTypeShortName, confirmEntityFormAction, confirmEntityFormDanger, entityDeleteConfirmation, entityFormCatalog, entityFormKey, entityFormPrefillState, entityFormRoutes, entityFormTypeTitles, entityFormUnsetPlaceholderFields, entityFormUnsetPlaceholderLookup, entityListAttributeNames, entityListIncludesDerivedTypes, formatEntityFormsMessage, humanizeCkTypeName, isChainEndForm, isEditorCompatible, isEntityFormSaveVeto, isEntityFormUnsetPlaceholder, isSecretMetaData, isVisible, localizeEntityForm, localizeEntityFormTitle, localizeEntityListColumns, mergeEntityFormPrefill, mergeEntityFormsMessages, parseDefault, parseEntityForm, parseEntityForms, parseVisibleWhen, pickEntityForm, provideEntityFormFallbacks, resolveEntityForm, resolveEntityFormLabel, resolveListDefaultSort, runEntityFormBeforeSave, secretMetaDataMarker, secretStatusLabelsOf, selectFallbackForms, shortTypeName, toAttributeInputs, toCkRecordInfo, toCkTypeInfo, toEntityListColumn, toEntityListRow, toFormValue, toKebabTypeKey, toListViewRowClass, withFallbackForms };
7996
+ export { BUILT_IN_DEFAULT_FORM, DEFAULT_ENTITY_FORMS_MESSAGES, DEFAULT_GENERATED_SECTION_TITLE, DEFAULT_SECTION_KEY, ENTITY_FORM_ACTION_CONFIRMATION, ENTITY_FORM_BEFORE_SAVE, ENTITY_FORM_DANGER_CONFIRMATION, ENTITY_FORM_FALLBACK_FORMS, ENTITY_FORM_LABEL_RESOLVER, ENTITY_FORM_SECRET_KEY_RING_CONFIGURED, ENTITY_FORM_SECRET_PLACEHOLDER_VALUES, ENTITY_FORM_UNSET_PLACEHOLDER_VALUES, ENTITY_LIST_ROW_CLASS, ENTITY_PAGE_NEW, ENTITY_PAGE_TYPE_QUERY_PARAM, EntityFormComponent, EntityFormDataService, EntityFormRecordsFieldComponent, EntityFormReferenceFieldComponent, EntityFormSaveVeto, EntityFormSecretEditorComponent, EntityFormService, EntityListComponent, EntityListDataSourceDirective, EntityPageActionsDirective, EntityPageComponent, GENERATED_SECTION_KEY, SYSTEM_PROPERTIES, associationFieldKey, associationRoleName, autoEditorFor, buildChangeSet, canonicaliseEntityFormPrefill, canonicalisePath, ckTypeDisplayName, ckTypeShortName, confirmEntityFormAction, confirmEntityFormDanger, entityDeleteConfirmation, entityFormCatalog, entityFormKey, entityFormPrefillState, entityFormRoutes, entityFormTypeTitles, entityFormUnsetPlaceholderFields, entityFormUnsetPlaceholderLookup, entityListAttributeNames, entityListCreateLabel, entityListIncludesDerivedTypes, formatEntityFormsMessage, humanizeCkTypeName, isChainEndForm, isEditorCompatible, isEntityFormSaveVeto, isEntityFormUnsetPlaceholder, isSecretMetaData, isVisible, localizeEntityForm, localizeEntityFormTitle, localizeEntityListColumns, mergeEntityFormPrefill, mergeEntityFormsMessages, parseDefault, parseEntityForm, parseEntityForms, parseVisibleWhen, pickEntityForm, provideEntityFormFallbacks, resolveEntityForm, resolveEntityFormLabel, resolveListDefaultSort, runEntityFormBeforeSave, secretMetaDataMarker, secretStatusLabelsOf, selectFallbackForms, shortTypeName, toAttributeInputs, toCkRecordInfo, toCkTypeInfo, toEntityListColumn, toEntityListRow, toFormValue, toKebabTypeKey, toListViewRowClass, withFallbackForms };
7944
7997
  //# sourceMappingURL=meshmakers-octo-ui-entity-forms.mjs.map