@mediusinc/mng-commons 5.2.0-rc.0 → 5.2.0-rc.2

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.
Files changed (67) hide show
  1. package/core/components/notification/notification-wrapper.component.d.ts +3 -1
  2. package/core/error/error-helpers.d.ts +5 -0
  3. package/core/error/error.model.d.ts +6 -0
  4. package/core/helpers/route.d.ts +1 -1
  5. package/core/models/menu.model.d.ts +2 -1
  6. package/core/router/route-builder.d.ts +0 -1
  7. package/core/security/permission.service.d.ts +13 -5
  8. package/core/security/permissions.model.d.ts +27 -2
  9. package/esm2022/core/components/notification/notification-wrapper.component.mjs +6 -5
  10. package/esm2022/core/error/error-helpers.mjs +8 -1
  11. package/esm2022/core/error/error.model.mjs +2 -1
  12. package/esm2022/core/models/menu.model.mjs +1 -1
  13. package/esm2022/core/router/route-builder.mjs +1 -24
  14. package/esm2022/core/rxjs/map-data-list-result-operator.mjs +4 -1
  15. package/esm2022/core/security/permission.guard.mjs +2 -2
  16. package/esm2022/core/security/permission.service.mjs +65 -15
  17. package/esm2022/core/security/permissions.model.mjs +1 -1
  18. package/esm2022/form/components/date-range/date-range.component.mjs +9 -3
  19. package/esm2022/form/components/number-range/number-range.component.mjs +106 -0
  20. package/esm2022/form/index.mjs +2 -1
  21. package/esm2022/model/descriptors/enum.descriptor.mjs +1 -1
  22. package/esm2022/model/helpers/i18n.mjs +2 -2
  23. package/esm2022/table/api/descriptors/column.descriptor.mjs +8 -19
  24. package/esm2022/table/api/descriptors/table.descriptor.mjs +13 -9
  25. package/esm2022/table/api/helpers/table-descriptor-helpers.mjs +3 -2
  26. package/esm2022/table/components/column-filter-full/column-filter-full.component.mjs +72 -10
  27. package/esm2022/table/helpers/notification.mjs +2 -2
  28. package/esm2022/tableview/action/components/action/action.component.mjs +6 -7
  29. package/esm2022/tableview/action/helpers/i18n.mjs +4 -4
  30. package/esm2022/tableview/action/services/action-executor.service.mjs +6 -3
  31. package/esm2022/tableview/api/action/descriptors/action-descriptor.factory.mjs +2 -2
  32. package/esm2022/tableview/api/editor/descriptors/editor.descriptor.mjs +5 -4
  33. package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +2 -3
  34. package/esm2022/tableview/api/editor/descriptors/field-lookup.descriptor.mjs +2 -3
  35. package/esm2022/tableview/api/editor/descriptors/field.descriptor.mjs +14 -7
  36. package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +1 -1
  37. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +12 -4
  38. package/fesm2022/mediusinc-mng-commons-core.mjs +82 -42
  39. package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
  40. package/fesm2022/mediusinc-mng-commons-form.mjs +109 -3
  41. package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
  42. package/fesm2022/mediusinc-mng-commons-model.mjs +1 -1
  43. package/fesm2022/mediusinc-mng-commons-model.mjs.map +1 -1
  44. package/fesm2022/mediusinc-mng-commons-table-api.mjs +21 -27
  45. package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
  46. package/fesm2022/mediusinc-mng-commons-table.mjs +72 -10
  47. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  48. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +20 -13
  49. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  50. package/fesm2022/mediusinc-mng-commons-tableview.mjs +23 -14
  51. package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
  52. package/form/components/date-range/date-range.component.d.ts +4 -2
  53. package/form/components/number-range/number-range.component.d.ts +30 -0
  54. package/form/index.d.ts +1 -0
  55. package/i18n/en.json +1 -1
  56. package/i18n/sl.json +1 -1
  57. package/model/descriptors/enum.descriptor.d.ts +1 -1
  58. package/package.json +7 -7
  59. package/table/api/descriptors/column.descriptor.d.ts +4 -10
  60. package/table/api/descriptors/table.descriptor.d.ts +2 -1
  61. package/table/components/column-filter-full/column-filter-full.component.d.ts +3 -2
  62. package/tableview/action/components/action/action.component.d.ts +0 -1
  63. package/tableview/action/services/action-executor.service.d.ts +1 -0
  64. package/tableview/api/editor/descriptors/field.descriptor.d.ts +12 -7
  65. package/tableview/api/tableview/helpers/tableview-default-actions.d.ts +5 -5
  66. package/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +1 -0
  67. package/version-info.json +6 -6
@@ -1,12 +1,20 @@
1
- import { ChangeDetectionStrategy, Component } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, signal } from '@angular/core';
2
2
  import { FieldWrapper, FormlyModule } from '@ngx-formly/core';
3
3
  import { TranslateModule } from '@ngx-translate/core';
4
+ import { getI18nTypePropertyKey } from '@mediusinc/mng-commons/core';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "@ngx-translate/core";
6
7
  import * as i2 from "@ngx-formly/core";
7
8
  export class FormlyFieldWrapperComponent extends FieldWrapper {
9
+ constructor() {
10
+ super(...arguments);
11
+ this.label = signal(undefined);
12
+ }
8
13
  ngOnInit() {
9
14
  const descriptor = this.props?.['descriptor'];
15
+ if (descriptor.label !== null) {
16
+ this.label.set(descriptor.label ?? getI18nTypePropertyKey(descriptor.editor.model.i18nBaseKey ?? descriptor.editor.model.typeName, descriptor.property));
17
+ }
10
18
  if (this.formState.disabled && descriptor.isLocalized) {
11
19
  this.addMissingTranslationHelperText();
12
20
  }
@@ -21,10 +29,10 @@ export class FormlyFieldWrapperComponent extends FieldWrapper {
21
29
  }
22
30
  }
23
31
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: FormlyFieldWrapperComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
24
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: FormlyFieldWrapperComponent, isStandalone: true, selector: "mng-formly-field-wrapper", usesInheritance: true, ngImport: i0, template: "<div [class]=\"props['descriptor']?.['fieldClassName'] ?? 'field'\">\n <div class=\"grid mt-0\">\n @if (props.label) {\n <label [for]=\"key\" class=\"col\" [class]=\"props['descriptor']?.['labelClassName'] ?? ''\"\n >{{ props!.label! | translate }}\n @if (props.required && props['hideRequiredMarker'] !== true) {\n <span>*</span>\n }\n </label>\n }\n </div>\n <ng-container #fieldComponent></ng-container>\n @if (props['descriptor']?.['helpText']) {\n <small class=\"block\">{{ props['descriptor']?.['helpText'] | translate }}</small>\n }\n @if (showError) {\n <small class=\"p-error block\">\n <formly-validation-message [field]=\"field\"></formly-validation-message>\n </small>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i2.ɵFormlyValidationMessage, selector: "formly-validation-message", inputs: ["field"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: FormlyFieldWrapperComponent, isStandalone: true, selector: "mng-formly-field-wrapper", usesInheritance: true, ngImport: i0, template: "<div [class]=\"props['descriptor']?.['fieldClassName'] ?? 'field'\">\n <div class=\"grid mt-0\">\n @if (label(); as label) {\n <label [for]=\"key\" class=\"col\" [class]=\"props['descriptor']?.['labelClassName'] ?? ''\"\n >{{ label | translate }}\n @if (props.required && props['hideRequiredMarker'] !== true) {\n <span>*</span>\n }\n </label>\n }\n </div>\n <ng-container #fieldComponent></ng-container>\n @if (props['descriptor']?.['helpText']) {\n <small class=\"block\">{{ props['descriptor']?.['helpText'] | translate }}</small>\n }\n @if (showError) {\n <small class=\"p-error block\">\n <formly-validation-message [field]=\"field\"></formly-validation-message>\n </small>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormlyModule }, { kind: "component", type: i2.ɵFormlyValidationMessage, selector: "formly-validation-message", inputs: ["field"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25
33
  }
26
34
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: FormlyFieldWrapperComponent, decorators: [{
27
35
  type: Component,
28
- args: [{ standalone: true, selector: 'mng-formly-field-wrapper', imports: [TranslateModule, FormlyModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"props['descriptor']?.['fieldClassName'] ?? 'field'\">\n <div class=\"grid mt-0\">\n @if (props.label) {\n <label [for]=\"key\" class=\"col\" [class]=\"props['descriptor']?.['labelClassName'] ?? ''\"\n >{{ props!.label! | translate }}\n @if (props.required && props['hideRequiredMarker'] !== true) {\n <span>*</span>\n }\n </label>\n }\n </div>\n <ng-container #fieldComponent></ng-container>\n @if (props['descriptor']?.['helpText']) {\n <small class=\"block\">{{ props['descriptor']?.['helpText'] | translate }}</small>\n }\n @if (showError) {\n <small class=\"p-error block\">\n <formly-validation-message [field]=\"field\"></formly-validation-message>\n </small>\n }\n</div>\n" }]
36
+ args: [{ standalone: true, selector: 'mng-formly-field-wrapper', imports: [TranslateModule, FormlyModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"props['descriptor']?.['fieldClassName'] ?? 'field'\">\n <div class=\"grid mt-0\">\n @if (label(); as label) {\n <label [for]=\"key\" class=\"col\" [class]=\"props['descriptor']?.['labelClassName'] ?? ''\"\n >{{ label | translate }}\n @if (props.required && props['hideRequiredMarker'] !== true) {\n <span>*</span>\n }\n </label>\n }\n </div>\n <ng-container #fieldComponent></ng-container>\n @if (props['descriptor']?.['helpText']) {\n <small class=\"block\">{{ props['descriptor']?.['helpText'] | translate }}</small>\n }\n @if (showError) {\n <small class=\"p-error block\">\n <formly-validation-message [field]=\"field\"></formly-validation-message>\n </small>\n }\n</div>\n" }]
29
37
  }] });
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LWZpZWxkLXdyYXBwZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9lZGl0b3IvY29tcG9uZW50cy9mb3JtbHkvd3JhcHBlcnMvZm9ybWx5LWZpZWxkLXdyYXBwZXIvZm9ybWx5LWZpZWxkLXdyYXBwZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9lZGl0b3IvY29tcG9uZW50cy9mb3JtbHkvd3JhcHBlcnMvZm9ybWx5LWZpZWxkLXdyYXBwZXIvZm9ybWx5LWZpZWxkLXdyYXBwZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBUyxNQUFNLGVBQWUsQ0FBQztBQUV6RSxPQUFPLEVBQUMsWUFBWSxFQUFFLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQzs7OztBQVdwRCxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsWUFBWTtJQUNsRCxRQUFRO1FBQ1gsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBK0IsQ0FBQztRQUM1RSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxJQUFJLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwRCxJQUFJLENBQUMsK0JBQStCLEVBQUUsQ0FBQztRQUMzQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLCtCQUErQjtRQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsRUFBRSxRQUFRLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkgsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1lBQ3ZGLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxJQUFJLGdDQUFnQyxDQUFDO1FBQzdELENBQUM7YUFBTSxDQUFDO1lBQ0osSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqRCxDQUFDO0lBQ0wsQ0FBQzs4R0FmUSwyQkFBMkI7a0dBQTNCLDJCQUEyQiwyR0NkeEMsaTFCQXFCQSwyQ0RWYyxlQUFlLDJGQUFFLFlBQVk7OzJGQUc5QiwyQkFBMkI7a0JBUHZDLFNBQVM7aUNBQ00sSUFBSSxZQUNOLDBCQUEwQixXQUUzQixDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsbUJBQ3ZCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7RmllbGRXcmFwcGVyLCBGb3JtbHlNb2R1bGV9IGZyb20gJ0BuZ3gtZm9ybWx5L2NvcmUnO1xuaW1wb3J0IHtUcmFuc2xhdGVNb2R1bGV9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuXG5pbXBvcnQge0FGaWVsZERlc2NyaXB0b3J9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvdGFibGV2aWV3L2FwaSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdtbmctZm9ybWx5LWZpZWxkLXdyYXBwZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb3JtbHktZmllbGQtd3JhcHBlci5jb21wb25lbnQuaHRtbCcsXG4gICAgaW1wb3J0czogW1RyYW5zbGF0ZU1vZHVsZSwgRm9ybWx5TW9kdWxlXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBGb3JtbHlGaWVsZFdyYXBwZXJDb21wb25lbnQgZXh0ZW5kcyBGaWVsZFdyYXBwZXIgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMucHJvcHM/LlsnZGVzY3JpcHRvciddIGFzIEFGaWVsZERlc2NyaXB0b3I8YW55LCBhbnk+O1xuICAgICAgICBpZiAodGhpcy5mb3JtU3RhdGUuZGlzYWJsZWQgJiYgZGVzY3JpcHRvci5pc0xvY2FsaXplZCkge1xuICAgICAgICAgICAgdGhpcy5hZGRNaXNzaW5nVHJhbnNsYXRpb25IZWxwZXJUZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE1pc3NpbmdUcmFuc2xhdGlvbkhlbHBlclRleHQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tb2RlbFt0aGlzLnByb3BzPy5bJ2Rlc2NyaXB0b3InXS5wcm9wZXJ0eSArICdUcmFuc2xhdGVkJ10gJiYgdGhpcy5wcm9wcz8uWydkZXNjcmlwdG9yJ10/LnByb3BlcnR5ICE9PSAnaWQnKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzPy5bJ2Rlc2NyaXB0b3InXT8ud2l0aEhlbHBUZXh0KCdtbmdFZGl0b3IubG9jYWxpemF0aW9ucy5taXNzaW5nVHJhbnNsYXRpb24nKTtcbiAgICAgICAgICAgIHRoaXMuZmllbGQuY2xhc3NOYW1lICs9ICcgbG9jYWxpemVkLWlucHV0LWJvcmRlci1vcmFuZ2UnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9wcz8uWydkZXNjcmlwdG9yJ10/LndpdGhIZWxwVGV4dCgnJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IFtjbGFzc109XCJwcm9wc1snZGVzY3JpcHRvciddPy5bJ2ZpZWxkQ2xhc3NOYW1lJ10gPz8gJ2ZpZWxkJ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJncmlkIG10LTBcIj5cbiAgICAgICAgQGlmIChwcm9wcy5sYWJlbCkge1xuICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwia2V5XCIgY2xhc3M9XCJjb2xcIiBbY2xhc3NdPVwicHJvcHNbJ2Rlc2NyaXB0b3InXT8uWydsYWJlbENsYXNzTmFtZSddID8/ICcnXCJcbiAgICAgICAgICAgICAgICA+e3sgcHJvcHMhLmxhYmVsISB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIEBpZiAocHJvcHMucmVxdWlyZWQgJiYgcHJvcHNbJ2hpZGVSZXF1aXJlZE1hcmtlciddICE9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgI2ZpZWxkQ29tcG9uZW50PjwvbmctY29udGFpbmVyPlxuICAgIEBpZiAocHJvcHNbJ2Rlc2NyaXB0b3InXT8uWydoZWxwVGV4dCddKSB7XG4gICAgICAgIDxzbWFsbCBjbGFzcz1cImJsb2NrXCI+e3sgcHJvcHNbJ2Rlc2NyaXB0b3InXT8uWydoZWxwVGV4dCddIHwgdHJhbnNsYXRlIH19PC9zbWFsbD5cbiAgICB9XG4gICAgQGlmIChzaG93RXJyb3IpIHtcbiAgICAgICAgPHNtYWxsIGNsYXNzPVwicC1lcnJvciBibG9ja1wiPlxuICAgICAgICAgICAgPGZvcm1seS12YWxpZGF0aW9uLW1lc3NhZ2UgW2ZpZWxkXT1cImZpZWxkXCI+PC9mb3JtbHktdmFsaWRhdGlvbi1tZXNzYWdlPlxuICAgICAgICA8L3NtYWxsPlxuICAgIH1cbjwvZGl2PlxuIl19
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWx5LWZpZWxkLXdyYXBwZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9lZGl0b3IvY29tcG9uZW50cy9mb3JtbHkvd3JhcHBlcnMvZm9ybWx5LWZpZWxkLXdyYXBwZXIvZm9ybWx5LWZpZWxkLXdyYXBwZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9lZGl0b3IvY29tcG9uZW50cy9mb3JtbHkvd3JhcHBlcnMvZm9ybWx5LWZpZWxkLXdyYXBwZXIvZm9ybWx5LWZpZWxkLXdyYXBwZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakYsT0FBTyxFQUFDLFlBQVksRUFBRSxZQUFZLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFcEQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sNkJBQTZCLENBQUM7Ozs7QUFVbkUsTUFBTSxPQUFPLDJCQUE0QixTQUFRLFlBQVk7SUFQN0Q7O1FBUVcsVUFBSyxHQUFHLE1BQU0sQ0FBcUIsU0FBUyxDQUFDLENBQUM7S0FxQnhEO0lBbkJVLFFBQVE7UUFDWCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUErQixDQUFDO1FBQzVFLElBQUksVUFBVSxDQUFDLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUM1QixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDN0osQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLElBQUksVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQywrQkFBK0IsRUFBRSxDQUFDO1FBQzNDLENBQUM7SUFDTCxDQUFDO0lBRU8sK0JBQStCO1FBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxRQUFRLEdBQUcsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQyxFQUFFLFFBQVEsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNuSCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7WUFDdkYsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLElBQUksZ0NBQWdDLENBQUM7UUFDN0QsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDTCxDQUFDOzhHQXJCUSwyQkFBMkI7a0dBQTNCLDJCQUEyQiwyR0NmeEMsKzBCQXFCQSwyQ0RUYyxlQUFlLDJGQUFFLFlBQVk7OzJGQUc5QiwyQkFBMkI7a0JBUHZDLFNBQVM7aUNBQ00sSUFBSSxZQUNOLDBCQUEwQixXQUUzQixDQUFDLGVBQWUsRUFBRSxZQUFZLENBQUMsbUJBQ3ZCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIE9uSW5pdCwgc2lnbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtGaWVsZFdyYXBwZXIsIEZvcm1seU1vZHVsZX0gZnJvbSAnQG5neC1mb3JtbHkvY29yZSc7XG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5cbmltcG9ydCB7Z2V0STE4blR5cGVQcm9wZXJ0eUtleX0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9jb3JlJztcbmltcG9ydCB7QUZpZWxkRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZXZpZXcvYXBpJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ21uZy1mb3JtbHktZmllbGQtd3JhcHBlcicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2Zvcm1seS1maWVsZC13cmFwcGVyLmNvbXBvbmVudC5odG1sJyxcbiAgICBpbXBvcnRzOiBbVHJhbnNsYXRlTW9kdWxlLCBGb3JtbHlNb2R1bGVdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIEZvcm1seUZpZWxkV3JhcHBlckNvbXBvbmVudCBleHRlbmRzIEZpZWxkV3JhcHBlciBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgcHVibGljIGxhYmVsID0gc2lnbmFsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMucHJvcHM/LlsnZGVzY3JpcHRvciddIGFzIEFGaWVsZERlc2NyaXB0b3I8YW55LCBhbnk+O1xuICAgICAgICBpZiAoZGVzY3JpcHRvci5sYWJlbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5sYWJlbC5zZXQoZGVzY3JpcHRvci5sYWJlbCA/PyBnZXRJMThuVHlwZVByb3BlcnR5S2V5KGRlc2NyaXB0b3IuZWRpdG9yLm1vZGVsLmkxOG5CYXNlS2V5ID8/IGRlc2NyaXB0b3IuZWRpdG9yLm1vZGVsLnR5cGVOYW1lLCBkZXNjcmlwdG9yLnByb3BlcnR5KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mb3JtU3RhdGUuZGlzYWJsZWQgJiYgZGVzY3JpcHRvci5pc0xvY2FsaXplZCkge1xuICAgICAgICAgICAgdGhpcy5hZGRNaXNzaW5nVHJhbnNsYXRpb25IZWxwZXJUZXh0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZE1pc3NpbmdUcmFuc2xhdGlvbkhlbHBlclRleHQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5tb2RlbFt0aGlzLnByb3BzPy5bJ2Rlc2NyaXB0b3InXS5wcm9wZXJ0eSArICdUcmFuc2xhdGVkJ10gJiYgdGhpcy5wcm9wcz8uWydkZXNjcmlwdG9yJ10/LnByb3BlcnR5ICE9PSAnaWQnKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzPy5bJ2Rlc2NyaXB0b3InXT8ud2l0aEhlbHBUZXh0KCdtbmdFZGl0b3IubG9jYWxpemF0aW9ucy5taXNzaW5nVHJhbnNsYXRpb24nKTtcbiAgICAgICAgICAgIHRoaXMuZmllbGQuY2xhc3NOYW1lICs9ICcgbG9jYWxpemVkLWlucHV0LWJvcmRlci1vcmFuZ2UnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9wcz8uWydkZXNjcmlwdG9yJ10/LndpdGhIZWxwVGV4dCgnJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IFtjbGFzc109XCJwcm9wc1snZGVzY3JpcHRvciddPy5bJ2ZpZWxkQ2xhc3NOYW1lJ10gPz8gJ2ZpZWxkJ1wiPlxuICAgIDxkaXYgY2xhc3M9XCJncmlkIG10LTBcIj5cbiAgICAgICAgQGlmIChsYWJlbCgpOyBhcyBsYWJlbCkge1xuICAgICAgICAgICAgPGxhYmVsIFtmb3JdPVwia2V5XCIgY2xhc3M9XCJjb2xcIiBbY2xhc3NdPVwicHJvcHNbJ2Rlc2NyaXB0b3InXT8uWydsYWJlbENsYXNzTmFtZSddID8/ICcnXCJcbiAgICAgICAgICAgICAgICA+e3sgbGFiZWwgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICBAaWYgKHByb3BzLnJlcXVpcmVkICYmIHByb3BzWydoaWRlUmVxdWlyZWRNYXJrZXInXSAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICA8c3Bhbj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICA8bmctY29udGFpbmVyICNmaWVsZENvbXBvbmVudD48L25nLWNvbnRhaW5lcj5cbiAgICBAaWYgKHByb3BzWydkZXNjcmlwdG9yJ10/LlsnaGVscFRleHQnXSkge1xuICAgICAgICA8c21hbGwgY2xhc3M9XCJibG9ja1wiPnt7IHByb3BzWydkZXNjcmlwdG9yJ10/LlsnaGVscFRleHQnXSB8IHRyYW5zbGF0ZSB9fTwvc21hbGw+XG4gICAgfVxuICAgIEBpZiAoc2hvd0Vycm9yKSB7XG4gICAgICAgIDxzbWFsbCBjbGFzcz1cInAtZXJyb3IgYmxvY2tcIj5cbiAgICAgICAgICAgIDxmb3JtbHktdmFsaWRhdGlvbi1tZXNzYWdlIFtmaWVsZF09XCJmaWVsZFwiPjwvZm9ybWx5LXZhbGlkYXRpb24tbWVzc2FnZT5cbiAgICAgICAgPC9zbWFsbD5cbiAgICB9XG48L2Rpdj5cbiJdfQ==
@@ -13,7 +13,7 @@ import { PrimeNGConfig, MessageService, ConfirmationService } from 'primeng/api'
13
13
  import { Router, NavigationEnd, RouterLink, NavigationStart, RouteConfigLoadStart, RouteConfigLoadEnd, NavigationCancel, NavigationError } from '@angular/router';
14
14
  import * as i2$1 from 'primeng/button';
15
15
  import { ButtonModule } from 'primeng/button';
16
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
16
+ import { takeUntilDestroyed, toObservable as toObservable$1 } from '@angular/core/rxjs-interop';
17
17
  import { Title } from '@angular/platform-browser';
18
18
  import { filter, map, first, catchError } from 'rxjs/operators';
19
19
  import { DatePipe } from '@angular/common';
@@ -27,14 +27,15 @@ class NotificationWrapperComponent {
27
27
  this.notificationCutoff = 70;
28
28
  this.isDialogNotificationVisible = computed(() => this.dialogNotification() !== null);
29
29
  this.dialogNotification = signal(null);
30
+ this.dialogNotificationIconClass = computed(() => this.getMessageIcon(this.dialogNotification()));
30
31
  }
31
- getNotificationIconClass(message) {
32
+ getMessageIcon(message) {
32
33
  if (message?.icon)
33
34
  return message.icon;
34
35
  switch (message?.severity) {
35
36
  case 'info':
36
37
  return 'pi-info-circle';
37
- case 'warning':
38
+ case 'warn':
38
39
  return 'pi-exclamation-triangle';
39
40
  case 'error':
40
41
  return 'pi-times-circle';
@@ -53,11 +54,11 @@ class NotificationWrapperComponent {
53
54
  }
54
55
  }
55
56
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: NotificationWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
56
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: NotificationWrapperComponent, isStandalone: true, selector: "mng-notification-wrapper", ngImport: i0, template: "<ng-content></ng-content>\n<p-confirmDialog appendTo=\"body\" [baseZIndex]=\"50\"></p-confirmDialog>\n\n<p-toast [baseZIndex]=\"50\">\n <ng-template let-message pTemplate=\"message\">\n <span [class]=\"'p-toast-message-icon pi ' + getNotificationIconClass(message)\"></span>\n <div class=\"p-toast-message-text\">\n <div class=\"p-toast-summary\">{{ message.summary }}</div>\n @if (message.detail) {\n <div class=\"p-toast-detail\">{{ message.detail.slice(0, notificationCutoff) + (message.detail.length > notificationCutoff ? '...' : '') }}</div>\n @if (message.detail.length > notificationCutoff) {\n <div (click)=\"onShowNotificationInDialog(message)\" class=\"p-link font-semibold text-sm mt-2 flex align-items-center\">\n <i class=\"pi pi-chevron-down mr-1\"></i>{{ 'notification.details' | translate }}\n </div>\n }\n }\n </div>\n </ng-template>\n</p-toast>\n\n<p-dialog\n [visible]=\"isDialogNotificationVisible()\"\n (visibleChange)=\"onDialogNotificationVisibilityChange($event)\"\n [styleClass]=\"'p-fluid mng-dialog mng-dialog-xs ' + 'mng-message-detail-dialog mng-message-detail-dialog-' + (dialogNotification()?.severity ?? '')\">\n <ng-template pTemplate=\"header\" mngDialogKeydownHandler>\n <span class=\"p-dialog-title font-bold mng-dialog-success\">\n <span [class]=\"'mr-2 pi ' + getNotificationIconClass(dialogNotification())\"></span>\n {{ dialogNotification()?.summary ?? '' }}\n </span>\n </ng-template>\n <div>\n {{ dialogNotification()?.detail ?? '' }}\n </div>\n</p-dialog>\n", dependencies: [{ kind: "ngmodule", type: ToastModule }, { kind: "component", type: i1.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ConfirmDialogModule }, { kind: "component", type: i3.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i5.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
57
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: NotificationWrapperComponent, isStandalone: true, selector: "mng-notification-wrapper", ngImport: i0, template: "<ng-content></ng-content>\n<p-confirmDialog appendTo=\"body\" [baseZIndex]=\"50\"></p-confirmDialog>\n\n<p-toast [baseZIndex]=\"50\">\n <ng-template let-message pTemplate=\"message\">\n <span [class]=\"'p-toast-message-icon pi ' + getMessageIcon(message)\"></span>\n <div class=\"p-toast-message-text\">\n <div class=\"p-toast-summary\">{{ message.summary }}</div>\n @if (message.detail) {\n <div class=\"p-toast-detail\">{{ message.detail.slice(0, notificationCutoff) + (message.detail.length > notificationCutoff ? '...' : '') }}</div>\n @if (message.detail.length > notificationCutoff) {\n <div (click)=\"onShowNotificationInDialog(message)\" class=\"p-link font-semibold text-sm mt-2 flex align-items-center\">\n <i class=\"pi pi-chevron-down mr-1\"></i>{{ 'notification.details' | translate }}\n </div>\n }\n }\n </div>\n </ng-template>\n</p-toast>\n\n<p-dialog\n [visible]=\"isDialogNotificationVisible()\"\n (visibleChange)=\"onDialogNotificationVisibilityChange($event)\"\n [styleClass]=\"'p-fluid mng-dialog mng-dialog-xs ' + 'mng-message-detail-dialog mng-message-detail-dialog-' + (dialogNotification()?.severity ?? '')\"\n appendTo=\"body\"\n draggable=\"false\"\n modal=\"true\">\n <ng-template pTemplate=\"header\" mngDialogKeydownHandler>\n <span class=\"p-dialog-title font-bold mng-dialog-success\">\n <span [class]=\"'mr-2 pi ' + dialogNotificationIconClass()\"></span>\n {{ dialogNotification()?.summary ?? '' }}\n </span>\n </ng-template>\n <div class=\"mng-notification-details\">\n {{ dialogNotification()?.detail ?? '' }}\n </div>\n</p-dialog>\n", styles: [".mng-notification-details{white-space:pre-wrap;word-wrap:break-word}\n"], dependencies: [{ kind: "ngmodule", type: ToastModule }, { kind: "component", type: i1.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ConfirmDialogModule }, { kind: "component", type: i3.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i3$1.TranslatePipe, name: "translate" }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i5.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "positionLeft", "positionTop", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "responsive", "appendTo", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "breakpoint", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "visible", "style", "position"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
57
58
  }
58
59
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: NotificationWrapperComponent, decorators: [{
59
60
  type: Component,
60
- args: [{ selector: 'mng-notification-wrapper', standalone: true, imports: [ToastModule, ConfirmDialogModule, TranslateModule, DialogModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>\n<p-confirmDialog appendTo=\"body\" [baseZIndex]=\"50\"></p-confirmDialog>\n\n<p-toast [baseZIndex]=\"50\">\n <ng-template let-message pTemplate=\"message\">\n <span [class]=\"'p-toast-message-icon pi ' + getNotificationIconClass(message)\"></span>\n <div class=\"p-toast-message-text\">\n <div class=\"p-toast-summary\">{{ message.summary }}</div>\n @if (message.detail) {\n <div class=\"p-toast-detail\">{{ message.detail.slice(0, notificationCutoff) + (message.detail.length > notificationCutoff ? '...' : '') }}</div>\n @if (message.detail.length > notificationCutoff) {\n <div (click)=\"onShowNotificationInDialog(message)\" class=\"p-link font-semibold text-sm mt-2 flex align-items-center\">\n <i class=\"pi pi-chevron-down mr-1\"></i>{{ 'notification.details' | translate }}\n </div>\n }\n }\n </div>\n </ng-template>\n</p-toast>\n\n<p-dialog\n [visible]=\"isDialogNotificationVisible()\"\n (visibleChange)=\"onDialogNotificationVisibilityChange($event)\"\n [styleClass]=\"'p-fluid mng-dialog mng-dialog-xs ' + 'mng-message-detail-dialog mng-message-detail-dialog-' + (dialogNotification()?.severity ?? '')\">\n <ng-template pTemplate=\"header\" mngDialogKeydownHandler>\n <span class=\"p-dialog-title font-bold mng-dialog-success\">\n <span [class]=\"'mr-2 pi ' + getNotificationIconClass(dialogNotification())\"></span>\n {{ dialogNotification()?.summary ?? '' }}\n </span>\n </ng-template>\n <div>\n {{ dialogNotification()?.detail ?? '' }}\n </div>\n</p-dialog>\n" }]
61
+ args: [{ selector: 'mng-notification-wrapper', standalone: true, imports: [ToastModule, ConfirmDialogModule, TranslateModule, DialogModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content></ng-content>\n<p-confirmDialog appendTo=\"body\" [baseZIndex]=\"50\"></p-confirmDialog>\n\n<p-toast [baseZIndex]=\"50\">\n <ng-template let-message pTemplate=\"message\">\n <span [class]=\"'p-toast-message-icon pi ' + getMessageIcon(message)\"></span>\n <div class=\"p-toast-message-text\">\n <div class=\"p-toast-summary\">{{ message.summary }}</div>\n @if (message.detail) {\n <div class=\"p-toast-detail\">{{ message.detail.slice(0, notificationCutoff) + (message.detail.length > notificationCutoff ? '...' : '') }}</div>\n @if (message.detail.length > notificationCutoff) {\n <div (click)=\"onShowNotificationInDialog(message)\" class=\"p-link font-semibold text-sm mt-2 flex align-items-center\">\n <i class=\"pi pi-chevron-down mr-1\"></i>{{ 'notification.details' | translate }}\n </div>\n }\n }\n </div>\n </ng-template>\n</p-toast>\n\n<p-dialog\n [visible]=\"isDialogNotificationVisible()\"\n (visibleChange)=\"onDialogNotificationVisibilityChange($event)\"\n [styleClass]=\"'p-fluid mng-dialog mng-dialog-xs ' + 'mng-message-detail-dialog mng-message-detail-dialog-' + (dialogNotification()?.severity ?? '')\"\n appendTo=\"body\"\n draggable=\"false\"\n modal=\"true\">\n <ng-template pTemplate=\"header\" mngDialogKeydownHandler>\n <span class=\"p-dialog-title font-bold mng-dialog-success\">\n <span [class]=\"'mr-2 pi ' + dialogNotificationIconClass()\"></span>\n {{ dialogNotification()?.summary ?? '' }}\n </span>\n </ng-template>\n <div class=\"mng-notification-details\">\n {{ dialogNotification()?.detail ?? '' }}\n </div>\n</p-dialog>\n", styles: [".mng-notification-details{white-space:pre-wrap;word-wrap:break-word}\n"] }]
61
62
  }] });
62
63
 
63
64
  class ACommonsErrorBase extends Error {
@@ -69,6 +70,7 @@ class ACommonsErrorBase extends Error {
69
70
  this.cause = options?.cause;
70
71
  this.stack = options?.stack ?? (options?.cause ? options.cause.stack : new Error(message).stack);
71
72
  this.details = options?.details;
73
+ this.notification = options?.notification;
72
74
  }
73
75
  }
74
76
  class CommonsInternalError extends ACommonsErrorBase {
@@ -1692,6 +1694,13 @@ function getHttpErrorResponse(error) {
1692
1694
  function getHttpErrorResponseStatus(error) {
1693
1695
  return getHttpErrorResponse(error)?.status ?? null;
1694
1696
  }
1697
+ /**
1698
+ * Gets HttpErrorResponse status text from error (Angular or Commons).
1699
+ * @param error Error.
1700
+ */
1701
+ function getHttpErrorResponseStatusText(error) {
1702
+ return getHttpErrorResponse(error)?.statusText ?? null;
1703
+ }
1695
1704
  /**
1696
1705
  * Get error log level. All is error, except if error is http error with status >=400 and <500.
1697
1706
  * @param error Error.
@@ -2753,37 +2762,88 @@ function isRbacPermitted(permissions, userRoles) {
2753
2762
 
2754
2763
  class PermissionService {
2755
2764
  constructor() {
2756
- this.router = inject(Router);
2757
2765
  this.injector = inject(Injector);
2758
2766
  this.commons = inject(CommonsService);
2759
2767
  this.logger = inject(LoggerService).create('AuthorizationService');
2760
- this.userRoles$ = toObservable(this.commons.userRoles());
2768
+ this.userRoles$ = toObservable$1(this.commons.userRoles);
2769
+ }
2770
+ canActivateRoute(permissions, route) {
2771
+ switch (permissions.authorizationType) {
2772
+ case PermissionTypeEnum.All:
2773
+ return this.canActivateRouteAll(permissions, route);
2774
+ case PermissionTypeEnum.Any:
2775
+ return this.canActivateRouteAny(permissions, route);
2776
+ case PermissionTypeEnum.Service:
2777
+ return this.canActivateRouteService(permissions, route);
2778
+ default:
2779
+ return this.userRoles$.pipe(map(ur => isPermitted(permissions, ur)));
2780
+ }
2781
+ }
2782
+ canActivateRouteAll(permission, route) {
2783
+ return combineLatest(permission.permissions.map(p => this.canActivateRoute(p, route))).pipe(map(res => res.every(ip => ip === true)));
2784
+ }
2785
+ canActivateRouteAny(permissions, route) {
2786
+ return combineLatest(permissions.permissions.map(p => this.canActivateRoute(p, route))).pipe(map(res => res.some(ip => ip === true)));
2787
+ }
2788
+ canActivateRouteService(permission, route) {
2789
+ const serviceInstance = this.injector.get(permission.service);
2790
+ if (!serviceInstance) {
2791
+ this.logger.debug(`WARNING: Service instance could not be retreived for type ${permission.service}`);
2792
+ return of(false);
2793
+ }
2794
+ return serviceInstance.canActivateRoute(route);
2761
2795
  }
2762
- isPermitted(permissions, route, actionCtx) {
2796
+ isMenuItemVisible(permissions, menuItem) {
2763
2797
  switch (permissions.authorizationType) {
2764
2798
  case PermissionTypeEnum.All:
2765
- return this.isPermittedAll(permissions, route, actionCtx);
2799
+ return this.isMenuItemVisibleAll(permissions, menuItem);
2766
2800
  case PermissionTypeEnum.Any:
2767
- return this.isPermittedAny(permissions, route, actionCtx);
2801
+ return this.isMenuItemVisibleAny(permissions, menuItem);
2768
2802
  case PermissionTypeEnum.Service:
2769
- return this.isPermittedService(permissions, route, actionCtx);
2803
+ return this.isMenuItemVisibleService(permissions, menuItem);
2804
+ default:
2805
+ return this.userRoles$.pipe(map(role => isPermitted(permissions, role)));
2806
+ }
2807
+ }
2808
+ isMenuItemVisibleAll(permission, menuItem) {
2809
+ return combineLatest(permission.permissions.map(p => this.isMenuItemVisible(p, menuItem))).pipe(map(res => res.every(ip => ip === true)));
2810
+ }
2811
+ isMenuItemVisibleAny(permission, menuItem) {
2812
+ return combineLatest(permission.permissions.map(p => this.isMenuItemVisible(p, menuItem))).pipe(map(res => res.some(ip => ip === true)));
2813
+ }
2814
+ isMenuItemVisibleService(permission, menuItem) {
2815
+ const serviceInstance = this.injector.get(permission.service);
2816
+ if (!serviceInstance) {
2817
+ this.logger.debug(`WARNING: Service instance could not be retreived for type ${permission.service}`);
2818
+ return of(false);
2819
+ }
2820
+ return serviceInstance.isMenuitemVisible(menuItem);
2821
+ }
2822
+ isActionVisible(permissions, actionCtx, route) {
2823
+ switch (permissions.authorizationType) {
2824
+ case PermissionTypeEnum.All:
2825
+ return this.isActionVisibleAll(permissions, actionCtx, route);
2826
+ case PermissionTypeEnum.Any:
2827
+ return this.isActionVisibleAny(permissions, actionCtx, route);
2828
+ case PermissionTypeEnum.Service:
2829
+ return this.isActionVisibleService(permissions, actionCtx, route);
2770
2830
  default:
2771
2831
  return this.userRoles$.pipe(map(ur => isPermitted(permissions, ur)));
2772
2832
  }
2773
2833
  }
2774
- isPermittedAll(permission, route, actionCtx) {
2775
- return combineLatest(permission.permissions.map(p => this.isPermitted(p, route, actionCtx))).pipe(map(res => res.every(ip => ip === true)));
2834
+ isActionVisibleAll(permission, actionCtx, route) {
2835
+ return combineLatest(permission.permissions.map(p => this.isActionVisible(p, actionCtx, route))).pipe(map(res => res.every(ip => ip === true)));
2776
2836
  }
2777
- isPermittedAny(permission, route, actionCtx) {
2778
- return combineLatest(permission.permissions.map(p => this.isPermitted(p, route, actionCtx))).pipe(map(res => res.some(ip => ip === true)));
2837
+ isActionVisibleAny(permission, actionCtx, route) {
2838
+ return combineLatest(permission.permissions.map(p => this.isActionVisible(p, actionCtx, route))).pipe(map(res => res.some(ip => ip === true)));
2779
2839
  }
2780
- isPermittedService(permission, route, actionCtx) {
2840
+ isActionVisibleService(permission, actionCtx, route) {
2781
2841
  const serviceInstance = this.injector.get(permission.service);
2782
2842
  if (!serviceInstance) {
2783
2843
  this.logger.debug(`WARNING: Service instance could not be retreived for type ${permission.service}`);
2784
2844
  return of(false);
2785
2845
  }
2786
- return serviceInstance.isPermitted(route, this.router.routerState.snapshot, actionCtx);
2846
+ return serviceInstance.isActionVisible(actionCtx, route);
2787
2847
  }
2788
2848
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: PermissionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
2789
2849
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: PermissionService }); }
@@ -2796,7 +2856,7 @@ const permissionGuard = (route) => {
2796
2856
  const permission = inject(PermissionService);
2797
2857
  const data = route.data;
2798
2858
  if (data.permissions) {
2799
- return permission.isPermitted(data.permissions).pipe(first());
2859
+ return permission.canActivateRoute(data.permissions).pipe(first());
2800
2860
  }
2801
2861
  else {
2802
2862
  return of(true);
@@ -3134,34 +3194,11 @@ class RouteBuilder {
3134
3194
  if (menuItemChildrenBuild.length > 0) {
3135
3195
  menuItemBuild.items = menuItemChildrenBuild;
3136
3196
  }
3137
- if (!menuItemBuild.guards) {
3138
- const guards = this.findMenuItemGuards();
3139
- if (guards.length > 0) {
3140
- menuItemBuild.guards = guards;
3141
- }
3142
- }
3143
3197
  if (!menuItemBuild.permissions) {
3144
3198
  menuItemBuild.permissions = this.findMenuItemPermissions();
3145
3199
  }
3146
3200
  return [menuItemBuild];
3147
3201
  }
3148
- findMenuItemGuards() {
3149
- const guards = [];
3150
- if (this.route.canActivate?.length) {
3151
- guards.push(...this.route.canActivate);
3152
- }
3153
- if (this.parent) {
3154
- // Check for parent guards that should be included in decision to hide menu item!
3155
- // Some parent routes might have guards, but no menu items, so this guards must be taken into account here,
3156
- // because there is no parent menu item to hide.
3157
- this.parent.findMenuItemGuards().forEach(g => {
3158
- if (guards.indexOf(g) < 0) {
3159
- guards.push(g);
3160
- }
3161
- });
3162
- }
3163
- return guards;
3164
- }
3165
3202
  findMenuItemPermissions() {
3166
3203
  if (this.menuItem?.permissions) {
3167
3204
  return this.menuItem.permissions;
@@ -3311,6 +3348,9 @@ function mapToDataList() {
3311
3348
  data: value.data ?? [],
3312
3349
  totalCount: value.totalCount ?? value.data?.length ?? 0
3313
3350
  });
3351
+ },
3352
+ error: err => {
3353
+ subscriber.error(err);
3314
3354
  }
3315
3355
  });
3316
3356
  });
@@ -3907,5 +3947,5 @@ function provideCommons(config, ...features) {
3907
3947
  * Generated bundle index. Do not edit.
3908
3948
  */
3909
3949
 
3910
- export { ACommonsErrorBase, APermissions, BROWSER_STORAGE_IT, BooleanPipe, COMMONS_INITIALIZER_IT, COMMONS_MODULE_CONFIG_IT, ClassMapPipe, CommonsConfigurationService, CommonsErrorHandler, CommonsFeatureTypeEnum, CommonsHttpError, CommonsInitEventEnum, CommonsInitService, CommonsInternalError, CommonsRouterService, CommonsService, ComponentDirective, DataProvider, DataProviderInst, EnumName, EnumPipe, EnumerateAsyncPipe, EnumeratePipe, ErrorPageComponent, FilterMatchMode, GetterPipe, I18nPropertyPipe, JsonPathPipe, LOG_PUBLISHERS, LocalStorageService, LogLevelEnum, LogPublisherConsoleService, LoggerService, NotFoundPageComponent, NotificationWrapperComponent, ParametrizePipe, PermissionService, PermissionTypeEnum, Permissions, RouteBuilder, RoutesBuilder, StyleLevelEnum, StyleSizeEnum, Styles, TemplateDirective, TemplatePipe, TypeName, TypeRegistry, adjustRouteMenuLazyChildrenRouterLinks, angularDateFormatHasSeconds, angularDateFormatHasTime, appendRoutePathToBasePath, boolean$Attribute, booleanOrUndefinedAttribute, commonsActionErrorContextToString, commonsErrorToString, commonsInitializerProvider, copyDataListParams, createLazyChildrenRoute, createLazyRoute, createRoute, createRouteRedirect, createRoutes, dataListParamsFilterToUrlQuery, dataListParamsFilterValueToUrlString, dataListParamsFiltersToUrlQuery, dataListParamsSortToUrlQuery, dataListParamsToUrlQuery, dataProviderBase, dataProviderFromClass, dataProviderWithService, dateToIsoString, defineReflectEnumName, defineReflectTypeName, doesUrlMatchRouterLink, errorCauseToString, errorToString, escapeHtml, escapeHtmlAny, findReflectEnumName, findReflectTypeName, findTemplateByName, flattenObjectKeys, fromAngularDateFormatToPrime, fromEnumConstantsAsValueArray, fromEnumValuesAsValueArray, fromSubscribeError, fromTableLoadToDataListParams, fromUrlQueryToDataListParams, getEnumConstantName, getEnumConstantNameFromObject, getEnumConstantNames, getEnumConstantNamesFromObject, getEnumConstantValuesAsNumber, getEnumConstantValuesAsString, getEnumerationI18nBaseKey, getErrorLogLevel, getErrorName, getHttpErrorResponse, getHttpErrorResponseStatus, getI18n, getI18nAsync, getI18nErrorParams, getI18nForError, getI18nTypeGroupKey, getI18nTypeKeyBasePath, getI18nTypeName, getI18nTypeNameAsync, getI18nTypeParams, getI18nTypeParamsAsync, getI18nTypePropertyKey, getI18nTypeTabKey, getObjectGetters, getObjectProperties, getObjectPropertyByPath, httpErrorResponseToString, isHttpErrorResponse, isPermitted, isRbacPermitted, itemIdToDefined, itemIdToNumber, itemIdToString, mapToDataList, mergeDataListParamsWithDefaults, number$Attribute, objectDeepCopy, objectDeepMerge, permissionGuard, populateI18nParams, populateI18nTypeParams, provideCommons, reflectEnumNameKey, reflectTypeNameExists, reflectTypeNameKey, removeRouteEmptyPathSegments, selectEnumerationI18n, selectI18n, stringify, throwError, toEnumerationI18nEnumerate, toObservable, toastMessage, valueToDefined };
3950
+ export { ACommonsErrorBase, APermissions, BROWSER_STORAGE_IT, BooleanPipe, COMMONS_INITIALIZER_IT, COMMONS_MODULE_CONFIG_IT, ClassMapPipe, CommonsConfigurationService, CommonsErrorHandler, CommonsFeatureTypeEnum, CommonsHttpError, CommonsInitEventEnum, CommonsInitService, CommonsInternalError, CommonsRouterService, CommonsService, ComponentDirective, DataProvider, DataProviderInst, EnumName, EnumPipe, EnumerateAsyncPipe, EnumeratePipe, ErrorPageComponent, FilterMatchMode, GetterPipe, I18nPropertyPipe, JsonPathPipe, LOG_PUBLISHERS, LocalStorageService, LogLevelEnum, LogPublisherConsoleService, LoggerService, NotFoundPageComponent, NotificationWrapperComponent, ParametrizePipe, PermissionService, PermissionTypeEnum, Permissions, RouteBuilder, RoutesBuilder, StyleLevelEnum, StyleSizeEnum, Styles, TemplateDirective, TemplatePipe, TypeName, TypeRegistry, adjustRouteMenuLazyChildrenRouterLinks, angularDateFormatHasSeconds, angularDateFormatHasTime, appendRoutePathToBasePath, boolean$Attribute, booleanOrUndefinedAttribute, commonsActionErrorContextToString, commonsErrorToString, commonsInitializerProvider, copyDataListParams, createLazyChildrenRoute, createLazyRoute, createRoute, createRouteRedirect, createRoutes, dataListParamsFilterToUrlQuery, dataListParamsFilterValueToUrlString, dataListParamsFiltersToUrlQuery, dataListParamsSortToUrlQuery, dataListParamsToUrlQuery, dataProviderBase, dataProviderFromClass, dataProviderWithService, dateToIsoString, defineReflectEnumName, defineReflectTypeName, doesUrlMatchRouterLink, errorCauseToString, errorToString, escapeHtml, escapeHtmlAny, findReflectEnumName, findReflectTypeName, findTemplateByName, flattenObjectKeys, fromAngularDateFormatToPrime, fromEnumConstantsAsValueArray, fromEnumValuesAsValueArray, fromSubscribeError, fromTableLoadToDataListParams, fromUrlQueryToDataListParams, getEnumConstantName, getEnumConstantNameFromObject, getEnumConstantNames, getEnumConstantNamesFromObject, getEnumConstantValuesAsNumber, getEnumConstantValuesAsString, getEnumerationI18nBaseKey, getErrorLogLevel, getErrorName, getHttpErrorResponse, getHttpErrorResponseStatus, getHttpErrorResponseStatusText, getI18n, getI18nAsync, getI18nErrorParams, getI18nForError, getI18nTypeGroupKey, getI18nTypeKeyBasePath, getI18nTypeName, getI18nTypeNameAsync, getI18nTypeParams, getI18nTypeParamsAsync, getI18nTypePropertyKey, getI18nTypeTabKey, getObjectGetters, getObjectProperties, getObjectPropertyByPath, httpErrorResponseToString, isHttpErrorResponse, isPermitted, isRbacPermitted, itemIdToDefined, itemIdToNumber, itemIdToString, mapToDataList, mergeDataListParamsWithDefaults, number$Attribute, objectDeepCopy, objectDeepMerge, permissionGuard, populateI18nParams, populateI18nTypeParams, provideCommons, reflectEnumNameKey, reflectTypeNameExists, reflectTypeNameKey, removeRouteEmptyPathSegments, selectEnumerationI18n, selectI18n, stringify, throwError, toEnumerationI18nEnumerate, toObservable, toastMessage, valueToDefined };
3911
3951
  //# sourceMappingURL=mediusinc-mng-commons-core.mjs.map