@zambon-dev/framework 1.2.0 → 1.3.0

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.
package/CHANGELOG.md CHANGED
@@ -23,6 +23,76 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
23
23
 
24
24
  ### ⚠ Breaking Changes / Migration
25
25
 
26
+ ## [1.3.0] - 2026-07-30
27
+
28
+ ### Added
29
+
30
+ - `framework-button-export` now accepts a **`defaultOption` `@Input()`** — the index into `options`
31
+ exported when the main button itself is clicked, defaulting to `0` (Excel). This mirrors the input
32
+ `framework-button-save` already had; `-1` means "no default" and makes the button only toggle its
33
+ dropdown. See **Changed** below for the behaviour this changes by default.
34
+
35
+ ### Changed
36
+
37
+ - **`framework-button-export` now exports on a single click**, to Excel by default, instead of only
38
+ opening its format menu. `RibbonButtonComponent` treats a `defaultOption` of -1 as "no default" and
39
+ merely toggles the dropdown; Export never set one, so the common case took two clicks while
40
+ `framework-button-save` (which sets 0) took one. Export now sets 0 as well, through the new
41
+ `defaultOption` `@Input()`. The format menu is unchanged and still reachable from the button's
42
+ dropdown caret, so every format remains available.
43
+
44
+ ### Fixed
45
+
46
+ - **Routed list views now fill the available height automatically.** `DefaultTabViewComponent` gave its
47
+ routed child no layout and `lib-data-grid` has no `flex-grow` of its own, so a grid collapsed to its
48
+ `rowsToDisplay × rowHeight` minimum with empty space beneath it, and every consuming list component
49
+ had to repeat the same `:host { flex; flex-grow; overflow: hidden }` + `lib-data-grid { flex-grow }`
50
+ stylesheet to compensate. `TabViewList` now carries a `framework-view-list` host class — inherited by
51
+ every subclass — which `DefaultTabViewComponent` styles, so **consuming apps can delete those
52
+ per-component stylesheets**. Routed screens that do not extend `TabViewList` (forms, dashboards) are
53
+ unaffected.
54
+
55
+ - `framework-default-tab-view` and `framework-default-details-tab-view` no longer log
56
+ `NG0100: ExpressionChangedAfterItHasBeenCheckedError` on every render in development mode.
57
+ Both views assigned a placeholder ribbon template from `ngAfterViewInit` — after Angular had
58
+ already checked the ribbon's `*ngTemplateOutlet` binding — which tripped the dev-mode change
59
+ detection check one to three times per load. The placeholder rendered no content, so it has
60
+ been removed and the outlet is now left empty until a view publishes its own `#ribbon`
61
+ template. The rendered output is unchanged, and ribbon buttons still appear immediately for
62
+ list and detail screens.
63
+
64
+ ### ⚠ Breaking Changes / Migration
65
+
66
+ None — nothing has to change for your app to compile against this release. Two behaviour changes to
67
+ check, and one optional cleanup:
68
+
69
+ - **Absolutely-positioned content inside a routed list view is now clipped.** The full-height layout
70
+ applied to `framework-view-list` includes `overflow: hidden`, so a popover, dropdown or tooltip that
71
+ a list screen renders with `position: absolute` inside its own host is now cut off at the host's
72
+ edges. Apps that had already written the equivalent `:host { overflow: hidden }` stylesheet by hand
73
+ are unaffected — the clipping was already in place there. Only list screens that had no such
74
+ stylesheet change. Fix by portaling the content out of the host (CDK Overlay, as `lib-catalog-select`
75
+ does) rather than relying on `position: absolute`.
76
+ - If you relied on `framework-button-export`'s first click opening the format menu rather than
77
+ exporting, set `[defaultOption]="-1"` to restore that behaviour.
78
+ - *Optional cleanup:* components extending `TabViewList` can now delete their
79
+ `:host { display: flex; flex-grow: 1; overflow: hidden }` / `lib-data-grid { flex-grow: 1 }`
80
+ stylesheets — `DefaultTabViewComponent` styles the inherited `framework-view-list` host class.
81
+
82
+ ## [1.2.1] - 2026-07-29
83
+
84
+ ### Fixed
85
+
86
+ - Lint configuration only: the library's ESLint selector rules now accept the `framework-` prefix
87
+ that every `@framework` component already uses. They previously still expected the Angular
88
+ scaffold's `lib` prefix, so the entire component surface reported
89
+ `@angular-eslint/component-selector` errors. No selector was renamed, and no published API or
90
+ runtime behavior changed — nothing to do on upgrade.
91
+
92
+ ### ⚠ Breaking Changes / Migration
93
+
94
+ None.
95
+
26
96
  ## [1.2.0] - 2026-07-24
27
97
 
28
98
  ### Added
@@ -33,22 +103,27 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
33
103
  Existing `new AppConfig(baseUrl)` calls continue to work unchanged (`notificationsEnabled`
34
104
  defaults to `false`, other new fields to empty strings).
35
105
 
106
+ ### ⚠ Breaking Changes / Migration
107
+
108
+ None.
109
+
110
+ ## [1.1.1] - 2026-06-20
111
+
36
112
  ### Fixed
37
113
 
38
114
  - `framework-button-export` now forwards its `iconSize` input to the underlying ribbon button,
39
115
  so setting `iconSize` correctly resizes the export button's icon. Previously the input was
40
116
  ignored and the icon always rendered at the default size.
41
117
 
42
- ### ⚠ Breaking Changes / Migration
43
-
44
- None.
45
-
46
118
  ## [1.1.0] - 2026-06-02
47
119
 
48
120
  - Baseline release: the changelog starts being tracked from this version. Earlier history is
49
121
  available via [GitHub Releases](https://github.com/RicardoZambon/ZLibraries/releases) and the
50
122
  `framework-v*` tags.
51
123
 
52
- [Unreleased]: https://github.com/RicardoZambon/ZLibraries/compare/framework-v1.2.0...HEAD
124
+ [Unreleased]: https://github.com/RicardoZambon/ZLibraries/compare/framework-v1.3.0...HEAD
125
+ [1.3.0]: https://github.com/RicardoZambon/ZLibraries/releases/tag/framework-v1.3.0
126
+ [1.2.1]: https://github.com/RicardoZambon/ZLibraries/releases/tag/framework-v1.2.1
53
127
  [1.2.0]: https://github.com/RicardoZambon/ZLibraries/releases/tag/framework-v1.2.0
128
+ [1.1.1]: https://github.com/RicardoZambon/ZLibraries/releases/tag/framework-v1.1.1
54
129
  [1.1.0]: https://github.com/RicardoZambon/ZLibraries/releases/tag/framework-v1.1.0
@@ -1263,6 +1263,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImpor
1263
1263
  const MaxExportRows = 50000;
1264
1264
  class ButtonExportComponent extends BaseButton {
1265
1265
  //#region ViewChilds, Inputs, Outputs
1266
+ /**
1267
+ * Index into `options` exported when the main button is clicked, defaulting to Excel.
1268
+ * `RibbonButtonComponent` treats -1 as "no default" and merely toggles the dropdown, which left
1269
+ * Export needing two clicks for the common case while Save (which sets 0) needed one. Set -1 to
1270
+ * restore the dropdown-only behaviour.
1271
+ */
1272
+ defaultOption = 0;
1266
1273
  fileBaseName = 'export';
1267
1274
  //#endregion
1268
1275
  //#region Variables
@@ -1337,15 +1344,17 @@ class ButtonExportComponent extends BaseButton {
1337
1344
  URL.revokeObjectURL(url);
1338
1345
  }
1339
1346
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: ButtonExportComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1340
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.6", type: ButtonExportComponent, isStandalone: true, selector: "framework-button-export", inputs: { fileBaseName: "fileBaseName" }, providers: [{ provide: RibbonGroupChild, useExisting: forwardRef(() => ButtonExportComponent) }], usesInheritance: true, ngImport: i0, template: "<lib-ribbon-button *ngIf=\"visible\"\nlabel=\"Button-Export\"\nicon=\"fa-file-export\"\n[disabled]=\"isButtonDisabled\"\n[loading]=\"loading\"\n[iconSize]=\"iconSize\"\n[options]=\"options\"\n[tooltip]=\"tooltip\"\n(action)=\"onButtonClicked($event)\">\n</lib-ribbon-button>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: RibbonButtonComponent, selector: "lib-ribbon-button", inputs: ["color", "defaultOption", "disabled", "icon", "iconSize", "label", "loading", "options", "tooltip"], outputs: ["action"] }] });
1347
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.6", type: ButtonExportComponent, isStandalone: true, selector: "framework-button-export", inputs: { defaultOption: "defaultOption", fileBaseName: "fileBaseName" }, providers: [{ provide: RibbonGroupChild, useExisting: forwardRef(() => ButtonExportComponent) }], usesInheritance: true, ngImport: i0, template: "<lib-ribbon-button *ngIf=\"visible\"\nlabel=\"Button-Export\"\nicon=\"fa-file-export\"\n[defaultOption]=\"defaultOption\"\n[disabled]=\"isButtonDisabled\"\n[loading]=\"loading\"\n[iconSize]=\"iconSize\"\n[options]=\"options\"\n[tooltip]=\"tooltip\"\n(action)=\"onButtonClicked($event)\">\n</lib-ribbon-button>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: RibbonButtonComponent, selector: "lib-ribbon-button", inputs: ["color", "defaultOption", "disabled", "icon", "iconSize", "label", "loading", "options", "tooltip"], outputs: ["action"] }] });
1341
1348
  }
1342
1349
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: ButtonExportComponent, decorators: [{
1343
1350
  type: Component,
1344
1351
  args: [{ selector: 'framework-button-export', imports: [
1345
1352
  NgIf,
1346
1353
  RibbonButtonComponent,
1347
- ], providers: [{ provide: RibbonGroupChild, useExisting: forwardRef(() => ButtonExportComponent) }], template: "<lib-ribbon-button *ngIf=\"visible\"\nlabel=\"Button-Export\"\nicon=\"fa-file-export\"\n[disabled]=\"isButtonDisabled\"\n[loading]=\"loading\"\n[iconSize]=\"iconSize\"\n[options]=\"options\"\n[tooltip]=\"tooltip\"\n(action)=\"onButtonClicked($event)\">\n</lib-ribbon-button>\n" }]
1348
- }], ctorParameters: () => [], propDecorators: { fileBaseName: [{
1354
+ ], providers: [{ provide: RibbonGroupChild, useExisting: forwardRef(() => ButtonExportComponent) }], template: "<lib-ribbon-button *ngIf=\"visible\"\nlabel=\"Button-Export\"\nicon=\"fa-file-export\"\n[defaultOption]=\"defaultOption\"\n[disabled]=\"isButtonDisabled\"\n[loading]=\"loading\"\n[iconSize]=\"iconSize\"\n[options]=\"options\"\n[tooltip]=\"tooltip\"\n(action)=\"onButtonClicked($event)\">\n</lib-ribbon-button>\n" }]
1355
+ }], ctorParameters: () => [], propDecorators: { defaultOption: [{
1356
+ type: Input
1357
+ }], fileBaseName: [{
1349
1358
  type: Input
1350
1359
  }] } });
1351
1360
 
@@ -2541,6 +2550,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImpor
2541
2550
  args: [{ template: '' }]
2542
2551
  }], ctorParameters: () => [{ type: i1$2.DataGridDataset }, { type: i2.ActivatedRoute }, { type: TabService }] });
2543
2552
 
2553
+ // The host class is inherited by every subclass (Angular merges hostAttrs from a base component
2554
+ // definition), which is what lets DefaultTabViewComponent give routed list screens a full-height
2555
+ // layout without each one declaring its own stylesheet. Plain class name, NOT Tailwind utilities:
2556
+ // library SCSS resolves @apply at library-build time, whereas a utility class named here would
2557
+ // have to be generated by each consumer's own Tailwind build.
2544
2558
  class TabViewList extends TabViewBase {
2545
2559
  //#region ViewChilds, Inputs, Outputs
2546
2560
  //#endregion
@@ -2593,11 +2607,11 @@ class TabViewList extends TabViewBase {
2593
2607
  }
2594
2608
  }
2595
2609
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: TabViewList, deps: [], target: i0.ɵɵFactoryTarget.Component });
2596
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.6", type: TabViewList, isStandalone: true, selector: "ng-component", usesInheritance: true, ngImport: i0, template: '', isInline: true });
2610
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.6", type: TabViewList, isStandalone: true, selector: "ng-component", host: { classAttribute: "framework-view-list" }, usesInheritance: true, ngImport: i0, template: '', isInline: true });
2597
2611
  }
2598
2612
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: TabViewList, decorators: [{
2599
2613
  type: Component,
2600
- args: [{ template: '' }]
2614
+ args: [{ host: { class: 'framework-view-list' }, template: '' }]
2601
2615
  }], ctorParameters: () => [] });
2602
2616
 
2603
2617
  class ListView extends TabViewList {
@@ -3206,7 +3220,6 @@ class DefaultTabViewComponent {
3206
3220
  changeDetectorRef;
3207
3221
  tabViewService;
3208
3222
  //#region ViewChilds, Inputs, Outputs
3209
- emptyRibbonTemplate;
3210
3223
  //#endregion
3211
3224
  //#region Variables
3212
3225
  destroy$ = new Subject();
@@ -3220,12 +3233,6 @@ class DefaultTabViewComponent {
3220
3233
  this.changeDetectorRef = changeDetectorRef;
3221
3234
  this.tabViewService = tabViewService;
3222
3235
  }
3223
- ngAfterViewInit() {
3224
- if (!this.ribbonTemplate) {
3225
- // If there are no template assigned to the ribbon, we use the empty template.
3226
- this.updateRibbonTemplate();
3227
- }
3228
- }
3229
3236
  ngOnDestroy() {
3230
3237
  this.destroy$.next(true);
3231
3238
  this.destroy$.complete();
@@ -3249,26 +3256,26 @@ class DefaultTabViewComponent {
3249
3256
  //#region Public methods
3250
3257
  //#endregion
3251
3258
  //#region Private methods
3252
- updateRibbonTemplate(template = undefined) {
3253
- const isRealTemplate = !!template;
3254
- if (!template) {
3255
- template = this.emptyRibbonTemplate;
3256
- }
3259
+ updateRibbonTemplate(template) {
3257
3260
  this.ribbonTemplate = template;
3258
- if (isRealTemplate) {
3261
+ if (template) {
3259
3262
  // Real template from a child view — render immediately so buttons appear
3260
3263
  // without waiting for the next change detection cycle (user interaction).
3261
3264
  this.changeDetectorRef.detectChanges();
3262
3265
  }
3263
3266
  else {
3264
- // Empty/fallback template — defer rendering to avoid briefly flashing
3265
- // an empty ribbon during component creation (the child view will push
3266
- // the real template moments later in the same initialization cycle).
3267
+ // No template for this view — defer clearing the ribbon to avoid tearing down
3268
+ // an already rendered one for a frame while switching views (the incoming view
3269
+ // pushes its real template moments later in the same initialization cycle).
3270
+ //
3271
+ // Never assign the ribbon template from a lifecycle hook that runs after the first
3272
+ // change detection pass (e.g. ngAfterViewInit): the outlet below has already been
3273
+ // checked by then, so mutating it there trips NG0100 in dev mode.
3267
3274
  this.changeDetectorRef.markForCheck();
3268
3275
  }
3269
3276
  }
3270
3277
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: DefaultTabViewComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: TabViewService }], target: i0.ɵɵFactoryTarget.Component });
3271
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.6", type: DefaultTabViewComponent, isStandalone: true, selector: "framework-default-tab-view", providers: [{ provide: TabViewService }], viewQueries: [{ propertyName: "emptyRibbonTemplate", first: true, predicate: ["emptyRibbon"], descendants: true }], ngImport: i0, template: "<lib-ribbon>\n <ng-container *ngTemplateOutlet=\"ribbonTemplate\"></ng-container>\n\n <ng-template #emptyRibbon>\n </ng-template>\n</lib-ribbon>\n\n<router-outlet>\n</router-outlet>", styles: [":host-context{display:flex;flex-grow:1;flex-direction:column;gap:.5rem;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: RibbonComponent, selector: "lib-ribbon" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] });
3278
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.6", type: DefaultTabViewComponent, isStandalone: true, selector: "framework-default-tab-view", providers: [{ provide: TabViewService }], ngImport: i0, template: "<lib-ribbon>\n <ng-container *ngTemplateOutlet=\"ribbonTemplate ?? null\"></ng-container>\n</lib-ribbon>\n\n<router-outlet>\n</router-outlet>\n", styles: ["@charset \"UTF-8\";:host-context{display:flex;flex-grow:1;flex-direction:column;gap:.5rem;overflow:hidden}:host ::ng-deep .framework-view-list{display:flex;flex-grow:1;flex-direction:column;overflow:hidden;min-height:0}:host ::ng-deep .framework-view-list lib-data-grid{flex-grow:1}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: RibbonComponent, selector: "lib-ribbon" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }] });
3272
3279
  }
3273
3280
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: DefaultTabViewComponent, decorators: [{
3274
3281
  type: Component,
@@ -3276,11 +3283,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImpor
3276
3283
  NgTemplateOutlet,
3277
3284
  RibbonComponent,
3278
3285
  RouterModule,
3279
- ], providers: [{ provide: TabViewService }], template: "<lib-ribbon>\n <ng-container *ngTemplateOutlet=\"ribbonTemplate\"></ng-container>\n\n <ng-template #emptyRibbon>\n </ng-template>\n</lib-ribbon>\n\n<router-outlet>\n</router-outlet>", styles: [":host-context{display:flex;flex-grow:1;flex-direction:column;gap:.5rem;overflow:hidden}\n"] }]
3280
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: TabViewService }], propDecorators: { emptyRibbonTemplate: [{
3281
- type: ViewChild,
3282
- args: ['emptyRibbon']
3283
- }] } });
3286
+ ], providers: [{ provide: TabViewService }], template: "<lib-ribbon>\n <ng-container *ngTemplateOutlet=\"ribbonTemplate ?? null\"></ng-container>\n</lib-ribbon>\n\n<router-outlet>\n</router-outlet>\n", styles: ["@charset \"UTF-8\";:host-context{display:flex;flex-grow:1;flex-direction:column;gap:.5rem;overflow:hidden}:host ::ng-deep .framework-view-list{display:flex;flex-grow:1;flex-direction:column;overflow:hidden;min-height:0}:host ::ng-deep .framework-view-list lib-data-grid{flex-grow:1}\n"] }]
3287
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: TabViewService }] });
3284
3288
 
3285
3289
  function dataProviderFactory(route) {
3286
3290
  return route.snapshot.data['dataProvider']();
@@ -3372,7 +3376,7 @@ class DefaultDetailsTabViewComponent extends DefaultTabViewComponent {
3372
3376
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.1.6", type: DefaultDetailsTabViewComponent, isStandalone: true, selector: "framework-default-details-tab-view", providers: [
3373
3377
  { provide: TabViewService },
3374
3378
  { provide: DataProviderService, useFactory: dataProviderFactory, deps: [ActivatedRoute] },
3375
- ], viewQueries: [{ propertyName: "errorModal", first: true, predicate: ErrorModalComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<lib-ribbon>\n <ng-container *ngTemplateOutlet=\"ribbonTemplate\"></ng-container>\n\n <ng-template #emptyRibbon>\n </ng-template>\n\n <div right>\n <lib-ribbon-group [label]=\"'RibbonGroup-Page' | translate\">\n <framework-button-views [detailsViewRoute]=\"detailsViewRoute\">\n </framework-button-views>\n </lib-ribbon-group>\n </div>\n</lib-ribbon>\n\n<lib-group-container\n[icon]=\"containerIcon\"\n[title]=\"containerTitle\">\n <router-outlet>\n </router-outlet>\n</lib-group-container>\n\n<framework-error-modal (closed)=\"onErrorModalClosed()\"></framework-error-modal>", styles: [":host-context{display:flex;flex-grow:1;flex-direction:column;gap:.5rem;overflow:hidden}router-outlet{display:none}\n"], dependencies: [{ kind: "component", type: ButtonViewsComponent, selector: "framework-button-views", inputs: ["detailsViewRoute"] }, { kind: "component", type: ErrorModalComponent, selector: "framework-error-modal", inputs: ["errorMessage", "size", "subtitle", "title"], outputs: ["closed"] }, { kind: "component", type: GroupContainerComponent, selector: "lib-group-container", inputs: ["title", "icon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: RibbonComponent, selector: "lib-ribbon" }, { kind: "component", type: RibbonGroupComponent, selector: "lib-ribbon-group", inputs: ["label"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
3379
+ ], viewQueries: [{ propertyName: "errorModal", first: true, predicate: ErrorModalComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: "<lib-ribbon>\n <ng-container *ngTemplateOutlet=\"ribbonTemplate ?? null\"></ng-container>\n\n <div right>\n <lib-ribbon-group [label]=\"'RibbonGroup-Page' | translate\">\n <framework-button-views [detailsViewRoute]=\"detailsViewRoute\">\n </framework-button-views>\n </lib-ribbon-group>\n </div>\n</lib-ribbon>\n\n<lib-group-container\n[icon]=\"containerIcon\"\n[title]=\"containerTitle\">\n <router-outlet>\n </router-outlet>\n</lib-group-container>\n\n<framework-error-modal (closed)=\"onErrorModalClosed()\"></framework-error-modal>", styles: [":host-context{display:flex;flex-grow:1;flex-direction:column;gap:.5rem;overflow:hidden}router-outlet{display:none}\n"], dependencies: [{ kind: "component", type: ButtonViewsComponent, selector: "framework-button-views", inputs: ["detailsViewRoute"] }, { kind: "component", type: ErrorModalComponent, selector: "framework-error-modal", inputs: ["errorMessage", "size", "subtitle", "title"], outputs: ["closed"] }, { kind: "component", type: GroupContainerComponent, selector: "lib-group-container", inputs: ["title", "icon"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: RibbonComponent, selector: "lib-ribbon" }, { kind: "component", type: RibbonGroupComponent, selector: "lib-ribbon-group", inputs: ["label"] }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name", "routerOutletData"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
3376
3380
  }
3377
3381
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImport: i0, type: DefaultDetailsTabViewComponent, decorators: [{
3378
3382
  type: Component,
@@ -3388,7 +3392,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImpor
3388
3392
  ], providers: [
3389
3393
  { provide: TabViewService },
3390
3394
  { provide: DataProviderService, useFactory: dataProviderFactory, deps: [ActivatedRoute] },
3391
- ], template: "<lib-ribbon>\n <ng-container *ngTemplateOutlet=\"ribbonTemplate\"></ng-container>\n\n <ng-template #emptyRibbon>\n </ng-template>\n\n <div right>\n <lib-ribbon-group [label]=\"'RibbonGroup-Page' | translate\">\n <framework-button-views [detailsViewRoute]=\"detailsViewRoute\">\n </framework-button-views>\n </lib-ribbon-group>\n </div>\n</lib-ribbon>\n\n<lib-group-container\n[icon]=\"containerIcon\"\n[title]=\"containerTitle\">\n <router-outlet>\n </router-outlet>\n</lib-group-container>\n\n<framework-error-modal (closed)=\"onErrorModalClosed()\"></framework-error-modal>", styles: [":host-context{display:flex;flex-grow:1;flex-direction:column;gap:.5rem;overflow:hidden}router-outlet{display:none}\n"] }]
3395
+ ], template: "<lib-ribbon>\n <ng-container *ngTemplateOutlet=\"ribbonTemplate ?? null\"></ng-container>\n\n <div right>\n <lib-ribbon-group [label]=\"'RibbonGroup-Page' | translate\">\n <framework-button-views [detailsViewRoute]=\"detailsViewRoute\">\n </framework-button-views>\n </lib-ribbon-group>\n </div>\n</lib-ribbon>\n\n<lib-group-container\n[icon]=\"containerIcon\"\n[title]=\"containerTitle\">\n <router-outlet>\n </router-outlet>\n</lib-group-container>\n\n<framework-error-modal (closed)=\"onErrorModalClosed()\"></framework-error-modal>", styles: [":host-context{display:flex;flex-grow:1;flex-direction:column;gap:.5rem;overflow:hidden}router-outlet{display:none}\n"] }]
3392
3396
  }], ctorParameters: () => [], propDecorators: { errorModal: [{
3393
3397
  type: ViewChild,
3394
3398
  args: [ErrorModalComponent]