@smallpearl/ngx-helper 0.31.8 → 0.31.12

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.
@@ -190,7 +190,7 @@ class FormViewHostComponent {
190
190
  }
191
191
  /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: FormViewHostComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
192
192
  /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "19.1.6", type: FormViewHostComponent, isStandalone: true, selector: "sp-create-edit-entity-host", inputs: { entityCrudComponentBase: { classPropertyName: "entityCrudComponentBase", publicName: "entityCrudComponentBase", isSignal: true, isRequired: true, transformFunction: null }, clientViewTemplate: { classPropertyName: "clientViewTemplate", publicName: "clientViewTemplate", isSignal: true, isRequired: false, transformFunction: null }, itemLabel: { classPropertyName: "itemLabel", publicName: "itemLabel", isSignal: true, isRequired: true, transformFunction: null }, itemLabelPlural: { classPropertyName: "itemLabelPlural", publicName: "itemLabelPlural", isSignal: true, isRequired: true, transformFunction: null } }, viewQueries: [{ propertyName: "vc", first: true, predicate: ["clientFormContainer"], descendants: true, read: ViewContainerRef, isSignal: true }], ngImport: i0, template: `
193
- <div spHostBusyWheel="formBusyWheel">
193
+ <div [class]="'form-wrapper ' + entityCrudComponentBase().getFormPaneContentClass()" spHostBusyWheel="formBusyWheel">
194
194
  <div class="create-edit-topbar">
195
195
  <div class="title">
196
196
  {{ title() }}
@@ -202,9 +202,11 @@ class FormViewHostComponent {
202
202
  </button>
203
203
  </div>
204
204
  </div>
205
- <ng-container #clientFormContainer></ng-container>
205
+ <div class="form-container">
206
+ <ng-container #clientFormContainer></ng-container>
207
+ </div>
206
208
  </div>
207
- `, isInline: true, styles: [".create-edit-topbar{display:flex;flex-direction:row;align-items:center;min-height:48px}.create-edit-topbar .title{font-size:1.5em;font-weight:500}.create-edit-topbar .spacer{flex-grow:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: SPMatHostBusyWheelDirective, selector: "[spHostBusyWheel]", inputs: ["spHostBusyWheel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
209
+ `, isInline: true, styles: [".form-wrapper{width:100%!important;height:100%!important;display:flex;flex-direction:column;padding:.4em}.create-edit-topbar{display:flex;flex-direction:row;align-items:center;min-height:48px;padding-bottom:.4em}.create-edit-topbar .title{font-size:1.5em;font-weight:500}.create-edit-topbar .spacer{flex-grow:1}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: SPMatHostBusyWheelDirective, selector: "[spHostBusyWheel]", inputs: ["spHostBusyWheel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
208
210
  }
209
211
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: FormViewHostComponent, decorators: [{
210
212
  type: Component,
@@ -214,7 +216,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImpor
214
216
  MatIconModule,
215
217
  SPMatHostBusyWheelDirective,
216
218
  ], selector: 'sp-create-edit-entity-host', template: `
217
- <div spHostBusyWheel="formBusyWheel">
219
+ <div [class]="'form-wrapper ' + entityCrudComponentBase().getFormPaneContentClass()" spHostBusyWheel="formBusyWheel">
218
220
  <div class="create-edit-topbar">
219
221
  <div class="title">
220
222
  {{ title() }}
@@ -226,9 +228,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImpor
226
228
  </button>
227
229
  </div>
228
230
  </div>
229
- <ng-container #clientFormContainer></ng-container>
231
+ <div class="form-container">
232
+ <ng-container #clientFormContainer></ng-container>
233
+ </div>
230
234
  </div>
231
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".create-edit-topbar{display:flex;flex-direction:row;align-items:center;min-height:48px}.create-edit-topbar .title{font-size:1.5em;font-weight:500}.create-edit-topbar .spacer{flex-grow:1}\n"] }]
235
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".form-wrapper{width:100%!important;height:100%!important;display:flex;flex-direction:column;padding:.4em}.create-edit-topbar{display:flex;flex-direction:row;align-items:center;min-height:48px;padding-bottom:.4em}.create-edit-topbar .title{font-size:1.5em;font-weight:500}.create-edit-topbar .spacer{flex-grow:1}\n"] }]
232
236
  }], ctorParameters: () => [] });
233
237
 
234
238
  class PreviewHostComponent {
@@ -452,6 +456,10 @@ class SPMatEntityCrudComponent extends SPMatEntityListComponent {
452
456
  * The class class that will be applied to the preview pane content.
453
457
  */
454
458
  previewPaneContentClass = input('sp-mat-crud-preview-pane-content-class');
459
+ /**
460
+ * The CSS class that will be applied to the form pane content.
461
+ */
462
+ formPaneContentClass = input('sp-mat-crud-form-pane-content-class');
455
463
  // INTERNAL PROPERTIES //
456
464
  // Derive a label from a camelCase source string. If the camelCase string
457
465
  // can be translated, it returns the translated string. If not, the function
@@ -774,7 +782,7 @@ class SPMatEntityCrudComponent extends SPMatEntityListComponent {
774
782
  const params = {
775
783
  title: this.newItemLabel() ??
776
784
  this.transloco.translate('spMatEntityCrud.newItem', {
777
- item: itemLabel
785
+ item: itemLabel,
778
786
  }),
779
787
  };
780
788
  this.showCreateEditView(undefined, params);
@@ -797,7 +805,7 @@ class SPMatEntityCrudComponent extends SPMatEntityListComponent {
797
805
  const params = {
798
806
  title: this.editItemTitle() ??
799
807
  this.transloco.translate('spMatEntityCrud.editItem', {
800
- item: itemLabel
808
+ item: itemLabel,
801
809
  }),
802
810
  };
803
811
  this.showCreateEditView(entity, params);
@@ -1035,6 +1043,9 @@ class SPMatEntityCrudComponent extends SPMatEntityListComponent {
1035
1043
  getPreviewPaneContentClass() {
1036
1044
  return this.previewPaneContentClass();
1037
1045
  }
1046
+ getFormPaneContentClass() {
1047
+ return this.formPaneContentClass();
1048
+ }
1038
1049
  /**
1039
1050
  * Initialize the columns for the mat-entities-list component. This is
1040
1051
  * called when the <sp-mat-entities-list> component has been properly
@@ -1073,7 +1084,7 @@ class SPMatEntityCrudComponent extends SPMatEntityListComponent {
1073
1084
  }
1074
1085
  }
1075
1086
  /** @nocollapse */ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SPMatEntityCrudComponent, deps: [{ token: i1$1.HttpClient }, { token: i2$1.MatSnackBar }, { token: i3.DomSanitizer }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Component });
1076
- /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.6", type: SPMatEntityCrudComponent, isStandalone: true, selector: "sp-mat-entity-crud", inputs: { itemLabel: { classPropertyName: "itemLabel", publicName: "itemLabel", isSignal: true, isRequired: false, transformFunction: null }, itemLabelPlural: { classPropertyName: "itemLabelPlural", publicName: "itemLabelPlural", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, itemActions: { classPropertyName: "itemActions", publicName: "itemActions", isSignal: true, isRequired: false, transformFunction: null }, newItemLink: { classPropertyName: "newItemLink", publicName: "newItemLink", isSignal: true, isRequired: false, transformFunction: null }, newItemLabel: { classPropertyName: "newItemLabel", publicName: "newItemLabel", isSignal: true, isRequired: false, transformFunction: null }, editItemTitle: { classPropertyName: "editItemTitle", publicName: "editItemTitle", isSignal: true, isRequired: false, transformFunction: null }, newItemSubTypes: { classPropertyName: "newItemSubTypes", publicName: "newItemSubTypes", isSignal: true, isRequired: false, transformFunction: null }, crudOpFn: { classPropertyName: "crudOpFn", publicName: "crudOpFn", isSignal: true, isRequired: false, transformFunction: null }, previewTemplate: { classPropertyName: "previewTemplate", publicName: "previewTemplate", isSignal: true, isRequired: false, transformFunction: null }, allowEntityActionFn: { classPropertyName: "allowEntityActionFn", publicName: "allowEntityActionFn", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, actionsTemplate: { classPropertyName: "actionsTemplate", publicName: "actionsTemplate", isSignal: true, isRequired: false, transformFunction: null }, crudResponseParser: { classPropertyName: "crudResponseParser", publicName: "crudResponseParser", isSignal: true, isRequired: false, transformFunction: null }, createEditFormTemplate: { classPropertyName: "createEditFormTemplate", publicName: "createEditFormTemplate", isSignal: true, isRequired: false, transformFunction: null }, disableItemActions: { classPropertyName: "disableItemActions", publicName: "disableItemActions", isSignal: true, isRequired: false, transformFunction: null }, disableCreate: { classPropertyName: "disableCreate", publicName: "disableCreate", isSignal: true, isRequired: false, transformFunction: null }, refreshAfterEdit: { classPropertyName: "refreshAfterEdit", publicName: "refreshAfterEdit", isSignal: true, isRequired: false, transformFunction: null }, crudHttpReqContext: { classPropertyName: "crudHttpReqContext", publicName: "crudHttpReqContext", isSignal: true, isRequired: false, transformFunction: null }, editPaneWidth: { classPropertyName: "editPaneWidth", publicName: "editPaneWidth", isSignal: true, isRequired: false, transformFunction: null }, previewPaneWidth: { classPropertyName: "previewPaneWidth", publicName: "previewPaneWidth", isSignal: true, isRequired: false, transformFunction: null }, listPaneWrapperClass: { classPropertyName: "listPaneWrapperClass", publicName: "listPaneWrapperClass", isSignal: true, isRequired: false, transformFunction: null }, previewPaneWrapperClass: { classPropertyName: "previewPaneWrapperClass", publicName: "previewPaneWrapperClass", isSignal: true, isRequired: false, transformFunction: null }, previewPaneContentClass: { classPropertyName: "previewPaneContentClass", publicName: "previewPaneContentClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { action: "action", entityViewPaneActivated: "entityViewPaneActivated" }, providers: [provideTranslocoScope('sp-mat-entity-crud')], queries: [{ propertyName: "_clientColumnDefs", predicate: MatColumnDef }], viewQueries: [{ propertyName: "componentColumns", predicate: MatColumnDef, descendants: true, isSignal: true }, { propertyName: "spEntitiesList", first: true, predicate: ["entitiesList"], descendants: true, isSignal: true }, { propertyName: "createEditHostComponent", first: true, predicate: FormViewHostComponent, descendants: true, isSignal: true }, { propertyName: "previewHostComponent", first: true, predicate: PreviewHostComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
1087
+ /** @nocollapse */ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.6", type: SPMatEntityCrudComponent, isStandalone: true, selector: "sp-mat-entity-crud", inputs: { itemLabel: { classPropertyName: "itemLabel", publicName: "itemLabel", isSignal: true, isRequired: false, transformFunction: null }, itemLabelPlural: { classPropertyName: "itemLabelPlural", publicName: "itemLabelPlural", isSignal: true, isRequired: false, transformFunction: null }, title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, itemActions: { classPropertyName: "itemActions", publicName: "itemActions", isSignal: true, isRequired: false, transformFunction: null }, newItemLink: { classPropertyName: "newItemLink", publicName: "newItemLink", isSignal: true, isRequired: false, transformFunction: null }, newItemLabel: { classPropertyName: "newItemLabel", publicName: "newItemLabel", isSignal: true, isRequired: false, transformFunction: null }, editItemTitle: { classPropertyName: "editItemTitle", publicName: "editItemTitle", isSignal: true, isRequired: false, transformFunction: null }, newItemSubTypes: { classPropertyName: "newItemSubTypes", publicName: "newItemSubTypes", isSignal: true, isRequired: false, transformFunction: null }, crudOpFn: { classPropertyName: "crudOpFn", publicName: "crudOpFn", isSignal: true, isRequired: false, transformFunction: null }, previewTemplate: { classPropertyName: "previewTemplate", publicName: "previewTemplate", isSignal: true, isRequired: false, transformFunction: null }, allowEntityActionFn: { classPropertyName: "allowEntityActionFn", publicName: "allowEntityActionFn", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, actionsTemplate: { classPropertyName: "actionsTemplate", publicName: "actionsTemplate", isSignal: true, isRequired: false, transformFunction: null }, crudResponseParser: { classPropertyName: "crudResponseParser", publicName: "crudResponseParser", isSignal: true, isRequired: false, transformFunction: null }, createEditFormTemplate: { classPropertyName: "createEditFormTemplate", publicName: "createEditFormTemplate", isSignal: true, isRequired: false, transformFunction: null }, disableItemActions: { classPropertyName: "disableItemActions", publicName: "disableItemActions", isSignal: true, isRequired: false, transformFunction: null }, disableCreate: { classPropertyName: "disableCreate", publicName: "disableCreate", isSignal: true, isRequired: false, transformFunction: null }, refreshAfterEdit: { classPropertyName: "refreshAfterEdit", publicName: "refreshAfterEdit", isSignal: true, isRequired: false, transformFunction: null }, crudHttpReqContext: { classPropertyName: "crudHttpReqContext", publicName: "crudHttpReqContext", isSignal: true, isRequired: false, transformFunction: null }, editPaneWidth: { classPropertyName: "editPaneWidth", publicName: "editPaneWidth", isSignal: true, isRequired: false, transformFunction: null }, previewPaneWidth: { classPropertyName: "previewPaneWidth", publicName: "previewPaneWidth", isSignal: true, isRequired: false, transformFunction: null }, listPaneWrapperClass: { classPropertyName: "listPaneWrapperClass", publicName: "listPaneWrapperClass", isSignal: true, isRequired: false, transformFunction: null }, previewPaneWrapperClass: { classPropertyName: "previewPaneWrapperClass", publicName: "previewPaneWrapperClass", isSignal: true, isRequired: false, transformFunction: null }, previewPaneContentClass: { classPropertyName: "previewPaneContentClass", publicName: "previewPaneContentClass", isSignal: true, isRequired: false, transformFunction: null }, formPaneContentClass: { classPropertyName: "formPaneContentClass", publicName: "formPaneContentClass", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { action: "action", entityViewPaneActivated: "entityViewPaneActivated" }, providers: [provideTranslocoScope('sp-mat-entity-crud')], queries: [{ propertyName: "_clientColumnDefs", predicate: MatColumnDef }], viewQueries: [{ propertyName: "componentColumns", predicate: MatColumnDef, descendants: true, isSignal: true }, { propertyName: "spEntitiesList", first: true, predicate: ["entitiesList"], descendants: true, isSignal: true }, { propertyName: "createEditHostComponent", first: true, predicate: FormViewHostComponent, descendants: true, isSignal: true }, { propertyName: "previewHostComponent", first: true, predicate: PreviewHostComponent, descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0, template: `
1077
1088
  <as-split direction="horizontal" [gutterSize]="6" *transloco="let t">
1078
1089
  <as-split-area
1079
1090
  [size]="entitiesPaneWidth()"
@@ -1195,17 +1206,17 @@ class SPMatEntityCrudComponent extends SPMatEntityListComponent {
1195
1206
  </as-split-area>
1196
1207
  <as-split-area [size]="entityPaneWidth()" [visible]="entityPaneActive()">
1197
1208
  <div
1198
- [class]="previewPaneWrapperClass()"
1209
+ [class]="'preview-pane-wrapper ' + previewPaneWrapperClass()"
1199
1210
  spHostBusyWheel="formBusyWheel"
1200
1211
  >
1201
1212
  <sp-entity-crud-preview-host
1202
- [ngClass]="createEditViewActive() ? 'd-none' : 'd-inherit'"
1213
+ [ngClass]="createEditViewActive() ? 'sp-hidden' : 'sp-visible'"
1203
1214
  [entityCrudComponentBase]="this"
1204
1215
  [clientViewTemplate]="previewTemplate()!"
1205
1216
  ></sp-entity-crud-preview-host>
1206
1217
  <!-- Create/Edit Entity -->
1207
1218
  <sp-create-edit-entity-host
1208
- [ngClass]="createEditViewActive() ? 'd-inherit' : 'd-none'"
1219
+ [ngClass]="createEditViewActive() ? 'sp-visible' : 'sp-hidden'"
1209
1220
  itemLabel="{{ _itemLabel() | async }}"
1210
1221
  itemLabelPlural="{{ _itemLabelPlural() | async }}"
1211
1222
  [entityCrudComponentBase]="this"
@@ -1214,7 +1225,7 @@ class SPMatEntityCrudComponent extends SPMatEntityListComponent {
1214
1225
  </div>
1215
1226
  </as-split-area>
1216
1227
  </as-split>
1217
- `, isInline: true, styles: [".d-none{display:none}.d-inherit{display:inherit}.action-bar{display:flex;flex-direction:row;align-items:center;padding-bottom:.5em}.action-bar-title{font-size:1.5em;font-weight:600}.spacer{flex-grow:1}.action-bar-actions{text-align:end}.active-row{font-weight:700}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "directive", type: i7.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i7.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i7.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i7.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i7.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "ngmodule", type: MatSortModule }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i10.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: AngularSplitModule }, { kind: "component", type: i11.SplitComponent, selector: "as-split", inputs: ["gutterSize", "gutterStep", "disabled", "gutterClickDeltaPx", "direction", "dir", "unit", "gutterAriaLabel", "restrictMove", "useTransition", "gutterDblClickDuration"], outputs: ["gutterClick", "gutterDblClick", "dragStart", "dragEnd", "transitionEnd"], exportAs: ["asSplit"] }, { kind: "component", type: i11.SplitAreaComponent, selector: "as-split-area", inputs: ["size", "minSize", "maxSize", "lockSize", "visible"], exportAs: ["asSplitArea"] }, { kind: "component", type: SPMatEntityListComponent, selector: "sp-mat-entity-list", inputs: ["entityName", "entityNamePlural", "endpoint", "entityLoaderFn", "columns", "displayedColumns", "pageSize", "idKey", "pagination", "paginator", "sorter", "disableSort", "infiniteScrollContainer", "infiniteScrollDistance", "infiniteScrollThrottle", "infiniteScrollWindow", "httpReqContext", "deferViewInit"], outputs: ["selectEntity"] }, { kind: "component", type: SPMatContextMenuComponent, selector: "sp-mat-context-menu", inputs: ["menuItems", "label", "menuIconName", "enableHover", "contextData", "hasBackdrop"], outputs: ["selected"] }, { kind: "component", type: FormViewHostComponent, selector: "sp-create-edit-entity-host", inputs: ["entityCrudComponentBase", "clientViewTemplate", "itemLabel", "itemLabelPlural"] }, { kind: "directive", type: SPMatHostBusyWheelDirective, selector: "[spHostBusyWheel]", inputs: ["spHostBusyWheel"] }, { kind: "component", type: PreviewHostComponent, selector: "sp-entity-crud-preview-host", inputs: ["entityCrudComponentBase", "clientViewTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1228
+ `, isInline: true, styles: [".sp-hidden{display:none}.sp-visible{display:inherit;height:100%!important;width:100%!important}.preview-pane-wrapper{height:100%!important;width:100%!important}.action-bar{display:flex;flex-direction:row;align-items:center;padding-bottom:.5em}.action-bar-title{font-size:1.5em;font-weight:600}.spacer{flex-grow:1}.action-bar-actions{text-align:end}.active-row{font-weight:700}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "directive", type: i7.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i7.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i7.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i7.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i7.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "ngmodule", type: MatSortModule }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i8.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i8.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i8.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: MatSnackBarModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i10.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoPrefix", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: AngularSplitModule }, { kind: "component", type: i11.SplitComponent, selector: "as-split", inputs: ["gutterSize", "gutterStep", "disabled", "gutterClickDeltaPx", "direction", "dir", "unit", "gutterAriaLabel", "restrictMove", "useTransition", "gutterDblClickDuration"], outputs: ["gutterClick", "gutterDblClick", "dragStart", "dragEnd", "transitionEnd"], exportAs: ["asSplit"] }, { kind: "component", type: i11.SplitAreaComponent, selector: "as-split-area", inputs: ["size", "minSize", "maxSize", "lockSize", "visible"], exportAs: ["asSplitArea"] }, { kind: "component", type: SPMatEntityListComponent, selector: "sp-mat-entity-list", inputs: ["entityName", "entityNamePlural", "endpoint", "entityLoaderFn", "columns", "displayedColumns", "pageSize", "idKey", "pagination", "paginator", "sorter", "disableSort", "infiniteScrollContainer", "infiniteScrollDistance", "infiniteScrollThrottle", "infiniteScrollWindow", "httpReqContext", "deferViewInit"], outputs: ["selectEntity"] }, { kind: "component", type: SPMatContextMenuComponent, selector: "sp-mat-context-menu", inputs: ["menuItems", "label", "menuIconName", "enableHover", "contextData", "hasBackdrop"], outputs: ["selected"] }, { kind: "component", type: FormViewHostComponent, selector: "sp-create-edit-entity-host", inputs: ["entityCrudComponentBase", "clientViewTemplate", "itemLabel", "itemLabelPlural"] }, { kind: "directive", type: SPMatHostBusyWheelDirective, selector: "[spHostBusyWheel]", inputs: ["spHostBusyWheel"] }, { kind: "component", type: PreviewHostComponent, selector: "sp-entity-crud-preview-host", inputs: ["entityCrudComponentBase", "clientViewTemplate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1218
1229
  }
1219
1230
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SPMatEntityCrudComponent, decorators: [{
1220
1231
  type: Component,
@@ -1356,17 +1367,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImpor
1356
1367
  </as-split-area>
1357
1368
  <as-split-area [size]="entityPaneWidth()" [visible]="entityPaneActive()">
1358
1369
  <div
1359
- [class]="previewPaneWrapperClass()"
1370
+ [class]="'preview-pane-wrapper ' + previewPaneWrapperClass()"
1360
1371
  spHostBusyWheel="formBusyWheel"
1361
1372
  >
1362
1373
  <sp-entity-crud-preview-host
1363
- [ngClass]="createEditViewActive() ? 'd-none' : 'd-inherit'"
1374
+ [ngClass]="createEditViewActive() ? 'sp-hidden' : 'sp-visible'"
1364
1375
  [entityCrudComponentBase]="this"
1365
1376
  [clientViewTemplate]="previewTemplate()!"
1366
1377
  ></sp-entity-crud-preview-host>
1367
1378
  <!-- Create/Edit Entity -->
1368
1379
  <sp-create-edit-entity-host
1369
- [ngClass]="createEditViewActive() ? 'd-inherit' : 'd-none'"
1380
+ [ngClass]="createEditViewActive() ? 'sp-visible' : 'sp-hidden'"
1370
1381
  itemLabel="{{ _itemLabel() | async }}"
1371
1382
  itemLabelPlural="{{ _itemLabelPlural() | async }}"
1372
1383
  [entityCrudComponentBase]="this"
@@ -1375,7 +1386,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImpor
1375
1386
  </div>
1376
1387
  </as-split-area>
1377
1388
  </as-split>
1378
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".d-none{display:none}.d-inherit{display:inherit}.action-bar{display:flex;flex-direction:row;align-items:center;padding-bottom:.5em}.action-bar-title{font-size:1.5em;font-weight:600}.spacer{flex-grow:1}.action-bar-actions{text-align:end}.active-row{font-weight:700}\n"] }]
1389
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".sp-hidden{display:none}.sp-visible{display:inherit;height:100%!important;width:100%!important}.preview-pane-wrapper{height:100%!important;width:100%!important}.action-bar{display:flex;flex-direction:row;align-items:center;padding-bottom:.5em}.action-bar-title{font-size:1.5em;font-weight:600}.spacer{flex-grow:1}.action-bar-actions{text-align:end}.active-row{font-weight:700}\n"] }]
1379
1390
  }], ctorParameters: () => [{ type: i1$1.HttpClient }, { type: i2$1.MatSnackBar }, { type: i3.DomSanitizer }, { type: i0.Injector }], propDecorators: { _clientColumnDefs: [{
1380
1391
  type: ContentChildren,
1381
1392
  args: [MatColumnDef]
@@ -1471,7 +1482,7 @@ class SPMatEntityCrudPreviewPaneComponent {
1471
1482
  <ng-content select="[previewContent]"></ng-content>
1472
1483
  </div>
1473
1484
  </div>
1474
- `, isInline: true, styles: [".preview-wrapper{display:flex;flex-direction:column;height:100%}.spacer{flex:1 1 auto}.preview-content{flex-grow:1;overflow:scroll}\n"], dependencies: [{ kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i1$2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i1$2.MatToolbarRow, selector: "mat-toolbar-row", exportAs: ["matToolbarRow"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1485
+ `, isInline: true, styles: [".preview-wrapper{display:flex;flex-direction:column;height:100%!important;width:100%!important}mat-toolbar{background-color:var(--mat-sys-surface-variant)}.spacer{flex:1 1 auto}.preview-content{padding:.4em;flex-grow:1;overflow:scroll}\n"], dependencies: [{ kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i1$2.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: i1$2.MatToolbarRow, selector: "mat-toolbar-row", exportAs: ["matToolbarRow"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1475
1486
  }
1476
1487
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SPMatEntityCrudPreviewPaneComponent, decorators: [{
1477
1488
  type: Component,
@@ -1516,7 +1527,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImpor
1516
1527
  <ng-content select="[previewContent]"></ng-content>
1517
1528
  </div>
1518
1529
  </div>
1519
- `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".preview-wrapper{display:flex;flex-direction:column;height:100%}.spacer{flex:1 1 auto}.preview-content{flex-grow:1;overflow:scroll}\n"] }]
1530
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [".preview-wrapper{display:flex;flex-direction:column;height:100%!important;width:100%!important}mat-toolbar{background-color:var(--mat-sys-surface-variant)}.spacer{flex:1 1 auto}.preview-content{padding:.4em;flex-grow:1;overflow:scroll}\n"] }]
1520
1531
  }] });
1521
1532
 
1522
1533
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"smallpearl-ngx-helper-mat-entity-crud.mjs","sources":["../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/mat-entity-crud-types.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/providers.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/default-config.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/form-view-host.component.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/preview-host.component.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/mat-entity-crud.component.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/mat-entity-crud-internal-types.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/preview-pane.component.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/mat-entity-crud-form-base.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/smallpearl-ngx-helper-mat-entity-crud.ts"],"sourcesContent":["import { HttpContextToken } from \"@angular/common/http\";\nimport { SPContextMenuItem } from \"@smallpearl/ngx-helper/mat-context-menu\";\nimport { Observable } from \"rxjs\";\n\n/**\n * Prototype of the function to parse the CRUD action response.\n */\nexport type SPMatEntityCrudResponseParser = (\n entityName: string,\n idKey: string,\n method: 'create' | 'retrieve' | 'update' | 'delete',\n resp: any\n) => any|undefined;\n\n\n/**\n * Global config for SPMatEntityList component.\n */\nexport interface SPMatEntityCrudConfig {\n /**\n * The item actions that will be shown for each item in the list.\n * This defaults to 'Update' & 'Delete' actions, but can be customized\n * by this property. Note the item actions can be set for individual\n * <sp-mat-entity-crud> component through its itemActions property.\n */\n defaultItemActions?: SPContextMenuItem[];\n /**\n * Global crud response parser.\n */\n crudOpResponseParser?: SPMatEntityCrudResponseParser;\n}\n\n/**\n * This is the interface through which the client provided CRUD form component\n * interacts with the 'host' SPMatEntityCrudComponent. When the form wants to\n * submit an entity to the server (for create or update), it should call the\n * one of the create or update methods. The interface also other methods for\n * the form component to interact with SPMatEntityCrudComponent such as\n * refresh its entities list, close the form pane, etc.\n *\n * The interface name has a 'Bridge' as the interface acts as a bridge between\n * the client provided form handler component and the host\n * SPMatEntityCrudComponent.\n */\nexport interface SPMatEntityCrudCreateEditBridge {\n /**\n * Close the edit/update form pane. This WON'T call the 'cancelEditCallback'\n * even if one is registered.\n */\n close: (cancel: boolean) => void;\n /**\n * Client form view can register a callback that will be invoked by the\n * framework when user cancels the create/edit operation by clicking on the\n * close button on the top right.\n * @param callback\n * @returns None\n */\n registerCanCancelEditCallback: (callback: () => boolean) => void;\n // Parameters of type any are entity values are typically the output of\n // form.value and therefore their types would not necessarily match TEntity.\n // id can be typed as TEntity[Idkey], but TSC doesn't allow that yet.\n /**\n * Create a new instance of TEntity, by sending a POST request to remote.\n * @param entityValue This is the typically the output of Reactive form's\n * form.value. Since this value's shape may be different from TEntity and is\n * known only to client form, we use 'any'.\n * @returns None\n * @inner Implementation will show a busy wheel centered on the form\n * view while the async function to update the object remains active.\n */\n create: (entityValue: any) => Observable<any>;\n /**\n * Update the entity with id `id` with new values in entityValue.\n * @param id TEntity id\n * @param entityValue Entity values to be updated.\n * @returns None\n * @inner Implementation will show a busy wheel centered on the form\n * view while the async function to update the object remains active.\n */\n update: (id: any, entityValue: any) => Observable<any>;\n}\n\n/**\n * Prototype of the function that will be used instead of HttpClient for\n * CRUD operations.\n * @param op - the CRUD operation being requested\n * @param entityValue - The entity or entity value upon which the operation\n * is being requested. for 'create' & 'update' this will be the value\n * of the reactive form. This is typically form.value or the 2nd arg to create\n * & update methods of SPMatEntityCrudCreateEditBridge.\n */\nexport type CRUD_OP_FN<\n TEntity extends { [P in IdKey]: PropertyKey },\n IdKey extends string = 'id'\n> = (\n op: 'get' | 'create' | 'update' | 'delete',\n id: TEntity[IdKey] | undefined, // valid only for 'get', 'update' & 'delete'\n entityValue: any, // valid only for 'create' & 'update'\n entityCrudComponent: any,\n) => Observable<TEntity | null>;\n\n\nexport type ALLOW_ITEM_ACTION_FN<TEntity> = (entity: TEntity, action: string) => boolean;\n\n/**\n * This interface is used to define sub types for the \"New {{item}}\" button on\n * top of the CRUD UI. An array of these is provided as the value to the\n * component property 'newItemSubTypes'.\n */\nexport interface NewItemSubType {\n /**\n * A role string that will be passed as argument to the (action) event\n * handler. This string allows the event handler to distinguish the selected\n * sub-type.\n *\n * The special keyword '_new_' can be used to activate the\n * `createEditTemplate` template if one is provided. In this case the params\n * element value (see below) can be used in the template to distinguish\n * between different menu items.\n */\n role: string;\n /**\n * Label displayed in the menu representing this role.\n */\n label: string;\n /**\n * Arbitrary value that will be passed to the 'createEditTemplate' in the\n * $implicit template context as 'params'. You can access this in the\n * template like below (see `data.params`):-\n ```\n <ng-template #createEdit let-data>\n <app-create-edit-entity-demo\n [bridge]=\"data.bridge\"\n [entity]=\"data.entity\"\n [params]=\"data.params\"\n ></app-create-edit-entity-demo>\n </ng-template>\n ```\n\n If params is an object and it includes the key 'title', its value will be\n used as the title for the edit form.\n */\n params?: any;\n}\n\nexport type CrudOp = 'create'|'retrieve'|'update'|'delete'|undefined;\n\nexport interface SPMatEntityCrudHttpContext {\n entityName: string;\n entityNamePlural: string;\n endpoint: string;\n op: CrudOp;\n}\n\nexport const SP_MAT_ENTITY_CRUD_HTTP_CONTEXT =\n new HttpContextToken<SPMatEntityCrudHttpContext>(() => ({\n entityName: '',\n entityNamePlural: '',\n endpoint: '',\n op: undefined,\n }));\n","import { InjectionToken } from '@angular/core';\nimport { SPMatEntityCrudConfig } from './mat-entity-crud-types';\n\nexport const SP_MAT_ENTITY_CRUD_CONFIG = new InjectionToken<SPMatEntityCrudConfig>('SPMatEntityCrudConfig');\n","import { inject } from \"@angular/core\";\nimport { SPMatEntityCrudConfig } from \"./mat-entity-crud-types\";\nimport { SP_MAT_ENTITY_CRUD_CONFIG } from \"./providers\";\n\nfunction defaultCrudResponseParser(\n entityName: string,\n idKey: string,\n method: 'create' | 'retrieve' | 'update' | 'delete',\n resp: any\n) {\n // If the response is an object with a property '<idKey>', return it as\n // TEntity.\n if (resp.hasOwnProperty(idKey)) {\n return resp;\n }\n // If the response has an object indexed at '<entityName>' and it has\n // the property '<idKey>', return it as TEntity.\n if (resp.hasOwnProperty(entityName)) {\n const obj = resp[entityName];\n if (obj.hasOwnProperty(idKey)) {\n return obj;\n }\n }\n // Return undefined, indicating that we could't parse the response.\n return undefined;\n}\n\nexport const DefaultSPMatEntityCrudConfig: SPMatEntityCrudConfig = {\n crudOpResponseParser: defaultCrudResponseParser\n};\n\n/**\n * To be called from an object constructor as it internally calls Angular's\n * inject() API.\n * @param userConfig\n * @returns\n */\nexport function getEntityCrudConfig(): SPMatEntityCrudConfig {\n const userCrudConfig = inject(SP_MAT_ENTITY_CRUD_CONFIG, {\n optional: true,\n });\n return {\n ...DefaultSPMatEntityCrudConfig,\n ...(userCrudConfig ?? {}),\n };\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n EmbeddedViewRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n signal,\n TemplateRef,\n viewChild,\n ViewContainerRef\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { SPMatHostBusyWheelDirective } from '@smallpearl/ngx-helper/mat-busy-wheel';\nimport { firstValueFrom, Observable, of, Subscription, tap } from 'rxjs';\nimport { getEntityCrudConfig } from './default-config';\nimport { SPMatEntityCrudComponentBase } from './mat-entity-crud-internal-types';\nimport { SPMatEntityCrudConfig, SPMatEntityCrudCreateEditBridge } from './mat-entity-crud-types';\nimport { TranslocoService } from '@jsverse/transloco';\n\n@Component({\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n SPMatHostBusyWheelDirective,\n ],\n selector: 'sp-create-edit-entity-host',\n template: `\n <div spHostBusyWheel=\"formBusyWheel\">\n <div class=\"create-edit-topbar\">\n <div class=\"title\">\n {{ title() }}\n </div>\n <div class=\"spacer\"></div>\n <div class=\"close\">\n <button mat-icon-button (click)=\"onClose()\">\n <mat-icon>cancel</mat-icon>\n </button>\n </div>\n </div>\n <ng-container #clientFormContainer></ng-container>\n </div>\n `,\n styles: `\n .create-edit-topbar {\n display: flex;\n flex-direction: row;\n align-items: center;\n min-height: 48px;\n }\n .create-edit-topbar .title {\n font-size: 1.5em;\n font-weight: 500;\n }\n .create-edit-topbar .spacer {\n flex-grow: 1;\n }\n .create-edit-topbar .close {\n\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormViewHostComponent<TEntity>\n implements SPMatEntityCrudCreateEditBridge, OnInit, OnDestroy\n{\n entityCrudComponentBase =\n input.required<SPMatEntityCrudComponentBase<TEntity>>();\n clientViewTemplate = input<TemplateRef<any> | null>(null);\n itemLabel = input.required<string | Observable<string>>();\n itemLabelPlural = input.required<string | Observable<string>>();\n\n _itemLabel = computed<Observable<string>>(() => {\n const label = this.itemLabel();\n return label instanceof Observable ? label : of(label);\n });\n _itemLabelPlural = computed<Observable<string>>(() => {\n const label = this.itemLabelPlural();\n return label instanceof Observable ? label : of(label);\n });\n\n entity = signal<TEntity | undefined>(undefined);\n title = signal<string>('');\n params = signal<any>(undefined);\n clientFormView!: EmbeddedViewRef<any> | null;\n vc = viewChild('clientFormContainer', { read: ViewContainerRef });\n config!: SPMatEntityCrudConfig;\n sub$ = new Subscription();\n transloco = inject(TranslocoService);\n\n constructor() {\n this.config = getEntityCrudConfig();\n }\n\n ngOnInit() {}\n\n ngOnDestroy(): void {\n this.sub$.unsubscribe();\n }\n\n show(entity: TEntity | undefined, params?: any) {\n this.entity.set(entity);\n if (params && params?.title) {\n this.title.set(params.title);\n } else {\n firstValueFrom(this._itemLabel()).then((itemLabel) => {\n this.title.set(\n this.transloco.translate(entity ? 'editItem' : 'newItem', {\n item: itemLabel,\n })\n );\n });\n // this.title.set(entity ? this.config.i18n.editItemLabel(this.itemLabel()) : this.config.i18n.newItemLabel(this.itemLabel()));\n // this.title.set(\n // this.transloco.translate(entity ? 'editItem' : 'newItem', {\n // item: this.itemLabel(),\n // })\n // );\n }\n this.params.set(params);\n this.createClientView();\n }\n\n close(cancel: boolean) {\n this.entityCrudComponentBase().closeCreateEdit(cancel);\n // destroy the client's form component\n this.destroyClientView();\n }\n\n registerCanCancelEditCallback(callback: () => boolean) {\n this.entityCrudComponentBase().registerCanCancelEditCallback(callback);\n }\n\n create(entityValue: any) {\n // console.log(\n // `SPCreateEditEntityHostComponent.create - entity: ${JSON.stringify(\n // entityValue\n // )}`\n // );\n const crudComponent = this.entityCrudComponentBase();\n return crudComponent\n ?.create(entityValue)\n .pipe(tap(() => this.close(false)));\n }\n\n update(id: any, entityValue: any) {\n // console.log(\n // `SPCreateEditEntityHostComponent.update - id: ${String(\n // id\n // )}, entity: ${entityValue}`\n // );\n const crudComponent = this.entityCrudComponentBase();\n return crudComponent\n ?.update(id, entityValue)\n .pipe(tap(() => this.close(false)));\n }\n\n /**\n * Creates the client view provided via template\n */\n createClientView() {\n /** Render preview component if one was provided */\n const ft = this.clientViewTemplate();\n const vc = this.vc();\n if (ft && vc) {\n this.clientFormView = vc.createEmbeddedView(ft, {\n $implicit: {\n bridge: this,\n entity: this.entity(),\n params: this.params(),\n },\n });\n this.clientFormView.detectChanges();\n }\n }\n\n destroyClientView() {\n if (this.clientFormView) {\n this.clientFormView.destroy();\n this.clientFormView = null;\n }\n }\n\n onClose() {\n // Can we give the client form component a chance to intercept this\n // and cancel the closure?\n if (this.entityCrudComponentBase().canCancelEdit()) {\n this.entityCrudComponentBase().closeCreateEdit(true);\n this.destroyClientView();\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EmbeddedViewRef,\n input,\n OnDestroy,\n OnInit,\n signal,\n TemplateRef,\n viewChild,\n ViewContainerRef\n} from '@angular/core';\nimport { SPMatEntityCrudComponentBase } from './mat-entity-crud-internal-types';\n\n@Component({\n imports: [],\n selector: 'sp-entity-crud-preview-host',\n template: ` <ng-container #previewComponent></ng-container> `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PreviewHostComponent<TEntity> implements OnInit, OnDestroy {\n vc = viewChild('previewComponent', { read: ViewContainerRef });\n\n entityCrudComponentBase = input.required<SPMatEntityCrudComponentBase<TEntity>>();\n clientViewTemplate = input<TemplateRef<any> | null>(null);\n entity = signal<TEntity|undefined>(undefined);\n clientView!: EmbeddedViewRef<any> | null;\n\n constructor() {\n // effect(() => {\n // const tmpl = this.clientViewTemplate();\n // this.createClientView(tmpl);\n // });\n }\n\n ngOnInit(): void {}\n\n ngOnDestroy(): void {}\n\n show(entity: TEntity|undefined, params?: any) {\n this.entity.set(entity);\n // if (params && params?.title) {\n // this.title.set(params.title);\n // } else {\n // this.title.set(entity ? this.config.i18n.editItemLabel(this.itemLabel()) : this.config.i18n.newItemLabel(this.itemLabel()));\n // }\n // this.params.set(params);\n this.createClientView();\n }\n\n close() {\n // this.entityCrudComponentBase().closeCreateEdit(cancel);\n // destroy the client's form component\n this.destroyClientView();\n }\n\n private createClientView() {\n if (this.clientView) {\n // We have only one view in the ng-container. So we might as well\n // call clear() to remove all views contained in it.\n this.vc()!.clear();\n this.clientView.destroy();\n }\n /** Render preview component if one was provided */\n const ft = this.clientViewTemplate();\n const vc = this.vc();\n if (ft && vc) {\n this.clientView = this.vc()!.createEmbeddedView(\n ft,\n {\n $implicit: {\n entity: this.entity(),\n entityCrudComponent: this.entityCrudComponentBase(),\n },\n }\n );\n this.clientView.detectChanges();\n }\n }\n\n\n destroyClientView() {\n if (this.clientView) {\n this.clientView.destroy();\n this.clientView = null;\n }\n }\n\n // close() {\n // this.closePreview.emit();\n // }\n}\n","import { CommonModule } from '@angular/common';\nimport { HttpClient, HttpContext, HttpContextToken } from '@angular/common/http';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n ContentChildren,\n effect,\n EventEmitter,\n inject,\n Injector,\n input,\n Output,\n QueryList,\n signal,\n TemplateRef,\n viewChild,\n viewChildren\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatColumnDef, MatTableModule } from '@angular/material/table';\nimport { RouterModule } from '@angular/router';\nimport {\n showBusyWheelUntilComplete,\n SPMatHostBusyWheelDirective\n} from '@smallpearl/ngx-helper/mat-busy-wheel';\nimport {\n SPContextMenuItem,\n SPMatContextMenuComponent,\n} from '@smallpearl/ngx-helper/mat-context-menu';\nimport { SPMatEntityListComponent } from '@smallpearl/ngx-helper/mat-entity-list';\n\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { provideTranslocoScope, TranslocoModule, TranslocoService } from '@jsverse/transloco';\nimport { SPEntityFieldSpec } from '@smallpearl/ngx-helper/entity-field';\nimport { AngularSplitModule } from 'angular-split';\nimport { startCase } from 'lodash';\nimport { plural } from 'pluralize';\nimport { firstValueFrom, map, Observable, of, Subscription, switchMap, tap } from 'rxjs';\nimport { getEntityCrudConfig } from './default-config';\nimport { FormViewHostComponent } from './form-view-host.component';\nimport { SPMatEntityCrudComponentBase } from './mat-entity-crud-internal-types';\nimport {\n ALLOW_ITEM_ACTION_FN,\n CRUD_OP_FN,\n CrudOp,\n NewItemSubType,\n SP_MAT_ENTITY_CRUD_HTTP_CONTEXT,\n SPMatEntityCrudConfig,\n SPMatEntityCrudResponseParser,\n} from './mat-entity-crud-types';\nimport { PreviewHostComponent } from './preview-host.component';\n\n@Component({\n imports: [\n CommonModule,\n RouterModule,\n MatButtonModule,\n MatTableModule,\n MatSortModule,\n MatMenuModule,\n MatSnackBarModule,\n MatIconModule,\n TranslocoModule,\n AngularSplitModule,\n SPMatEntityListComponent,\n SPMatContextMenuComponent,\n FormViewHostComponent,\n SPMatHostBusyWheelDirective,\n PreviewHostComponent,\n ],\n providers: [provideTranslocoScope('sp-mat-entity-crud')],\n selector: 'sp-mat-entity-crud',\n template: `\n <as-split direction=\"horizontal\" [gutterSize]=\"6\" *transloco=\"let t\">\n <as-split-area\n [size]=\"entitiesPaneWidth()\"\n [visible]=\"!entitiesPaneHidden()\"\n >\n <div [class]=\"listPaneWrapperClass()\">\n <ng-content select=\"[breadCrumbs]\"></ng-content>\n\n <ng-template #defaultActionButtons>\n <div class=\"action-bar-actions\">\n @if (!disableCreate()) { @if (newItemSubTypes()) {\n <!-- New {{item}} displays a dropdown menu from which the subtype can be selected -->\n <button\n type=\"button\"\n mat-raised-button\n color=\"primary\"\n [matMenuTriggerFor]=\"newSubTypesMenu\"\n >\n {{\n newItemLabel() ??\n t('spMatEntityCrud.newItem', {\n item: _itemLabel() | async\n })\n }}\n <mat-icon>expand_circle_down</mat-icon>\n </button>\n <mat-menu #newSubTypesMenu=\"matMenu\">\n @for (subtype of newItemSubTypes(); track $index) { @if\n (subtype.role) {\n <button mat-menu-item (click)=\"handleNewItemSubType(subtype)\">\n {{ subtype.label }}\n </button>\n } @else {\n <div style=\"padding: .2em 0.5em;\">\n <strong>{{ subtype.label }}</strong>\n </div>\n } }\n </mat-menu>\n } @else {\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"onCreate($event)\"\n [routerLink]=\"newItemLink()\"\n >\n {{\n newItemLabel() ??\n t('spMatEntityCrud.newItem', {\n item: _itemLabel() | async\n })\n }}\n <mat-icon>add_circle</mat-icon>\n </button>\n } }\n </div>\n </ng-template>\n\n <ng-template #defaultHeaderTemplate>\n <div class=\"action-bar\">\n <div class=\"action-bar-title\">\n {{ _title() | async }}\n </div>\n <span class=\"spacer\"></span>\n <!-- Hide the action buttons when Preview/Edit pane is active -->\n @if (!entityPaneActive()) {\n <ng-container\n [ngTemplateOutlet]=\"actionsTemplate() || defaultActionButtons\"\n ></ng-container>\n }\n </div>\n </ng-template>\n <ng-container\n [ngTemplateOutlet]=\"headerTemplate() || defaultHeaderTemplate\"\n ></ng-container>\n <sp-mat-entity-list\n #entitiesList\n [entityName]=\"entityName()\"\n [entityNamePlural]=\"entityNamePlural()\"\n [deferViewInit]=\"true\"\n [endpoint]=\"endpoint()\"\n [entityLoaderFn]=\"entityLoaderFn()\"\n [columns]=\"columnsWithAction()\"\n [displayedColumns]=\"visibleColumns()\"\n [idKey]=\"idKey()\"\n [pagination]=\"pagination()\"\n [paginator]=\"paginator()\"\n [pageSize]=\"pageSize()\"\n [sorter]=\"sorter()\"\n [disableSort]=\"disableSort()\"\n (selectEntity)=\"handleSelectEntity($event)\"\n [httpReqContext]=\"httpReqContext()\"\n >\n </sp-mat-entity-list>\n </div>\n\n <!--\n We'll be initializing the contentColumnDefs separately and not\n relying on <sp-mat-entity-list>'s internal @ContentChildre() querylist\n for building this. So we define this independenly and not as\n <sp-mat-entity-list> content.\n -->\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element\">\n <!-- <button\n mat-icon-button\n hoverDropDown\n >\n <mat-icon>more_vert</mat-icon>\n </button> -->\n <sp-mat-context-menu\n [menuItems]=\"_itemActions\"\n (selected)=\"onItemAction($event, element)\"\n [contextData]=\"element\"\n [hasBackdrop]=\"true\"\n ></sp-mat-context-menu>\n </td>\n </ng-container>\n </as-split-area>\n <as-split-area [size]=\"entityPaneWidth()\" [visible]=\"entityPaneActive()\">\n <div\n [class]=\"previewPaneWrapperClass()\"\n spHostBusyWheel=\"formBusyWheel\"\n >\n <sp-entity-crud-preview-host\n [ngClass]=\"createEditViewActive() ? 'd-none' : 'd-inherit'\"\n [entityCrudComponentBase]=\"this\"\n [clientViewTemplate]=\"previewTemplate()!\"\n ></sp-entity-crud-preview-host>\n <!-- Create/Edit Entity -->\n <sp-create-edit-entity-host\n [ngClass]=\"createEditViewActive() ? 'd-inherit' : 'd-none'\"\n itemLabel=\"{{ _itemLabel() | async }}\"\n itemLabelPlural=\"{{ _itemLabelPlural() | async }}\"\n [entityCrudComponentBase]=\"this\"\n [clientViewTemplate]=\"createEditFormTemplate()\"\n ></sp-create-edit-entity-host>\n </div>\n </as-split-area>\n </as-split>\n `,\n styles: `\n .d-none {\n display: none;\n }\n .d-inherit {\n display: inherit;\n }\n .action-bar {\n display: flex;\n flex-direction: row;\n align-items: center;\n padding-bottom: 0.5em;\n }\n .action-bar-title {\n font-size: 1.5em;\n font-weight: 600;\n }\n .spacer {\n flex-grow: 1;\n }\n .action-bar-actions {\n text-align: end;\n }\n .active-row {\n font-weight: bold;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SPMatEntityCrudComponent<\n TEntity extends { [P in IdKey]: PropertyKey },\n IdKey extends string = 'id'\n >\n extends SPMatEntityListComponent<TEntity, IdKey>\n implements SPMatEntityCrudComponentBase<TEntity>, AfterViewInit\n{\n // entityName = input.required<string>();\n // entityNamePlural = input<string>();\n\n itemLabel = input<string | Observable<string>>();\n itemLabelPlural = input<string | Observable<string>>();\n\n /**\n * Title string displayed above the component. If not specified, will use\n * itemLabelPlural() as the title.\n */\n title = input<string | Observable<string>>();\n /**\n *\n */\n itemActions = input<SPContextMenuItem[]>([]);\n /**\n * Specify the list of router paths that will be set as the value for\n * [routerLink] for the 'New {{ item }}' button. If not specified,\n * if createEditTemplate is specified, it will be shown. If not, `action`\n * out event will be raised with `{ role: '_new_' }`.\n */\n newItemLink = input<string | string[]>();\n /**\n * If not specified, will default to 'New <itemLabel()>'.\n */\n newItemLabel = input<string | string[]>();\n /**\n * Text for the Edit <item> pane title\n */\n editItemTitle = input<string>();\n /**\n * If you want \"New {{item}}\" button to support multiple entity types,\n * you can set this to `NewItemSubType[]`, where each element stands for for\n * a dropdown menu item. Refer to `NewItemSubType` for details on this\n * interface.\n */\n newItemSubTypes = input<NewItemSubType[]>();\n /**\n * If you want to take control of the network operations for the CRUD\n * operations (GET/CREATE/UPDATE/DELETE), provide a value for this property.\n */\n crudOpFn = input<CRUD_OP_FN<TEntity, IdKey>>();\n /**\n * Item preview template.\n */\n previewTemplate = input<TemplateRef<any>>();\n /**\n * Whether to allow a context menu action or not. Return false to disable\n * the action.\n */\n allowEntityActionFn = input<ALLOW_ITEM_ACTION_FN<TEntity>>();\n /**\n * A template that allows the header to be replaced. Usage:-\n *\n * ```\n * <sp-map-entity-crud\n * [headerTemplate]=\"myCrudViewHeader\"\n * ></sp-map-entity-crud>\n * <ng-template #myCrudViewHeader>...</ng-template>\n * ```\n */\n headerTemplate = input<TemplateRef<any>>();\n /**\n * Set this to the custom template identifier that will replace the\n * \"New {{Item}}\" button portion. This template will expand towards the\n * title which will be placed to its left (right in rtl).\n *\n * ```\n * <sp-map-entity-crud\n * [actionsTemplate]=\"myCrudActions\"\n * ></sp-map-entity-crud>\n * <ng-template #myCrudActions>...</ng-template>\n * ```\n */\n actionsTemplate = input<TemplateRef<any>>();\n\n /**\n * CRUD action response parser. This will be called with the response\n * from CREATE & UPDATE operations to parse the response JSON and return\n * the created/updated TEntity.\n */\n crudResponseParser = input<SPMatEntityCrudResponseParser>();\n /**\n * An ng-template name that contains the component which provides the\n * create/edit CRUD action.\n *\n * ```\n * <ng-template #createEdit let-data>\n * <app-create-edit-entity-demo [bridge]=\"data.bridge\" [entity]=\"data.entity\"></app-create-edit-entity-demo>\n * </ng-template>\n * ```\n * Note how [bridge] & [entity] properties are set deriving them from the\n * implicit template context. [entity] will be undefined for Create\n * opreation and will be the valid entity for an Update.\n * (app-create-edit-entity-demo here is the client code that implements the\n * Create/Edit form)\n */\n createEditFormTemplate = input<TemplateRef<any> | null>(null);\n /**\n * Disables the per item actions column, preventing 'Edit' & 'Delete'\n * (and other user defined) item operations.\n */\n disableItemActions = input<boolean>(false);\n /**\n * Disables the Create function.\n */\n disableCreate = input<boolean>(false);\n /**\n * View refresh policy after a CREATE/UPDATE operation. Values\n * 'none' - Objects are not refreshed after an edit operation. The return\n * value of the edit operation is used as the object to\n * add/update the component's internal store. This is the default.\n * 'object' - Refresh just the object that was returned from the\n * CREATE/UPDATE operation. Use this if the JSON object returned\n * after a successful CREATE/UPDATE op differs from the JSON\n * object returned for the GET request.\n * 'all' - Refresh the entire list after a CREATE/UPDATE operation. This\n * mimics the behaviour of legacy HTML apps with pure server\n * defined UI.\n */\n refreshAfterEdit = input<'none' | 'object' | 'all'>('none');\n /**\n * HttpContext for crud requests - list, create, retrieve, update & delete.\n * The value can be an object where the property names reflect the CRUD\n * methods with each of these keys taking\n * `[[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]` as its\n * value. This object has a special key 'crud', which if given a value for,\n * would be used for all CRUD requests (CREATE|READ|UPDATE|DELETE).\n *\n * Alternatively the property can be set a\n * `[[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]` as its\n * value, in which case the same context would be used for all HTTP requests.\n */\n crudHttpReqContext = input<\n | [[HttpContextToken<any>, any]]\n | [HttpContextToken<any>, any]\n | {\n // list?: [[HttpContextToken<any>, any]] | [HttpContextToken<any>, any];\n // crud?: [[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]; // common context for all crud operations\n create?: [[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]; // CREATE\n retrieve?:\n | [[HttpContextToken<any>, any]]\n | [HttpContextToken<any>, any]; // RETRIEVE\n update?: [[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]; // UPDATE\n delete?: [[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]; // DELETE\n }\n >();\n /**\n * Width of the edit pane as a percentange of the overall <as-split> width.\n */\n editPaneWidth = input<number>(100);\n /**\n * Width of the preview pane as a percentange of the overall <as-split> width.\n */\n previewPaneWidth = input<number>(50);\n\n /**\n * The class class that will be applied to the list pane wrapper.\n */\n listPaneWrapperClass = input<string>('sp-mat-crud-list-pane-wrapper-class');\n\n /**\n * The class class that will be applied to the preview pane wrapper.\n */\n previewPaneWrapperClass = input<string>(\n 'sp-mat-crud-preview-pane-wrapper-class'\n );\n\n /**\n * The class class that will be applied to the preview pane content.\n */\n previewPaneContentClass = input<string>(\n 'sp-mat-crud-preview-pane-content-class'\n );\n\n // INTERNAL PROPERTIES //\n // Derive a label from a camelCase source string. If the camelCase string\n // can be translated, it returns the translated string. If not, the function\n // converts the camelCase to 'Title Case' and returns it.\n private getLabel = (source: string) => {\n const label = this.transloco.translate(source);\n if (label.localeCompare(source) !== 0) {\n // Successful translation, return it\n return label;\n }\n return startCase(source);\n };\n\n _itemLabel = computed<Observable<string>>(() => {\n const itemLabel = this.itemLabel();\n const label = itemLabel ? itemLabel : this.getLabel(this.entityName());\n return label instanceof Observable ? label : of(label);\n });\n _itemLabelPlural = computed<Observable<string>>(() => {\n const itemLabelPlural = this.itemLabelPlural();\n const label = itemLabelPlural\n ? itemLabelPlural\n : this.getLabel(plural(this.entityName()));\n return label instanceof Observable ? label : of(label);\n });\n\n // Computed title\n _title = computed(() => {\n const title = this.title() ? this.title() : this._itemLabelPlural();\n return title instanceof Observable ? title : of(title);\n });\n // endpoint with the QP string removed (if one was provided)\n _endpointSansParams = computed(() => this.endpoint().split('?')[0]);\n _endpointParams = computed(() => {});\n componentColumns = viewChildren(MatColumnDef);\n @ContentChildren(MatColumnDef) _clientColumnDefs!: QueryList<MatColumnDef>;\n\n /**\n * Event raised for user selecting an item action. It's also raised\n * for 'New <Item>' action, if 'newItemLink' property is not set.\n */\n @Output() action = new EventEmitter<{ role: string; entity?: TEntity }>();\n\n /**\n * Event raised when create Create/Edit pane is activated & deactivated.\n * Event contains two flags:-\n * activated - whether the createEdit form view was activated or\n * deactivated.\n * cancelled - whether the form view was cancelled by user. False for this\n * indicates that the form view was closed after a successful\n * edit operation.\n */\n @Output() entityViewPaneActivated = new EventEmitter<{\n activated: boolean;\n cancelled: boolean | undefined;\n mode: 'edit' | 'preview';\n }>();\n\n busyWheelId = `entityCrudBusyWheel-${Date.now()}`;\n sub$ = new Subscription();\n spEntitiesList =\n viewChild<SPMatEntityListComponent<TEntity, IdKey>>('entitiesList');\n\n // Theoritically, we ought to be able to initialize the mat-entities-list\n // columns from ngAfterViewInit lifecycle hook. But for some strange reason\n // when this hook is called, sp-mat-entities-list has not been initialized.\n // Therefore `spEntitiesList()` is null. So we have to use a computed signal,\n // which will be triggered when spEntitiesList() is initialized and use that\n // to initialize the columns.\n spEntitiesListInited = effect(() => {\n if (this.spEntitiesList()) {\n this._initEntitiesList();\n }\n });\n\n crudConfig!: SPMatEntityCrudConfig;\n\n // This is the internal component that will host the createEditFormTemplate\n createEditHostComponent = viewChild(FormViewHostComponent);\n // A flag to toggle the viewport's contents between the mat-table\n // and the create/edit form template.\n createEditViewActive = signal<boolean>(false);\n\n // Whether it's okay to cancel the edit\n canCancelEditCallback!: () => boolean;\n\n // Preview host component\n previewHostComponent = viewChild(PreviewHostComponent);\n previewActive = computed(() => this.previewedEntity() !== undefined);\n previewedEntity = signal<TEntity | undefined>(undefined);\n\n // Whether the pane that hosts the preview/edit-entity template is active.\n // We call it entityPane as it's used to either render a selected entity\n // or to edit one.\n entityPaneActive = computed(\n () => !!this.previewedEntity() || this.createEditViewActive()\n );\n // Effective width of the entity pane.\n entityPaneWidth = computed(() =>\n this.entityPaneActive()\n ? !!this.previewedEntity()\n ? this.previewPaneWidth()\n : this.editPaneWidth()\n : 0\n );\n\n // Width of the pane showing the list of entities. Calculated as\n entitiesPaneWidth = computed(() => 100 - this.entityPaneWidth());\n entitiesPaneHidden = computed(\n () => this.entityPaneActive() && this.entityPaneWidth() === 100\n );\n\n defaultItemCrudActions = signal<SPContextMenuItem[]>([]);\n columnsWithAction = computed(() => {\n const cols: Array<SPEntityFieldSpec<TEntity, IdKey> | string> = JSON.parse(\n JSON.stringify(this.columns())\n );\n // JSON.parse(JSON.strigify()) does not clone function objects. So\n // we've to explicitly copy these over. So this is really a shallow clone\n // as the cloned objects still refers to the function objects in the\n // original object.\n this.columns().forEach((col, index: number, orgColumns) => {\n const orgCol = orgColumns[index];\n if (typeof orgCol !== 'string') {\n const newColumn = cols[index] as SPEntityFieldSpec<TEntity, IdKey>;\n if (orgCol.valueFn) {\n newColumn.valueFn = orgCol.valueFn;\n }\n if (orgCol.valueOptions) {\n newColumn.valueOptions = orgCol.valueOptions;\n }\n }\n });\n const actionDefined =\n cols.find((c) =>\n typeof c === 'string' ? c === 'action' : c.name === 'action'\n ) !== undefined;\n if (!actionDefined && !this.disableItemActions()) {\n cols.push('action');\n }\n return cols;\n });\n // Provide per entity actions as a function so that the actions are\n // enumerated only when the user clicks on the context menu button.\n _itemActions = (entity: TEntity) => this.getItemActions(entity);\n\n // This uses the previewActive signal to compute the visible columns\n // when preview is activated. For now we just hide the 'action' column when\n // preview is active. We can further customize this logic by allowing the\n // client to specify the columns to display when preview is active thereby\n // reducing column clutter when the table width becomes narrower owing to\n // preview pane taking up screen space.\n visibleColumns = computed(() =>\n this.entityPaneActive()\n ? this.columnsWithAction()\n .map((col) => (typeof col === 'string' ? col : col.name))\n .filter((name) => name !== 'action')\n : []\n );\n transloco = inject(TranslocoService);\n\n constructor(\n http: HttpClient,\n private snackBar: MatSnackBar,\n sanitizer: DomSanitizer,\n injector: Injector\n ) {\n super(http, sanitizer, injector);\n this.crudConfig = getEntityCrudConfig();\n if (this.crudConfig?.defaultItemActions) {\n this.defaultItemCrudActions.set(this.crudConfig?.defaultItemActions);\n } else {\n this.defaultItemCrudActions.set([\n {\n label: this.transloco.translate('spMatEntityCrud.edit'),\n role: '_update_',\n },\n {\n label: this.transloco.translate('spMatEntityCrud.delete'),\n role: '_delete_',\n },\n ]);\n }\n }\n\n override ngOnInit() {}\n\n override ngOnDestroy(): void {\n this.sub$.unsubscribe();\n }\n\n /**\n * Override so that we can suppress default action in SPMatEntityListComponent\n */\n override ngAfterViewInit(): void {}\n\n /**\n * If the create/edit entity form is active, it calls its registered\n * canCancelEdit callback to determine if it's okay to cancel the edit.\n * You can use this method from the host component's router guard to\n * ensure that any changes made to the form are not accidentally lost by\n * navigating away from the CRUD page.\n *\n * If your CRUD page has multiple sp-mat-entity-crud components, you have to\n * implement the logic to call this method on the appropriate component.\n *\n * If the the create/edit form is not active, this method returns true.\n * @returns\n */\n canDeactivate() {\n if (this.createEditViewActive()) {\n return this.canCancelEdit();\n }\n return true;\n }\n\n override refresh(force = false) {\n this.spEntitiesList()?.refresh(force);\n }\n\n closeCreateEdit(cancelled: boolean) {\n this.createEditViewActive.set(false);\n this.entityViewPaneActivated.emit({\n activated: false,\n cancelled: !!cancelled,\n mode: 'edit',\n });\n }\n\n canCancelEdit() {\n if (this.canCancelEditCallback) {\n return this.canCancelEditCallback();\n }\n return true;\n }\n\n registerCanCancelEditCallback(callback: () => boolean) {\n this.canCancelEditCallback = callback;\n }\n\n triggerEntityUpdate(entity: TEntity) {\n this.onUpdate(entity);\n }\n\n triggerEntityDelete(entity: TEntity) {\n this.onDelete(entity);\n }\n\n create(entityValue: any) {\n let obs!: Observable<TEntity | null>;\n const crudOpFn = this.crudOpFn();\n if (crudOpFn) {\n obs = crudOpFn('create', undefined, entityValue, this);\n } else {\n obs = this.http.post<TEntity>(this.getUrl(this.endpoint()), entityValue, {\n context: this.getCrudReqHttpContext('create'),\n });\n }\n\n return obs.pipe(\n showBusyWheelUntilComplete('formBusyWheel'),\n switchMap((resp) =>\n resp ? this.doRefreshAfterEdit(resp, 'create') : of(null)\n ),\n tap((entity) => {\n // If pagination is infinite or if the pagination if none or if the\n // count of items in the current page is less than pageSize()\n // wec an safely add the item to the list, which will cause the view\n // render the new item in the mat-table.\n if (entity) {\n this.spEntitiesList()?.addEntity(entity);\n this.snackBar.open(\n this.transloco.translate('spMatEntityCrud.createSuccess', {\n item: this._itemLabel(),\n })\n );\n }\n })\n );\n }\n\n update(id: TEntity[IdKey], entityValue: any) {\n let obs!: Observable<TEntity | null>;\n const crudOpFn = this.crudOpFn();\n if (crudOpFn) {\n obs = crudOpFn('update', id, entityValue, this);\n } else {\n obs = this.http.patch<TEntity>(this.getEntityUrl(id), entityValue, {\n context: this.getCrudReqHttpContext('update'),\n });\n }\n\n return obs.pipe(\n showBusyWheelUntilComplete('formBusyWheel'),\n switchMap((resp) =>\n resp ? this.doRefreshAfterEdit(resp, 'update') : of(null)\n ),\n tap((entity) => {\n if (entity) {\n this.spEntitiesList()?.updateEntity(id, entity);\n this.snackBar.open(\n this.transloco.translate('spMatEntityCrud.updateSuccess', {\n item: this._itemLabel(),\n })\n );\n }\n })\n );\n }\n\n /**\n * Refresh the entity list, after a CRUD CREATE or UPDATE operation.\n * @param resp This is the response from the CRUD operation (CREATE/UPDATE).\n * @param method The CRUD operation post which REFRESH is requested.\n * @returns Observable<TEntity|null>\n */\n doRefreshAfterEdit(resp: any, method: 'create' | 'update') {\n const refreshAfterEdit = this.refreshAfterEdit();\n const entity = this.getCrudOpResponseParser()(\n this.entityName(),\n this.idKey(),\n method,\n resp\n );\n if (refreshAfterEdit === 'object') {\n let obs!: Observable<TEntity>;\n const crudOpFn = this.crudOpFn();\n if (crudOpFn) {\n obs = crudOpFn(\n 'get',\n (entity as any)[this.idKey()],\n undefined,\n this\n ) as Observable<TEntity>;\n } else {\n obs = this.http.get<TEntity>(\n this.getEntityUrl((entity as any)[this.idKey()]),\n { context: this.getCrudReqHttpContext('retrieve') }\n );\n }\n return obs.pipe(\n map((entity) => {\n return this.getCrudOpResponseParser()(\n this.entityName(),\n this.idKey(),\n 'retrieve',\n entity\n );\n })\n );\n } else if (refreshAfterEdit === 'all') {\n this.refresh(true);\n return of(null);\n }\n\n return of(entity);\n }\n\n getCrudOpResponseParser(): SPMatEntityCrudResponseParser {\n if (this.crudResponseParser()) {\n // Without the `as SPMatEntityCrudResponseParser`, TSC will complain.\n return this.crudResponseParser() as SPMatEntityCrudResponseParser;\n }\n // crudConfig will have a parser as our default config provides one.\n return this.crudConfig\n .crudOpResponseParser as SPMatEntityCrudResponseParser;\n }\n\n // SPMatEntityCrudComponentBase interface method. Thunk to the implementation\n // method closePreviewImpl().\n closePreview() {\n this.closePreviewImpl(true);\n }\n\n private closePreviewImpl(toggleEntityListActiveEntity: boolean) {\n if (this.previewedEntity()) {\n if (toggleEntityListActiveEntity) {\n this.spEntitiesList()?.toggleActiveEntity(this.previewedEntity());\n }\n this.previewedEntity.set(undefined);\n this.entityViewPaneActivated.emit({\n activated: false,\n cancelled: undefined,\n mode: 'preview',\n });\n }\n }\n\n onItemAction(role: string, entity: TEntity) {\n if (role === '_update_') {\n this.onUpdate(entity);\n } else if (role === '_delete_') {\n this.onDelete(entity);\n } else {\n this.action.emit({ role, entity });\n }\n }\n\n onCreate(event: Event) {\n // If newItemLink() has not been provided, check if createEditFormTemplate\n // is specified. If it is, load it and make that cover the entire viewport.\n // If that too is not specified, emit an action event with role='_new_'.\n if (!this.newItemLink() || this.newItemLink()?.length == 0) {\n event.preventDefault();\n event.stopImmediatePropagation();\n firstValueFrom(this._itemLabel()).then((itemLabel) => {\n const params = {\n title:\n this.newItemLabel() ??\n this.transloco.translate('spMatEntityCrud.newItem', {\n item: itemLabel\n }),\n };\n this.showCreateEditView(undefined, params);\n if (!this.createEditViewActive()) {\n this.action.emit({ role: '_new_' });\n }\n });\n\n // const params = {\n // title:\n // this.newItemLabel() ??\n // this.transloco.translate('spMatEntityCrud.newItem', {\n // item: this._itemLabel(),\n // }),\n // };\n // this.showCreateEditView(undefined, params);\n }\n }\n\n onUpdate(entity: TEntity) {\n\n firstValueFrom(this._itemLabel()).then((itemLabel) => {\n const params = {\n title:\n this.editItemTitle() ??\n this.transloco.translate('spMatEntityCrud.editItem', {\n item: itemLabel\n }),\n }\n this.showCreateEditView(entity, params);\n if (!this.createEditViewActive()) {\n this.action.emit({ role: '_update_' });\n }\n });\n\n // const params = {\n // title:\n // this.editItemTitle() ??\n // this.transloco.translate('spMatEntityCrud.editItem', {\n // item: this._itemLabel(),\n // }),\n // };\n // this.showCreateEditView(entity, params);\n\n // const tmpl = this.createEditFormTemplate();\n // if (tmpl) {\n // // If preview is active deactivate it\n // if (this.previewActive()) {\n // this.closePreview();\n // }\n // const createEditHost = this.createEditHostComponent();\n // if (tmpl && createEditHost) {\n // createEditHost.show(entity);\n // this.createEditViewActive.set(true);\n // }\n // }\n // if (!this.createEditViewActive()) {\n // this.action.emit({ role: '_update_' });\n // }\n }\n\n /**\n * Show the create/edit component. This is deliberately made public so as to\n * be callable from the client. This allows the client to dynamically\n * set the form edit template and then show the edit pane by calling this\n * method.\n * @param entity\n * @param params\n */\n showCreateEditView(entity?: TEntity | undefined, params?: any) {\n const tmpl = this.createEditFormTemplate();\n if (!this.createEditViewActive() && tmpl) {\n // If preview is active deactivate it\n if (this.previewActive()) {\n this.closePreviewImpl(true);\n }\n const createEditHost = this.createEditHostComponent();\n createEditHost!.show(entity, params);\n this.createEditViewActive.set(true);\n this.entityViewPaneActivated.emit({\n activated: true,\n cancelled: undefined,\n mode: 'edit',\n });\n }\n }\n\n showPreviewView(entity?: TEntity, params?: any) {\n const tmpl = this.previewTemplate();\n if (tmpl) {\n if (!this.createEditViewActive()) {\n const previewHost = this.previewHostComponent();\n this.previewedEntity.set(entity);\n previewHost?.show(entity, params);\n this.entityViewPaneActivated.emit({\n activated: true,\n cancelled: undefined,\n mode: 'preview',\n });\n // this.previewActivated.emit({ entity, activated: true });\n }\n }\n }\n\n hidePreviewView() {\n if (this.previewActive()) {\n const previewHost = this.previewHostComponent();\n previewHost?.close();\n this.closePreviewImpl(false);\n }\n }\n\n async onDelete(entity: TEntity) {\n // Do the delete prompt asynchronously so that the context menu is\n // dismissed before the prompt is displayed.\n setTimeout(() => {\n // We use firstValueFrom() to get the value of the observable\n // synchronously. firstValueFrom() also gracefully cleans up the\n // observable after a value is emitted.\n firstValueFrom(this._itemLabel()).then((itemLabel) => {\n const deletedItemPrompt = this.transloco.translate(\n 'spMatEntityCrud.deleteItemConfirm',\n { item: itemLabel.toLocaleLowerCase() }\n );\n const yes = confirm(deletedItemPrompt);\n if (yes) {\n const entityId = (entity as any)[this.idKey()];\n\n // If preview is active deactivate it\n if (this.previewActive()) {\n this.closePreviewImpl(false);\n }\n\n let obs!: Observable<any>;\n const crudOpFn = this.crudOpFn();\n if (crudOpFn) {\n obs = crudOpFn('delete', entityId, undefined, this);\n } else {\n obs = this.http.delete<void>(this.getEntityUrl(entityId), {\n context: this.getCrudReqHttpContext('delete'),\n });\n }\n\n this.sub$.add(\n obs\n .pipe(\n // TODO: how to display a busy wheel?\n // showBusyWheelUntilComplete(this.busyWheelId),\n tap(() => {\n this.spEntitiesList()!.removeEntity(entityId);\n // TODO: customize by providing an interface via SPMatEntityCrudConfig?\n const deletedMessage = this.transloco.translate(\n 'spMatEntityCrud.deleteItemSuccess',\n { item: this._itemLabel() }\n );\n this.snackBar.open(deletedMessage);\n })\n )\n .subscribe()\n );\n }\n });\n });\n }\n\n override getUrl(endpoint: string) {\n return this.entityListConfig?.urlResolver\n ? this.entityListConfig?.urlResolver(endpoint)\n : endpoint;\n }\n\n getEntityUrl(entityId: TEntity[IdKey]) {\n const endpoint = this.endpoint();\n const endpointParts = endpoint.split('?');\n const entityEndpoint =\n (endpointParts[0].endsWith('/')\n ? endpointParts[0]\n : endpointParts[0] + '/') + `${String(entityId)}/`;\n if (endpointParts.length > 1) {\n return this.getUrl(entityEndpoint + `?${endpointParts[1]}`);\n }\n return this.getUrl(entityEndpoint);\n }\n\n handleSelectEntity(entity: TEntity | undefined) {\n if (!this.createEditViewActive()) {\n if (this.previewTemplate()) {\n entity ? this.showPreviewView(entity) : this.hidePreviewView();\n // this.previewedEntity.set(entity);\n } else {\n // If 'previewTemplate' is not set, propagate the event to client.\n this.selectEntity.emit(entity);\n }\n }\n }\n\n handleNewItemSubType(subtype: NewItemSubType) {\n // console.log(`handleNewItemSubType: ${subtype}`);\n if (subtype.role === '_new_') {\n this.showCreateEditView(undefined, subtype?.params);\n } else {\n this.action.emit({ role: subtype.role });\n }\n }\n\n private getCrudReqHttpContext(op: CrudOp) {\n const contextParamToHttpContext = (\n context: HttpContext,\n reqContext: [[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]\n ) => {\n if (reqContext.length == 2 && !Array.isArray(reqContext[0])) {\n // one dimensional array of a key, value pair.\n context.set(reqContext[0], reqContext[1]);\n } else {\n reqContext.forEach(([k, v]) => context.set(k, v));\n }\n };\n\n let context = new HttpContext();\n const crudHttpReqContext = this.crudHttpReqContext();\n if (crudHttpReqContext) {\n if (Array.isArray(crudHttpReqContext)) {\n // Same HttpContext for all crud requests\n contextParamToHttpContext(context, crudHttpReqContext);\n } else if (\n typeof crudHttpReqContext === 'object' &&\n op &&\n crudHttpReqContext[op]\n ) {\n contextParamToHttpContext(context, crudHttpReqContext[op]!);\n // if (crudHttpReqContext[op]) {\n // context = contextParamToHttpContext(crudHttpReqContext[op] as any);\n // } else if (crudHttpReqContext['crud']) {\n // context = contextParamToHttpContext(crudHttpReqContext['crud'] as any);\n // }\n }\n // } else if (this.httpReqContext()) {\n // context = contextParamToHttpContext(this.httpReqContext()!);\n }\n\n context.set(SP_MAT_ENTITY_CRUD_HTTP_CONTEXT, {\n entityName: this.entityName(),\n entityNamePlural: this._entityNamePlural(),\n endpoint: this.endpoint(),\n op,\n });\n return context;\n // const httpReqContext = this.httpReqContext();\n // return httpReqContext\n // ? contextParamToHttpContext(httpReqContext)\n // : undefined;\n }\n\n isItemActionAllowed(action: string, entity: TEntity) {\n return false;\n }\n\n /**\n * Returns the list of item actions. Calls 'allowItemActionFn' for each action\n * to determine if the action is allowed for the given entity.\n * @returns\n */\n getItemActions(entity: TEntity): SPContextMenuItem[] {\n // console.log(`SPMatEntityCrudComponent.getItemActions - entity: ${JSON.stringify(entity, null, 2)}`);\n const actions =\n this.itemActions() && this.itemActions().length\n ? this.itemActions()\n : this.defaultItemCrudActions();\n let actionsCopy: SPContextMenuItem[] = JSON.parse(JSON.stringify(actions));\n actionsCopy.forEach((action: SPContextMenuItem, index: number) => {\n // localize default action item labels (Update & Delete)\n // Client specified action labels are to be localized by the client\n // before supplying them to the component.\n if (action.label.startsWith('spMatEntityCrud.')) {\n action.label = this.transloco.translate(action.label);\n }\n const orgDisable = actions[index]?.disable;\n action.disable = (entity: TEntity) => {\n if (orgDisable) {\n return orgDisable(entity);\n }\n const allowItemActionFn = this.allowEntityActionFn();\n if (allowItemActionFn) {\n return !allowItemActionFn(entity, action.role ?? action.label);\n }\n return false;\n };\n });\n return actionsCopy;\n }\n\n getPreviewPaneContentClass() {\n return this.previewPaneContentClass();\n }\n\n /**\n * Initialize the columns for the mat-entities-list component. This is\n * called when the <sp-mat-entities-list> component has been properly\n * initialized.\n */\n private _initEntitiesList() {\n const spEntitiesList = this.spEntitiesList();\n if (spEntitiesList) {\n // Build contentColumnDefs using our component's content. Then add our own\n // 'action' column definition to it. Then set this as the value of\n // child SPMatEntityListComponent.contentColumnDef. This way we force\n // SPMatEntityListComponent to use our component's any project MatColumnDef\n // content in the final mat-table.\n const clientColumnDefs = this.clientColumnDefs;\n let contentColumnDefs = new Array<MatColumnDef>();\n if (clientColumnDefs.length) {\n // Note that we process any content projected matColumnDef first and\n // our own internal content later. And when we process our own internal\n // columns (for now only 'action'), it's not added if a column with that\n // name has already been defined via content projection. This allows the\n // clients to override even internal columns with their column defintion.\n clientColumnDefs.toArray().forEach((c) => contentColumnDefs.push(c));\n }\n this.componentColumns().forEach((ic) => {\n if (!contentColumnDefs.find((c) => c.name === ic.name)) {\n contentColumnDefs.push(ic);\n }\n });\n spEntitiesList.contentColumnDefs = contentColumnDefs;\n // This is a replication of SPMatEntityCrudList.ngAfterViewInit. That\n // code is skipped as we declare <sp-mat-entity-list> with\n // deferViewInit=true.\n spEntitiesList.buildColumns();\n spEntitiesList.setupSort();\n spEntitiesList.loadMoreEntities();\n }\n }\n}\n","import { SPContextMenuItem } from \"@smallpearl/ngx-helper/mat-context-menu\";\nimport { Observable } from \"rxjs\";\n\nexport const ITEM_ACTION_UPDATE = '_update_';\nexport const ITEM_ACTION_DELETE = '_delete_';\n\n/**\n * SPMatEntityCrudCreateEditBridge implementer uses this interface to\n * communicate with the parent SPMatEntityCreateComponent. The bridge\n * component would use the hideCreateEdit() to close itself, when user cancels\n * the create/edit operation.\n */\nexport interface SPMatEntityCrudComponentBase<TEntity> {\n /**\n * FormViewHostComponent will call this to close the Create/Edit pane.\n * SPMatEntityCrudComponentBase implementor will destroy the client form\n * view and hide the Create/Edit form view pane and show the hidden\n * entity list view.\n * @returns\n */\n closeCreateEdit: (cancelled: boolean) => void;\n /**\n * Used internally by FormViewHostComponent to determine if the client form\n * view wants to intercept user's cancel the create/edit operation. Perhaps\n * with the Yes/No prompt 'Lose changes?'\n * @returns boolean indicating it's okay to cancel the create/edit operation.\n */\n canCancelEdit: () => boolean;\n /**\n * Client form view can register a callback that will be invoked by the\n * framework when user cancels the create/edit operation by clicking on the\n * close button on the top right.\n * @param callback\n * @returns\n */\n registerCanCancelEditCallback: (callback: () => boolean) => void;\n /**\n * Initiates update on the given entity.\n * @returns\n */\n triggerEntityUpdate: (entity: TEntity) => void;\n /**\n * Initiates entity delete.\n * @returns\n */\n triggerEntityDelete: (entity: TEntity) => void;\n /**\n * Called by client form-view host component to close a new entity.\n * @param entityValue The ReactiveForm.value object that the server expects\n * to create a new object.\n * @returns The new Entity object returned by the server. For typical REST\n * API, this would be of the same shape as the objects returned by the\n * REST's GET request.\n */\n create: (entityValue: any) => Observable<any>;\n /**\n * Called by client form-view host component to close a new entity.\n * @param id The id of the entity being edited.\n * @param entityValue The ReactiveForm.value object that the server expects\n * to update the new object.\n * @returns The new Entity object returned by the server. For typical REST\n * API, this would be of the same shape as the objects returned by the\n * REST's GET request.\n */\n update: (id: any, entityValue: any) => Observable<any>;\n /**\n * Close the preview pane.\n * @returns\n */\n closePreview: () => void;\n /**\n * Returns the context menu items for the entity. This can be used to build\n * the context menu for an entity in its preview pane toolbar.\n * @returns\n */\n getItemActions(entity?: TEntity): SPContextMenuItem[];\n\n /**\n * Returns the class to be used for the preview pane content. This interface\n * is provided to allow the PreviewPaneComponent to access the client\n * configured class for the preview pane content.\n */\n getPreviewPaneContentClass(): string;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { SPContextMenuItem } from '@smallpearl/ngx-helper/mat-context-menu';\nimport {\n ITEM_ACTION_DELETE,\n ITEM_ACTION_UPDATE,\n SPMatEntityCrudComponentBase,\n} from './mat-entity-crud-internal-types';\n\n/**\n * A preview pane container to provide a consistent UX for all preview panes.\n * It consits of a toolbar on the top and a container div below that takes up\n * the rest of the preview pane area.\n */\n@Component({\n imports: [MatToolbarModule, MatButtonModule, MatIconModule],\n selector: 'sp-mat-entity-crud-preview-pane',\n template: `\n <div class=\"preview-wrapper\">\n <mat-toolbar>\n <mat-toolbar-row>\n @if (title()) {\n <h2>{{ title() }}</h2>\n &nbsp; } @if (!hideUpdate()) {\n <button\n mat-icon-button\n aria-label=\"Edit\"\n (click)=\"onEdit()\"\n [disabled]=\"_disableUpdate()\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n } @if (!hideDelete()) {\n <button\n mat-icon-button\n aria-label=\"Delete\"\n (click)=\"onDelete()\"\n [disabled]=\"_disableDelete()\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n }\n <ng-content select=\"[previewToolbarContent]\"></ng-content>\n <span class=\"spacer\"></span>\n <button mat-icon-button aria-label=\"Close\" (click)=\"onClose()\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-toolbar-row>\n </mat-toolbar>\n <div\n [class]=\"\n 'preview-content ' +\n entityCrudComponent().getPreviewPaneContentClass()\n \"\n >\n <ng-content select=\"[previewContent]\"></ng-content>\n </div>\n </div>\n `,\n styles: [\n `\n .preview-wrapper {\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n .spacer {\n flex: 1 1 auto;\n }\n .preview-content {\n flex-grow: 1;\n overflow: scroll;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SPMatEntityCrudPreviewPaneComponent<TEntity>\n implements OnInit, OnDestroy\n{\n entity = input.required<TEntity>();\n entityCrudComponent = input.required<SPMatEntityCrudComponentBase<TEntity>>();\n title = input<string>();\n disableUpdate = input<boolean>(false);\n hideUpdate = input<boolean>(false);\n disableDelete = input<boolean>(false);\n hideDelete = input<boolean>(false);\n itemActions!: SPContextMenuItem[];\n\n _disableActionFactory = (role: string, signal?: InputSignal<boolean>) => {\n return computed(() => {\n if (signal && signal()) {\n return true;\n }\n const actionFn = this.itemActions.find((a) => a.role === role)?.disable;\n if (actionFn && actionFn(this.entity())) {\n return true;\n }\n return false;\n });\n };\n _disableUpdate = this._disableActionFactory(\n ITEM_ACTION_UPDATE,\n this.disableUpdate\n );\n _disableDelete = this._disableActionFactory(\n ITEM_ACTION_DELETE,\n this.disableDelete\n );\n\n ngOnInit() {\n this.itemActions = this.entityCrudComponent().getItemActions();\n }\n\n ngOnDestroy(): void {}\n\n onEdit() {\n this.entityCrudComponent().triggerEntityUpdate(this.entity());\n }\n\n onDelete() {\n this.entityCrudComponent().triggerEntityDelete(this.entity());\n }\n\n onClose() {\n this.entityCrudComponent().closePreview();\n }\n}\n","import { ChangeDetectorRef, Component, computed, inject, input, OnDestroy, OnInit, signal } from '@angular/core';\nimport { AbstractControl, UntypedFormGroup } from '@angular/forms';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { setServerErrorsAsFormErrors } from '@smallpearl/ngx-helper/forms';\nimport { Subscription } from 'rxjs';\nimport { getEntityCrudConfig } from './default-config';\nimport { SPMatEntityCrudCreateEditBridge } from './mat-entity-crud-types';\n\n/**\n * This is a convenience base class that clients can derive from to implement\n * their CRUD form component. Particularly this class registers the change\n * detection hook which will be called when the user attempts to close the\n * form's parent container pane via the Close button on the top right.\n *\n * This button behaves like a Cancel button in a desktop app and therefore if\n * the user has entered any data in the form's controls, (determined by\n * checking form.touched), then a 'Lose Changes' prompt is displayed allowing\n * the user to cancel the closure.\n *\n * The @Component is fake just to keep the VSCode angular linter quiet.\n *\n * To use this class:-\n *\n * 1. Declare a FormGroup<> type as\n *\n * ```\n * type MyForm = FormGroup<{\n * name: FormControl<string>;\n * type: FormControl<string>;\n * notes: FormControl<string>;\n * }>;\n * ```\n *\n * 2. Derive your form's component class from this and implement the\n * createForm() method returing the FormGroup<> instance that matches\n * the FormGroup concrete type above.\n *\n * ```\n * class MyFormComponent extends SPMatEntityCrudFormBase<MyForm, MyEntity> {\n * constructor() {\n * super()\n * }\n *\n * createForm() {\n * return new FormGroup([...])\n * }\n * }\n * ```\n *\n * 3. If you form's value requires manipulation before being sent to the\n * server, override getFormValue() method and do it there before returning\n * the modified values.\n *\n * 4. Wire up the form in the template as:\n *\n * ```\n * <form [formGroup]='form'.. (ngSubmit)=\"onSubmit()\">\n * <button type=\"submit\">Submit</button>\n * </form>\n * ```\n */\n@Component({\n selector: '_#_sp-mat-entity-crud-form-base_#_', template: ``,\n standalone: false\n})\nexport abstract class SPMatEntityCrudFormBase<\n TFormGroup extends AbstractControl,\n TEntity extends { [P in IdKey]: PropertyKey },\n IdKey extends string = 'id'\n> implements OnInit, OnDestroy\n{\n _form = signal<TFormGroup|undefined>(undefined);\n entity = input.required<TEntity>();\n bridge = input.required<SPMatEntityCrudCreateEditBridge>();\n params = input<any>();\n sub$ = new Subscription();\n form = computed(() => this._form());\n crudConfig = getEntityCrudConfig();\n transloco = inject(TranslocoService);\n\n cdr = inject(ChangeDetectorRef);\n\n canCancelEdit = () => {\n return this._canCancelEdit();\n };\n\n _canCancelEdit() {\n const form = this._form();\n if (form && form.touched) {\n return window.confirm(\n this.transloco.translate('spMatEntityCrud.loseChangesConfirm')\n );\n }\n return true;\n }\n\n ngOnInit() {\n this._form.set(this.createForm(this.entity()));\n this.bridge()?.registerCanCancelEditCallback(this.canCancelEdit);\n }\n\n ngOnDestroy() {\n this.sub$.unsubscribe();\n }\n\n // get form(): TFormGroup|undefined {\n // return this._form();\n // }\n\n // set form(f: TFormGroup) {\n // this._form.set(f);\n // }\n\n /**\n * Create the TFormGroup FormGroup class that will be used for the reactive\n * form.\n * @param entity\n */\n abstract createForm(entity: TEntity | undefined): TFormGroup;\n\n /**\n * Override to customize the id key name if it's not 'id'\n * @returns The name of the unique identifier key that will be used to\n * extract the entity's id for UPDATE operation.\n */\n getIdKey() {\n return 'id';\n }\n\n /**\n * Return the form's value to be sent to server as Create/Update CRUD\n * operation data.\n * @returns\n */\n getFormValue() {\n const form = this.form()\n return form ? form.value : undefined;\n }\n\n onSubmit() {\n const value = this.getFormValue();\n const obs = !this.entity()\n ? this.bridge()?.create(value)\n : this.bridge()?.update((this.entity() as any)[this.getIdKey()], value);\n this.sub$.add(\n obs\n ?.pipe(\n setServerErrorsAsFormErrors(this._form() as unknown as UntypedFormGroup, this.cdr)\n )\n .subscribe()\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i6","i9","i3"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0Ja,MAAA,+BAA+B,GAC1C,IAAI,gBAAgB,CAA6B,OAAO;AACtD,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,gBAAgB,EAAE,EAAE;AACpB,IAAA,QAAQ,EAAE,EAAE;AACZ,IAAA,EAAE,EAAE,SAAS;AACd,CAAA,CAAC;;MC7JS,yBAAyB,GAAG,IAAI,cAAc,CAAwB,uBAAuB;;ACC1G,SAAS,yBAAyB,CAChC,UAAkB,EAClB,KAAa,EACb,MAAmD,EACnD,IAAS,EAAA;;;AAIT,IAAA,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;AAC9B,QAAA,OAAO,IAAI;;;;AAIb,IAAA,IAAI,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE;AACnC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;AAC5B,QAAA,IAAI,GAAG,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;AAC7B,YAAA,OAAO,GAAG;;;;AAId,IAAA,OAAO,SAAS;AAClB;AAEO,MAAM,4BAA4B,GAA0B;AACjE,IAAA,oBAAoB,EAAE;CACvB;AAED;;;;;AAKG;SACa,mBAAmB,GAAA;AACjC,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,yBAAyB,EAAE;AACvD,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;IACF,OAAO;AACL,QAAA,GAAG,4BAA4B;AAC/B,QAAA,IAAI,cAAc,IAAI,EAAE,CAAC;KAC1B;AACH;;MCuBa,qBAAqB,CAAA;AAGhC,IAAA,uBAAuB,GACrB,KAAK,CAAC,QAAQ,EAAyC;AACzD,IAAA,kBAAkB,GAAG,KAAK,CAA0B,IAAI,CAAC;AACzD,IAAA,SAAS,GAAG,KAAK,CAAC,QAAQ,EAA+B;AACzD,IAAA,eAAe,GAAG,KAAK,CAAC,QAAQ,EAA+B;AAE/D,IAAA,UAAU,GAAG,QAAQ,CAAqB,MAAK;AAC7C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE;AAC9B,QAAA,OAAO,KAAK,YAAY,UAAU,GAAG,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;AACxD,KAAC,CAAC;AACF,IAAA,gBAAgB,GAAG,QAAQ,CAAqB,MAAK;AACnD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,EAAE;AACpC,QAAA,OAAO,KAAK,YAAY,UAAU,GAAG,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;AACxD,KAAC,CAAC;AAEF,IAAA,MAAM,GAAG,MAAM,CAAsB,SAAS,CAAC;AAC/C,IAAA,KAAK,GAAG,MAAM,CAAS,EAAE,CAAC;AAC1B,IAAA,MAAM,GAAG,MAAM,CAAM,SAAS,CAAC;AAC/B,IAAA,cAAc;IACd,EAAE,GAAG,SAAS,CAAC,qBAAqB,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;AACjE,IAAA,MAAM;AACN,IAAA,IAAI,GAAG,IAAI,YAAY,EAAE;AACzB,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAEpC,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,MAAM,GAAG,mBAAmB,EAAE;;AAGrC,IAAA,QAAQ;IAER,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;;IAGzB,IAAI,CAAC,MAA2B,EAAE,MAAY,EAAA;AAC5C,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;AACvB,QAAA,IAAI,MAAM,IAAI,MAAM,EAAE,KAAK,EAAE;YAC3B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC;;aACvB;AACL,YAAA,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAI;gBACnD,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,UAAU,GAAG,SAAS,EAAE;AACxD,oBAAA,IAAI,EAAE,SAAS;AAChB,iBAAA,CAAC,CACH;AACH,aAAC,CAAC;;;;;;;;AAQJ,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;QACvB,IAAI,CAAC,gBAAgB,EAAE;;AAGzB,IAAA,KAAK,CAAC,MAAe,EAAA;QACnB,IAAI,CAAC,uBAAuB,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC;;QAEtD,IAAI,CAAC,iBAAiB,EAAE;;AAG1B,IAAA,6BAA6B,CAAC,QAAuB,EAAA;QACnD,IAAI,CAAC,uBAAuB,EAAE,CAAC,6BAA6B,CAAC,QAAQ,CAAC;;AAGxE,IAAA,MAAM,CAAC,WAAgB,EAAA;;;;;;AAMrB,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,uBAAuB,EAAE;AACpD,QAAA,OAAO;cACH,MAAM,CAAC,WAAW;AACnB,aAAA,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;;IAGvC,MAAM,CAAC,EAAO,EAAE,WAAgB,EAAA;;;;;;AAM9B,QAAA,MAAM,aAAa,GAAG,IAAI,CAAC,uBAAuB,EAAE;AACpD,QAAA,OAAO;AACL,cAAE,MAAM,CAAC,EAAE,EAAE,WAAW;AACvB,aAAA,IAAI,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;;AAGvC;;AAEG;IACH,gBAAgB,GAAA;;AAEd,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACpC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE;AACpB,QAAA,IAAI,EAAE,IAAI,EAAE,EAAE;YACZ,IAAI,CAAC,cAAc,GAAG,EAAE,CAAC,kBAAkB,CAAC,EAAE,EAAE;AAC9C,gBAAA,SAAS,EAAE;AACT,oBAAA,MAAM,EAAE,IAAI;AACZ,oBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrB,oBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACtB,iBAAA;AACF,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE;;;IAIvC,iBAAiB,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;AAC7B,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI;;;IAI9B,OAAO,GAAA;;;QAGL,IAAI,IAAI,CAAC,uBAAuB,EAAE,CAAC,aAAa,EAAE,EAAE;YAClD,IAAI,CAAC,uBAAuB,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC;YACpD,IAAI,CAAC,iBAAiB,EAAE;;;0HA7HjB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;8GAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,IAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EAsBc,gBAAgB,EA1DpD,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA;;;;;;;;;;;;;;;AAeT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,8LAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EArBC,YAAY,EACZ,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,eAAe,EACf,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAa,oLACb,2BAA2B,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAuClB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBA5CjC,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,OAAA,EAAA;wBACP,YAAY;wBACZ,eAAe;wBACf,aAAa;wBACb,2BAA2B;AAC5B,qBAAA,EAAA,QAAA,EACS,4BAA4B,EAC5B,QAAA,EAAA;;;;;;;;;;;;;;;GAeT,EAmBgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,8LAAA,CAAA,EAAA;;;MC9CpC,oBAAoB,CAAA;IAC/B,EAAE,GAAG,SAAS,CAAC,kBAAkB,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;AAE9D,IAAA,uBAAuB,GAAG,KAAK,CAAC,QAAQ,EAAyC;AACjF,IAAA,kBAAkB,GAAG,KAAK,CAA0B,IAAI,CAAC;AACzD,IAAA,MAAM,GAAG,MAAM,CAAoB,SAAS,CAAC;AAC7C,IAAA,UAAU;AAEV,IAAA,WAAA,GAAA;;;;;;AAOA,IAAA,QAAQ;AAER,IAAA,WAAW;IAEX,IAAI,CAAC,MAAyB,EAAE,MAAY,EAAA;AAC1C,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;;;;;;;QAOvB,IAAI,CAAC,gBAAgB,EAAE;;IAGzB,KAAK,GAAA;;;QAGH,IAAI,CAAC,iBAAiB,EAAE;;IAGlB,gBAAgB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;;;AAGnB,YAAA,IAAI,CAAC,EAAE,EAAG,CAAC,KAAK,EAAE;AAClB,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;;;AAG3B,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,kBAAkB,EAAE;AACpC,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE;AACpB,QAAA,IAAI,EAAE,IAAI,EAAE,EAAE;YACZ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,EAAG,CAAC,kBAAkB,CAC7C,EAAE,EACF;AACE,gBAAA,SAAS,EAAE;AACT,oBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AACrB,oBAAA,mBAAmB,EAAE,IAAI,CAAC,uBAAuB,EAAE;AACpD,iBAAA;AACF,aAAA,CACF;AACD,YAAA,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE;;;IAKnC,iBAAiB,GAAA;AACf,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE;AACzB,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI;;;0HAhEf,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;8GAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,IAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EACY,gBAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAJ/C,CAAmD,iDAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAGpD,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,OAAO,EAAE,EAAE;AACX,oBAAA,QAAQ,EAAE,6BAA6B;AACvC,oBAAA,QAAQ,EAAE,CAAmD,iDAAA,CAAA;oBAC7D,eAAe,EAAE,uBAAuB,CAAC;AAC5C,iBAAA;;;ACsOK,MAAO,wBAIX,SAAQ,wBAAwC,CAAA;AAqVtC,IAAA,QAAA;;;IA/UV,SAAS,GAAG,KAAK,EAA+B;IAChD,eAAe,GAAG,KAAK,EAA+B;AAEtD;;;AAGG;IACH,KAAK,GAAG,KAAK,EAA+B;AAC5C;;AAEG;AACH,IAAA,WAAW,GAAG,KAAK,CAAsB,EAAE,CAAC;AAC5C;;;;;AAKG;IACH,WAAW,GAAG,KAAK,EAAqB;AACxC;;AAEG;IACH,YAAY,GAAG,KAAK,EAAqB;AACzC;;AAEG;IACH,aAAa,GAAG,KAAK,EAAU;AAC/B;;;;;AAKG;IACH,eAAe,GAAG,KAAK,EAAoB;AAC3C;;;AAGG;IACH,QAAQ,GAAG,KAAK,EAA8B;AAC9C;;AAEG;IACH,eAAe,GAAG,KAAK,EAAoB;AAC3C;;;AAGG;IACH,mBAAmB,GAAG,KAAK,EAAiC;AAC5D;;;;;;;;;AASG;IACH,cAAc,GAAG,KAAK,EAAoB;AAC1C;;;;;;;;;;;AAWG;IACH,eAAe,GAAG,KAAK,EAAoB;AAE3C;;;;AAIG;IACH,kBAAkB,GAAG,KAAK,EAAiC;AAC3D;;;;;;;;;;;;;;AAcG;AACH,IAAA,sBAAsB,GAAG,KAAK,CAA0B,IAAI,CAAC;AAC7D;;;AAGG;AACH,IAAA,kBAAkB,GAAG,KAAK,CAAU,KAAK,CAAC;AAC1C;;AAEG;AACH,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,CAAC;AACrC;;;;;;;;;;;;AAYG;AACH,IAAA,gBAAgB,GAAG,KAAK,CAA4B,MAAM,CAAC;AAC3D;;;;;;;;;;;AAWG;IACH,kBAAkB,GAAG,KAAK,EAavB;AACH;;AAEG;AACH,IAAA,aAAa,GAAG,KAAK,CAAS,GAAG,CAAC;AAClC;;AAEG;AACH,IAAA,gBAAgB,GAAG,KAAK,CAAS,EAAE,CAAC;AAEpC;;AAEG;AACH,IAAA,oBAAoB,GAAG,KAAK,CAAS,qCAAqC,CAAC;AAE3E;;AAEG;AACH,IAAA,uBAAuB,GAAG,KAAK,CAC7B,wCAAwC,CACzC;AAED;;AAEG;AACH,IAAA,uBAAuB,GAAG,KAAK,CAC7B,wCAAwC,CACzC;;;;;AAMO,IAAA,QAAQ,GAAG,CAAC,MAAc,KAAI;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC;QAC9C,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;;AAErC,YAAA,OAAO,KAAK;;AAEd,QAAA,OAAO,SAAS,CAAC,MAAM,CAAC;AAC1B,KAAC;AAED,IAAA,UAAU,GAAG,QAAQ,CAAqB,MAAK;AAC7C,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,QAAA,MAAM,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;AACtE,QAAA,OAAO,KAAK,YAAY,UAAU,GAAG,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;AACxD,KAAC,CAAC;AACF,IAAA,gBAAgB,GAAG,QAAQ,CAAqB,MAAK;AACnD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE;QAC9C,MAAM,KAAK,GAAG;AACZ,cAAE;AACF,cAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;AAC5C,QAAA,OAAO,KAAK,YAAY,UAAU,GAAG,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;AACxD,KAAC,CAAC;;AAGF,IAAA,MAAM,GAAG,QAAQ,CAAC,MAAK;QACrB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,gBAAgB,EAAE;AACnE,QAAA,OAAO,KAAK,YAAY,UAAU,GAAG,KAAK,GAAG,EAAE,CAAC,KAAK,CAAC;AACxD,KAAC,CAAC;;AAEF,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnE,eAAe,GAAG,QAAQ,CAAC,MAAO,GAAC,CAAC;AACpC,IAAA,gBAAgB,GAAG,YAAY,CAAC,YAAY,CAAC;AACd,IAAA,iBAAiB;AAEhD;;;AAGG;AACO,IAAA,MAAM,GAAG,IAAI,YAAY,EAAsC;AAEzE;;;;;;;;AAQG;AACO,IAAA,uBAAuB,GAAG,IAAI,YAAY,EAIhD;AAEJ,IAAA,WAAW,GAAG,CAAuB,oBAAA,EAAA,IAAI,CAAC,GAAG,EAAE,EAAE;AACjD,IAAA,IAAI,GAAG,IAAI,YAAY,EAAE;AACzB,IAAA,cAAc,GACZ,SAAS,CAA2C,cAAc,CAAC;;;;;;;AAQrE,IAAA,oBAAoB,GAAG,MAAM,CAAC,MAAK;AACjC,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE;YACzB,IAAI,CAAC,iBAAiB,EAAE;;AAE5B,KAAC,CAAC;AAEF,IAAA,UAAU;;AAGV,IAAA,uBAAuB,GAAG,SAAS,CAAC,qBAAqB,CAAC;;;AAG1D,IAAA,oBAAoB,GAAG,MAAM,CAAU,KAAK,CAAC;;AAG7C,IAAA,qBAAqB;;AAGrB,IAAA,oBAAoB,GAAG,SAAS,CAAC,oBAAoB,CAAC;AACtD,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,KAAK,SAAS,CAAC;AACpE,IAAA,eAAe,GAAG,MAAM,CAAsB,SAAS,CAAC;;;;AAKxD,IAAA,gBAAgB,GAAG,QAAQ,CACzB,MAAM,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAC9D;;IAED,eAAe,GAAG,QAAQ,CAAC,MACzB,IAAI,CAAC,gBAAgB;AACnB,UAAE,CAAC,CAAC,IAAI,CAAC,eAAe;AACtB,cAAE,IAAI,CAAC,gBAAgB;AACvB,cAAE,IAAI,CAAC,aAAa;UACpB,CAAC,CACN;;AAGD,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;AAChE,IAAA,kBAAkB,GAAG,QAAQ,CAC3B,MAAM,IAAI,CAAC,gBAAgB,EAAE,IAAI,IAAI,CAAC,eAAe,EAAE,KAAK,GAAG,CAChE;AAED,IAAA,sBAAsB,GAAG,MAAM,CAAsB,EAAE,CAAC;AACxD,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAK;AAChC,QAAA,MAAM,IAAI,GAAsD,IAAI,CAAC,KAAK,CACxE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAC/B;;;;;AAKD,QAAA,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAa,EAAE,UAAU,KAAI;AACxD,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC;AAChC,YAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AAC9B,gBAAA,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAsC;AAClE,gBAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,oBAAA,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO;;AAEpC,gBAAA,IAAI,MAAM,CAAC,YAAY,EAAE;AACvB,oBAAA,SAAS,CAAC,YAAY,GAAG,MAAM,CAAC,YAAY;;;AAGlD,SAAC,CAAC;AACF,QAAA,MAAM,aAAa,GACjB,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KACV,OAAO,CAAC,KAAK,QAAQ,GAAG,CAAC,KAAK,QAAQ,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,CAC7D,KAAK,SAAS;QACjB,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAChD,YAAA,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;;AAErB,QAAA,OAAO,IAAI;AACb,KAAC,CAAC;;;AAGF,IAAA,YAAY,GAAG,CAAC,MAAe,KAAK,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;;;;;;;IAQ/D,cAAc,GAAG,QAAQ,CAAC,MACxB,IAAI,CAAC,gBAAgB;AACnB,UAAE,IAAI,CAAC,iBAAiB;aACnB,GAAG,CAAC,CAAC,GAAG,MAAM,OAAO,GAAG,KAAK,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC;aACvD,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,QAAQ;UACrC,EAAE,CACP;AACD,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAEpC,IAAA,WAAA,CACE,IAAgB,EACR,QAAqB,EAC7B,SAAuB,EACvB,QAAkB,EAAA;AAElB,QAAA,KAAK,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;QAJxB,IAAQ,CAAA,QAAA,GAAR,QAAQ;AAKhB,QAAA,IAAI,CAAC,UAAU,GAAG,mBAAmB,EAAE;AACvC,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE,kBAAkB,EAAE;YACvC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC;;aAC/D;AACL,YAAA,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC;AAC9B,gBAAA;oBACE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,sBAAsB,CAAC;AACvD,oBAAA,IAAI,EAAE,UAAU;AACjB,iBAAA;AACD,gBAAA;oBACE,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,wBAAwB,CAAC;AACzD,oBAAA,IAAI,EAAE,UAAU;AACjB,iBAAA;AACF,aAAA,CAAC;;;AAIG,IAAA,QAAQ;IAER,WAAW,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;;AAGzB;;AAEG;AACM,IAAA,eAAe;AAExB;;;;;;;;;;;;AAYG;IACH,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAC/B,YAAA,OAAO,IAAI,CAAC,aAAa,EAAE;;AAE7B,QAAA,OAAO,IAAI;;IAGJ,OAAO,CAAC,KAAK,GAAG,KAAK,EAAA;QAC5B,IAAI,CAAC,cAAc,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC;;AAGvC,IAAA,eAAe,CAAC,SAAkB,EAAA;AAChC,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,KAAK,CAAC;AACpC,QAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC;AAChC,YAAA,SAAS,EAAE,KAAK;YAChB,SAAS,EAAE,CAAC,CAAC,SAAS;AACtB,YAAA,IAAI,EAAE,MAAM;AACb,SAAA,CAAC;;IAGJ,aAAa,GAAA;AACX,QAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;AAC9B,YAAA,OAAO,IAAI,CAAC,qBAAqB,EAAE;;AAErC,QAAA,OAAO,IAAI;;AAGb,IAAA,6BAA6B,CAAC,QAAuB,EAAA;AACnD,QAAA,IAAI,CAAC,qBAAqB,GAAG,QAAQ;;AAGvC,IAAA,mBAAmB,CAAC,MAAe,EAAA;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;;AAGvB,IAAA,mBAAmB,CAAC,MAAe,EAAA;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;;AAGvB,IAAA,MAAM,CAAC,WAAgB,EAAA;AACrB,QAAA,IAAI,GAAgC;AACpC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,IAAI,QAAQ,EAAE;YACZ,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC;;aACjD;AACL,YAAA,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAU,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE;AACvE,gBAAA,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC;AAC9C,aAAA,CAAC;;AAGJ,QAAA,OAAO,GAAG,CAAC,IAAI,CACb,0BAA0B,CAAC,eAAe,CAAC,EAC3C,SAAS,CAAC,CAAC,IAAI,KACb,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAC1D,EACD,GAAG,CAAC,CAAC,MAAM,KAAI;;;;;YAKb,IAAI,MAAM,EAAE;gBACV,IAAI,CAAC,cAAc,EAAE,EAAE,SAAS,CAAC,MAAM,CAAC;AACxC,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,+BAA+B,EAAE;AACxD,oBAAA,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE;AACxB,iBAAA,CAAC,CACH;;SAEJ,CAAC,CACH;;IAGH,MAAM,CAAC,EAAkB,EAAE,WAAgB,EAAA;AACzC,QAAA,IAAI,GAAgC;AACpC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,IAAI,QAAQ,EAAE;YACZ,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC;;aAC1C;AACL,YAAA,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAU,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE;AACjE,gBAAA,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC;AAC9C,aAAA,CAAC;;AAGJ,QAAA,OAAO,GAAG,CAAC,IAAI,CACb,0BAA0B,CAAC,eAAe,CAAC,EAC3C,SAAS,CAAC,CAAC,IAAI,KACb,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAC1D,EACD,GAAG,CAAC,CAAC,MAAM,KAAI;YACb,IAAI,MAAM,EAAE;gBACV,IAAI,CAAC,cAAc,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC;AAC/C,gBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAChB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,+BAA+B,EAAE;AACxD,oBAAA,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE;AACxB,iBAAA,CAAC,CACH;;SAEJ,CAAC,CACH;;AAGH;;;;;AAKG;IACH,kBAAkB,CAAC,IAAS,EAAE,MAA2B,EAAA;AACvD,QAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,EAAE;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAC3C,IAAI,CAAC,UAAU,EAAE,EACjB,IAAI,CAAC,KAAK,EAAE,EACZ,MAAM,EACN,IAAI,CACL;AACD,QAAA,IAAI,gBAAgB,KAAK,QAAQ,EAAE;AACjC,YAAA,IAAI,GAAyB;AAC7B,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;YAChC,IAAI,QAAQ,EAAE;AACZ,gBAAA,GAAG,GAAG,QAAQ,CACZ,KAAK,EACJ,MAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAC7B,SAAS,EACT,IAAI,CACkB;;iBACnB;AACL,gBAAA,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CACjB,IAAI,CAAC,YAAY,CAAE,MAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAChD,EAAE,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,CACpD;;YAEH,OAAO,GAAG,CAAC,IAAI,CACb,GAAG,CAAC,CAAC,MAAM,KAAI;AACb,gBAAA,OAAO,IAAI,CAAC,uBAAuB,EAAE,CACnC,IAAI,CAAC,UAAU,EAAE,EACjB,IAAI,CAAC,KAAK,EAAE,EACZ,UAAU,EACV,MAAM,CACP;aACF,CAAC,CACH;;AACI,aAAA,IAAI,gBAAgB,KAAK,KAAK,EAAE;AACrC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;AAClB,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;;AAGjB,QAAA,OAAO,EAAE,CAAC,MAAM,CAAC;;IAGnB,uBAAuB,GAAA;AACrB,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE,EAAE;;AAE7B,YAAA,OAAO,IAAI,CAAC,kBAAkB,EAAmC;;;QAGnE,OAAO,IAAI,CAAC;AACT,aAAA,oBAAqD;;;;IAK1D,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;;AAGrB,IAAA,gBAAgB,CAAC,4BAAqC,EAAA;AAC5D,QAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;YAC1B,IAAI,4BAA4B,EAAE;gBAChC,IAAI,CAAC,cAAc,EAAE,EAAE,kBAAkB,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;;AAEnE,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC;AACnC,YAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC;AAChC,gBAAA,SAAS,EAAE,KAAK;AAChB,gBAAA,SAAS,EAAE,SAAS;AACpB,gBAAA,IAAI,EAAE,SAAS;AAChB,aAAA,CAAC;;;IAIN,YAAY,CAAC,IAAY,EAAE,MAAe,EAAA;AACxC,QAAA,IAAI,IAAI,KAAK,UAAU,EAAE;AACvB,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;;AAChB,aAAA,IAAI,IAAI,KAAK,UAAU,EAAE;AAC9B,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;;aAChB;YACL,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;;AAItC,IAAA,QAAQ,CAAC,KAAY,EAAA;;;;AAInB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,IAAI,CAAC,EAAE;YAC1D,KAAK,CAAC,cAAc,EAAE;YACtB,KAAK,CAAC,wBAAwB,EAAE;AAChC,YAAA,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAI;AACnD,gBAAA,MAAM,MAAM,GAAG;AACb,oBAAA,KAAK,EACH,IAAI,CAAC,YAAY,EAAE;AACnB,wBAAA,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,yBAAyB,EAAE;AAClD,4BAAA,IAAI,EAAE;yBACP,CAAC;iBACL;AACD,gBAAA,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,MAAM,CAAC;AAC1C,gBAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE;oBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;;AAEvC,aAAC,CAAC;;;;;;;;;;;AAaN,IAAA,QAAQ,CAAC,MAAe,EAAA;AAEtB,QAAA,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAI;AACnD,YAAA,MAAM,MAAM,GAAG;AACb,gBAAA,KAAK,EACH,IAAI,CAAC,aAAa,EAAE;AACpB,oBAAA,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,0BAA0B,EAAE;AACnD,wBAAA,IAAI,EAAE;qBACP,CAAC;aACL;AACD,YAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,MAAM,CAAC;AACvC,YAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE;gBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;;AAE1C,SAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;AA4BJ;;;;;;;AAOG;IACH,kBAAkB,CAAC,MAA4B,EAAE,MAAY,EAAA;AAC3D,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,EAAE;QAC1C,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,IAAI,EAAE;;AAExC,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACxB,gBAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;;AAE7B,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,uBAAuB,EAAE;AACrD,YAAA,cAAe,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACpC,YAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AACnC,YAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC;AAChC,gBAAA,SAAS,EAAE,IAAI;AACf,gBAAA,SAAS,EAAE,SAAS;AACpB,gBAAA,IAAI,EAAE,MAAM;AACb,aAAA,CAAC;;;IAIN,eAAe,CAAC,MAAgB,EAAE,MAAY,EAAA;AAC5C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,EAAE;QACnC,IAAI,IAAI,EAAE;AACR,YAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAChC,gBAAA,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,EAAE;AAC/C,gBAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;AAChC,gBAAA,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AACjC,gBAAA,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC;AAChC,oBAAA,SAAS,EAAE,IAAI;AACf,oBAAA,SAAS,EAAE,SAAS;AACpB,oBAAA,IAAI,EAAE,SAAS;AAChB,iBAAA,CAAC;;;;;IAMR,eAAe,GAAA;AACb,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACxB,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,EAAE;YAC/C,WAAW,EAAE,KAAK,EAAE;AACpB,YAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;;;IAIhC,MAAM,QAAQ,CAAC,MAAe,EAAA;;;QAG5B,UAAU,CAAC,MAAK;;;;AAId,YAAA,cAAc,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,KAAI;AACnD,gBAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAChD,mCAAmC,EACnC,EAAE,IAAI,EAAE,SAAS,CAAC,iBAAiB,EAAE,EAAE,CACxC;AACD,gBAAA,MAAM,GAAG,GAAG,OAAO,CAAC,iBAAiB,CAAC;gBACtC,IAAI,GAAG,EAAE;oBACP,MAAM,QAAQ,GAAI,MAAc,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;;AAG9C,oBAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;AACxB,wBAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;;AAG9B,oBAAA,IAAI,GAAqB;AACzB,oBAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;oBAChC,IAAI,QAAQ,EAAE;wBACZ,GAAG,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC;;yBAC9C;AACL,wBAAA,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE;AACxD,4BAAA,OAAO,EAAE,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC;AAC9C,yBAAA,CAAC;;AAGJ,oBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CACX;yBACG,IAAI;;;oBAGH,GAAG,CAAC,MAAK;wBACP,IAAI,CAAC,cAAc,EAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;;AAE7C,wBAAA,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAC7C,mCAAmC,EACnC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,CAC5B;AACD,wBAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;AACpC,qBAAC,CAAC;yBAEH,SAAS,EAAE,CACf;;AAEL,aAAC,CAAC;AACJ,SAAC,CAAC;;AAGK,IAAA,MAAM,CAAC,QAAgB,EAAA;AAC9B,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE;cAC1B,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,QAAQ;cAC3C,QAAQ;;AAGd,IAAA,YAAY,CAAC,QAAwB,EAAA;AACnC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE;QAChC,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;QACzC,MAAM,cAAc,GAClB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG;AAC5B,cAAE,aAAa,CAAC,CAAC;AACjB,cAAE,aAAa,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG;AACtD,QAAA,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;AAC5B,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,GAAG,CAAI,CAAA,EAAA,aAAa,CAAC,CAAC,CAAC,CAAA,CAAE,CAAC;;AAE7D,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;;AAGpC,IAAA,kBAAkB,CAAC,MAA2B,EAAA;AAC5C,QAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE;AAChC,YAAA,IAAI,IAAI,CAAC,eAAe,EAAE,EAAE;AAC1B,gBAAA,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,eAAe,EAAE;;;iBAEzD;;AAEL,gBAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC;;;;AAKpC,IAAA,oBAAoB,CAAC,OAAuB,EAAA;;AAE1C,QAAA,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE;YAC5B,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC;;aAC9C;AACL,YAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;;;AAIpC,IAAA,qBAAqB,CAAC,EAAU,EAAA;AACtC,QAAA,MAAM,yBAAyB,GAAG,CAChC,OAAoB,EACpB,UAAyE,KACvE;AACF,YAAA,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;;AAE3D,gBAAA,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;;iBACpC;gBACL,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;;AAErD,SAAC;AAED,QAAA,IAAI,OAAO,GAAG,IAAI,WAAW,EAAE;AAC/B,QAAA,MAAM,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,EAAE;QACpD,IAAI,kBAAkB,EAAE;AACtB,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;;AAErC,gBAAA,yBAAyB,CAAC,OAAO,EAAE,kBAAkB,CAAC;;iBACjD,IACL,OAAO,kBAAkB,KAAK,QAAQ;gBACtC,EAAE;AACF,gBAAA,kBAAkB,CAAC,EAAE,CAAC,EACtB;gBACA,yBAAyB,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAE,CAAC;;;;;;;;;;AAW/D,QAAA,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE;AAC3C,YAAA,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,gBAAgB,EAAE,IAAI,CAAC,iBAAiB,EAAE;AAC1C,YAAA,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE;YACzB,EAAE;AACH,SAAA,CAAC;AACF,QAAA,OAAO,OAAO;;;;;;IAOhB,mBAAmB,CAAC,MAAc,EAAE,MAAe,EAAA;AACjD,QAAA,OAAO,KAAK;;AAGd;;;;AAIG;AACH,IAAA,cAAc,CAAC,MAAe,EAAA;;AAE5B,QAAA,MAAM,OAAO,GACX,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;AACvC,cAAE,IAAI,CAAC,WAAW;AAClB,cAAE,IAAI,CAAC,sBAAsB,EAAE;AACnC,QAAA,IAAI,WAAW,GAAwB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC1E,WAAW,CAAC,OAAO,CAAC,CAAC,MAAyB,EAAE,KAAa,KAAI;;;;YAI/D,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE;AAC/C,gBAAA,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;;YAEvD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO;AAC1C,YAAA,MAAM,CAAC,OAAO,GAAG,CAAC,MAAe,KAAI;gBACnC,IAAI,UAAU,EAAE;AACd,oBAAA,OAAO,UAAU,CAAC,MAAM,CAAC;;AAE3B,gBAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,mBAAmB,EAAE;gBACpD,IAAI,iBAAiB,EAAE;AACrB,oBAAA,OAAO,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC;;AAEhE,gBAAA,OAAO,KAAK;AACd,aAAC;AACH,SAAC,CAAC;AACF,QAAA,OAAO,WAAW;;IAGpB,0BAA0B,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC,uBAAuB,EAAE;;AAGvC;;;;AAIG;IACK,iBAAiB,GAAA;AACvB,QAAA,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE;QAC5C,IAAI,cAAc,EAAE;;;;;;AAMlB,YAAA,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB;AAC9C,YAAA,IAAI,iBAAiB,GAAG,IAAI,KAAK,EAAgB;AACjD,YAAA,IAAI,gBAAgB,CAAC,MAAM,EAAE;;;;;;AAM3B,gBAAA,gBAAgB,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;YAEtE,IAAI,CAAC,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,KAAI;AACrC,gBAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE;AACtD,oBAAA,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;;AAE9B,aAAC,CAAC;AACF,YAAA,cAAc,CAAC,iBAAiB,GAAG,iBAAiB;;;;YAIpD,cAAc,CAAC,YAAY,EAAE;YAC7B,cAAc,CAAC,SAAS,EAAE;YAC1B,cAAc,CAAC,gBAAgB,EAAE;;;0HA15B1B,wBAAwB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,UAAA,EAAA,EAAA,EAAA,KAAA,EAAAC,IAAA,CAAA,WAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,KAAA,EAAA,EAAA,CAAA,QAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,uBAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EA7KxB,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,WAAA,EAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,sBAAA,EAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,UAAA,EAAA,wBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,kBAAA,EAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,uBAAA,EAAA,EAAA,iBAAA,EAAA,yBAAA,EAAA,UAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,yBAAA,EAAA,EAAA,SAAA,EAAA,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,CAAC,EAsYvC,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,YAAY,kEADG,YAAY,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,yBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EA4CR,qBAAqB,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,sBAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EASxB,oBAAoB,EAxb3C,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6IT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,4QAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA/JC,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,SAAA,EAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,aAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,MAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,YAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,SAAA,EAAA,QAAA,EAAA,6GAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,UAAA,EAAA,QAAA,EAAA,cAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,sCAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,eAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,6CAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,mBAAA,EAAA,oBAAA,EAAA,4BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,QAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,qBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,YAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,KAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,wBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,gBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,GAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,wBAAwB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,QAAA,EAAA,aAAA,EAAA,yBAAA,EAAA,wBAAA,EAAA,wBAAA,EAAA,sBAAA,EAAA,gBAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACxB,yBAAyB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,WAAA,EAAA,OAAA,EAAA,cAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACzB,qBAAqB,EAAA,QAAA,EAAA,4BAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACrB,2BAA2B,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,oBAAoB,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,oBAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FA+KX,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBA/LpC,SAAS;AACC,YAAA,IAAA,EAAA,CAAA,EAAA,OAAA,EAAA;wBACP,YAAY;wBACZ,YAAY;wBACZ,eAAe;wBACf,cAAc;wBACd,aAAa;wBACb,aAAa;wBACb,iBAAiB;wBACjB,aAAa;wBACb,eAAe;wBACf,kBAAkB;wBAClB,wBAAwB;wBACxB,yBAAyB;wBACzB,qBAAqB;wBACrB,2BAA2B;wBAC3B,oBAAoB;qBACrB,EACU,SAAA,EAAA,CAAC,qBAAqB,CAAC,oBAAoB,CAAC,CAAC,EAAA,QAAA,EAC9C,oBAAoB,EACpB,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6IT,EA4BgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,4QAAA,CAAA,EAAA;+JA2NhB,iBAAiB,EAAA,CAAA;sBAA/C,eAAe;uBAAC,YAAY;gBAMnB,MAAM,EAAA,CAAA;sBAAf;gBAWS,uBAAuB,EAAA,CAAA;sBAAhC;;;ACheI,MAAM,kBAAkB,GAAG,UAAU;AACrC,MAAM,kBAAkB,GAAG,UAAU;;ACe5C;;;;AAIG;MAgEU,mCAAmC,CAAA;AAG9C,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAW;AAClC,IAAA,mBAAmB,GAAG,KAAK,CAAC,QAAQ,EAAyC;IAC7E,KAAK,GAAG,KAAK,EAAU;AACvB,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,CAAC;AACrC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,CAAC;AAClC,IAAA,aAAa,GAAG,KAAK,CAAU,KAAK,CAAC;AACrC,IAAA,UAAU,GAAG,KAAK,CAAU,KAAK,CAAC;AAClC,IAAA,WAAW;AAEX,IAAA,qBAAqB,GAAG,CAAC,IAAY,EAAE,MAA6B,KAAI;QACtE,OAAO,QAAQ,CAAC,MAAK;AACnB,YAAA,IAAI,MAAM,IAAI,MAAM,EAAE,EAAE;AACtB,gBAAA,OAAO,IAAI;;YAEb,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,OAAO;YACvE,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;AACvC,gBAAA,OAAO,IAAI;;AAEb,YAAA,OAAO,KAAK;AACd,SAAC,CAAC;AACJ,KAAC;IACD,cAAc,GAAG,IAAI,CAAC,qBAAqB,CACzC,kBAAkB,EAClB,IAAI,CAAC,aAAa,CACnB;IACD,cAAc,GAAG,IAAI,CAAC,qBAAqB,CACzC,kBAAkB,EAClB,IAAI,CAAC,aAAa,CACnB;IAED,QAAQ,GAAA;QACN,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC,cAAc,EAAE;;AAGhE,IAAA,WAAW;IAEX,MAAM,GAAA;QACJ,IAAI,CAAC,mBAAmB,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;IAG/D,QAAQ,GAAA;QACN,IAAI,CAAC,mBAAmB,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;;IAG/D,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,mBAAmB,EAAE,CAAC,YAAY,EAAE;;0HAhDhC,mCAAmC,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnC,uBAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mCAAmC,EA5DpC,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,mBAAA,EAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,uIAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA3CS,gBAAgB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAH,IAAA,CAAA,UAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,QAAA,EAAA,CAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAG,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,UAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FA8D/C,mCAAmC,EAAA,UAAA,EAAA,CAAA;kBA/D/C,SAAS;8BACC,CAAC,gBAAgB,EAAE,eAAe,EAAE,aAAa,CAAC,EAAA,QAAA,EACjD,iCAAiC,EACjC,QAAA,EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCT,EAiBgB,eAAA,EAAA,uBAAuB,CAAC,MAAM,EAAA,MAAA,EAAA,CAAA,uIAAA,CAAA,EAAA;;;AC7EjD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoDG;MAKmB,uBAAuB,CAAA;AAM3C,IAAA,KAAK,GAAG,MAAM,CAAuB,SAAS,CAAC;AAC/C,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAW;AAClC,IAAA,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAmC;IAC1D,MAAM,GAAG,KAAK,EAAO;AACrB,IAAA,IAAI,GAAG,IAAI,YAAY,EAAE;IACzB,IAAI,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACnC,UAAU,GAAG,mBAAmB,EAAE;AAClC,IAAA,SAAS,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAEpC,IAAA,GAAG,GAAG,MAAM,CAAC,iBAAiB,CAAC;IAE/B,aAAa,GAAG,MAAK;AACnB,QAAA,OAAO,IAAI,CAAC,cAAc,EAAE;AAC9B,KAAC;IAED,cAAc,GAAA;AACZ,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE;AACzB,QAAA,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,EAAE;AACxB,YAAA,OAAO,MAAM,CAAC,OAAO,CACnB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAC/D;;AAEH,QAAA,OAAO,IAAI;;IAGb,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,EAAE,EAAE,6BAA6B,CAAC,IAAI,CAAC,aAAa,CAAC;;IAGlE,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;;AAkBzB;;;;AAIG;IACH,QAAQ,GAAA;AACN,QAAA,OAAO,IAAI;;AAGb;;;;AAIG;IACH,YAAY,GAAA;AACV,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;QACxB,OAAO,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS;;IAGtC,QAAQ,GAAA;AACN,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AACjC,QAAA,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM;cACpB,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,KAAK;cAC3B,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,CAAE,IAAI,CAAC,MAAM,EAAU,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC;AACzE,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CACX;AACE,cAAE,IAAI,CACJ,2BAA2B,CAAC,IAAI,CAAC,KAAK,EAAiC,EAAE,IAAI,CAAC,GAAG,CAAC;aAEnF,SAAS,EAAE,CACf;;0HArFiB,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,uBAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,0dAHiB,CAAE,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA;;2FAG1C,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAJ5C,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACP,oBAAA,QAAQ,EAAE,oCAAoC,EAAE,QAAQ,EAAE,CAAE,CAAA;AAC5D,oBAAA,UAAU,EAAE;AACf,iBAAA;;;AChED;;AAEG;;;;"}
1
+ {"version":3,"file":"smallpearl-ngx-helper-mat-entity-crud.mjs","sources":["../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/mat-entity-crud-types.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/providers.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/default-config.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/form-view-host.component.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/preview-host.component.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/mat-entity-crud.component.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/mat-entity-crud-internal-types.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/preview-pane.component.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/src/mat-entity-crud-form-base.ts","../../../../projects/smallpearl/ngx-helper/mat-entity-crud/smallpearl-ngx-helper-mat-entity-crud.ts"],"sourcesContent":["import { HttpContextToken } from \"@angular/common/http\";\nimport { SPContextMenuItem } from \"@smallpearl/ngx-helper/mat-context-menu\";\nimport { Observable } from \"rxjs\";\n\n/**\n * Prototype of the function to parse the CRUD action response.\n */\nexport type SPMatEntityCrudResponseParser = (\n entityName: string,\n idKey: string,\n method: 'create' | 'retrieve' | 'update' | 'delete',\n resp: any\n) => any|undefined;\n\n\n/**\n * Global config for SPMatEntityList component.\n */\nexport interface SPMatEntityCrudConfig {\n /**\n * The item actions that will be shown for each item in the list.\n * This defaults to 'Update' & 'Delete' actions, but can be customized\n * by this property. Note the item actions can be set for individual\n * <sp-mat-entity-crud> component through its itemActions property.\n */\n defaultItemActions?: SPContextMenuItem[];\n /**\n * Global crud response parser.\n */\n crudOpResponseParser?: SPMatEntityCrudResponseParser;\n}\n\n/**\n * This is the interface through which the client provided CRUD form component\n * interacts with the 'host' SPMatEntityCrudComponent. When the form wants to\n * submit an entity to the server (for create or update), it should call the\n * one of the create or update methods. The interface also other methods for\n * the form component to interact with SPMatEntityCrudComponent such as\n * refresh its entities list, close the form pane, etc.\n *\n * The interface name has a 'Bridge' as the interface acts as a bridge between\n * the client provided form handler component and the host\n * SPMatEntityCrudComponent.\n */\nexport interface SPMatEntityCrudCreateEditBridge {\n /**\n * Close the edit/update form pane. This WON'T call the 'cancelEditCallback'\n * even if one is registered.\n */\n close: (cancel: boolean) => void;\n /**\n * Client form view can register a callback that will be invoked by the\n * framework when user cancels the create/edit operation by clicking on the\n * close button on the top right.\n * @param callback\n * @returns None\n */\n registerCanCancelEditCallback: (callback: () => boolean) => void;\n // Parameters of type any are entity values are typically the output of\n // form.value and therefore their types would not necessarily match TEntity.\n // id can be typed as TEntity[Idkey], but TSC doesn't allow that yet.\n /**\n * Create a new instance of TEntity, by sending a POST request to remote.\n * @param entityValue This is the typically the output of Reactive form's\n * form.value. Since this value's shape may be different from TEntity and is\n * known only to client form, we use 'any'.\n * @returns None\n * @inner Implementation will show a busy wheel centered on the form\n * view while the async function to update the object remains active.\n */\n create: (entityValue: any) => Observable<any>;\n /**\n * Update the entity with id `id` with new values in entityValue.\n * @param id TEntity id\n * @param entityValue Entity values to be updated.\n * @returns None\n * @inner Implementation will show a busy wheel centered on the form\n * view while the async function to update the object remains active.\n */\n update: (id: any, entityValue: any) => Observable<any>;\n}\n\n/**\n * Prototype of the function that will be used instead of HttpClient for\n * CRUD operations.\n * @param op - the CRUD operation being requested\n * @param entityValue - The entity or entity value upon which the operation\n * is being requested. for 'create' & 'update' this will be the value\n * of the reactive form. This is typically form.value or the 2nd arg to create\n * & update methods of SPMatEntityCrudCreateEditBridge.\n */\nexport type CRUD_OP_FN<\n TEntity extends { [P in IdKey]: PropertyKey },\n IdKey extends string = 'id'\n> = (\n op: 'get' | 'create' | 'update' | 'delete',\n id: TEntity[IdKey] | undefined, // valid only for 'get', 'update' & 'delete'\n entityValue: any, // valid only for 'create' & 'update'\n entityCrudComponent: any,\n) => Observable<TEntity | null>;\n\n\nexport type ALLOW_ITEM_ACTION_FN<TEntity> = (entity: TEntity, action: string) => boolean;\n\n/**\n * This interface is used to define sub types for the \"New {{item}}\" button on\n * top of the CRUD UI. An array of these is provided as the value to the\n * component property 'newItemSubTypes'.\n */\nexport interface NewItemSubType {\n /**\n * A role string that will be passed as argument to the (action) event\n * handler. This string allows the event handler to distinguish the selected\n * sub-type.\n *\n * The special keyword '_new_' can be used to activate the\n * `createEditTemplate` template if one is provided. In this case the params\n * element value (see below) can be used in the template to distinguish\n * between different menu items.\n */\n role: string;\n /**\n * Label displayed in the menu representing this role.\n */\n label: string;\n /**\n * Arbitrary value that will be passed to the 'createEditTemplate' in the\n * $implicit template context as 'params'. You can access this in the\n * template like below (see `data.params`):-\n ```\n <ng-template #createEdit let-data>\n <app-create-edit-entity-demo\n [bridge]=\"data.bridge\"\n [entity]=\"data.entity\"\n [params]=\"data.params\"\n ></app-create-edit-entity-demo>\n </ng-template>\n ```\n\n If params is an object and it includes the key 'title', its value will be\n used as the title for the edit form.\n */\n params?: any;\n}\n\nexport type CrudOp = 'create'|'retrieve'|'update'|'delete'|undefined;\n\nexport interface SPMatEntityCrudHttpContext {\n entityName: string;\n entityNamePlural: string;\n endpoint: string;\n op: CrudOp;\n}\n\nexport const SP_MAT_ENTITY_CRUD_HTTP_CONTEXT =\n new HttpContextToken<SPMatEntityCrudHttpContext>(() => ({\n entityName: '',\n entityNamePlural: '',\n endpoint: '',\n op: undefined,\n }));\n","import { InjectionToken } from '@angular/core';\nimport { SPMatEntityCrudConfig } from './mat-entity-crud-types';\n\nexport const SP_MAT_ENTITY_CRUD_CONFIG = new InjectionToken<SPMatEntityCrudConfig>('SPMatEntityCrudConfig');\n","import { inject } from \"@angular/core\";\nimport { SPMatEntityCrudConfig } from \"./mat-entity-crud-types\";\nimport { SP_MAT_ENTITY_CRUD_CONFIG } from \"./providers\";\n\nfunction defaultCrudResponseParser(\n entityName: string,\n idKey: string,\n method: 'create' | 'retrieve' | 'update' | 'delete',\n resp: any\n) {\n // If the response is an object with a property '<idKey>', return it as\n // TEntity.\n if (resp.hasOwnProperty(idKey)) {\n return resp;\n }\n // If the response has an object indexed at '<entityName>' and it has\n // the property '<idKey>', return it as TEntity.\n if (resp.hasOwnProperty(entityName)) {\n const obj = resp[entityName];\n if (obj.hasOwnProperty(idKey)) {\n return obj;\n }\n }\n // Return undefined, indicating that we could't parse the response.\n return undefined;\n}\n\nexport const DefaultSPMatEntityCrudConfig: SPMatEntityCrudConfig = {\n crudOpResponseParser: defaultCrudResponseParser\n};\n\n/**\n * To be called from an object constructor as it internally calls Angular's\n * inject() API.\n * @param userConfig\n * @returns\n */\nexport function getEntityCrudConfig(): SPMatEntityCrudConfig {\n const userCrudConfig = inject(SP_MAT_ENTITY_CRUD_CONFIG, {\n optional: true,\n });\n return {\n ...DefaultSPMatEntityCrudConfig,\n ...(userCrudConfig ?? {}),\n };\n}\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n EmbeddedViewRef,\n inject,\n input,\n OnDestroy,\n OnInit,\n signal,\n TemplateRef,\n viewChild,\n ViewContainerRef\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { SPMatHostBusyWheelDirective } from '@smallpearl/ngx-helper/mat-busy-wheel';\nimport { firstValueFrom, Observable, of, Subscription, tap } from 'rxjs';\nimport { getEntityCrudConfig } from './default-config';\nimport { SPMatEntityCrudComponentBase } from './mat-entity-crud-internal-types';\nimport { SPMatEntityCrudConfig, SPMatEntityCrudCreateEditBridge } from './mat-entity-crud-types';\nimport { TranslocoService } from '@jsverse/transloco';\n\n@Component({\n imports: [\n CommonModule,\n MatButtonModule,\n MatIconModule,\n SPMatHostBusyWheelDirective,\n ],\n selector: 'sp-create-edit-entity-host',\n template: `\n <div [class]=\"'form-wrapper ' + entityCrudComponentBase().getFormPaneContentClass()\" spHostBusyWheel=\"formBusyWheel\">\n <div class=\"create-edit-topbar\">\n <div class=\"title\">\n {{ title() }}\n </div>\n <div class=\"spacer\"></div>\n <div class=\"close\">\n <button mat-icon-button (click)=\"onClose()\">\n <mat-icon>cancel</mat-icon>\n </button>\n </div>\n </div>\n <div class=\"form-container\">\n <ng-container #clientFormContainer></ng-container>\n </div>\n </div>\n `,\n styles: `\n .form-wrapper {\n width: 100% !important;\n height: 100% !important;\n display: flex;\n flex-direction: column;\n padding: 0.4em;\n }\n .create-edit-topbar {\n display: flex;\n flex-direction: row;\n align-items: center;\n min-height: 48px;\n padding-bottom: 0.4em;\n }\n .create-edit-topbar .title {\n font-size: 1.5em;\n font-weight: 500;\n }\n .create-edit-topbar .spacer {\n flex-grow: 1;\n }\n .create-edit-topbar .close {\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormViewHostComponent<TEntity>\n implements SPMatEntityCrudCreateEditBridge, OnInit, OnDestroy\n{\n entityCrudComponentBase =\n input.required<SPMatEntityCrudComponentBase<TEntity>>();\n clientViewTemplate = input<TemplateRef<any> | null>(null);\n itemLabel = input.required<string | Observable<string>>();\n itemLabelPlural = input.required<string | Observable<string>>();\n\n _itemLabel = computed<Observable<string>>(() => {\n const label = this.itemLabel();\n return label instanceof Observable ? label : of(label);\n });\n _itemLabelPlural = computed<Observable<string>>(() => {\n const label = this.itemLabelPlural();\n return label instanceof Observable ? label : of(label);\n });\n\n entity = signal<TEntity | undefined>(undefined);\n title = signal<string>('');\n params = signal<any>(undefined);\n clientFormView!: EmbeddedViewRef<any> | null;\n vc = viewChild('clientFormContainer', { read: ViewContainerRef });\n config!: SPMatEntityCrudConfig;\n sub$ = new Subscription();\n transloco = inject(TranslocoService);\n\n constructor() {\n this.config = getEntityCrudConfig();\n }\n\n ngOnInit() {}\n\n ngOnDestroy(): void {\n this.sub$.unsubscribe();\n }\n\n show(entity: TEntity | undefined, params?: any) {\n this.entity.set(entity);\n if (params && params?.title) {\n this.title.set(params.title);\n } else {\n firstValueFrom(this._itemLabel()).then((itemLabel) => {\n this.title.set(\n this.transloco.translate(entity ? 'editItem' : 'newItem', {\n item: itemLabel,\n })\n );\n });\n // this.title.set(entity ? this.config.i18n.editItemLabel(this.itemLabel()) : this.config.i18n.newItemLabel(this.itemLabel()));\n // this.title.set(\n // this.transloco.translate(entity ? 'editItem' : 'newItem', {\n // item: this.itemLabel(),\n // })\n // );\n }\n this.params.set(params);\n this.createClientView();\n }\n\n close(cancel: boolean) {\n this.entityCrudComponentBase().closeCreateEdit(cancel);\n // destroy the client's form component\n this.destroyClientView();\n }\n\n registerCanCancelEditCallback(callback: () => boolean) {\n this.entityCrudComponentBase().registerCanCancelEditCallback(callback);\n }\n\n create(entityValue: any) {\n // console.log(\n // `SPCreateEditEntityHostComponent.create - entity: ${JSON.stringify(\n // entityValue\n // )}`\n // );\n const crudComponent = this.entityCrudComponentBase();\n return crudComponent\n ?.create(entityValue)\n .pipe(tap(() => this.close(false)));\n }\n\n update(id: any, entityValue: any) {\n // console.log(\n // `SPCreateEditEntityHostComponent.update - id: ${String(\n // id\n // )}, entity: ${entityValue}`\n // );\n const crudComponent = this.entityCrudComponentBase();\n return crudComponent\n ?.update(id, entityValue)\n .pipe(tap(() => this.close(false)));\n }\n\n /**\n * Creates the client view provided via template\n */\n createClientView() {\n /** Render preview component if one was provided */\n const ft = this.clientViewTemplate();\n const vc = this.vc();\n if (ft && vc) {\n this.clientFormView = vc.createEmbeddedView(ft, {\n $implicit: {\n bridge: this,\n entity: this.entity(),\n params: this.params(),\n },\n });\n this.clientFormView.detectChanges();\n }\n }\n\n destroyClientView() {\n if (this.clientFormView) {\n this.clientFormView.destroy();\n this.clientFormView = null;\n }\n }\n\n onClose() {\n // Can we give the client form component a chance to intercept this\n // and cancel the closure?\n if (this.entityCrudComponentBase().canCancelEdit()) {\n this.entityCrudComponentBase().closeCreateEdit(true);\n this.destroyClientView();\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n EmbeddedViewRef,\n input,\n OnDestroy,\n OnInit,\n signal,\n TemplateRef,\n viewChild,\n ViewContainerRef\n} from '@angular/core';\nimport { SPMatEntityCrudComponentBase } from './mat-entity-crud-internal-types';\n\n@Component({\n imports: [],\n selector: 'sp-entity-crud-preview-host',\n template: ` <ng-container #previewComponent></ng-container> `,\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class PreviewHostComponent<TEntity> implements OnInit, OnDestroy {\n vc = viewChild('previewComponent', { read: ViewContainerRef });\n\n entityCrudComponentBase = input.required<SPMatEntityCrudComponentBase<TEntity>>();\n clientViewTemplate = input<TemplateRef<any> | null>(null);\n entity = signal<TEntity|undefined>(undefined);\n clientView!: EmbeddedViewRef<any> | null;\n\n constructor() {\n // effect(() => {\n // const tmpl = this.clientViewTemplate();\n // this.createClientView(tmpl);\n // });\n }\n\n ngOnInit(): void {}\n\n ngOnDestroy(): void {}\n\n show(entity: TEntity|undefined, params?: any) {\n this.entity.set(entity);\n // if (params && params?.title) {\n // this.title.set(params.title);\n // } else {\n // this.title.set(entity ? this.config.i18n.editItemLabel(this.itemLabel()) : this.config.i18n.newItemLabel(this.itemLabel()));\n // }\n // this.params.set(params);\n this.createClientView();\n }\n\n close() {\n // this.entityCrudComponentBase().closeCreateEdit(cancel);\n // destroy the client's form component\n this.destroyClientView();\n }\n\n private createClientView() {\n if (this.clientView) {\n // We have only one view in the ng-container. So we might as well\n // call clear() to remove all views contained in it.\n this.vc()!.clear();\n this.clientView.destroy();\n }\n /** Render preview component if one was provided */\n const ft = this.clientViewTemplate();\n const vc = this.vc();\n if (ft && vc) {\n this.clientView = this.vc()!.createEmbeddedView(\n ft,\n {\n $implicit: {\n entity: this.entity(),\n entityCrudComponent: this.entityCrudComponentBase(),\n },\n }\n );\n this.clientView.detectChanges();\n }\n }\n\n\n destroyClientView() {\n if (this.clientView) {\n this.clientView.destroy();\n this.clientView = null;\n }\n }\n\n // close() {\n // this.closePreview.emit();\n // }\n}\n","import { CommonModule } from '@angular/common';\nimport { HttpClient, HttpContext, HttpContextToken } from '@angular/common/http';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n ContentChildren,\n effect,\n EventEmitter,\n inject,\n Injector,\n input,\n Output,\n QueryList,\n signal,\n TemplateRef,\n viewChild,\n viewChildren\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatSnackBar, MatSnackBarModule } from '@angular/material/snack-bar';\nimport { MatSortModule } from '@angular/material/sort';\nimport { MatColumnDef, MatTableModule } from '@angular/material/table';\nimport { RouterModule } from '@angular/router';\nimport {\n showBusyWheelUntilComplete,\n SPMatHostBusyWheelDirective\n} from '@smallpearl/ngx-helper/mat-busy-wheel';\nimport {\n SPContextMenuItem,\n SPMatContextMenuComponent,\n} from '@smallpearl/ngx-helper/mat-context-menu';\nimport { SPMatEntityListComponent } from '@smallpearl/ngx-helper/mat-entity-list';\n\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { provideTranslocoScope, TranslocoModule, TranslocoService } from '@jsverse/transloco';\nimport { SPEntityFieldSpec } from '@smallpearl/ngx-helper/entity-field';\nimport { AngularSplitModule } from 'angular-split';\nimport { startCase } from 'lodash';\nimport { plural } from 'pluralize';\nimport { firstValueFrom, map, Observable, of, Subscription, switchMap, tap } from 'rxjs';\nimport { getEntityCrudConfig } from './default-config';\nimport { FormViewHostComponent } from './form-view-host.component';\nimport { SPMatEntityCrudComponentBase } from './mat-entity-crud-internal-types';\nimport {\n ALLOW_ITEM_ACTION_FN,\n CRUD_OP_FN,\n CrudOp,\n NewItemSubType,\n SP_MAT_ENTITY_CRUD_HTTP_CONTEXT,\n SPMatEntityCrudConfig,\n SPMatEntityCrudResponseParser,\n} from './mat-entity-crud-types';\nimport { PreviewHostComponent } from './preview-host.component';\n\n@Component({\n imports: [\n CommonModule,\n RouterModule,\n MatButtonModule,\n MatTableModule,\n MatSortModule,\n MatMenuModule,\n MatSnackBarModule,\n MatIconModule,\n TranslocoModule,\n AngularSplitModule,\n SPMatEntityListComponent,\n SPMatContextMenuComponent,\n FormViewHostComponent,\n SPMatHostBusyWheelDirective,\n PreviewHostComponent,\n ],\n providers: [provideTranslocoScope('sp-mat-entity-crud')],\n selector: 'sp-mat-entity-crud',\n template: `\n <as-split direction=\"horizontal\" [gutterSize]=\"6\" *transloco=\"let t\">\n <as-split-area\n [size]=\"entitiesPaneWidth()\"\n [visible]=\"!entitiesPaneHidden()\"\n >\n <div [class]=\"listPaneWrapperClass()\">\n <ng-content select=\"[breadCrumbs]\"></ng-content>\n\n <ng-template #defaultActionButtons>\n <div class=\"action-bar-actions\">\n @if (!disableCreate()) { @if (newItemSubTypes()) {\n <!-- New {{item}} displays a dropdown menu from which the subtype can be selected -->\n <button\n type=\"button\"\n mat-raised-button\n color=\"primary\"\n [matMenuTriggerFor]=\"newSubTypesMenu\"\n >\n {{\n newItemLabel() ??\n t('spMatEntityCrud.newItem', {\n item: _itemLabel() | async\n })\n }}\n <mat-icon>expand_circle_down</mat-icon>\n </button>\n <mat-menu #newSubTypesMenu=\"matMenu\">\n @for (subtype of newItemSubTypes(); track $index) { @if\n (subtype.role) {\n <button mat-menu-item (click)=\"handleNewItemSubType(subtype)\">\n {{ subtype.label }}\n </button>\n } @else {\n <div style=\"padding: .2em 0.5em;\">\n <strong>{{ subtype.label }}</strong>\n </div>\n } }\n </mat-menu>\n } @else {\n <button\n mat-raised-button\n color=\"primary\"\n (click)=\"onCreate($event)\"\n [routerLink]=\"newItemLink()\"\n >\n {{\n newItemLabel() ??\n t('spMatEntityCrud.newItem', {\n item: _itemLabel() | async\n })\n }}\n <mat-icon>add_circle</mat-icon>\n </button>\n } }\n </div>\n </ng-template>\n\n <ng-template #defaultHeaderTemplate>\n <div class=\"action-bar\">\n <div class=\"action-bar-title\">\n {{ _title() | async }}\n </div>\n <span class=\"spacer\"></span>\n <!-- Hide the action buttons when Preview/Edit pane is active -->\n @if (!entityPaneActive()) {\n <ng-container\n [ngTemplateOutlet]=\"actionsTemplate() || defaultActionButtons\"\n ></ng-container>\n }\n </div>\n </ng-template>\n <ng-container\n [ngTemplateOutlet]=\"headerTemplate() || defaultHeaderTemplate\"\n ></ng-container>\n <sp-mat-entity-list\n #entitiesList\n [entityName]=\"entityName()\"\n [entityNamePlural]=\"entityNamePlural()\"\n [deferViewInit]=\"true\"\n [endpoint]=\"endpoint()\"\n [entityLoaderFn]=\"entityLoaderFn()\"\n [columns]=\"columnsWithAction()\"\n [displayedColumns]=\"visibleColumns()\"\n [idKey]=\"idKey()\"\n [pagination]=\"pagination()\"\n [paginator]=\"paginator()\"\n [pageSize]=\"pageSize()\"\n [sorter]=\"sorter()\"\n [disableSort]=\"disableSort()\"\n (selectEntity)=\"handleSelectEntity($event)\"\n [httpReqContext]=\"httpReqContext()\"\n >\n </sp-mat-entity-list>\n </div>\n\n <!--\n We'll be initializing the contentColumnDefs separately and not\n relying on <sp-mat-entity-list>'s internal @ContentChildre() querylist\n for building this. So we define this independenly and not as\n <sp-mat-entity-list> content.\n -->\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell *matHeaderCellDef></th>\n <td mat-cell *matCellDef=\"let element\">\n <!-- <button\n mat-icon-button\n hoverDropDown\n >\n <mat-icon>more_vert</mat-icon>\n </button> -->\n <sp-mat-context-menu\n [menuItems]=\"_itemActions\"\n (selected)=\"onItemAction($event, element)\"\n [contextData]=\"element\"\n [hasBackdrop]=\"true\"\n ></sp-mat-context-menu>\n </td>\n </ng-container>\n </as-split-area>\n <as-split-area [size]=\"entityPaneWidth()\" [visible]=\"entityPaneActive()\">\n <div\n [class]=\"'preview-pane-wrapper ' + previewPaneWrapperClass()\"\n spHostBusyWheel=\"formBusyWheel\"\n >\n <sp-entity-crud-preview-host\n [ngClass]=\"createEditViewActive() ? 'sp-hidden' : 'sp-visible'\"\n [entityCrudComponentBase]=\"this\"\n [clientViewTemplate]=\"previewTemplate()!\"\n ></sp-entity-crud-preview-host>\n <!-- Create/Edit Entity -->\n <sp-create-edit-entity-host\n [ngClass]=\"createEditViewActive() ? 'sp-visible' : 'sp-hidden'\"\n itemLabel=\"{{ _itemLabel() | async }}\"\n itemLabelPlural=\"{{ _itemLabelPlural() | async }}\"\n [entityCrudComponentBase]=\"this\"\n [clientViewTemplate]=\"createEditFormTemplate()\"\n ></sp-create-edit-entity-host>\n </div>\n </as-split-area>\n </as-split>\n `,\n styles: `\n .sp-hidden {\n display: none;\n }\n .sp-visible {\n display: inherit;\n height: 100% !important;\n width: 100% !important;\n }\n .preview-pane-wrapper {\n height: 100% !important;\n width: 100% !important;\n }\n .action-bar {\n display: flex;\n flex-direction: row;\n align-items: center;\n padding-bottom: 0.5em;\n }\n .action-bar-title {\n font-size: 1.5em;\n font-weight: 600;\n }\n .spacer {\n flex-grow: 1;\n }\n .action-bar-actions {\n text-align: end;\n }\n .active-row {\n font-weight: bold;\n }\n `,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SPMatEntityCrudComponent<\n TEntity extends { [P in IdKey]: PropertyKey },\n IdKey extends string = 'id'\n >\n extends SPMatEntityListComponent<TEntity, IdKey>\n implements SPMatEntityCrudComponentBase<TEntity>, AfterViewInit\n{\n // entityName = input.required<string>();\n // entityNamePlural = input<string>();\n\n itemLabel = input<string | Observable<string>>();\n itemLabelPlural = input<string | Observable<string>>();\n\n /**\n * Title string displayed above the component. If not specified, will use\n * itemLabelPlural() as the title.\n */\n title = input<string | Observable<string>>();\n /**\n *\n */\n itemActions = input<SPContextMenuItem[]>([]);\n /**\n * Specify the list of router paths that will be set as the value for\n * [routerLink] for the 'New {{ item }}' button. If not specified,\n * if createEditTemplate is specified, it will be shown. If not, `action`\n * out event will be raised with `{ role: '_new_' }`.\n */\n newItemLink = input<string | string[]>();\n /**\n * If not specified, will default to 'New <itemLabel()>'.\n */\n newItemLabel = input<string | string[]>();\n /**\n * Text for the Edit <item> pane title\n */\n editItemTitle = input<string>();\n /**\n * If you want \"New {{item}}\" button to support multiple entity types,\n * you can set this to `NewItemSubType[]`, where each element stands for for\n * a dropdown menu item. Refer to `NewItemSubType` for details on this\n * interface.\n */\n newItemSubTypes = input<NewItemSubType[]>();\n /**\n * If you want to take control of the network operations for the CRUD\n * operations (GET/CREATE/UPDATE/DELETE), provide a value for this property.\n */\n crudOpFn = input<CRUD_OP_FN<TEntity, IdKey>>();\n /**\n * Item preview template.\n */\n previewTemplate = input<TemplateRef<any>>();\n /**\n * Whether to allow a context menu action or not. Return false to disable\n * the action.\n */\n allowEntityActionFn = input<ALLOW_ITEM_ACTION_FN<TEntity>>();\n /**\n * A template that allows the header to be replaced. Usage:-\n *\n * ```\n * <sp-map-entity-crud\n * [headerTemplate]=\"myCrudViewHeader\"\n * ></sp-map-entity-crud>\n * <ng-template #myCrudViewHeader>...</ng-template>\n * ```\n */\n headerTemplate = input<TemplateRef<any>>();\n /**\n * Set this to the custom template identifier that will replace the\n * \"New {{Item}}\" button portion. This template will expand towards the\n * title which will be placed to its left (right in rtl).\n *\n * ```\n * <sp-map-entity-crud\n * [actionsTemplate]=\"myCrudActions\"\n * ></sp-map-entity-crud>\n * <ng-template #myCrudActions>...</ng-template>\n * ```\n */\n actionsTemplate = input<TemplateRef<any>>();\n\n /**\n * CRUD action response parser. This will be called with the response\n * from CREATE & UPDATE operations to parse the response JSON and return\n * the created/updated TEntity.\n */\n crudResponseParser = input<SPMatEntityCrudResponseParser>();\n /**\n * An ng-template name that contains the component which provides the\n * create/edit CRUD action.\n *\n * ```\n * <ng-template #createEdit let-data>\n * <app-create-edit-entity-demo [bridge]=\"data.bridge\" [entity]=\"data.entity\"></app-create-edit-entity-demo>\n * </ng-template>\n * ```\n * Note how [bridge] & [entity] properties are set deriving them from the\n * implicit template context. [entity] will be undefined for Create\n * opreation and will be the valid entity for an Update.\n * (app-create-edit-entity-demo here is the client code that implements the\n * Create/Edit form)\n */\n createEditFormTemplate = input<TemplateRef<any> | null>(null);\n /**\n * Disables the per item actions column, preventing 'Edit' & 'Delete'\n * (and other user defined) item operations.\n */\n disableItemActions = input<boolean>(false);\n /**\n * Disables the Create function.\n */\n disableCreate = input<boolean>(false);\n /**\n * View refresh policy after a CREATE/UPDATE operation. Values\n * 'none' - Objects are not refreshed after an edit operation. The return\n * value of the edit operation is used as the object to\n * add/update the component's internal store. This is the default.\n * 'object' - Refresh just the object that was returned from the\n * CREATE/UPDATE operation. Use this if the JSON object returned\n * after a successful CREATE/UPDATE op differs from the JSON\n * object returned for the GET request.\n * 'all' - Refresh the entire list after a CREATE/UPDATE operation. This\n * mimics the behaviour of legacy HTML apps with pure server\n * defined UI.\n */\n refreshAfterEdit = input<'none' | 'object' | 'all'>('none');\n /**\n * HttpContext for crud requests - list, create, retrieve, update & delete.\n * The value can be an object where the property names reflect the CRUD\n * methods with each of these keys taking\n * `[[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]` as its\n * value. This object has a special key 'crud', which if given a value for,\n * would be used for all CRUD requests (CREATE|READ|UPDATE|DELETE).\n *\n * Alternatively the property can be set a\n * `[[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]` as its\n * value, in which case the same context would be used for all HTTP requests.\n */\n crudHttpReqContext = input<\n | [[HttpContextToken<any>, any]]\n | [HttpContextToken<any>, any]\n | {\n // list?: [[HttpContextToken<any>, any]] | [HttpContextToken<any>, any];\n // crud?: [[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]; // common context for all crud operations\n create?: [[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]; // CREATE\n retrieve?:\n | [[HttpContextToken<any>, any]]\n | [HttpContextToken<any>, any]; // RETRIEVE\n update?: [[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]; // UPDATE\n delete?: [[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]; // DELETE\n }\n >();\n /**\n * Width of the edit pane as a percentange of the overall <as-split> width.\n */\n editPaneWidth = input<number>(100);\n /**\n * Width of the preview pane as a percentange of the overall <as-split> width.\n */\n previewPaneWidth = input<number>(50);\n\n /**\n * The class class that will be applied to the list pane wrapper.\n */\n listPaneWrapperClass = input<string>('sp-mat-crud-list-pane-wrapper-class');\n\n /**\n * The class class that will be applied to the preview pane wrapper.\n */\n previewPaneWrapperClass = input<string>(\n 'sp-mat-crud-preview-pane-wrapper-class'\n );\n\n /**\n * The class class that will be applied to the preview pane content.\n */\n previewPaneContentClass = input<string>(\n 'sp-mat-crud-preview-pane-content-class'\n );\n\n /**\n * The CSS class that will be applied to the form pane content.\n */\n formPaneContentClass = input<string>('sp-mat-crud-form-pane-content-class');\n\n // INTERNAL PROPERTIES //\n // Derive a label from a camelCase source string. If the camelCase string\n // can be translated, it returns the translated string. If not, the function\n // converts the camelCase to 'Title Case' and returns it.\n private getLabel = (source: string) => {\n const label = this.transloco.translate(source);\n if (label.localeCompare(source) !== 0) {\n // Successful translation, return it\n return label;\n }\n return startCase(source);\n };\n\n _itemLabel = computed<Observable<string>>(() => {\n const itemLabel = this.itemLabel();\n const label = itemLabel ? itemLabel : this.getLabel(this.entityName());\n return label instanceof Observable ? label : of(label);\n });\n _itemLabelPlural = computed<Observable<string>>(() => {\n const itemLabelPlural = this.itemLabelPlural();\n const label = itemLabelPlural\n ? itemLabelPlural\n : this.getLabel(plural(this.entityName()));\n return label instanceof Observable ? label : of(label);\n });\n\n // Computed title\n _title = computed(() => {\n const title = this.title() ? this.title() : this._itemLabelPlural();\n return title instanceof Observable ? title : of(title);\n });\n // endpoint with the QP string removed (if one was provided)\n _endpointSansParams = computed(() => this.endpoint().split('?')[0]);\n _endpointParams = computed(() => {});\n componentColumns = viewChildren(MatColumnDef);\n @ContentChildren(MatColumnDef) _clientColumnDefs!: QueryList<MatColumnDef>;\n\n /**\n * Event raised for user selecting an item action. It's also raised\n * for 'New <Item>' action, if 'newItemLink' property is not set.\n */\n @Output() action = new EventEmitter<{ role: string; entity?: TEntity }>();\n\n /**\n * Event raised when create Create/Edit pane is activated & deactivated.\n * Event contains two flags:-\n * activated - whether the createEdit form view was activated or\n * deactivated.\n * cancelled - whether the form view was cancelled by user. False for this\n * indicates that the form view was closed after a successful\n * edit operation.\n */\n @Output() entityViewPaneActivated = new EventEmitter<{\n activated: boolean;\n cancelled: boolean | undefined;\n mode: 'edit' | 'preview';\n }>();\n\n busyWheelId = `entityCrudBusyWheel-${Date.now()}`;\n sub$ = new Subscription();\n spEntitiesList =\n viewChild<SPMatEntityListComponent<TEntity, IdKey>>('entitiesList');\n\n // Theoritically, we ought to be able to initialize the mat-entities-list\n // columns from ngAfterViewInit lifecycle hook. But for some strange reason\n // when this hook is called, sp-mat-entities-list has not been initialized.\n // Therefore `spEntitiesList()` is null. So we have to use a computed signal,\n // which will be triggered when spEntitiesList() is initialized and use that\n // to initialize the columns.\n spEntitiesListInited = effect(() => {\n if (this.spEntitiesList()) {\n this._initEntitiesList();\n }\n });\n\n crudConfig!: SPMatEntityCrudConfig;\n\n // This is the internal component that will host the createEditFormTemplate\n createEditHostComponent = viewChild(FormViewHostComponent);\n // A flag to toggle the viewport's contents between the mat-table\n // and the create/edit form template.\n createEditViewActive = signal<boolean>(false);\n\n // Whether it's okay to cancel the edit\n canCancelEditCallback!: () => boolean;\n\n // Preview host component\n previewHostComponent = viewChild(PreviewHostComponent);\n previewActive = computed(() => this.previewedEntity() !== undefined);\n previewedEntity = signal<TEntity | undefined>(undefined);\n\n // Whether the pane that hosts the preview/edit-entity template is active.\n // We call it entityPane as it's used to either render a selected entity\n // or to edit one.\n entityPaneActive = computed(\n () => !!this.previewedEntity() || this.createEditViewActive()\n );\n // Effective width of the entity pane.\n entityPaneWidth = computed(() =>\n this.entityPaneActive()\n ? !!this.previewedEntity()\n ? this.previewPaneWidth()\n : this.editPaneWidth()\n : 0\n );\n\n // Width of the pane showing the list of entities. Calculated as\n entitiesPaneWidth = computed(() => 100 - this.entityPaneWidth());\n entitiesPaneHidden = computed(\n () => this.entityPaneActive() && this.entityPaneWidth() === 100\n );\n\n defaultItemCrudActions = signal<SPContextMenuItem[]>([]);\n columnsWithAction = computed(() => {\n const cols: Array<SPEntityFieldSpec<TEntity, IdKey> | string> = JSON.parse(\n JSON.stringify(this.columns())\n );\n // JSON.parse(JSON.strigify()) does not clone function objects. So\n // we've to explicitly copy these over. So this is really a shallow clone\n // as the cloned objects still refers to the function objects in the\n // original object.\n this.columns().forEach((col, index: number, orgColumns) => {\n const orgCol = orgColumns[index];\n if (typeof orgCol !== 'string') {\n const newColumn = cols[index] as SPEntityFieldSpec<TEntity, IdKey>;\n if (orgCol.valueFn) {\n newColumn.valueFn = orgCol.valueFn;\n }\n if (orgCol.valueOptions) {\n newColumn.valueOptions = orgCol.valueOptions;\n }\n }\n });\n const actionDefined =\n cols.find((c) =>\n typeof c === 'string' ? c === 'action' : c.name === 'action'\n ) !== undefined;\n if (!actionDefined && !this.disableItemActions()) {\n cols.push('action');\n }\n return cols;\n });\n // Provide per entity actions as a function so that the actions are\n // enumerated only when the user clicks on the context menu button.\n _itemActions = (entity: TEntity) => this.getItemActions(entity);\n\n // This uses the previewActive signal to compute the visible columns\n // when preview is activated. For now we just hide the 'action' column when\n // preview is active. We can further customize this logic by allowing the\n // client to specify the columns to display when preview is active thereby\n // reducing column clutter when the table width becomes narrower owing to\n // preview pane taking up screen space.\n visibleColumns = computed(() =>\n this.entityPaneActive()\n ? this.columnsWithAction()\n .map((col) => (typeof col === 'string' ? col : col.name))\n .filter((name) => name !== 'action')\n : []\n );\n transloco = inject(TranslocoService);\n\n constructor(\n http: HttpClient,\n private snackBar: MatSnackBar,\n sanitizer: DomSanitizer,\n injector: Injector\n ) {\n super(http, sanitizer, injector);\n this.crudConfig = getEntityCrudConfig();\n if (this.crudConfig?.defaultItemActions) {\n this.defaultItemCrudActions.set(this.crudConfig?.defaultItemActions);\n } else {\n this.defaultItemCrudActions.set([\n {\n label: this.transloco.translate('spMatEntityCrud.edit'),\n role: '_update_',\n },\n {\n label: this.transloco.translate('spMatEntityCrud.delete'),\n role: '_delete_',\n },\n ]);\n }\n }\n\n override ngOnInit() {}\n\n override ngOnDestroy(): void {\n this.sub$.unsubscribe();\n }\n\n /**\n * Override so that we can suppress default action in SPMatEntityListComponent\n */\n override ngAfterViewInit(): void {}\n\n /**\n * If the create/edit entity form is active, it calls its registered\n * canCancelEdit callback to determine if it's okay to cancel the edit.\n * You can use this method from the host component's router guard to\n * ensure that any changes made to the form are not accidentally lost by\n * navigating away from the CRUD page.\n *\n * If your CRUD page has multiple sp-mat-entity-crud components, you have to\n * implement the logic to call this method on the appropriate component.\n *\n * If the the create/edit form is not active, this method returns true.\n * @returns\n */\n canDeactivate() {\n if (this.createEditViewActive()) {\n return this.canCancelEdit();\n }\n return true;\n }\n\n override refresh(force = false) {\n this.spEntitiesList()?.refresh(force);\n }\n\n closeCreateEdit(cancelled: boolean) {\n this.createEditViewActive.set(false);\n this.entityViewPaneActivated.emit({\n activated: false,\n cancelled: !!cancelled,\n mode: 'edit',\n });\n }\n\n canCancelEdit() {\n if (this.canCancelEditCallback) {\n return this.canCancelEditCallback();\n }\n return true;\n }\n\n registerCanCancelEditCallback(callback: () => boolean) {\n this.canCancelEditCallback = callback;\n }\n\n triggerEntityUpdate(entity: TEntity) {\n this.onUpdate(entity);\n }\n\n triggerEntityDelete(entity: TEntity) {\n this.onDelete(entity);\n }\n\n create(entityValue: any) {\n let obs!: Observable<TEntity | null>;\n const crudOpFn = this.crudOpFn();\n if (crudOpFn) {\n obs = crudOpFn('create', undefined, entityValue, this);\n } else {\n obs = this.http.post<TEntity>(this.getUrl(this.endpoint()), entityValue, {\n context: this.getCrudReqHttpContext('create'),\n });\n }\n\n return obs.pipe(\n showBusyWheelUntilComplete('formBusyWheel'),\n switchMap((resp) =>\n resp ? this.doRefreshAfterEdit(resp, 'create') : of(null)\n ),\n tap((entity) => {\n // If pagination is infinite or if the pagination if none or if the\n // count of items in the current page is less than pageSize()\n // wec an safely add the item to the list, which will cause the view\n // render the new item in the mat-table.\n if (entity) {\n this.spEntitiesList()?.addEntity(entity);\n this.snackBar.open(\n this.transloco.translate('spMatEntityCrud.createSuccess', {\n item: this._itemLabel(),\n })\n );\n }\n })\n );\n }\n\n update(id: TEntity[IdKey], entityValue: any) {\n let obs!: Observable<TEntity | null>;\n const crudOpFn = this.crudOpFn();\n if (crudOpFn) {\n obs = crudOpFn('update', id, entityValue, this);\n } else {\n obs = this.http.patch<TEntity>(this.getEntityUrl(id), entityValue, {\n context: this.getCrudReqHttpContext('update'),\n });\n }\n\n return obs.pipe(\n showBusyWheelUntilComplete('formBusyWheel'),\n switchMap((resp) =>\n resp ? this.doRefreshAfterEdit(resp, 'update') : of(null)\n ),\n tap((entity) => {\n if (entity) {\n this.spEntitiesList()?.updateEntity(id, entity);\n this.snackBar.open(\n this.transloco.translate('spMatEntityCrud.updateSuccess', {\n item: this._itemLabel(),\n })\n );\n }\n })\n );\n }\n\n /**\n * Refresh the entity list, after a CRUD CREATE or UPDATE operation.\n * @param resp This is the response from the CRUD operation (CREATE/UPDATE).\n * @param method The CRUD operation post which REFRESH is requested.\n * @returns Observable<TEntity|null>\n */\n doRefreshAfterEdit(resp: any, method: 'create' | 'update') {\n const refreshAfterEdit = this.refreshAfterEdit();\n const entity = this.getCrudOpResponseParser()(\n this.entityName(),\n this.idKey(),\n method,\n resp\n );\n if (refreshAfterEdit === 'object') {\n let obs!: Observable<TEntity>;\n const crudOpFn = this.crudOpFn();\n if (crudOpFn) {\n obs = crudOpFn(\n 'get',\n (entity as any)[this.idKey()],\n undefined,\n this\n ) as Observable<TEntity>;\n } else {\n obs = this.http.get<TEntity>(\n this.getEntityUrl((entity as any)[this.idKey()]),\n { context: this.getCrudReqHttpContext('retrieve') }\n );\n }\n return obs.pipe(\n map((entity) => {\n return this.getCrudOpResponseParser()(\n this.entityName(),\n this.idKey(),\n 'retrieve',\n entity\n );\n })\n );\n } else if (refreshAfterEdit === 'all') {\n this.refresh(true);\n return of(null);\n }\n\n return of(entity);\n }\n\n getCrudOpResponseParser(): SPMatEntityCrudResponseParser {\n if (this.crudResponseParser()) {\n // Without the `as SPMatEntityCrudResponseParser`, TSC will complain.\n return this.crudResponseParser() as SPMatEntityCrudResponseParser;\n }\n // crudConfig will have a parser as our default config provides one.\n return this.crudConfig\n .crudOpResponseParser as SPMatEntityCrudResponseParser;\n }\n\n // SPMatEntityCrudComponentBase interface method. Thunk to the implementation\n // method closePreviewImpl().\n closePreview() {\n this.closePreviewImpl(true);\n }\n\n private closePreviewImpl(toggleEntityListActiveEntity: boolean) {\n if (this.previewedEntity()) {\n if (toggleEntityListActiveEntity) {\n this.spEntitiesList()?.toggleActiveEntity(this.previewedEntity());\n }\n this.previewedEntity.set(undefined);\n this.entityViewPaneActivated.emit({\n activated: false,\n cancelled: undefined,\n mode: 'preview',\n });\n }\n }\n\n onItemAction(role: string, entity: TEntity) {\n if (role === '_update_') {\n this.onUpdate(entity);\n } else if (role === '_delete_') {\n this.onDelete(entity);\n } else {\n this.action.emit({ role, entity });\n }\n }\n\n onCreate(event: Event) {\n // If newItemLink() has not been provided, check if createEditFormTemplate\n // is specified. If it is, load it and make that cover the entire viewport.\n // If that too is not specified, emit an action event with role='_new_'.\n if (!this.newItemLink() || this.newItemLink()?.length == 0) {\n event.preventDefault();\n event.stopImmediatePropagation();\n firstValueFrom(this._itemLabel()).then((itemLabel) => {\n const params = {\n title:\n this.newItemLabel() ??\n this.transloco.translate('spMatEntityCrud.newItem', {\n item: itemLabel,\n }),\n };\n this.showCreateEditView(undefined, params);\n if (!this.createEditViewActive()) {\n this.action.emit({ role: '_new_' });\n }\n });\n\n // const params = {\n // title:\n // this.newItemLabel() ??\n // this.transloco.translate('spMatEntityCrud.newItem', {\n // item: this._itemLabel(),\n // }),\n // };\n // this.showCreateEditView(undefined, params);\n }\n }\n\n onUpdate(entity: TEntity) {\n firstValueFrom(this._itemLabel()).then((itemLabel) => {\n const params = {\n title:\n this.editItemTitle() ??\n this.transloco.translate('spMatEntityCrud.editItem', {\n item: itemLabel,\n }),\n };\n this.showCreateEditView(entity, params);\n if (!this.createEditViewActive()) {\n this.action.emit({ role: '_update_' });\n }\n });\n\n // const params = {\n // title:\n // this.editItemTitle() ??\n // this.transloco.translate('spMatEntityCrud.editItem', {\n // item: this._itemLabel(),\n // }),\n // };\n // this.showCreateEditView(entity, params);\n\n // const tmpl = this.createEditFormTemplate();\n // if (tmpl) {\n // // If preview is active deactivate it\n // if (this.previewActive()) {\n // this.closePreview();\n // }\n // const createEditHost = this.createEditHostComponent();\n // if (tmpl && createEditHost) {\n // createEditHost.show(entity);\n // this.createEditViewActive.set(true);\n // }\n // }\n // if (!this.createEditViewActive()) {\n // this.action.emit({ role: '_update_' });\n // }\n }\n\n /**\n * Show the create/edit component. This is deliberately made public so as to\n * be callable from the client. This allows the client to dynamically\n * set the form edit template and then show the edit pane by calling this\n * method.\n * @param entity\n * @param params\n */\n showCreateEditView(entity?: TEntity | undefined, params?: any) {\n const tmpl = this.createEditFormTemplate();\n if (!this.createEditViewActive() && tmpl) {\n // If preview is active deactivate it\n if (this.previewActive()) {\n this.closePreviewImpl(true);\n }\n const createEditHost = this.createEditHostComponent();\n createEditHost!.show(entity, params);\n this.createEditViewActive.set(true);\n this.entityViewPaneActivated.emit({\n activated: true,\n cancelled: undefined,\n mode: 'edit',\n });\n }\n }\n\n showPreviewView(entity?: TEntity, params?: any) {\n const tmpl = this.previewTemplate();\n if (tmpl) {\n if (!this.createEditViewActive()) {\n const previewHost = this.previewHostComponent();\n this.previewedEntity.set(entity);\n previewHost?.show(entity, params);\n this.entityViewPaneActivated.emit({\n activated: true,\n cancelled: undefined,\n mode: 'preview',\n });\n // this.previewActivated.emit({ entity, activated: true });\n }\n }\n }\n\n hidePreviewView() {\n if (this.previewActive()) {\n const previewHost = this.previewHostComponent();\n previewHost?.close();\n this.closePreviewImpl(false);\n }\n }\n\n async onDelete(entity: TEntity) {\n // Do the delete prompt asynchronously so that the context menu is\n // dismissed before the prompt is displayed.\n setTimeout(() => {\n // We use firstValueFrom() to get the value of the observable\n // synchronously. firstValueFrom() also gracefully cleans up the\n // observable after a value is emitted.\n firstValueFrom(this._itemLabel()).then((itemLabel) => {\n const deletedItemPrompt = this.transloco.translate(\n 'spMatEntityCrud.deleteItemConfirm',\n { item: itemLabel.toLocaleLowerCase() }\n );\n const yes = confirm(deletedItemPrompt);\n if (yes) {\n const entityId = (entity as any)[this.idKey()];\n\n // If preview is active deactivate it\n if (this.previewActive()) {\n this.closePreviewImpl(false);\n }\n\n let obs!: Observable<any>;\n const crudOpFn = this.crudOpFn();\n if (crudOpFn) {\n obs = crudOpFn('delete', entityId, undefined, this);\n } else {\n obs = this.http.delete<void>(this.getEntityUrl(entityId), {\n context: this.getCrudReqHttpContext('delete'),\n });\n }\n\n this.sub$.add(\n obs\n .pipe(\n // TODO: how to display a busy wheel?\n // showBusyWheelUntilComplete(this.busyWheelId),\n tap(() => {\n this.spEntitiesList()!.removeEntity(entityId);\n // TODO: customize by providing an interface via SPMatEntityCrudConfig?\n const deletedMessage = this.transloco.translate(\n 'spMatEntityCrud.deleteItemSuccess',\n { item: this._itemLabel() }\n );\n this.snackBar.open(deletedMessage);\n })\n )\n .subscribe()\n );\n }\n });\n });\n }\n\n override getUrl(endpoint: string) {\n return this.entityListConfig?.urlResolver\n ? this.entityListConfig?.urlResolver(endpoint)\n : endpoint;\n }\n\n getEntityUrl(entityId: TEntity[IdKey]) {\n const endpoint = this.endpoint();\n const endpointParts = endpoint.split('?');\n const entityEndpoint =\n (endpointParts[0].endsWith('/')\n ? endpointParts[0]\n : endpointParts[0] + '/') + `${String(entityId)}/`;\n if (endpointParts.length > 1) {\n return this.getUrl(entityEndpoint + `?${endpointParts[1]}`);\n }\n return this.getUrl(entityEndpoint);\n }\n\n handleSelectEntity(entity: TEntity | undefined) {\n if (!this.createEditViewActive()) {\n if (this.previewTemplate()) {\n entity ? this.showPreviewView(entity) : this.hidePreviewView();\n // this.previewedEntity.set(entity);\n } else {\n // If 'previewTemplate' is not set, propagate the event to client.\n this.selectEntity.emit(entity);\n }\n }\n }\n\n handleNewItemSubType(subtype: NewItemSubType) {\n // console.log(`handleNewItemSubType: ${subtype}`);\n if (subtype.role === '_new_') {\n this.showCreateEditView(undefined, subtype?.params);\n } else {\n this.action.emit({ role: subtype.role });\n }\n }\n\n private getCrudReqHttpContext(op: CrudOp) {\n const contextParamToHttpContext = (\n context: HttpContext,\n reqContext: [[HttpContextToken<any>, any]] | [HttpContextToken<any>, any]\n ) => {\n if (reqContext.length == 2 && !Array.isArray(reqContext[0])) {\n // one dimensional array of a key, value pair.\n context.set(reqContext[0], reqContext[1]);\n } else {\n reqContext.forEach(([k, v]) => context.set(k, v));\n }\n };\n\n let context = new HttpContext();\n const crudHttpReqContext = this.crudHttpReqContext();\n if (crudHttpReqContext) {\n if (Array.isArray(crudHttpReqContext)) {\n // Same HttpContext for all crud requests\n contextParamToHttpContext(context, crudHttpReqContext);\n } else if (\n typeof crudHttpReqContext === 'object' &&\n op &&\n crudHttpReqContext[op]\n ) {\n contextParamToHttpContext(context, crudHttpReqContext[op]!);\n // if (crudHttpReqContext[op]) {\n // context = contextParamToHttpContext(crudHttpReqContext[op] as any);\n // } else if (crudHttpReqContext['crud']) {\n // context = contextParamToHttpContext(crudHttpReqContext['crud'] as any);\n // }\n }\n // } else if (this.httpReqContext()) {\n // context = contextParamToHttpContext(this.httpReqContext()!);\n }\n\n context.set(SP_MAT_ENTITY_CRUD_HTTP_CONTEXT, {\n entityName: this.entityName(),\n entityNamePlural: this._entityNamePlural(),\n endpoint: this.endpoint(),\n op,\n });\n return context;\n // const httpReqContext = this.httpReqContext();\n // return httpReqContext\n // ? contextParamToHttpContext(httpReqContext)\n // : undefined;\n }\n\n isItemActionAllowed(action: string, entity: TEntity) {\n return false;\n }\n\n /**\n * Returns the list of item actions. Calls 'allowItemActionFn' for each action\n * to determine if the action is allowed for the given entity.\n * @returns\n */\n getItemActions(entity: TEntity): SPContextMenuItem[] {\n // console.log(`SPMatEntityCrudComponent.getItemActions - entity: ${JSON.stringify(entity, null, 2)}`);\n const actions =\n this.itemActions() && this.itemActions().length\n ? this.itemActions()\n : this.defaultItemCrudActions();\n let actionsCopy: SPContextMenuItem[] = JSON.parse(JSON.stringify(actions));\n actionsCopy.forEach((action: SPContextMenuItem, index: number) => {\n // localize default action item labels (Update & Delete)\n // Client specified action labels are to be localized by the client\n // before supplying them to the component.\n if (action.label.startsWith('spMatEntityCrud.')) {\n action.label = this.transloco.translate(action.label);\n }\n const orgDisable = actions[index]?.disable;\n action.disable = (entity: TEntity) => {\n if (orgDisable) {\n return orgDisable(entity);\n }\n const allowItemActionFn = this.allowEntityActionFn();\n if (allowItemActionFn) {\n return !allowItemActionFn(entity, action.role ?? action.label);\n }\n return false;\n };\n });\n return actionsCopy;\n }\n\n getPreviewPaneContentClass() {\n return this.previewPaneContentClass();\n }\n\n getFormPaneContentClass(): string {\n return this.formPaneContentClass();\n }\n\n /**\n * Initialize the columns for the mat-entities-list component. This is\n * called when the <sp-mat-entities-list> component has been properly\n * initialized.\n */\n private _initEntitiesList() {\n const spEntitiesList = this.spEntitiesList();\n if (spEntitiesList) {\n // Build contentColumnDefs using our component's content. Then add our own\n // 'action' column definition to it. Then set this as the value of\n // child SPMatEntityListComponent.contentColumnDef. This way we force\n // SPMatEntityListComponent to use our component's any project MatColumnDef\n // content in the final mat-table.\n const clientColumnDefs = this.clientColumnDefs;\n let contentColumnDefs = new Array<MatColumnDef>();\n if (clientColumnDefs.length) {\n // Note that we process any content projected matColumnDef first and\n // our own internal content later. And when we process our own internal\n // columns (for now only 'action'), it's not added if a column with that\n // name has already been defined via content projection. This allows the\n // clients to override even internal columns with their column defintion.\n clientColumnDefs.toArray().forEach((c) => contentColumnDefs.push(c));\n }\n this.componentColumns().forEach((ic) => {\n if (!contentColumnDefs.find((c) => c.name === ic.name)) {\n contentColumnDefs.push(ic);\n }\n });\n spEntitiesList.contentColumnDefs = contentColumnDefs;\n // This is a replication of SPMatEntityCrudList.ngAfterViewInit. That\n // code is skipped as we declare <sp-mat-entity-list> with\n // deferViewInit=true.\n spEntitiesList.buildColumns();\n spEntitiesList.setupSort();\n spEntitiesList.loadMoreEntities();\n }\n }\n}\n","import { SPContextMenuItem } from \"@smallpearl/ngx-helper/mat-context-menu\";\nimport { Observable } from \"rxjs\";\n\nexport const ITEM_ACTION_UPDATE = '_update_';\nexport const ITEM_ACTION_DELETE = '_delete_';\n\n/**\n * SPMatEntityCrudCreateEditBridge implementer uses this interface to\n * communicate with the parent SPMatEntityCreateComponent. The bridge\n * component would use the hideCreateEdit() to close itself, when user cancels\n * the create/edit operation.\n */\nexport interface SPMatEntityCrudComponentBase<TEntity> {\n /**\n * FormViewHostComponent will call this to close the Create/Edit pane.\n * SPMatEntityCrudComponentBase implementor will destroy the client form\n * view and hide the Create/Edit form view pane and show the hidden\n * entity list view.\n * @returns\n */\n closeCreateEdit: (cancelled: boolean) => void;\n /**\n * Used internally by FormViewHostComponent to determine if the client form\n * view wants to intercept user's cancel the create/edit operation. Perhaps\n * with the Yes/No prompt 'Lose changes?'\n * @returns boolean indicating it's okay to cancel the create/edit operation.\n */\n canCancelEdit: () => boolean;\n /**\n * Client form view can register a callback that will be invoked by the\n * framework when user cancels the create/edit operation by clicking on the\n * close button on the top right.\n * @param callback\n * @returns\n */\n registerCanCancelEditCallback: (callback: () => boolean) => void;\n /**\n * Initiates update on the given entity.\n * @returns\n */\n triggerEntityUpdate: (entity: TEntity) => void;\n /**\n * Initiates entity delete.\n * @returns\n */\n triggerEntityDelete: (entity: TEntity) => void;\n /**\n * Called by client form-view host component to close a new entity.\n * @param entityValue The ReactiveForm.value object that the server expects\n * to create a new object.\n * @returns The new Entity object returned by the server. For typical REST\n * API, this would be of the same shape as the objects returned by the\n * REST's GET request.\n */\n create: (entityValue: any) => Observable<any>;\n /**\n * Called by client form-view host component to close a new entity.\n * @param id The id of the entity being edited.\n * @param entityValue The ReactiveForm.value object that the server expects\n * to update the new object.\n * @returns The new Entity object returned by the server. For typical REST\n * API, this would be of the same shape as the objects returned by the\n * REST's GET request.\n */\n update: (id: any, entityValue: any) => Observable<any>;\n /**\n * Close the preview pane.\n * @returns\n */\n closePreview: () => void;\n /**\n * Returns the context menu items for the entity. This can be used to build\n * the context menu for an entity in its preview pane toolbar.\n * @returns\n */\n getItemActions(entity?: TEntity): SPContextMenuItem[];\n\n /**\n * Returns the class to be used for the preview pane content. This interface\n * is provided to allow the PreviewPaneComponent to access the client\n * configured class for the preview pane content.\n */\n getPreviewPaneContentClass(): string;\n\n getFormPaneContentClass(): string;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n input,\n InputSignal,\n OnDestroy,\n OnInit,\n} from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { SPContextMenuItem } from '@smallpearl/ngx-helper/mat-context-menu';\nimport {\n ITEM_ACTION_DELETE,\n ITEM_ACTION_UPDATE,\n SPMatEntityCrudComponentBase,\n} from './mat-entity-crud-internal-types';\n\n/**\n * A preview pane container to provide a consistent UX for all preview panes.\n * It consits of a toolbar on the top and a container div below that takes up\n * the rest of the preview pane area.\n */\n@Component({\n imports: [MatToolbarModule, MatButtonModule, MatIconModule],\n selector: 'sp-mat-entity-crud-preview-pane',\n template: `\n <div class=\"preview-wrapper\">\n <mat-toolbar>\n <mat-toolbar-row>\n @if (title()) {\n <h2>{{ title() }}</h2>\n &nbsp; } @if (!hideUpdate()) {\n <button\n mat-icon-button\n aria-label=\"Edit\"\n (click)=\"onEdit()\"\n [disabled]=\"_disableUpdate()\"\n >\n <mat-icon>edit</mat-icon>\n </button>\n } @if (!hideDelete()) {\n <button\n mat-icon-button\n aria-label=\"Delete\"\n (click)=\"onDelete()\"\n [disabled]=\"_disableDelete()\"\n >\n <mat-icon>delete</mat-icon>\n </button>\n }\n <ng-content select=\"[previewToolbarContent]\"></ng-content>\n <span class=\"spacer\"></span>\n <button mat-icon-button aria-label=\"Close\" (click)=\"onClose()\">\n <mat-icon>close</mat-icon>\n </button>\n </mat-toolbar-row>\n </mat-toolbar>\n <div\n [class]=\"\n 'preview-content ' +\n entityCrudComponent().getPreviewPaneContentClass()\n \"\n >\n <ng-content select=\"[previewContent]\"></ng-content>\n </div>\n </div>\n `,\n styles: [\n `\n .preview-wrapper {\n display: flex;\n flex-direction: column;\n height: 100% !important;\n width: 100% !important;\n }\n mat-toolbar {\n background-color: var(--mat-sys-surface-variant);;\n }\n .spacer {\n flex: 1 1 auto;\n }\n .preview-content {\n padding: 0.4em;\n flex-grow: 1;\n overflow: scroll;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SPMatEntityCrudPreviewPaneComponent<TEntity>\n implements OnInit, OnDestroy\n{\n entity = input.required<TEntity>();\n entityCrudComponent = input.required<SPMatEntityCrudComponentBase<TEntity>>();\n title = input<string>();\n disableUpdate = input<boolean>(false);\n hideUpdate = input<boolean>(false);\n disableDelete = input<boolean>(false);\n hideDelete = input<boolean>(false);\n itemActions!: SPContextMenuItem[];\n\n _disableActionFactory = (role: string, signal?: InputSignal<boolean>) => {\n return computed(() => {\n if (signal && signal()) {\n return true;\n }\n const actionFn = this.itemActions.find((a) => a.role === role)?.disable;\n if (actionFn && actionFn(this.entity())) {\n return true;\n }\n return false;\n });\n };\n _disableUpdate = this._disableActionFactory(\n ITEM_ACTION_UPDATE,\n this.disableUpdate\n );\n _disableDelete = this._disableActionFactory(\n ITEM_ACTION_DELETE,\n this.disableDelete\n );\n\n ngOnInit() {\n this.itemActions = this.entityCrudComponent().getItemActions();\n }\n\n ngOnDestroy(): void {}\n\n onEdit() {\n this.entityCrudComponent().triggerEntityUpdate(this.entity());\n }\n\n onDelete() {\n this.entityCrudComponent().triggerEntityDelete(this.entity());\n }\n\n onClose() {\n this.entityCrudComponent().closePreview();\n }\n}\n","import { ChangeDetectorRef, Component, computed, inject, input, OnDestroy, OnInit, signal } from '@angular/core';\nimport { AbstractControl, UntypedFormGroup } from '@angular/forms';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { setServerErrorsAsFormErrors } from '@smallpearl/ngx-helper/forms';\nimport { Subscription } from 'rxjs';\nimport { getEntityCrudConfig } from './default-config';\nimport { SPMatEntityCrudCreateEditBridge } from './mat-entity-crud-types';\n\n/**\n * This is a convenience base class that clients can derive from to implement\n * their CRUD form component. Particularly this class registers the change\n * detection hook which will be called when the user attempts to close the\n * form's parent container pane via the Close button on the top right.\n *\n * This button behaves like a Cancel button in a desktop app and therefore if\n * the user has entered any data in the form's controls, (determined by\n * checking form.touched), then a 'Lose Changes' prompt is displayed allowing\n * the user to cancel the closure.\n *\n * The @Component is fake just to keep the VSCode angular linter quiet.\n *\n * To use this class:-\n *\n * 1. Declare a FormGroup<> type as\n *\n * ```\n * type MyForm = FormGroup<{\n * name: FormControl<string>;\n * type: FormControl<string>;\n * notes: FormControl<string>;\n * }>;\n * ```\n *\n * 2. Derive your form's component class from this and implement the\n * createForm() method returing the FormGroup<> instance that matches\n * the FormGroup concrete type above.\n *\n * ```\n * class MyFormComponent extends SPMatEntityCrudFormBase<MyForm, MyEntity> {\n * constructor() {\n * super()\n * }\n *\n * createForm() {\n * return new FormGroup([...])\n * }\n * }\n * ```\n *\n * 3. If you form's value requires manipulation before being sent to the\n * server, override getFormValue() method and do it there before returning\n * the modified values.\n *\n * 4. Wire up the form in the template as:\n *\n * ```\n * <form [formGroup]='form'.. (ngSubmit)=\"onSubmit()\">\n * <button type=\"submit\">Submit</button>\n * </form>\n * ```\n */\n@Component({\n selector: '_#_sp-mat-entity-crud-form-base_#_', template: ``,\n standalone: false\n})\nexport abstract class SPMatEntityCrudFormBase<\n TFormGroup extends AbstractControl,\n TEntity extends { [P in IdKey]: PropertyKey },\n IdKey extends string = 'id'\n> implements OnInit, OnDestroy\n{\n _form = signal<TFormGroup|undefined>(undefined);\n entity = input.required<TEntity>();\n bridge = input.required<SPMatEntityCrudCreateEditBridge>();\n params = input<any>();\n sub$ = new Subscription();\n form = computed(() => this._form());\n crudConfig = getEntityCrudConfig();\n transloco = inject(TranslocoService);\n\n cdr = inject(ChangeDetectorRef);\n\n canCancelEdit = () => {\n return this._canCancelEdit();\n };\n\n _canCancelEdit() {\n const form = this._form();\n if (form && form.touched) {\n return window.confirm(\n this.transloco.translate('spMatEntityCrud.loseChangesConfirm')\n );\n }\n return true;\n }\n\n ngOnInit() {\n this._form.set(this.createForm(this.entity()));\n this.bridge()?.registerCanCancelEditCallback(this.canCancelEdit);\n }\n\n ngOnDestroy() {\n this.sub$.unsubscribe();\n }\n\n // get form(): TFormGroup|undefined {\n // return this._form();\n // }\n\n // set form(f: TFormGroup) {\n // this._form.set(f);\n // }\n\n /**\n * Create the TFormGroup FormGroup class that will be used for the reactive\n * form.\n * @param entity\n */\n abstract createForm(entity: TEntity | undefined): TFormGroup;\n\n /**\n * Override to customize the id key name if it's not 'id'\n * @returns The name of the unique identifier key that will be used to\n * extract the entity's id for UPDATE operation.\n */\n getIdKey() {\n return 'id';\n }\n\n /**\n * Return the form's value to be sent to server as Create/Update CRUD\n * operation data.\n * @returns\n */\n getFormValue() {\n const form = this.form()\n return form ? form.value : undefined;\n }\n\n onSubmit() {\n const value = this.getFormValue();\n const obs = !this.entity()\n ? this.bridge()?.create(value)\n : this.bridge()?.update((this.entity() as any)[this.getIdKey()], value);\n this.sub$.add(\n obs\n ?.pipe(\n setServerErrorsAsFormErrors(this._form() as unknown as UntypedFormGroup, this.cdr)\n )\n .subscribe()\n );\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i6","i9","i3"],"mappings":"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"}
@@ -774,7 +774,7 @@ class SPMatMenuLayoutComponent {
774
774
  </div>
775
775
  </mat-sidenav-content>
776
776
  </mat-sidenav-container>
777
- `, isInline: true, styles: [".layout-menu-pane{background-color:var(--sp-mat-menu-bg-color)!important;color:var(--sp-mat-menu-fg-color)!important}.layout-container{position:absolute;inset:0}.layout-menu-container{height:100%;max-width:var(--sp-mat-menu-sidemenu-max-width, 50%);min-width:var(--sp-mat-menu-sidemenu-min-width, 250px);text-wrap:nowrap;overflow-x:scroll;overflow-y:scroll}.layout-content{height:100vh;display:flex;flex-direction:column}.layout-content-toolbar{border-bottom:1px solid var(--sp-mat-menu-toolbar-border-color);flex-grow:0;background-color:var(--sp-mat-menu-toolbar-bg-color);color:var(--sp-mat-menu-toolbar-fg-color);padding:0;min-height:var(--mat-toolbar-standard-height);max-height:var(--mat-toolbar-standard-height)}.layout-content-content{flex-grow:1;overflow:hidden}.h-100{height:100%}.spacer{flex:1 1 auto}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1$1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: i4$1.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i4$1.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i4$1.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "component", type: i5$1.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: SPMatMenuPaneComponent, selector: "ngx-mat-menu-pane", inputs: ["menuTitle", "showBackButton", "defaultBackButtonHref", "backButtonText", "menuItems", "brandingText", "brandingImage", "matSideNav", "appVersion", "menuPaneFooterContent", "showIcons", "baseUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
777
+ `, isInline: true, styles: [".layout-menu-pane{background-color:var(--sp-mat-menu-bg-color)!important;color:var(--sp-mat-menu-fg-color)!important}.layout-container{position:absolute;inset:0}.layout-menu-container{height:100%;max-width:var(--sp-mat-menu-sidemenu-max-width, 50%);min-width:var(--sp-mat-menu-sidemenu-min-width, 250px);text-wrap:nowrap;overflow-x:scroll;overflow-y:scroll}.layout-content{height:100vh;display:flex;flex-direction:column;overflow-x:clip}.layout-content-toolbar{border-bottom:1px solid var(--sp-mat-menu-toolbar-border-color);flex-grow:0;background-color:var(--sp-mat-menu-toolbar-bg-color);color:var(--sp-mat-menu-toolbar-fg-color);padding:0;min-height:var(--mat-toolbar-standard-height);max-height:var(--mat-toolbar-standard-height)}.layout-content-content{flex-grow:1;overflow:hidden}.h-100{height:100%}.spacer{flex:1 1 auto}\n"], dependencies: [{ kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1$1.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "component", type: i4$1.MatSidenav, selector: "mat-sidenav", inputs: ["fixedInViewport", "fixedTopGap", "fixedBottomGap"], exportAs: ["matSidenav"] }, { kind: "component", type: i4$1.MatSidenavContainer, selector: "mat-sidenav-container", exportAs: ["matSidenavContainer"] }, { kind: "component", type: i4$1.MatSidenavContent, selector: "mat-sidenav-content" }, { kind: "component", type: i5$1.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: SPMatMenuPaneComponent, selector: "ngx-mat-menu-pane", inputs: ["menuTitle", "showBackButton", "defaultBackButtonHref", "backButtonText", "menuItems", "brandingText", "brandingImage", "matSideNav", "appVersion", "menuPaneFooterContent", "showIcons", "baseUrl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
778
778
  }
779
779
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: SPMatMenuLayoutComponent, decorators: [{
780
780
  type: Component,
@@ -840,7 +840,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImpor
840
840
  </div>
841
841
  </mat-sidenav-content>
842
842
  </mat-sidenav-container>
843
- `, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [".layout-menu-pane{background-color:var(--sp-mat-menu-bg-color)!important;color:var(--sp-mat-menu-fg-color)!important}.layout-container{position:absolute;inset:0}.layout-menu-container{height:100%;max-width:var(--sp-mat-menu-sidemenu-max-width, 50%);min-width:var(--sp-mat-menu-sidemenu-min-width, 250px);text-wrap:nowrap;overflow-x:scroll;overflow-y:scroll}.layout-content{height:100vh;display:flex;flex-direction:column}.layout-content-toolbar{border-bottom:1px solid var(--sp-mat-menu-toolbar-border-color);flex-grow:0;background-color:var(--sp-mat-menu-toolbar-bg-color);color:var(--sp-mat-menu-toolbar-fg-color);padding:0;min-height:var(--mat-toolbar-standard-height);max-height:var(--mat-toolbar-standard-height)}.layout-content-content{flex-grow:1;overflow:hidden}.h-100{height:100%}.spacer{flex:1 1 auto}\n"] }]
843
+ `, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, styles: [".layout-menu-pane{background-color:var(--sp-mat-menu-bg-color)!important;color:var(--sp-mat-menu-fg-color)!important}.layout-container{position:absolute;inset:0}.layout-menu-container{height:100%;max-width:var(--sp-mat-menu-sidemenu-max-width, 50%);min-width:var(--sp-mat-menu-sidemenu-min-width, 250px);text-wrap:nowrap;overflow-x:scroll;overflow-y:scroll}.layout-content{height:100vh;display:flex;flex-direction:column;overflow-x:clip}.layout-content-toolbar{border-bottom:1px solid var(--sp-mat-menu-toolbar-border-color);flex-grow:0;background-color:var(--sp-mat-menu-toolbar-bg-color);color:var(--sp-mat-menu-toolbar-fg-color);padding:0;min-height:var(--mat-toolbar-standard-height);max-height:var(--mat-toolbar-standard-height)}.layout-content-content{flex-grow:1;overflow:hidden}.h-100{height:100%}.spacer{flex:1 1 auto}\n"] }]
844
844
  }], ctorParameters: () => [{ type: LayoutService }, { type: i0.ChangeDetectorRef }], propDecorators: { menuNav: [{
845
845
  type: ViewChild,
846
846
  args: ['menuNav']
@@ -1 +1 @@
1
- {"version":3,"file":"smallpearl-ngx-helper-mat-side-menu-layout.mjs","sources":["../../../../projects/smallpearl/ngx-helper/mat-side-menu-layout/src/layout.service.ts","../../../../projects/smallpearl/ngx-helper/mat-side-menu-layout/src/mat-menu-list-item.component.ts","../../../../projects/smallpearl/ngx-helper/mat-side-menu-layout/src/mat-menu-pane.component.ts","../../../../projects/smallpearl/ngx-helper/mat-side-menu-layout/src/mat-menu-layout.component.ts","../../../../projects/smallpearl/ngx-helper/mat-side-menu-layout/src/mat-menu-layout.module.ts","../../../../projects/smallpearl/ngx-helper/mat-side-menu-layout/smallpearl-ngx-helper-mat-side-menu-layout.ts"],"sourcesContent":["import {\n BreakpointObserver,\n BreakpointState,\n Breakpoints,\n} from '@angular/cdk/layout';\nimport { Injectable, OnDestroy } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { BehaviorSubject, Subject, takeUntil } from 'rxjs';\n\nexport interface SideMenuLayoutProps {\n smallScreen: boolean;\n toolbarHeight: number;\n}\n\n@Injectable({ providedIn: 'any' })\nexport class LayoutService implements OnDestroy {\n marginTop: number = 64;\n toolbarHeight: number = 64;\n smallScreen: boolean = false;\n\n destroy = new Subject<void>();\n _previousUrl: string = '';\n\n layoutChanged = new BehaviorSubject<SideMenuLayoutProps>({\n smallScreen: false,\n toolbarHeight: 64,\n });\n\n constructor(public breakpointObserver: BreakpointObserver, router: Router) {\n this.breakpointObserver\n .observe([\n Breakpoints.XSmall,\n Breakpoints.Small,\n Breakpoints.Medium,\n Breakpoints.Large,\n Breakpoints.XLarge,\n ])\n .pipe(takeUntil(this.destroy))\n .subscribe((result: BreakpointState) => {\n let smallScreen = this.smallScreen;\n let marginTop = this.marginTop;\n for (const query of Object.keys(result.breakpoints)) {\n if (result.breakpoints[query]) {\n if (query == Breakpoints.XSmall) {\n smallScreen = true;\n marginTop = 56;\n // } else if (query === Breakpoints.Small) {\n // smallScreen = true;\n // marginTop = 56;\n } else {\n smallScreen = false;\n }\n }\n }\n if (this.smallScreen != smallScreen || this.marginTop != marginTop) {\n this.smallScreen = smallScreen;\n this.toolbarHeight = this.marginTop = marginTop;\n const newLayout = {\n smallScreen: smallScreen,\n toolbarHeight: marginTop,\n };\n this.layoutChanged.next(newLayout);\n }\n });\n\n // router.events\n // .pipe(\n // filter(\n // (e: RouterEvent) =>\n // e instanceof NavigationStart && (router.url.startsWith('/community') || router.url.startsWith('/company'))\n // ),\n // tap(() => {\n // // console.log(`URL: ${this.router.url}`);\n // this._previousUrl = router.url;\n // })\n // )\n // .subscribe();\n }\n\n ngOnDestroy(): void {\n this.destroy.next();\n }\n\n get previousUrl() {\n return this._previousUrl;\n }\n}\n","import {\n animate,\n state,\n style,\n transition,\n trigger,\n} from '@angular/animations';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostBinding,\n Input,\n OnDestroy,\n OnInit,\n QueryList,\n ViewChildren,\n} from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { NavItem } from './nav-item';\n\n@Component({\n selector: 'ngx-mat-menu-list-item',\n template: `\n <a\n *ngIf=\"item.children || item.route; else divider\"\n mat-list-item\n [ngStyle]=\"{ 'padding-left': depth * 8 + 'px' }\"\n [disabled]=\"item.disabled\"\n [attr.routerLink]=\"!item.children ? item.route : null\"\n class=\"menu-list-item pl-8\"\n [ngClass]=\"{\n highlighted: this.highlighted,\n 'not-highlighted': !this.highlighted,\n }\"\n routerLinkActive=\"is-active\"\n (click)=\"onItemSelected($event, item)\"\n >\n <mat-icon\n *ngIf=\"\n (item.icon && showIcon && !item.iconType) || item.iconType == 'mat'\n \"\n class=\"menu-item-color\"\n matListItemIcon\n >{{ item.icon }}</mat-icon\n >\n <i\n *ngIf=\"item.icon && showIcon && item.iconType != 'mat'\"\n [class]=\"'menu-item-color ' + item.icon\"\n ></i>\n <span class=\"menu-item-color\">{{ item.text }}</span>\n <span class=\"twistie-separator\"></span>\n <span *ngIf=\"item.children && item.children.length\">\n <mat-icon\n class=\"menu-twistie menu-item-color\"\n [@indicatorRotate]=\"expanded ? 'expanded' : 'collapsed'\"\n >\n expand_more\n </mat-icon>\n </span>\n </a>\n <div>\n <ngx-mat-menu-list-item\n class=\"menu-child\"\n [showIcon]=\"showIcon\"\n [ngStyle]=\"{ display: expanded ? 'inherit' : 'none' }\"\n *ngFor=\"let child of item.children\"\n [item]=\"child\"\n [parent]=\"this\"\n [depth]=\"depth + 1\"\n ></ngx-mat-menu-list-item>\n </div>\n <ng-template #divider>\n <div class=\"menu-divider\"></div>\n </ng-template>\n `,\n styles: [\n `\n .menu-list-item {\n margin-right: 8px !important;\n }\n .pl-8 {\n padding-left: 8px;\n }\n .twistie-separator {\n flex: 1 1 0%;\n }\n .routeIcon {\n margin-right: 10px;\n font-size: 16pt;\n }\n .menu-item-text {\n font-size: 10pt;\n }\n .menu-twistie {\n font-size: 10pt;\n height: 12px;\n width: 12px;\n }\n mat-icon {\n margin-left: 8px !important;\n margin-right: 8px !important;\n }\n .menu-item-color {\n background-color: var(--sp-mat-menu-menu-item-bg-color) !important;\n color: var(--sp-mat-menu-menu-item-fg-color) !important;\n }\n .highlighted {\n background-color: var(\n --sp-mat-menu-highlighted-menu-item-bg-color\n ) !important;\n color: var(--sp-mat-menu-highlighted-menu-item-fg-color) !important;\n }\n .highlighted .menu-item-color {\n background-color: var(\n --sp-mat-menu-highlighted-menu-item-bg-color\n ) !important;\n color: var(--sp-mat-menu-highlighted-menu-item-fg-color) !important;\n }\n .mdc-list-item {\n padding-right: 0px;\n }\n .menu-divider {\n height: 1em;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('indicatorRotate', [\n state('collapsed', style({ transform: 'rotate(0deg)' })),\n state('expanded', style({ transform: 'rotate(180deg)' })),\n transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4,0.0,0.2,1)')),\n ]),\n ],\n standalone: false\n})\nexport class SPMatMenuListItemComponent implements OnInit, OnDestroy {\n expanded = false;\n @Input() highlighted = false;\n @HostBinding('attr.aria-expanded') ariaExpanded = this.expanded;\n\n // The NavItem associated with this item.\n @Input() item!: NavItem;\n\n // This is an implementation property that is used to control with offset\n // of the menu item from the start of the screen to indicate that an item\n // is a child of a parent menu item.\n @Input() depth!: number;\n\n // The parent of this menu item. Set only for child items. Will be undefined\n // for top level menu items\n @Input() parent!: SPMatMenuListItemComponent;\n\n @Input() showIcon: boolean = true;\n\n // All child MenuListItemComponents so that we can check each one if\n // the current url ends with the child component's NavItem.route.\n // If it does then we have to mark this component as expanded.\n @ViewChildren(SPMatMenuListItemComponent)\n children!: QueryList<SPMatMenuListItemComponent>;\n\n constructor(\n public route: ActivatedRoute,\n public router: Router,\n private dialog: MatDialog,\n private cdr: ChangeDetectorRef\n ) {\n if (this.depth === undefined) {\n this.depth = 1;\n }\n }\n\n ngOnInit(): void {}\n\n ngOnDestroy(): void {}\n\n // Return highlighted status\n get isHighlighted() {\n return this.highlighted;\n }\n\n toggleHighlight(highlight: boolean) {\n if (highlight != this.highlighted) {\n this.highlighted = highlight;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Expand a parent container menu item.\n */\n expand() {\n if (!this.item?.route && !this.expanded) {\n this.expanded = this.ariaExpanded = true;\n this.cdr.detectChanges();\n if (this.parent) {\n this.parent.expand();\n }\n }\n }\n\n /**\n * Collapse an expanded parent container menu item.\n */\n collapse() {\n if (!this.item?.route && this.expanded) {\n this.expanded = this.ariaExpanded = false;\n this.cdr.detectChanges();\n }\n }\n\n checkChildrenForHighlight(lastUrlSegment: string) {\n let childHighlighted = false;\n this.children.forEach((childItem) => {\n if (childItem.item.route === lastUrlSegment) {\n childItem.toggleHighlight(true);\n childHighlighted = true;\n } else {\n childItem.toggleHighlight(false);\n if (childItem.item?.children) {\n if (childItem.checkChildrenForHighlight(lastUrlSegment)) {\n childHighlighted = true;\n }\n }\n childItem.expand(); // open the childItem\n }\n });\n return childHighlighted; // Return highlighted state so that caller can\n // expand itself.\n }\n\n // Item selection handler\n onItemSelected(ev: Event, item: NavItem): void {\n this.dialog.closeAll();\n\n // Leaf menu item, navigate the router to the item's route.\n if (!item.children) {\n if (item?.backButton && item?.backHref) {\n // Idiotic way to implement Back button! This will conflict\n // with the browser history as the current satellite app\n // page would become the previous page to backHref page! A complex\n // mechanism to navigate back accurately, by popping all the\n // intermediate pages is beyond our scope for now.\n this.router.navigateByUrl(item.backHref);\n } else if (item.route) {\n this.router.navigate([item.route], {\n relativeTo: this.route,\n state: {\n backHref: window.location.pathname,\n },\n });\n }\n } else {\n // Sub menu items, toogle the item to show/hide the child menu items.\n ev.preventDefault();\n ev.stopImmediatePropagation();\n this.expanded = !this.expanded;\n this.cdr.detectChanges();\n }\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n effect,\n Injector,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n runInInjectionContext,\n SimpleChanges,\n TemplateRef,\n viewChildren\n} from '@angular/core';\nimport { MatSidenav } from '@angular/material/sidenav';\nimport { NavigationEnd, Router, Event as RouterEvent } from '@angular/router';\nimport { Subject, filter, takeUntil, tap } from 'rxjs';\nimport { LayoutService, SideMenuLayoutProps } from './layout.service';\nimport { SPMatMenuListItemComponent } from './mat-menu-list-item.component';\nimport { NavItem } from './nav-item';\n\n@Component({\n selector: 'ngx-mat-menu-pane',\n template: `\n <div class=\"menu-pane-wrapper\">\n <div class=\"sidenav-branding mat-toolbar-single-row\">\n <div class=\"branding branding-logo\">\n <img *ngIf=\"brandingImage\" [src]=\"brandingImage\" />\n </div>\n <h4 class=\"mat-typography branding branding-text\">\n {{ brandingText }}\n </h4>\n </div>\n <div class=\"sidenav-menu\">\n <div *ngIf=\"menuTitle\" class=\"mat-body title\">{{ menuTitle }}</div>\n <mat-nav-list>\n <ngx-mat-menu-list-item\n *ngIf=\"backButtonNavItem\"\n [item]=\"backButtonNavItem\"\n ></ngx-mat-menu-list-item>\n <ngx-mat-menu-list-item\n *ngFor=\"let item of menuItems\"\n [item]=\"item\"\n [showIcon]=\"showIcons\"\n ></ngx-mat-menu-list-item>\n </mat-nav-list>\n </div>\n <div class=\"sidenav-version\" *ngIf=\"menuPaneFooterContent\">\n <ng-container *ngTemplateOutlet=\"menuPaneFooterContent\"> </ng-container>\n </div>\n </div>\n `,\n styleUrls: ['./mat-menu-pane.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class SPMatMenuPaneComponent implements OnInit, OnDestroy, AfterViewInit, OnChanges {\n @Input() menuTitle: string = '';\n @Input() showBackButton: boolean = false;\n @Input() defaultBackButtonHref: string = '';\n @Input() backButtonText: string = 'BACK';\n @Input() menuItems: NavItem[] = [];\n @Input() brandingText: string = 'BRAND';\n @Input() brandingImage: string = '';\n @Input() matSideNav: MatSidenav | undefined;\n @Input() appVersion: string = '0.0';\n @Input() menuPaneFooterContent!: TemplateRef<any>;\n @Input() showIcons: boolean = true;\n @Input() baseUrl = '';\n layout!: SideMenuLayoutProps;\n\n backButtonNavItem: NavItem | undefined;\n destroy = new Subject<void>();\n\n menuItemComps = viewChildren(SPMatMenuListItemComponent);\n\n // So that if menuItems is specified via an async pipe, we can highlight the\n // current URL after the menuItems are loaded.\n menuItemComps$ = effect(() => {\n const components = this.menuItemComps();\n runInInjectionContext(this.injector, () => {\n this.highlightUrlMenuItem(this.router.routerState.snapshot.url);\n });\n });\n\n constructor(\n public cdr: ChangeDetectorRef,\n private layoutService: LayoutService,\n private router: Router,\n private injector: Injector\n ) {}\n\n ngOnInit() {\n this.layoutService.layoutChanged\n .pipe(\n takeUntil(this.destroy),\n tap((newLayout) => {\n // console.log(\n // 'Layout changed - new toolbar height:',\n // newLayout.toolbarHeight\n // );\n this.layout = newLayout;\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n if (this.showBackButton) {\n this.backButtonNavItem = {\n route: this.layoutService.previousUrl\n ? this.layoutService.previousUrl\n : this.defaultBackButtonHref,\n text: this.backButtonText,\n icon: 'arrow_back',\n backButton: true,\n backHref: window.history.state ? window.history.state['backHref'] : '#',\n };\n this.cdr.detectChanges();\n }\n\n this.router.events\n .pipe(\n takeUntil(this.destroy),\n filter((e) => e instanceof NavigationEnd),\n tap((e: RouterEvent) => {\n if (this.matSideNav && this.layout.smallScreen) {\n this.matSideNav.close();\n }\n const ne = e as NavigationEnd;\n this.highlightUrlMenuItem(ne.urlAfterRedirects);\n })\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {\n this.destroy.next();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['backButtonText']) {\n if (this.backButtonNavItem) {\n this.backButtonNavItem = {\n ...this.backButtonNavItem,\n text: this.backButtonText,\n };\n this.cdr.detectChanges();\n }\n }\n }\n\n ngAfterViewInit(): void {\n this.highlightUrlMenuItem(this.router.routerState.snapshot.url);\n }\n\n /**\n * Highlights the menu item for the specified URL.\n *\n * @param url the full url of the current navigation\n *\n * The way this function works is like this.\n *\n * It first finds the NavItem matching the given URL in url arg. It does\n * this by removing the baseUrl from the url and then comparing the\n * NavItem.route attached to each SPMatMenuListItemComponent. This is done\n * recursively covering all NavItem.children. When a matching NavItem is\n * found, the function goes on to find the SPMatMenuListItemComponent which\n * has this NavItem attached to it. This too is done recursively to find\n * the innermost NavItem with matching URL.\n *\n * When a matching SPMatMenuListItemComponent is found, it first deselects\n * the previous SPMatMenuListItemComponent selection and then goes on to\n * select the newly matched SPMatMenuListItemComponent. If the\n * SPMatMenuListItemComponent is a child of a parent NavItem, the parent\n * NavItem is expanded. Similarly when deselecting the current selection,\n * if it belongs to a parent NavItem and the parent is not shared by the\n * currently matched SPMatMenuListItemComponent, it collapses the parent\n * of the previously selected SPMatMenuListItemComponent. (Quite a mouthful\n * of a sentence, but it's exactly how it works.)\n */\n highlightUrlMenuItem(url: string) {\n // Remove baseUrl from our url-to-SPMatMenuListItem matching logic\n const baseUrl = this.baseUrl.startsWith('/') ? this.baseUrl.substring(1) : this.baseUrl;\n const baseUrlIndex = url.search(baseUrl);\n if (baseUrlIndex != -1) {\n url = url.substring(baseUrlIndex+baseUrl.length);\n }\n\n // Filter out empty strings so that we avoid a pointless iteration of the\n // menuItemComps() array.\n const urlParts = url.split('/').filter(u => !!u);\n url = urlParts.join('/');\n // console.log(`highlightCurrentUrlMenuItem - baseUrl: ${this.baseUrl} url: ${url}, urlParts: ${urlParts}`);\n let highlightedItemFound = false;\n\n // Function to find the NavItem for for the given url. Returns a NavItem\n // if a matching NavItem is found, undefined otherwise.\n const findNavItemForUrl = (baseUrl: string, navItem: NavItem): NavItem|undefined => {\n let matchingItem: NavItem|undefined = undefined;\n if (navItem.children) {\n for (let index = 0; !matchingItem && index < navItem.children.length; index++) {\n matchingItem = findNavItemForUrl(baseUrl + (navItem?.route ?? ''), navItem.children[index]);\n }\n } else if (navItem.route) {\n if (url === navItem.route) {\n matchingItem = navItem;\n }\n }\n return matchingItem;\n }\n\n let matchingNavItem: NavItem|undefined = undefined;\n for (let index = 0; !matchingNavItem && index < this.menuItemComps().length; index++) {\n const element = this.menuItemComps()[index];\n if (element?.item) {\n matchingNavItem = findNavItemForUrl(url, element?.item);\n }\n }\n\n // Function to find the SPMatMenuListItemComponent for the given NavItem.\n // Returns SPMatMenuListItemComponent if a match is found, undefined\n // otherwise.\n const findMenuItemCompForNavItem = (\n menuItemComp: SPMatMenuListItemComponent,\n target: NavItem\n ): SPMatMenuListItemComponent | undefined => {\n let matchingMenuItemComp: SPMatMenuListItemComponent | undefined = undefined;\n if (menuItemComp.item === target) {\n matchingMenuItemComp = menuItemComp;\n } else if (menuItemComp.item?.children) {\n for (let index = 0; !matchingMenuItemComp && index < menuItemComp.children.length; index++) {\n matchingMenuItemComp = findMenuItemCompForNavItem(menuItemComp.children.get(index)!, target);\n }\n }\n return matchingMenuItemComp;\n };\n\n let matchingMenuItemComp: SPMatMenuListItemComponent | undefined = undefined;\n if (matchingNavItem) {\n for (let index = 0; !matchingMenuItemComp && index < this.menuItemComps().length; index++) {\n const element = this.menuItemComps()[index];\n matchingMenuItemComp = findMenuItemCompForNavItem(this.menuItemComps()[index], matchingNavItem);\n }\n }\n\n if (matchingMenuItemComp) {\n this.highlightMenuItemComp(matchingMenuItemComp);\n }\n\n // old logic, which is a little confusing and depends on state stored\n // in SPMatMenuListItemComponent.\n /*\n for (let index = 0; !highlightedItemFound && index < urlParts.length; index++) {\n const lastUrlSegment = urlParts[index];\n this.menuItemComps().find(menuItemComp => {\n const route = menuItemComp.item?.route;\n if (route === lastUrlSegment) {\n if (!menuItemComp.item?.children) {\n menuItemComp.toggleHighlight(true);\n highlightedItemFound = true;\n } else if (menuItemComp.checkChildrenForHighlight(lastUrlSegment)) {\n menuItemComp.expand();\n highlightedItemFound = true;\n }\n } else {\n menuItemComp.toggleHighlight(false);\n if (menuItemComp.item?.children) {\n if (menuItemComp.checkChildrenForHighlight(lastUrlSegment)) {\n menuItemComp.expand();\n highlightedItemFound = true\n };\n }\n }\n });\n }\n */\n }\n\n // To keep track of current highlighted SPMatMenuListItemComponent.\n private _curHighlitedMenuItemComp!: SPMatMenuListItemComponent|undefined;\n highlightMenuItemComp(menuItemComp: SPMatMenuListItemComponent) {\n // Deslect currently highliged SPMatMenuListItemComponent if it's different\n // from the menuItemComp arg.\n const lastHighlitedMenuItemComp = this._curHighlitedMenuItemComp;\n if (this._curHighlitedMenuItemComp && this._curHighlitedMenuItemComp !== menuItemComp) {\n this._curHighlitedMenuItemComp.toggleHighlight(false);\n this._curHighlitedMenuItemComp = undefined;\n }\n menuItemComp.toggleHighlight(true);\n if (lastHighlitedMenuItemComp && lastHighlitedMenuItemComp?.parent) {\n lastHighlitedMenuItemComp.parent.collapse();\n }\n if (menuItemComp.parent) {\n menuItemComp.parent.expand();\n }\n this._curHighlitedMenuItemComp = menuItemComp;\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { MatSidenav } from '@angular/material/sidenav';\nimport { Subject, takeUntil, tap } from 'rxjs';\nimport { LayoutService, SideMenuLayoutProps } from './layout.service';\nimport { NavItem } from './nav-item';\n\n@Component({\n selector: 'sp-mat-menu-layout',\n template: `\n <mat-sidenav-container class=\"layout-container\">\n <mat-sidenav\n class=\"layout-menu-pane\"\n opened\n #menuNav\n [mode]=\"layout.smallScreen ? 'over' : 'side'\"\n [opened]=\"!layout.smallScreen\"\n [fixedInViewport]=\"layout.smallScreen\"\n >\n <div class=\"layout-menu-container\">\n <ngx-mat-menu-pane\n [baseUrl]=\"baseUrl\"\n [showBackButton]=\"showBackButton\"\n [showIcons]=\"showIcons\"\n [defaultBackButtonHref]=\"defaultBackButtonHref\"\n [backButtonText]=\"backButtonText\"\n [brandingImage]=\"brandingImage\"\n [brandingText]=\"brandingText\"\n [menuItems]=\"menuItems\"\n [matSideNav]=\"menuNav\"\n [menuPaneFooterContent]=\"menuPaneFooterContent\"\n [menuTitle]=\"menuTitle\"\n class=\"h-100\"\n ></ngx-mat-menu-pane>\n </div>\n </mat-sidenav>\n\n <mat-sidenav\n [ngStyle]=\"{\n 'min-width.px': infoPaneMinWidth,\n 'max-width.px': infoPaneMaxWidth\n }\"\n #infoPane\n closed\n mode=\"over\"\n position=\"end\"\n >\n <ng-container *ngTemplateOutlet=\"infoPaneContent\"></ng-container>\n </mat-sidenav>\n\n <mat-sidenav-content class=\"layout-content\">\n <mat-toolbar class=\"layout-content-toolbar\">\n <button mat-icon-button (click)=\"onToggleMenuPane()\">\n <mat-icon>menu</mat-icon>\n </button>\n <ng-template #defaultToolbarTitle>\n <h4>{{ appTitle }}</h4>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n toolbarTitleContent ? toolbarTitleContent : defaultToolbarTitle\n \"\n ></ng-container>\n <span class=\"spacer\"></span>\n <ng-container *ngTemplateOutlet=\"toolbarEndContent\"></ng-container>\n </mat-toolbar>\n <div class=\"layout-content-content\" [class]=\"contentContainerClass\">\n <router-outlet></router-outlet>\n </div>\n </mat-sidenav-content>\n </mat-sidenav-container>\n `,\n styles: [\n `\n .layout-menu-pane {\n background-color: var(--sp-mat-menu-bg-color) !important;\n color: var(--sp-mat-menu-fg-color) !important;\n }\n .layout-container {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n }\n .layout-menu-container {\n height: 100%;\n max-width: var(--sp-mat-menu-sidemenu-max-width, 50%);\n min-width: var(--sp-mat-menu-sidemenu-min-width, 250px);\n text-wrap: nowrap;\n overflow-x: scroll;\n overflow-y: scroll;\n }\n .layout-content {\n height: 100vh;\n display: flex;\n flex-direction: column;\n }\n .layout-content-toolbar {\n border-bottom: 1px solid var(--sp-mat-menu-toolbar-border-color);\n flex-grow: 0;\n background-color: var(--sp-mat-menu-toolbar-bg-color);\n color: var(--sp-mat-menu-toolbar-fg-color);\n padding: 0 0;\n min-height: var(--mat-toolbar-standard-height);\n max-height: var(--mat-toolbar-standard-height);\n }\n .layout-content-content {\n flex-grow: 1;\n overflow: hidden;\n }\n .h-100 {\n height: 100%;\n }\n .spacer {\n flex: 1 1 auto;\n }\n `,\n ],\n // Add this style to make the content-container scroll from within.\n // That is override the window scrolling with the content div private\n // scroller.\n // .content-container {\n // overflow-x: scroll;\n // overflow-y: scroll;\n // }\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class SPMatMenuLayoutComponent implements OnInit, OnDestroy {\n @ViewChild('menuNav') menuNav!: MatSidenav;\n layout!: SideMenuLayoutProps;\n destroy = new Subject<void>();\n containerHeight: number = 500;\n topBottomPadding: number = 6;\n @Input() baseUrl = '';\n @Input() showBackButton: boolean = false;\n @Input() defaultBackButtonHref: string = '';\n @Input() backButtonText: string = 'BACK';\n @Input() brandingImage: string = '';\n @Input() brandingText: string = '';\n @Input() appTitle: string = '';\n @Input() menuTitle: string = '';\n @Input() menuItems: NavItem[] = [];\n // Template Partials for configurable portions of the layout\n @Input() menuPaneFooterContent!: TemplateRef<any>;\n @Input() toolbarEndContent!: TemplateRef<any>;\n @Input() infoPaneContent!: TemplateRef<any>;\n @Input() toolbarTitleContent!: TemplateRef<any>;\n // Width of the info pane on the right (or left for LTR) of the screen.\n @Input() infoPaneMinWidth: number = 250;\n @Input() infoPaneMaxWidth: number = 400;\n @Input() contentContainerClass: string = '';\n @Input() showIcons: boolean = true;\n // Allows querying infoPane to activate it or to set its attributes\n @ViewChild('infoPane') readonly infoPane!: MatSidenav;\n\n constructor(\n private layoutService: LayoutService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.layoutService.layoutChanged\n .pipe(\n takeUntil(this.destroy),\n tap((newLayout: SideMenuLayoutProps) => {\n this.layout = newLayout;\n this.containerHeight =\n window.innerHeight -\n (newLayout.toolbarHeight + this.topBottomPadding * 2);\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {\n this.destroy.next();\n this.destroy.complete();\n }\n\n onToggleMenuPane() {\n if (this.menuNav) {\n this.menuNav.toggle();\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatListModule } from '@angular/material/list';\nimport { RouterOutlet } from '@angular/router';\nimport { SPMatMenuLayoutComponent } from './mat-menu-layout.component';\nimport { SPMatMenuListItemComponent } from './mat-menu-list-item.component';\nimport { SPMatMenuPaneComponent } from './mat-menu-pane.component';\n\n@NgModule({\n declarations: [SPMatMenuPaneComponent, SPMatMenuListItemComponent, SPMatMenuLayoutComponent],\n imports: [\n CommonModule,\n RouterOutlet,\n MatSidenavModule,\n MatToolbarModule,\n MatIconModule,\n MatButtonModule,\n MatMenuModule,\n MatDialogModule,\n MatListModule\n ],\n exports: [SPMatMenuPaneComponent, SPMatMenuListItemComponent, SPMatMenuLayoutComponent],\n})\nexport class SPMatMenuLayoutModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i1","i1.LayoutService","i4","i5.SPMatMenuListItemComponent","i3","i5","i6","i8.SPMatMenuPaneComponent"],"mappings":"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"}
1
+ {"version":3,"file":"smallpearl-ngx-helper-mat-side-menu-layout.mjs","sources":["../../../../projects/smallpearl/ngx-helper/mat-side-menu-layout/src/layout.service.ts","../../../../projects/smallpearl/ngx-helper/mat-side-menu-layout/src/mat-menu-list-item.component.ts","../../../../projects/smallpearl/ngx-helper/mat-side-menu-layout/src/mat-menu-pane.component.ts","../../../../projects/smallpearl/ngx-helper/mat-side-menu-layout/src/mat-menu-layout.component.ts","../../../../projects/smallpearl/ngx-helper/mat-side-menu-layout/src/mat-menu-layout.module.ts","../../../../projects/smallpearl/ngx-helper/mat-side-menu-layout/smallpearl-ngx-helper-mat-side-menu-layout.ts"],"sourcesContent":["import {\n BreakpointObserver,\n BreakpointState,\n Breakpoints,\n} from '@angular/cdk/layout';\nimport { Injectable, OnDestroy } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { BehaviorSubject, Subject, takeUntil } from 'rxjs';\n\nexport interface SideMenuLayoutProps {\n smallScreen: boolean;\n toolbarHeight: number;\n}\n\n@Injectable({ providedIn: 'any' })\nexport class LayoutService implements OnDestroy {\n marginTop: number = 64;\n toolbarHeight: number = 64;\n smallScreen: boolean = false;\n\n destroy = new Subject<void>();\n _previousUrl: string = '';\n\n layoutChanged = new BehaviorSubject<SideMenuLayoutProps>({\n smallScreen: false,\n toolbarHeight: 64,\n });\n\n constructor(public breakpointObserver: BreakpointObserver, router: Router) {\n this.breakpointObserver\n .observe([\n Breakpoints.XSmall,\n Breakpoints.Small,\n Breakpoints.Medium,\n Breakpoints.Large,\n Breakpoints.XLarge,\n ])\n .pipe(takeUntil(this.destroy))\n .subscribe((result: BreakpointState) => {\n let smallScreen = this.smallScreen;\n let marginTop = this.marginTop;\n for (const query of Object.keys(result.breakpoints)) {\n if (result.breakpoints[query]) {\n if (query == Breakpoints.XSmall) {\n smallScreen = true;\n marginTop = 56;\n // } else if (query === Breakpoints.Small) {\n // smallScreen = true;\n // marginTop = 56;\n } else {\n smallScreen = false;\n }\n }\n }\n if (this.smallScreen != smallScreen || this.marginTop != marginTop) {\n this.smallScreen = smallScreen;\n this.toolbarHeight = this.marginTop = marginTop;\n const newLayout = {\n smallScreen: smallScreen,\n toolbarHeight: marginTop,\n };\n this.layoutChanged.next(newLayout);\n }\n });\n\n // router.events\n // .pipe(\n // filter(\n // (e: RouterEvent) =>\n // e instanceof NavigationStart && (router.url.startsWith('/community') || router.url.startsWith('/company'))\n // ),\n // tap(() => {\n // // console.log(`URL: ${this.router.url}`);\n // this._previousUrl = router.url;\n // })\n // )\n // .subscribe();\n }\n\n ngOnDestroy(): void {\n this.destroy.next();\n }\n\n get previousUrl() {\n return this._previousUrl;\n }\n}\n","import {\n animate,\n state,\n style,\n transition,\n trigger,\n} from '@angular/animations';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostBinding,\n Input,\n OnDestroy,\n OnInit,\n QueryList,\n ViewChildren,\n} from '@angular/core';\nimport { MatDialog } from '@angular/material/dialog';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { NavItem } from './nav-item';\n\n@Component({\n selector: 'ngx-mat-menu-list-item',\n template: `\n <a\n *ngIf=\"item.children || item.route; else divider\"\n mat-list-item\n [ngStyle]=\"{ 'padding-left': depth * 8 + 'px' }\"\n [disabled]=\"item.disabled\"\n [attr.routerLink]=\"!item.children ? item.route : null\"\n class=\"menu-list-item pl-8\"\n [ngClass]=\"{\n highlighted: this.highlighted,\n 'not-highlighted': !this.highlighted,\n }\"\n routerLinkActive=\"is-active\"\n (click)=\"onItemSelected($event, item)\"\n >\n <mat-icon\n *ngIf=\"\n (item.icon && showIcon && !item.iconType) || item.iconType == 'mat'\n \"\n class=\"menu-item-color\"\n matListItemIcon\n >{{ item.icon }}</mat-icon\n >\n <i\n *ngIf=\"item.icon && showIcon && item.iconType != 'mat'\"\n [class]=\"'menu-item-color ' + item.icon\"\n ></i>\n <span class=\"menu-item-color\">{{ item.text }}</span>\n <span class=\"twistie-separator\"></span>\n <span *ngIf=\"item.children && item.children.length\">\n <mat-icon\n class=\"menu-twistie menu-item-color\"\n [@indicatorRotate]=\"expanded ? 'expanded' : 'collapsed'\"\n >\n expand_more\n </mat-icon>\n </span>\n </a>\n <div>\n <ngx-mat-menu-list-item\n class=\"menu-child\"\n [showIcon]=\"showIcon\"\n [ngStyle]=\"{ display: expanded ? 'inherit' : 'none' }\"\n *ngFor=\"let child of item.children\"\n [item]=\"child\"\n [parent]=\"this\"\n [depth]=\"depth + 1\"\n ></ngx-mat-menu-list-item>\n </div>\n <ng-template #divider>\n <div class=\"menu-divider\"></div>\n </ng-template>\n `,\n styles: [\n `\n .menu-list-item {\n margin-right: 8px !important;\n }\n .pl-8 {\n padding-left: 8px;\n }\n .twistie-separator {\n flex: 1 1 0%;\n }\n .routeIcon {\n margin-right: 10px;\n font-size: 16pt;\n }\n .menu-item-text {\n font-size: 10pt;\n }\n .menu-twistie {\n font-size: 10pt;\n height: 12px;\n width: 12px;\n }\n mat-icon {\n margin-left: 8px !important;\n margin-right: 8px !important;\n }\n .menu-item-color {\n background-color: var(--sp-mat-menu-menu-item-bg-color) !important;\n color: var(--sp-mat-menu-menu-item-fg-color) !important;\n }\n .highlighted {\n background-color: var(\n --sp-mat-menu-highlighted-menu-item-bg-color\n ) !important;\n color: var(--sp-mat-menu-highlighted-menu-item-fg-color) !important;\n }\n .highlighted .menu-item-color {\n background-color: var(\n --sp-mat-menu-highlighted-menu-item-bg-color\n ) !important;\n color: var(--sp-mat-menu-highlighted-menu-item-fg-color) !important;\n }\n .mdc-list-item {\n padding-right: 0px;\n }\n .menu-divider {\n height: 1em;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('indicatorRotate', [\n state('collapsed', style({ transform: 'rotate(0deg)' })),\n state('expanded', style({ transform: 'rotate(180deg)' })),\n transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4,0.0,0.2,1)')),\n ]),\n ],\n standalone: false\n})\nexport class SPMatMenuListItemComponent implements OnInit, OnDestroy {\n expanded = false;\n @Input() highlighted = false;\n @HostBinding('attr.aria-expanded') ariaExpanded = this.expanded;\n\n // The NavItem associated with this item.\n @Input() item!: NavItem;\n\n // This is an implementation property that is used to control with offset\n // of the menu item from the start of the screen to indicate that an item\n // is a child of a parent menu item.\n @Input() depth!: number;\n\n // The parent of this menu item. Set only for child items. Will be undefined\n // for top level menu items\n @Input() parent!: SPMatMenuListItemComponent;\n\n @Input() showIcon: boolean = true;\n\n // All child MenuListItemComponents so that we can check each one if\n // the current url ends with the child component's NavItem.route.\n // If it does then we have to mark this component as expanded.\n @ViewChildren(SPMatMenuListItemComponent)\n children!: QueryList<SPMatMenuListItemComponent>;\n\n constructor(\n public route: ActivatedRoute,\n public router: Router,\n private dialog: MatDialog,\n private cdr: ChangeDetectorRef\n ) {\n if (this.depth === undefined) {\n this.depth = 1;\n }\n }\n\n ngOnInit(): void {}\n\n ngOnDestroy(): void {}\n\n // Return highlighted status\n get isHighlighted() {\n return this.highlighted;\n }\n\n toggleHighlight(highlight: boolean) {\n if (highlight != this.highlighted) {\n this.highlighted = highlight;\n this.cdr.detectChanges();\n }\n }\n\n /**\n * Expand a parent container menu item.\n */\n expand() {\n if (!this.item?.route && !this.expanded) {\n this.expanded = this.ariaExpanded = true;\n this.cdr.detectChanges();\n if (this.parent) {\n this.parent.expand();\n }\n }\n }\n\n /**\n * Collapse an expanded parent container menu item.\n */\n collapse() {\n if (!this.item?.route && this.expanded) {\n this.expanded = this.ariaExpanded = false;\n this.cdr.detectChanges();\n }\n }\n\n checkChildrenForHighlight(lastUrlSegment: string) {\n let childHighlighted = false;\n this.children.forEach((childItem) => {\n if (childItem.item.route === lastUrlSegment) {\n childItem.toggleHighlight(true);\n childHighlighted = true;\n } else {\n childItem.toggleHighlight(false);\n if (childItem.item?.children) {\n if (childItem.checkChildrenForHighlight(lastUrlSegment)) {\n childHighlighted = true;\n }\n }\n childItem.expand(); // open the childItem\n }\n });\n return childHighlighted; // Return highlighted state so that caller can\n // expand itself.\n }\n\n // Item selection handler\n onItemSelected(ev: Event, item: NavItem): void {\n this.dialog.closeAll();\n\n // Leaf menu item, navigate the router to the item's route.\n if (!item.children) {\n if (item?.backButton && item?.backHref) {\n // Idiotic way to implement Back button! This will conflict\n // with the browser history as the current satellite app\n // page would become the previous page to backHref page! A complex\n // mechanism to navigate back accurately, by popping all the\n // intermediate pages is beyond our scope for now.\n this.router.navigateByUrl(item.backHref);\n } else if (item.route) {\n this.router.navigate([item.route], {\n relativeTo: this.route,\n state: {\n backHref: window.location.pathname,\n },\n });\n }\n } else {\n // Sub menu items, toogle the item to show/hide the child menu items.\n ev.preventDefault();\n ev.stopImmediatePropagation();\n this.expanded = !this.expanded;\n this.cdr.detectChanges();\n }\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n effect,\n Injector,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n runInInjectionContext,\n SimpleChanges,\n TemplateRef,\n viewChildren\n} from '@angular/core';\nimport { MatSidenav } from '@angular/material/sidenav';\nimport { NavigationEnd, Router, Event as RouterEvent } from '@angular/router';\nimport { Subject, filter, takeUntil, tap } from 'rxjs';\nimport { LayoutService, SideMenuLayoutProps } from './layout.service';\nimport { SPMatMenuListItemComponent } from './mat-menu-list-item.component';\nimport { NavItem } from './nav-item';\n\n@Component({\n selector: 'ngx-mat-menu-pane',\n template: `\n <div class=\"menu-pane-wrapper\">\n <div class=\"sidenav-branding mat-toolbar-single-row\">\n <div class=\"branding branding-logo\">\n <img *ngIf=\"brandingImage\" [src]=\"brandingImage\" />\n </div>\n <h4 class=\"mat-typography branding branding-text\">\n {{ brandingText }}\n </h4>\n </div>\n <div class=\"sidenav-menu\">\n <div *ngIf=\"menuTitle\" class=\"mat-body title\">{{ menuTitle }}</div>\n <mat-nav-list>\n <ngx-mat-menu-list-item\n *ngIf=\"backButtonNavItem\"\n [item]=\"backButtonNavItem\"\n ></ngx-mat-menu-list-item>\n <ngx-mat-menu-list-item\n *ngFor=\"let item of menuItems\"\n [item]=\"item\"\n [showIcon]=\"showIcons\"\n ></ngx-mat-menu-list-item>\n </mat-nav-list>\n </div>\n <div class=\"sidenav-version\" *ngIf=\"menuPaneFooterContent\">\n <ng-container *ngTemplateOutlet=\"menuPaneFooterContent\"> </ng-container>\n </div>\n </div>\n `,\n styleUrls: ['./mat-menu-pane.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class SPMatMenuPaneComponent implements OnInit, OnDestroy, AfterViewInit, OnChanges {\n @Input() menuTitle: string = '';\n @Input() showBackButton: boolean = false;\n @Input() defaultBackButtonHref: string = '';\n @Input() backButtonText: string = 'BACK';\n @Input() menuItems: NavItem[] = [];\n @Input() brandingText: string = 'BRAND';\n @Input() brandingImage: string = '';\n @Input() matSideNav: MatSidenav | undefined;\n @Input() appVersion: string = '0.0';\n @Input() menuPaneFooterContent!: TemplateRef<any>;\n @Input() showIcons: boolean = true;\n @Input() baseUrl = '';\n layout!: SideMenuLayoutProps;\n\n backButtonNavItem: NavItem | undefined;\n destroy = new Subject<void>();\n\n menuItemComps = viewChildren(SPMatMenuListItemComponent);\n\n // So that if menuItems is specified via an async pipe, we can highlight the\n // current URL after the menuItems are loaded.\n menuItemComps$ = effect(() => {\n const components = this.menuItemComps();\n runInInjectionContext(this.injector, () => {\n this.highlightUrlMenuItem(this.router.routerState.snapshot.url);\n });\n });\n\n constructor(\n public cdr: ChangeDetectorRef,\n private layoutService: LayoutService,\n private router: Router,\n private injector: Injector\n ) {}\n\n ngOnInit() {\n this.layoutService.layoutChanged\n .pipe(\n takeUntil(this.destroy),\n tap((newLayout) => {\n // console.log(\n // 'Layout changed - new toolbar height:',\n // newLayout.toolbarHeight\n // );\n this.layout = newLayout;\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n\n if (this.showBackButton) {\n this.backButtonNavItem = {\n route: this.layoutService.previousUrl\n ? this.layoutService.previousUrl\n : this.defaultBackButtonHref,\n text: this.backButtonText,\n icon: 'arrow_back',\n backButton: true,\n backHref: window.history.state ? window.history.state['backHref'] : '#',\n };\n this.cdr.detectChanges();\n }\n\n this.router.events\n .pipe(\n takeUntil(this.destroy),\n filter((e) => e instanceof NavigationEnd),\n tap((e: RouterEvent) => {\n if (this.matSideNav && this.layout.smallScreen) {\n this.matSideNav.close();\n }\n const ne = e as NavigationEnd;\n this.highlightUrlMenuItem(ne.urlAfterRedirects);\n })\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {\n this.destroy.next();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['backButtonText']) {\n if (this.backButtonNavItem) {\n this.backButtonNavItem = {\n ...this.backButtonNavItem,\n text: this.backButtonText,\n };\n this.cdr.detectChanges();\n }\n }\n }\n\n ngAfterViewInit(): void {\n this.highlightUrlMenuItem(this.router.routerState.snapshot.url);\n }\n\n /**\n * Highlights the menu item for the specified URL.\n *\n * @param url the full url of the current navigation\n *\n * The way this function works is like this.\n *\n * It first finds the NavItem matching the given URL in url arg. It does\n * this by removing the baseUrl from the url and then comparing the\n * NavItem.route attached to each SPMatMenuListItemComponent. This is done\n * recursively covering all NavItem.children. When a matching NavItem is\n * found, the function goes on to find the SPMatMenuListItemComponent which\n * has this NavItem attached to it. This too is done recursively to find\n * the innermost NavItem with matching URL.\n *\n * When a matching SPMatMenuListItemComponent is found, it first deselects\n * the previous SPMatMenuListItemComponent selection and then goes on to\n * select the newly matched SPMatMenuListItemComponent. If the\n * SPMatMenuListItemComponent is a child of a parent NavItem, the parent\n * NavItem is expanded. Similarly when deselecting the current selection,\n * if it belongs to a parent NavItem and the parent is not shared by the\n * currently matched SPMatMenuListItemComponent, it collapses the parent\n * of the previously selected SPMatMenuListItemComponent. (Quite a mouthful\n * of a sentence, but it's exactly how it works.)\n */\n highlightUrlMenuItem(url: string) {\n // Remove baseUrl from our url-to-SPMatMenuListItem matching logic\n const baseUrl = this.baseUrl.startsWith('/') ? this.baseUrl.substring(1) : this.baseUrl;\n const baseUrlIndex = url.search(baseUrl);\n if (baseUrlIndex != -1) {\n url = url.substring(baseUrlIndex+baseUrl.length);\n }\n\n // Filter out empty strings so that we avoid a pointless iteration of the\n // menuItemComps() array.\n const urlParts = url.split('/').filter(u => !!u);\n url = urlParts.join('/');\n // console.log(`highlightCurrentUrlMenuItem - baseUrl: ${this.baseUrl} url: ${url}, urlParts: ${urlParts}`);\n let highlightedItemFound = false;\n\n // Function to find the NavItem for for the given url. Returns a NavItem\n // if a matching NavItem is found, undefined otherwise.\n const findNavItemForUrl = (baseUrl: string, navItem: NavItem): NavItem|undefined => {\n let matchingItem: NavItem|undefined = undefined;\n if (navItem.children) {\n for (let index = 0; !matchingItem && index < navItem.children.length; index++) {\n matchingItem = findNavItemForUrl(baseUrl + (navItem?.route ?? ''), navItem.children[index]);\n }\n } else if (navItem.route) {\n if (url === navItem.route) {\n matchingItem = navItem;\n }\n }\n return matchingItem;\n }\n\n let matchingNavItem: NavItem|undefined = undefined;\n for (let index = 0; !matchingNavItem && index < this.menuItemComps().length; index++) {\n const element = this.menuItemComps()[index];\n if (element?.item) {\n matchingNavItem = findNavItemForUrl(url, element?.item);\n }\n }\n\n // Function to find the SPMatMenuListItemComponent for the given NavItem.\n // Returns SPMatMenuListItemComponent if a match is found, undefined\n // otherwise.\n const findMenuItemCompForNavItem = (\n menuItemComp: SPMatMenuListItemComponent,\n target: NavItem\n ): SPMatMenuListItemComponent | undefined => {\n let matchingMenuItemComp: SPMatMenuListItemComponent | undefined = undefined;\n if (menuItemComp.item === target) {\n matchingMenuItemComp = menuItemComp;\n } else if (menuItemComp.item?.children) {\n for (let index = 0; !matchingMenuItemComp && index < menuItemComp.children.length; index++) {\n matchingMenuItemComp = findMenuItemCompForNavItem(menuItemComp.children.get(index)!, target);\n }\n }\n return matchingMenuItemComp;\n };\n\n let matchingMenuItemComp: SPMatMenuListItemComponent | undefined = undefined;\n if (matchingNavItem) {\n for (let index = 0; !matchingMenuItemComp && index < this.menuItemComps().length; index++) {\n const element = this.menuItemComps()[index];\n matchingMenuItemComp = findMenuItemCompForNavItem(this.menuItemComps()[index], matchingNavItem);\n }\n }\n\n if (matchingMenuItemComp) {\n this.highlightMenuItemComp(matchingMenuItemComp);\n }\n\n // old logic, which is a little confusing and depends on state stored\n // in SPMatMenuListItemComponent.\n /*\n for (let index = 0; !highlightedItemFound && index < urlParts.length; index++) {\n const lastUrlSegment = urlParts[index];\n this.menuItemComps().find(menuItemComp => {\n const route = menuItemComp.item?.route;\n if (route === lastUrlSegment) {\n if (!menuItemComp.item?.children) {\n menuItemComp.toggleHighlight(true);\n highlightedItemFound = true;\n } else if (menuItemComp.checkChildrenForHighlight(lastUrlSegment)) {\n menuItemComp.expand();\n highlightedItemFound = true;\n }\n } else {\n menuItemComp.toggleHighlight(false);\n if (menuItemComp.item?.children) {\n if (menuItemComp.checkChildrenForHighlight(lastUrlSegment)) {\n menuItemComp.expand();\n highlightedItemFound = true\n };\n }\n }\n });\n }\n */\n }\n\n // To keep track of current highlighted SPMatMenuListItemComponent.\n private _curHighlitedMenuItemComp!: SPMatMenuListItemComponent|undefined;\n highlightMenuItemComp(menuItemComp: SPMatMenuListItemComponent) {\n // Deslect currently highliged SPMatMenuListItemComponent if it's different\n // from the menuItemComp arg.\n const lastHighlitedMenuItemComp = this._curHighlitedMenuItemComp;\n if (this._curHighlitedMenuItemComp && this._curHighlitedMenuItemComp !== menuItemComp) {\n this._curHighlitedMenuItemComp.toggleHighlight(false);\n this._curHighlitedMenuItemComp = undefined;\n }\n menuItemComp.toggleHighlight(true);\n if (lastHighlitedMenuItemComp && lastHighlitedMenuItemComp?.parent) {\n lastHighlitedMenuItemComp.parent.collapse();\n }\n if (menuItemComp.parent) {\n menuItemComp.parent.expand();\n }\n this._curHighlitedMenuItemComp = menuItemComp;\n }\n}\n","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Input,\n OnDestroy,\n OnInit,\n TemplateRef,\n ViewChild\n} from '@angular/core';\nimport { MatSidenav } from '@angular/material/sidenav';\nimport { Subject, takeUntil, tap } from 'rxjs';\nimport { LayoutService, SideMenuLayoutProps } from './layout.service';\nimport { NavItem } from './nav-item';\n\n@Component({\n selector: 'sp-mat-menu-layout',\n template: `\n <mat-sidenav-container class=\"layout-container\">\n <mat-sidenav\n class=\"layout-menu-pane\"\n opened\n #menuNav\n [mode]=\"layout.smallScreen ? 'over' : 'side'\"\n [opened]=\"!layout.smallScreen\"\n [fixedInViewport]=\"layout.smallScreen\"\n >\n <div class=\"layout-menu-container\">\n <ngx-mat-menu-pane\n [baseUrl]=\"baseUrl\"\n [showBackButton]=\"showBackButton\"\n [showIcons]=\"showIcons\"\n [defaultBackButtonHref]=\"defaultBackButtonHref\"\n [backButtonText]=\"backButtonText\"\n [brandingImage]=\"brandingImage\"\n [brandingText]=\"brandingText\"\n [menuItems]=\"menuItems\"\n [matSideNav]=\"menuNav\"\n [menuPaneFooterContent]=\"menuPaneFooterContent\"\n [menuTitle]=\"menuTitle\"\n class=\"h-100\"\n ></ngx-mat-menu-pane>\n </div>\n </mat-sidenav>\n\n <mat-sidenav\n [ngStyle]=\"{\n 'min-width.px': infoPaneMinWidth,\n 'max-width.px': infoPaneMaxWidth\n }\"\n #infoPane\n closed\n mode=\"over\"\n position=\"end\"\n >\n <ng-container *ngTemplateOutlet=\"infoPaneContent\"></ng-container>\n </mat-sidenav>\n\n <mat-sidenav-content class=\"layout-content\">\n <mat-toolbar class=\"layout-content-toolbar\">\n <button mat-icon-button (click)=\"onToggleMenuPane()\">\n <mat-icon>menu</mat-icon>\n </button>\n <ng-template #defaultToolbarTitle>\n <h4>{{ appTitle }}</h4>\n </ng-template>\n <ng-container\n *ngTemplateOutlet=\"\n toolbarTitleContent ? toolbarTitleContent : defaultToolbarTitle\n \"\n ></ng-container>\n <span class=\"spacer\"></span>\n <ng-container *ngTemplateOutlet=\"toolbarEndContent\"></ng-container>\n </mat-toolbar>\n <div class=\"layout-content-content\" [class]=\"contentContainerClass\">\n <router-outlet></router-outlet>\n </div>\n </mat-sidenav-content>\n </mat-sidenav-container>\n `,\n styles: [\n `\n .layout-menu-pane {\n background-color: var(--sp-mat-menu-bg-color) !important;\n color: var(--sp-mat-menu-fg-color) !important;\n }\n .layout-container {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n }\n .layout-menu-container {\n height: 100%;\n max-width: var(--sp-mat-menu-sidemenu-max-width, 50%);\n min-width: var(--sp-mat-menu-sidemenu-min-width, 250px);\n text-wrap: nowrap;\n overflow-x: scroll;\n overflow-y: scroll;\n }\n .layout-content {\n height: 100vh;\n display: flex;\n flex-direction: column;\n overflow-x: clip;\n }\n .layout-content-toolbar {\n border-bottom: 1px solid var(--sp-mat-menu-toolbar-border-color);\n flex-grow: 0;\n background-color: var(--sp-mat-menu-toolbar-bg-color);\n color: var(--sp-mat-menu-toolbar-fg-color);\n padding: 0 0;\n min-height: var(--mat-toolbar-standard-height);\n max-height: var(--mat-toolbar-standard-height);\n }\n .layout-content-content {\n flex-grow: 1;\n overflow: hidden;\n }\n .h-100 {\n height: 100%;\n }\n .spacer {\n flex: 1 1 auto;\n }\n `,\n ],\n // Add this style to make the content-container scroll from within.\n // That is override the window scrolling with the content div private\n // scroller.\n // .content-container {\n // overflow-x: scroll;\n // overflow-y: scroll;\n // }\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: false\n})\nexport class SPMatMenuLayoutComponent implements OnInit, OnDestroy {\n @ViewChild('menuNav') menuNav!: MatSidenav;\n layout!: SideMenuLayoutProps;\n destroy = new Subject<void>();\n containerHeight: number = 500;\n topBottomPadding: number = 6;\n @Input() baseUrl = '';\n @Input() showBackButton: boolean = false;\n @Input() defaultBackButtonHref: string = '';\n @Input() backButtonText: string = 'BACK';\n @Input() brandingImage: string = '';\n @Input() brandingText: string = '';\n @Input() appTitle: string = '';\n @Input() menuTitle: string = '';\n @Input() menuItems: NavItem[] = [];\n // Template Partials for configurable portions of the layout\n @Input() menuPaneFooterContent!: TemplateRef<any>;\n @Input() toolbarEndContent!: TemplateRef<any>;\n @Input() infoPaneContent!: TemplateRef<any>;\n @Input() toolbarTitleContent!: TemplateRef<any>;\n // Width of the info pane on the right (or left for LTR) of the screen.\n @Input() infoPaneMinWidth: number = 250;\n @Input() infoPaneMaxWidth: number = 400;\n @Input() contentContainerClass: string = '';\n @Input() showIcons: boolean = true;\n // Allows querying infoPane to activate it or to set its attributes\n @ViewChild('infoPane') readonly infoPane!: MatSidenav;\n\n constructor(\n private layoutService: LayoutService,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n this.layoutService.layoutChanged\n .pipe(\n takeUntil(this.destroy),\n tap((newLayout: SideMenuLayoutProps) => {\n this.layout = newLayout;\n this.containerHeight =\n window.innerHeight -\n (newLayout.toolbarHeight + this.topBottomPadding * 2);\n this.cdr.detectChanges();\n })\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {\n this.destroy.next();\n this.destroy.complete();\n }\n\n onToggleMenuPane() {\n if (this.menuNav) {\n this.menuNav.toggle();\n }\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatSidenavModule } from '@angular/material/sidenav';\nimport { MatToolbarModule } from '@angular/material/toolbar';\nimport { MatListModule } from '@angular/material/list';\nimport { RouterOutlet } from '@angular/router';\nimport { SPMatMenuLayoutComponent } from './mat-menu-layout.component';\nimport { SPMatMenuListItemComponent } from './mat-menu-list-item.component';\nimport { SPMatMenuPaneComponent } from './mat-menu-pane.component';\n\n@NgModule({\n declarations: [SPMatMenuPaneComponent, SPMatMenuListItemComponent, SPMatMenuLayoutComponent],\n imports: [\n CommonModule,\n RouterOutlet,\n MatSidenavModule,\n MatToolbarModule,\n MatIconModule,\n MatButtonModule,\n MatMenuModule,\n MatDialogModule,\n MatListModule\n ],\n exports: [SPMatMenuPaneComponent, SPMatMenuListItemComponent, SPMatMenuLayoutComponent],\n})\nexport class SPMatMenuLayoutModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i1","i1.LayoutService","i4","i5.SPMatMenuListItemComponent","i3","i5","i6","i8.SPMatMenuPaneComponent"],"mappings":"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"}
@@ -78,4 +78,5 @@ export interface SPMatEntityCrudComponentBase<TEntity> {
78
78
  * configured class for the preview pane content.
79
79
  */
80
80
  getPreviewPaneContentClass(): string;
81
+ getFormPaneContentClass(): string;
81
82
  }
@@ -171,6 +171,10 @@ export declare class SPMatEntityCrudComponent<TEntity extends {
171
171
  * The class class that will be applied to the preview pane content.
172
172
  */
173
173
  previewPaneContentClass: import("@angular/core").InputSignal<string>;
174
+ /**
175
+ * The CSS class that will be applied to the form pane content.
176
+ */
177
+ formPaneContentClass: import("@angular/core").InputSignal<string>;
174
178
  private getLabel;
175
179
  _itemLabel: import("@angular/core").Signal<Observable<string>>;
176
180
  _itemLabelPlural: import("@angular/core").Signal<Observable<string>>;
@@ -288,6 +292,7 @@ export declare class SPMatEntityCrudComponent<TEntity extends {
288
292
  */
289
293
  getItemActions(entity: TEntity): SPContextMenuItem[];
290
294
  getPreviewPaneContentClass(): string;
295
+ getFormPaneContentClass(): string;
291
296
  /**
292
297
  * Initialize the columns for the mat-entities-list component. This is
293
298
  * called when the <sp-mat-entities-list> component has been properly
@@ -295,5 +300,5 @@ export declare class SPMatEntityCrudComponent<TEntity extends {
295
300
  */
296
301
  private _initEntitiesList;
297
302
  static ɵfac: i0.ɵɵFactoryDeclaration<SPMatEntityCrudComponent<any, any>, never>;
298
- static ɵcmp: i0.ɵɵComponentDeclaration<SPMatEntityCrudComponent<any, any>, "sp-mat-entity-crud", never, { "itemLabel": { "alias": "itemLabel"; "required": false; "isSignal": true; }; "itemLabelPlural": { "alias": "itemLabelPlural"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "itemActions": { "alias": "itemActions"; "required": false; "isSignal": true; }; "newItemLink": { "alias": "newItemLink"; "required": false; "isSignal": true; }; "newItemLabel": { "alias": "newItemLabel"; "required": false; "isSignal": true; }; "editItemTitle": { "alias": "editItemTitle"; "required": false; "isSignal": true; }; "newItemSubTypes": { "alias": "newItemSubTypes"; "required": false; "isSignal": true; }; "crudOpFn": { "alias": "crudOpFn"; "required": false; "isSignal": true; }; "previewTemplate": { "alias": "previewTemplate"; "required": false; "isSignal": true; }; "allowEntityActionFn": { "alias": "allowEntityActionFn"; "required": false; "isSignal": true; }; "headerTemplate": { "alias": "headerTemplate"; "required": false; "isSignal": true; }; "actionsTemplate": { "alias": "actionsTemplate"; "required": false; "isSignal": true; }; "crudResponseParser": { "alias": "crudResponseParser"; "required": false; "isSignal": true; }; "createEditFormTemplate": { "alias": "createEditFormTemplate"; "required": false; "isSignal": true; }; "disableItemActions": { "alias": "disableItemActions"; "required": false; "isSignal": true; }; "disableCreate": { "alias": "disableCreate"; "required": false; "isSignal": true; }; "refreshAfterEdit": { "alias": "refreshAfterEdit"; "required": false; "isSignal": true; }; "crudHttpReqContext": { "alias": "crudHttpReqContext"; "required": false; "isSignal": true; }; "editPaneWidth": { "alias": "editPaneWidth"; "required": false; "isSignal": true; }; "previewPaneWidth": { "alias": "previewPaneWidth"; "required": false; "isSignal": true; }; "listPaneWrapperClass": { "alias": "listPaneWrapperClass"; "required": false; "isSignal": true; }; "previewPaneWrapperClass": { "alias": "previewPaneWrapperClass"; "required": false; "isSignal": true; }; "previewPaneContentClass": { "alias": "previewPaneContentClass"; "required": false; "isSignal": true; }; }, { "action": "action"; "entityViewPaneActivated": "entityViewPaneActivated"; }, ["_clientColumnDefs"], ["[breadCrumbs]"], true, never>;
303
+ static ɵcmp: i0.ɵɵComponentDeclaration<SPMatEntityCrudComponent<any, any>, "sp-mat-entity-crud", never, { "itemLabel": { "alias": "itemLabel"; "required": false; "isSignal": true; }; "itemLabelPlural": { "alias": "itemLabelPlural"; "required": false; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "itemActions": { "alias": "itemActions"; "required": false; "isSignal": true; }; "newItemLink": { "alias": "newItemLink"; "required": false; "isSignal": true; }; "newItemLabel": { "alias": "newItemLabel"; "required": false; "isSignal": true; }; "editItemTitle": { "alias": "editItemTitle"; "required": false; "isSignal": true; }; "newItemSubTypes": { "alias": "newItemSubTypes"; "required": false; "isSignal": true; }; "crudOpFn": { "alias": "crudOpFn"; "required": false; "isSignal": true; }; "previewTemplate": { "alias": "previewTemplate"; "required": false; "isSignal": true; }; "allowEntityActionFn": { "alias": "allowEntityActionFn"; "required": false; "isSignal": true; }; "headerTemplate": { "alias": "headerTemplate"; "required": false; "isSignal": true; }; "actionsTemplate": { "alias": "actionsTemplate"; "required": false; "isSignal": true; }; "crudResponseParser": { "alias": "crudResponseParser"; "required": false; "isSignal": true; }; "createEditFormTemplate": { "alias": "createEditFormTemplate"; "required": false; "isSignal": true; }; "disableItemActions": { "alias": "disableItemActions"; "required": false; "isSignal": true; }; "disableCreate": { "alias": "disableCreate"; "required": false; "isSignal": true; }; "refreshAfterEdit": { "alias": "refreshAfterEdit"; "required": false; "isSignal": true; }; "crudHttpReqContext": { "alias": "crudHttpReqContext"; "required": false; "isSignal": true; }; "editPaneWidth": { "alias": "editPaneWidth"; "required": false; "isSignal": true; }; "previewPaneWidth": { "alias": "previewPaneWidth"; "required": false; "isSignal": true; }; "listPaneWrapperClass": { "alias": "listPaneWrapperClass"; "required": false; "isSignal": true; }; "previewPaneWrapperClass": { "alias": "previewPaneWrapperClass"; "required": false; "isSignal": true; }; "previewPaneContentClass": { "alias": "previewPaneContentClass"; "required": false; "isSignal": true; }; "formPaneContentClass": { "alias": "formPaneContentClass"; "required": false; "isSignal": true; }; }, { "action": "action"; "entityViewPaneActivated": "entityViewPaneActivated"; }, ["_clientColumnDefs"], ["[breadCrumbs]"], true, never>;
299
304
  }
package/package.json CHANGED
@@ -6,7 +6,7 @@
6
6
  "path": "src/assets/i18n/"
7
7
  }
8
8
  ],
9
- "version": "0.31.8",
9
+ "version": "0.31.12",
10
10
  "peerDependencies": {
11
11
  "@angular/common": "^19.1.0",
12
12
  "@angular/core": "^19.1.0",
@@ -47,6 +47,10 @@
47
47
  "types": "./entity-field/index.d.ts",
48
48
  "default": "./fesm2022/smallpearl-ngx-helper-entity-field.mjs"
49
49
  },
50
+ "./locale": {
51
+ "types": "./locale/index.d.ts",
52
+ "default": "./fesm2022/smallpearl-ngx-helper-locale.mjs"
53
+ },
50
54
  "./forms": {
51
55
  "types": "./forms/index.d.ts",
52
56
  "default": "./fesm2022/smallpearl-ngx-helper-forms.mjs"
@@ -55,10 +59,6 @@
55
59
  "types": "./mat-context-menu/index.d.ts",
56
60
  "default": "./fesm2022/smallpearl-ngx-helper-mat-context-menu.mjs"
57
61
  },
58
- "./locale": {
59
- "types": "./locale/index.d.ts",
60
- "default": "./fesm2022/smallpearl-ngx-helper-locale.mjs"
61
- },
62
62
  "./hover-dropdown": {
63
63
  "types": "./hover-dropdown/index.d.ts",
64
64
  "default": "./fesm2022/smallpearl-ngx-helper-hover-dropdown.mjs"