@sftech/ng-shared 0.0.20 → 0.0.23

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 (35) hide show
  1. package/fesm2022/sftech-ng-shared.mjs +141 -72
  2. package/fesm2022/sftech-ng-shared.mjs.map +1 -1
  3. package/index.d.ts +408 -31
  4. package/package.json +8 -8
  5. package/lib/components/forms/form-error-display/form-error-display.component.d.ts +0 -8
  6. package/lib/components/pages/base-display/base-display-modal/base-display-modal.component.d.ts +0 -7
  7. package/lib/components/pages/base-display/base-display.component.d.ts +0 -43
  8. package/lib/components/pages/base-list.component.d.ts +0 -32
  9. package/lib/components/paginator/paginator.component.d.ts +0 -11
  10. package/lib/core/configuration/app-config.interface.d.ts +0 -3
  11. package/lib/core/configuration/app-config.loader.d.ts +0 -2
  12. package/lib/core/dtos/api-response.dto.d.ts +0 -9
  13. package/lib/core/dtos/base-db-create.dto.d.ts +0 -2
  14. package/lib/core/dtos/base-db-response.dto.d.ts +0 -5
  15. package/lib/core/dtos/base-db-update.dto.d.ts +0 -2
  16. package/lib/core/dtos/base-response.dto.d.ts +0 -1
  17. package/lib/core/dtos/odata-response.dto.d.ts +0 -13
  18. package/lib/core/models/base-db.model.d.ts +0 -24
  19. package/lib/core/models/mapped-api-response.model.d.ts +0 -19
  20. package/lib/core/models/mapped-odata-response.model.d.ts +0 -12
  21. package/lib/core/models/odata/filter/filter.enums.d.ts +0 -16
  22. package/lib/core/models/odata/odata-expands.model.d.ts +0 -7
  23. package/lib/core/models/odata/odata-filter-collection.model.d.ts +0 -14
  24. package/lib/core/models/odata/odata-filter.model.d.ts +0 -13
  25. package/lib/core/models/odata/odata-order.model.d.ts +0 -10
  26. package/lib/core/models/odata/odata-pagination.model.d.ts +0 -10
  27. package/lib/core/models/odata/odata.interface.d.ts +0 -3
  28. package/lib/core/models/odata/odata.model.d.ts +0 -12
  29. package/lib/core/services/base-db-api.service.d.ts +0 -29
  30. package/lib/providers/icon.provider.d.ts +0 -21
  31. package/lib/ui/layouts/base-dialog/base-dialog.component.d.ts +0 -20
  32. package/lib/ui/layouts/head-main-footer-with-canvas/head-main-footer-with-canvas.component.d.ts +0 -20
  33. package/lib/ui/layouts/sidebar-navigation/sidebar-navigation.component.d.ts +0 -18
  34. package/lib/ui/pages/not-permitted/not-permitted.component.d.ts +0 -5
  35. package/lib/ui/styles/themes/sftech.preset.d.ts +0 -1
@@ -1,13 +1,13 @@
1
1
  import { definePreset } from '@primeng/themes';
2
2
  import Aura from '@primeng/themes/aura';
3
- import { NgTemplateOutlet, CommonModule } from '@angular/common';
3
+ import { NgTemplateOutlet } from '@angular/common';
4
4
  import * as i0 from '@angular/core';
5
5
  import { EventEmitter, input, Output, Component, ViewChild, ContentChild, Input, inject, model, signal, effect } from '@angular/core';
6
6
  import { FaIconComponent } from '@fortawesome/angular-fontawesome';
7
7
  import { Button } from 'primeng/button';
8
8
  import { Drawer } from 'primeng/drawer';
9
9
  import { Toast } from 'primeng/toast';
10
- import { faPlus, faHexagonNodes, faArrowLeft, faBrain, faClose, faCloud, faTrash, faDatabase, faFileArrowUp, faExchange, faQuestion, faBars, faRocket, faSearch, faShield, faHandSparkles, faUpload, faLaptop } from '@fortawesome/free-solid-svg-icons';
10
+ import { faPlus, faHexagonNodes, faArrowRight, faArrowLeft, faBolt, faBrain, faCalendarDays, faComments, faClose, faCloud, faTrash, faDatabase, faFileLines, faFileArrowUp, faExchange, faArrowUpRightFromSquare, faFilter, faSliders, faGlobe, faChevronDown, faChevronUp, faQuestion, faInbox, faCircleInfo, faLightbulb, faSpinner, faBars, faComment, faCircleExclamation, faRocket, faSearch, faShield, faHandSparkles, faTag, faScrewdriverWrench, faUpload, faLaptop } from '@fortawesome/free-solid-svg-icons';
11
11
  import { Ripple } from 'primeng/ripple';
12
12
  import { StyleClass } from 'primeng/styleclass';
13
13
  import { RouterLink, Router, ActivatedRoute } from '@angular/router';
@@ -48,20 +48,40 @@ const SfTechPreset = definePreset(Aura, {
48
48
  class IconProvider {
49
49
  static add = faPlus;
50
50
  static agent = faHexagonNodes;
51
+ static arrowRight = faArrowRight;
51
52
  static back = faArrowLeft;
53
+ static bolt = faBolt;
52
54
  static brain = faBrain;
55
+ static calendar = faCalendarDays;
56
+ static chat = faComments;
53
57
  static close = faClose;
54
58
  static cloud = faCloud;
55
59
  static delete = faTrash;
56
60
  static database = faDatabase;
61
+ static document = faFileLines;
57
62
  static documentAdd = faFileArrowUp;
58
63
  static exchange = faExchange;
64
+ static externalLink = faArrowUpRightFromSquare;
65
+ static filter = faFilter;
66
+ static filterSettings = faSliders;
67
+ static globe = faGlobe;
68
+ static chevronDown = faChevronDown;
69
+ static chevronUp = faChevronUp;
59
70
  static help = faQuestion;
71
+ static inbox = faInbox;
72
+ static info = faCircleInfo;
73
+ static lightbulb = faLightbulb;
74
+ static loading = faSpinner;
60
75
  static menu = faBars;
76
+ static message = faComment;
77
+ static notFound = faCircleExclamation;
78
+ static robot = faHexagonNodes;
61
79
  static rocket = faRocket;
62
80
  static search = faSearch;
63
81
  static shield = faShield;
64
82
  static sparkles = faHandSparkles;
83
+ static tag = faTag;
84
+ static tools = faScrewdriverWrench;
65
85
  static unknown = faQuestion;
66
86
  static upload = faUpload;
67
87
  static window = faLaptop;
@@ -69,11 +89,11 @@ class IconProvider {
69
89
 
70
90
  class SidebarNavigationComponent {
71
91
  closeDrawer = new EventEmitter();
72
- navigation = input([]);
73
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SidebarNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
74
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: SidebarNavigationComponent, isStandalone: true, selector: "sftech-sidebar-navigation", inputs: { navigation: { classPropertyName: "navigation", publicName: "navigation", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closeDrawer: "closeDrawer" }, ngImport: i0, template: "<ul class=\"list-none p-4 m-0\">\r\n @for (category of navigation(); track category) {\r\n <li>\r\n <div\r\n pRipple\r\n pStyleClass=\"@next\"\r\n enterFromClass=\"hidden\"\r\n enterActiveClass=\"animate-slidedown\"\r\n leaveToClass=\"hidden\"\r\n leaveActiveClass=\"animate-slideup\"\r\n class=\"py-2 flex items-center justify-between cursor-pointer p-ripple\"\r\n >\r\n @if (category.icon) {\r\n <fa-icon [icon]=\"category.icon\"></fa-icon>\r\n }\r\n <span class=\"font-bold\">{{ category.categoryName }}</span>\r\n </div>\r\n <ul class=\"list-none p-0 m-0 overflow-hidden\">\r\n @for (link of category.links; track link) {\r\n <li class=\"py-1\">\r\n <a [routerLink]=\"[link.routerLink]\" (click)=\"closeDrawer.emit()\" pRipple class=\"flex items-center cursor-pointer px-4 py-2.5 rounded-border hover:bg-primary-50 duration-150 transition-colors p-ripple\">\r\n @if (link.icon) {\r\n <fa-icon [icon]=\"link.icon\"></fa-icon>\r\n }\r\n <span class=\"font-medium\">{{ link.name}}</span>\r\n </a>\r\n </li>\r\n }\r\n </ul>\r\n </li>\r\n }\r\n</ul>", styles: [""], dependencies: [{ kind: "directive", type: Ripple, selector: "[pRipple]" }, { kind: "directive", type: StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
92
+ navigation = input([], ...(ngDevMode ? [{ debugName: "navigation" }] : []));
93
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: SidebarNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
94
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: SidebarNavigationComponent, isStandalone: true, selector: "sftech-sidebar-navigation", inputs: { navigation: { classPropertyName: "navigation", publicName: "navigation", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closeDrawer: "closeDrawer" }, ngImport: i0, template: "<ul class=\"list-none p-4 m-0\">\r\n @for (category of navigation(); track category) {\r\n <li>\r\n <div\r\n pRipple\r\n pStyleClass=\"@next\"\r\n enterFromClass=\"hidden\"\r\n enterActiveClass=\"animate-slidedown\"\r\n leaveToClass=\"hidden\"\r\n leaveActiveClass=\"animate-slideup\"\r\n class=\"py-2 flex items-center justify-between cursor-pointer p-ripple\"\r\n >\r\n @if (category.icon) {\r\n <fa-icon [icon]=\"category.icon\"></fa-icon>\r\n }\r\n <span class=\"font-bold\">{{ category.categoryName }}</span>\r\n </div>\r\n <ul class=\"list-none p-0 m-0 overflow-hidden\">\r\n @for (link of category.links; track link) {\r\n <li class=\"py-1\">\r\n <a [routerLink]=\"[link.routerLink]\" (click)=\"closeDrawer.emit()\" pRipple class=\"flex items-center cursor-pointer px-4 py-2.5 rounded-border hover:bg-primary-50 duration-150 transition-colors p-ripple\">\r\n @if (link.icon) {\r\n <fa-icon [icon]=\"link.icon\"></fa-icon>\r\n }\r\n <span class=\"font-medium\">{{ link.name}}</span>\r\n </a>\r\n </li>\r\n }\r\n </ul>\r\n </li>\r\n }\r\n</ul>", styles: [""], dependencies: [{ kind: "directive", type: Ripple, selector: "[pRipple]" }, { kind: "directive", type: StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape", "hideOnResize", "resizeSelector"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
75
95
  }
76
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SidebarNavigationComponent, decorators: [{
96
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: SidebarNavigationComponent, decorators: [{
77
97
  type: Component,
78
98
  args: [{ selector: 'sftech-sidebar-navigation', imports: [
79
99
  Ripple,
@@ -83,7 +103,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
83
103
  ], template: "<ul class=\"list-none p-4 m-0\">\r\n @for (category of navigation(); track category) {\r\n <li>\r\n <div\r\n pRipple\r\n pStyleClass=\"@next\"\r\n enterFromClass=\"hidden\"\r\n enterActiveClass=\"animate-slidedown\"\r\n leaveToClass=\"hidden\"\r\n leaveActiveClass=\"animate-slideup\"\r\n class=\"py-2 flex items-center justify-between cursor-pointer p-ripple\"\r\n >\r\n @if (category.icon) {\r\n <fa-icon [icon]=\"category.icon\"></fa-icon>\r\n }\r\n <span class=\"font-bold\">{{ category.categoryName }}</span>\r\n </div>\r\n <ul class=\"list-none p-0 m-0 overflow-hidden\">\r\n @for (link of category.links; track link) {\r\n <li class=\"py-1\">\r\n <a [routerLink]=\"[link.routerLink]\" (click)=\"closeDrawer.emit()\" pRipple class=\"flex items-center cursor-pointer px-4 py-2.5 rounded-border hover:bg-primary-50 duration-150 transition-colors p-ripple\">\r\n @if (link.icon) {\r\n <fa-icon [icon]=\"link.icon\"></fa-icon>\r\n }\r\n <span class=\"font-medium\">{{ link.name}}</span>\r\n </a>\r\n </li>\r\n }\r\n </ul>\r\n </li>\r\n }\r\n</ul>" }]
84
104
  }], propDecorators: { closeDrawer: [{
85
105
  type: Output
86
- }] } });
106
+ }], navigation: [{ type: i0.Input, args: [{ isSignal: true, alias: "navigation", required: false }] }] } });
87
107
 
88
108
  class HeadMainFooterWithCanvasComponent {
89
109
  title = 'demo';
@@ -99,12 +119,12 @@ class HeadMainFooterWithCanvasComponent {
99
119
  closeCallback(e) {
100
120
  this.drawerRef.close(e);
101
121
  }
102
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HeadMainFooterWithCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
103
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: HeadMainFooterWithCanvasComponent, isStandalone: true, selector: "sftech-head-main-footer-with-canvas", inputs: { title: "title", maxWidth: "maxWidth", navigationItems: "navigationItems", hasDrawer: "hasDrawer" }, queries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "main", first: true, predicate: ["main"], descendants: true }, { propertyName: "footer", first: true, predicate: ["footer"], descendants: true }], viewQueries: [{ propertyName: "drawerRef", first: true, predicate: ["drawerRef"], descendants: true }], ngImport: i0, template: "<div class=\"h-screen flex flex-col justify-between bg-gradient-to-b from-primary-50/40 via-white to-primary-50/40\">\r\n <p-toast/>\r\n <header class=\"shrink-0 p-3 bg-gradient-to-r from-primary-500 to-primary-900 text-white\">\r\n <div [style.max-width]=\"maxWidth\" class=\"w-full mx-auto\">\r\n @if (hasDrawer) {\r\n <div class=\"flex items-center w-full\">\r\n <div class=\"flex-shrink\">\r\n <p-button (click)=\"drawerVisible = !drawerVisible\">\r\n <fa-icon [icon]=\"iconProvider.menu\"></fa-icon>\r\n </p-button>\r\n </div>\r\n <div class=\"ms-2 w-full\">\r\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\r\n </div>\r\n </div>\r\n } @else {\r\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\r\n }\r\n </div>\r\n </header>\r\n\r\n <main class=\"flex-grow overflow-hidden\">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto bg-white shadow-xl h-full overflow-hidden\">\r\n <ng-container [ngTemplateOutlet]=\"main\"></ng-container>\r\n </div>\r\n </main>\r\n\r\n <footer class=\"shrink-0 p-3 bg-gradient-to-r from-primary-900 to-primary-500 text-white text-sm\">\r\n <div [style.max-width]=\"maxWidth\" class=\"w-full mx-auto\">\r\n <ng-container [ngTemplateOutlet]=\"footer\"></ng-container>\r\n </div>\r\n </footer>\r\n</div>\r\n\r\n@if (hasDrawer) {\r\n <p-drawer #drawerRef [(visible)]=\"drawerVisible\">\r\n <ng-template #headless>\r\n <div class=\"flex flex-col h-full bg-white shadow-lg\">\r\n <div class=\"flex items-center justify-between px-4 pt-5 pb-5 border-b border-gray-200\">\r\n <span class=\"font-semibold text-2xl text-primary\">Menu</span>\r\n <span>\r\n <p-button type=\"button\" (click)=\"drawerVisible = false\" rounded=\"true\" outlined=\"true\"\r\n styleClass=\"h-9 w-9\"><fa-icon [icon]=\"iconProvider.close\"></fa-icon></p-button>\r\n </span>\r\n </div>\r\n <div class=\"overflow-y-auto px-4 mt-4\">\r\n <sftech-sidebar-navigation [navigation]=\"navigationItems\" (closeDrawer)=\"drawerVisible = false\"></sftech-sidebar-navigation>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </p-drawer>\r\n}", styles: [""], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "component", type: Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "component", type: SidebarNavigationComponent, selector: "sftech-sidebar-navigation", inputs: ["navigation"], outputs: ["closeDrawer"] }] });
122
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: HeadMainFooterWithCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
123
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: HeadMainFooterWithCanvasComponent, isStandalone: true, selector: "sftech-head-main-footer-with-canvas", inputs: { title: "title", maxWidth: "maxWidth", navigationItems: "navigationItems", hasDrawer: "hasDrawer" }, queries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "main", first: true, predicate: ["main"], descendants: true }, { propertyName: "footer", first: true, predicate: ["footer"], descendants: true }], viewQueries: [{ propertyName: "drawerRef", first: true, predicate: ["drawerRef"], descendants: true }], ngImport: i0, template: "<div class=\"h-screen flex flex-col justify-between bg-gradient-to-b from-primary-50/40 via-white to-primary-50/40\">\r\n <p-toast/>\r\n <header class=\"shrink-0 p-3 bg-gradient-to-r from-primary-500 to-primary-900 text-white\">\r\n <div [style.max-width]=\"maxWidth\" class=\"w-full mx-auto\">\r\n @if (hasDrawer) {\r\n <div class=\"flex items-center w-full\">\r\n <div class=\"flex-shrink\">\r\n <p-button (click)=\"drawerVisible = !drawerVisible\">\r\n <fa-icon [icon]=\"iconProvider.menu\"></fa-icon>\r\n </p-button>\r\n </div>\r\n <div class=\"ms-2 w-full\">\r\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\r\n </div>\r\n </div>\r\n } @else {\r\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\r\n }\r\n </div>\r\n </header>\r\n\r\n <main class=\"flex-grow min-h-0 flex flex-col\">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto bg-white shadow-xl flex-grow overflow-auto w-full\">\r\n <ng-container [ngTemplateOutlet]=\"main\"></ng-container>\r\n </div>\r\n </main>\r\n\r\n <footer class=\"shrink-0 p-3 bg-gradient-to-r from-primary-900 to-primary-500 text-white text-sm\">\r\n <div [style.max-width]=\"maxWidth\" class=\"w-full mx-auto\">\r\n <ng-container [ngTemplateOutlet]=\"footer\"></ng-container>\r\n </div>\r\n </footer>\r\n</div>\r\n\r\n@if (hasDrawer) {\r\n <p-drawer #drawerRef [(visible)]=\"drawerVisible\">\r\n <ng-template #headless>\r\n <div class=\"flex flex-col h-full bg-white shadow-lg\">\r\n <div class=\"flex items-center justify-between px-4 pt-5 pb-5 border-b border-gray-200\">\r\n <span class=\"font-semibold text-2xl text-primary\">Menu</span>\r\n <span>\r\n <p-button type=\"button\" (click)=\"drawerVisible = false\" rounded=\"true\" outlined=\"true\"\r\n styleClass=\"h-9 w-9\"><fa-icon [icon]=\"iconProvider.close\"></fa-icon></p-button>\r\n </span>\r\n </div>\r\n <div class=\"overflow-y-auto px-4 mt-4\">\r\n <sftech-sidebar-navigation [navigation]=\"navigationItems\" (closeDrawer)=\"drawerVisible = false\"></sftech-sidebar-navigation>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </p-drawer>\r\n}", styles: [""], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"], outputs: ["iconChange", "titleChange", "animationChange", "maskChange", "flipChange", "sizeChange", "pullChange", "borderChange", "inverseChange", "symbolChange", "rotateChange", "fixedWidthChange", "transformChange", "a11yRoleChange"] }, { kind: "component", type: Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "component", type: SidebarNavigationComponent, selector: "sftech-sidebar-navigation", inputs: ["navigation"], outputs: ["closeDrawer"] }] });
104
124
  }
105
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HeadMainFooterWithCanvasComponent, decorators: [{
125
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: HeadMainFooterWithCanvasComponent, decorators: [{
106
126
  type: Component,
107
- args: [{ selector: 'sftech-head-main-footer-with-canvas', imports: [NgTemplateOutlet, Button, Drawer, FaIconComponent, Toast, SidebarNavigationComponent], template: "<div class=\"h-screen flex flex-col justify-between bg-gradient-to-b from-primary-50/40 via-white to-primary-50/40\">\r\n <p-toast/>\r\n <header class=\"shrink-0 p-3 bg-gradient-to-r from-primary-500 to-primary-900 text-white\">\r\n <div [style.max-width]=\"maxWidth\" class=\"w-full mx-auto\">\r\n @if (hasDrawer) {\r\n <div class=\"flex items-center w-full\">\r\n <div class=\"flex-shrink\">\r\n <p-button (click)=\"drawerVisible = !drawerVisible\">\r\n <fa-icon [icon]=\"iconProvider.menu\"></fa-icon>\r\n </p-button>\r\n </div>\r\n <div class=\"ms-2 w-full\">\r\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\r\n </div>\r\n </div>\r\n } @else {\r\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\r\n }\r\n </div>\r\n </header>\r\n\r\n <main class=\"flex-grow overflow-hidden\">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto bg-white shadow-xl h-full overflow-hidden\">\r\n <ng-container [ngTemplateOutlet]=\"main\"></ng-container>\r\n </div>\r\n </main>\r\n\r\n <footer class=\"shrink-0 p-3 bg-gradient-to-r from-primary-900 to-primary-500 text-white text-sm\">\r\n <div [style.max-width]=\"maxWidth\" class=\"w-full mx-auto\">\r\n <ng-container [ngTemplateOutlet]=\"footer\"></ng-container>\r\n </div>\r\n </footer>\r\n</div>\r\n\r\n@if (hasDrawer) {\r\n <p-drawer #drawerRef [(visible)]=\"drawerVisible\">\r\n <ng-template #headless>\r\n <div class=\"flex flex-col h-full bg-white shadow-lg\">\r\n <div class=\"flex items-center justify-between px-4 pt-5 pb-5 border-b border-gray-200\">\r\n <span class=\"font-semibold text-2xl text-primary\">Menu</span>\r\n <span>\r\n <p-button type=\"button\" (click)=\"drawerVisible = false\" rounded=\"true\" outlined=\"true\"\r\n styleClass=\"h-9 w-9\"><fa-icon [icon]=\"iconProvider.close\"></fa-icon></p-button>\r\n </span>\r\n </div>\r\n <div class=\"overflow-y-auto px-4 mt-4\">\r\n <sftech-sidebar-navigation [navigation]=\"navigationItems\" (closeDrawer)=\"drawerVisible = false\"></sftech-sidebar-navigation>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </p-drawer>\r\n}" }]
127
+ args: [{ selector: 'sftech-head-main-footer-with-canvas', imports: [NgTemplateOutlet, Button, Drawer, FaIconComponent, Toast, SidebarNavigationComponent], template: "<div class=\"h-screen flex flex-col justify-between bg-gradient-to-b from-primary-50/40 via-white to-primary-50/40\">\r\n <p-toast/>\r\n <header class=\"shrink-0 p-3 bg-gradient-to-r from-primary-500 to-primary-900 text-white\">\r\n <div [style.max-width]=\"maxWidth\" class=\"w-full mx-auto\">\r\n @if (hasDrawer) {\r\n <div class=\"flex items-center w-full\">\r\n <div class=\"flex-shrink\">\r\n <p-button (click)=\"drawerVisible = !drawerVisible\">\r\n <fa-icon [icon]=\"iconProvider.menu\"></fa-icon>\r\n </p-button>\r\n </div>\r\n <div class=\"ms-2 w-full\">\r\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\r\n </div>\r\n </div>\r\n } @else {\r\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\r\n }\r\n </div>\r\n </header>\r\n\r\n <main class=\"flex-grow min-h-0 flex flex-col\">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto bg-white shadow-xl flex-grow overflow-auto w-full\">\r\n <ng-container [ngTemplateOutlet]=\"main\"></ng-container>\r\n </div>\r\n </main>\r\n\r\n <footer class=\"shrink-0 p-3 bg-gradient-to-r from-primary-900 to-primary-500 text-white text-sm\">\r\n <div [style.max-width]=\"maxWidth\" class=\"w-full mx-auto\">\r\n <ng-container [ngTemplateOutlet]=\"footer\"></ng-container>\r\n </div>\r\n </footer>\r\n</div>\r\n\r\n@if (hasDrawer) {\r\n <p-drawer #drawerRef [(visible)]=\"drawerVisible\">\r\n <ng-template #headless>\r\n <div class=\"flex flex-col h-full bg-white shadow-lg\">\r\n <div class=\"flex items-center justify-between px-4 pt-5 pb-5 border-b border-gray-200\">\r\n <span class=\"font-semibold text-2xl text-primary\">Menu</span>\r\n <span>\r\n <p-button type=\"button\" (click)=\"drawerVisible = false\" rounded=\"true\" outlined=\"true\"\r\n styleClass=\"h-9 w-9\"><fa-icon [icon]=\"iconProvider.close\"></fa-icon></p-button>\r\n </span>\r\n </div>\r\n <div class=\"overflow-y-auto px-4 mt-4\">\r\n <sftech-sidebar-navigation [navigation]=\"navigationItems\" (closeDrawer)=\"drawerVisible = false\"></sftech-sidebar-navigation>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </p-drawer>\r\n}" }]
108
128
  }], propDecorators: { title: [{
109
129
  type: Input
110
130
  }], maxWidth: [{
@@ -128,10 +148,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
128
148
  }] } });
129
149
 
130
150
  class BaseDialogComponent {
131
- hasHeader = input(true);
132
- hasFooter = input(true);
133
- showButtons = input(true);
134
- headerText = input(undefined);
151
+ hasHeader = input(true, ...(ngDevMode ? [{ debugName: "hasHeader" }] : []));
152
+ hasFooter = input(true, ...(ngDevMode ? [{ debugName: "hasFooter" }] : []));
153
+ showButtons = input(true, ...(ngDevMode ? [{ debugName: "showButtons" }] : []));
154
+ headerText = input(undefined, ...(ngDevMode ? [{ debugName: "headerText" }] : []));
135
155
  closed = new EventEmitter();
136
156
  header = null;
137
157
  body = null;
@@ -143,13 +163,13 @@ class BaseDialogComponent {
143
163
  this.ref.close(retVal);
144
164
  this.closed.emit();
145
165
  }
146
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
147
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: BaseDialogComponent, isStandalone: true, selector: "sftech-base-dialog", inputs: { hasHeader: { classPropertyName: "hasHeader", publicName: "hasHeader", isSignal: true, isRequired: false, transformFunction: null }, hasFooter: { classPropertyName: "hasFooter", publicName: "hasFooter", isSignal: true, isRequired: false, transformFunction: null }, showButtons: { classPropertyName: "showButtons", publicName: "showButtons", isSignal: true, isRequired: false, transformFunction: null }, headerText: { classPropertyName: "headerText", publicName: "headerText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, queries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "body", first: true, predicate: ["body"], descendants: true }, { propertyName: "footer", first: true, predicate: ["footer"], descendants: true }], ngImport: i0, template: "<!--<p-dialog [(visible)]=\"visible\" [modal]=\"true\" [style]=\"{ width: '25rem' }\">-->\r\n<!-- <ng-template #header>-->\r\n<!-- <div class=\"inline-flex items-center justify-center gap-2\">-->\r\n<!-- <span class=\"font-bold whitespace-nowrap\">Amy Elsner</span>-->\r\n<!-- </div>-->\r\n<!-- </ng-template>-->\r\n<!-- <span class=\"text-surface-500 dark:text-surface-400 block mb-8\">Update your information.</span>-->\r\n<!-- <div class=\"flex items-center gap-4 mb-4\">-->\r\n<!-- <label for=\"username\" class=\"font-semibold w-24\">Username</label>-->\r\n<!-- <input pInputText id=\"username\" class=\"flex-auto\" autocomplete=\"off\" />-->\r\n<!-- </div>-->\r\n<!-- <div class=\"flex items-center gap-4 mb-2\">-->\r\n<!-- <label for=\"email\" class=\"font-semibold w-24\">Email</label>-->\r\n<!-- <input pInputText id=\"email\" class=\"flex-auto\" autocomplete=\"off\" />-->\r\n<!-- </div>-->\r\n<!-- <ng-template #footer>-->\r\n<!-- <p-button label=\"Cancel\" [text]=\"true\" severity=\"secondary\" (click)=\"visible = false\" />-->\r\n<!-- <p-button label=\"Save\" [outlined]=\"true\" severity=\"secondary\" (click)=\"visible = false\" />-->\r\n<!-- </ng-template>-->\r\n<!--</p-dialog>-->\r\n\r\n<div class=\"flex flex-col\">\r\n <div id=\"dialog-body\" class=\"flex-grow overflow-auto\">\r\n <ng-container [ngTemplateOutlet]=\"body\"></ng-container>\r\n </div>\r\n\r\n @if (hasFooter()) {\r\n <div id=\"dialog-footer\" class=\"flex justify-end mt-5\">\r\n <div id=\"footer-content\">\r\n <ng-container [ngTemplateOutlet]=\"footer\"></ng-container>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
166
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: BaseDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
167
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: BaseDialogComponent, isStandalone: true, selector: "sftech-base-dialog", inputs: { hasHeader: { classPropertyName: "hasHeader", publicName: "hasHeader", isSignal: true, isRequired: false, transformFunction: null }, hasFooter: { classPropertyName: "hasFooter", publicName: "hasFooter", isSignal: true, isRequired: false, transformFunction: null }, showButtons: { classPropertyName: "showButtons", publicName: "showButtons", isSignal: true, isRequired: false, transformFunction: null }, headerText: { classPropertyName: "headerText", publicName: "headerText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, queries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "body", first: true, predicate: ["body"], descendants: true }, { propertyName: "footer", first: true, predicate: ["footer"], descendants: true }], ngImport: i0, template: "<!--<p-dialog [(visible)]=\"visible\" [modal]=\"true\" [style]=\"{ width: '25rem' }\">-->\r\n<!-- <ng-template #header>-->\r\n<!-- <div class=\"inline-flex items-center justify-center gap-2\">-->\r\n<!-- <span class=\"font-bold whitespace-nowrap\">Amy Elsner</span>-->\r\n<!-- </div>-->\r\n<!-- </ng-template>-->\r\n<!-- <span class=\"text-surface-500 dark:text-surface-400 block mb-8\">Update your information.</span>-->\r\n<!-- <div class=\"flex items-center gap-4 mb-4\">-->\r\n<!-- <label for=\"username\" class=\"font-semibold w-24\">Username</label>-->\r\n<!-- <input pInputText id=\"username\" class=\"flex-auto\" autocomplete=\"off\" />-->\r\n<!-- </div>-->\r\n<!-- <div class=\"flex items-center gap-4 mb-2\">-->\r\n<!-- <label for=\"email\" class=\"font-semibold w-24\">Email</label>-->\r\n<!-- <input pInputText id=\"email\" class=\"flex-auto\" autocomplete=\"off\" />-->\r\n<!-- </div>-->\r\n<!-- <ng-template #footer>-->\r\n<!-- <p-button label=\"Cancel\" [text]=\"true\" severity=\"secondary\" (click)=\"visible = false\" />-->\r\n<!-- <p-button label=\"Save\" [outlined]=\"true\" severity=\"secondary\" (click)=\"visible = false\" />-->\r\n<!-- </ng-template>-->\r\n<!--</p-dialog>-->\r\n\r\n<div class=\"flex flex-col\">\r\n <div id=\"dialog-body\" class=\"flex-grow overflow-auto\">\r\n <ng-container [ngTemplateOutlet]=\"body\"></ng-container>\r\n </div>\r\n\r\n @if (hasFooter()) {\r\n <div id=\"dialog-footer\" class=\"flex justify-end mt-5\">\r\n <div id=\"footer-content\">\r\n <ng-container [ngTemplateOutlet]=\"footer\"></ng-container>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n", styles: [""], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
148
168
  }
149
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseDialogComponent, decorators: [{
169
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: BaseDialogComponent, decorators: [{
150
170
  type: Component,
151
171
  args: [{ selector: 'sftech-base-dialog', imports: [NgTemplateOutlet], template: "<!--<p-dialog [(visible)]=\"visible\" [modal]=\"true\" [style]=\"{ width: '25rem' }\">-->\r\n<!-- <ng-template #header>-->\r\n<!-- <div class=\"inline-flex items-center justify-center gap-2\">-->\r\n<!-- <span class=\"font-bold whitespace-nowrap\">Amy Elsner</span>-->\r\n<!-- </div>-->\r\n<!-- </ng-template>-->\r\n<!-- <span class=\"text-surface-500 dark:text-surface-400 block mb-8\">Update your information.</span>-->\r\n<!-- <div class=\"flex items-center gap-4 mb-4\">-->\r\n<!-- <label for=\"username\" class=\"font-semibold w-24\">Username</label>-->\r\n<!-- <input pInputText id=\"username\" class=\"flex-auto\" autocomplete=\"off\" />-->\r\n<!-- </div>-->\r\n<!-- <div class=\"flex items-center gap-4 mb-2\">-->\r\n<!-- <label for=\"email\" class=\"font-semibold w-24\">Email</label>-->\r\n<!-- <input pInputText id=\"email\" class=\"flex-auto\" autocomplete=\"off\" />-->\r\n<!-- </div>-->\r\n<!-- <ng-template #footer>-->\r\n<!-- <p-button label=\"Cancel\" [text]=\"true\" severity=\"secondary\" (click)=\"visible = false\" />-->\r\n<!-- <p-button label=\"Save\" [outlined]=\"true\" severity=\"secondary\" (click)=\"visible = false\" />-->\r\n<!-- </ng-template>-->\r\n<!--</p-dialog>-->\r\n\r\n<div class=\"flex flex-col\">\r\n <div id=\"dialog-body\" class=\"flex-grow overflow-auto\">\r\n <ng-container [ngTemplateOutlet]=\"body\"></ng-container>\r\n </div>\r\n\r\n @if (hasFooter()) {\r\n <div id=\"dialog-footer\" class=\"flex justify-end mt-5\">\r\n <div id=\"footer-content\">\r\n <ng-container [ngTemplateOutlet]=\"footer\"></ng-container>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n" }]
152
- }], ctorParameters: () => [], propDecorators: { closed: [{
172
+ }], ctorParameters: () => [], propDecorators: { hasHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasHeader", required: false }] }], hasFooter: [{ type: i0.Input, args: [{ isSignal: true, alias: "hasFooter", required: false }] }], showButtons: [{ type: i0.Input, args: [{ isSignal: true, alias: "showButtons", required: false }] }], headerText: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerText", required: false }] }], closed: [{
153
173
  type: Output
154
174
  }], header: [{
155
175
  type: ContentChild,
@@ -273,19 +293,35 @@ var FilterConcatenation;
273
293
  })(FilterConcatenation || (FilterConcatenation = {}));
274
294
  class OdataFilterCollection {
275
295
  andFilters = [];
276
- // public orFilters: OdataFilter[] = [];
296
+ /**
297
+ * Raw filter strings that are added directly to the OData query.
298
+ * Useful for complex filters that can't be expressed with OdataFilter (e.g., OR conditions).
299
+ */
300
+ rawFilters = [];
277
301
  toGetParameter() {
278
302
  let odataString = '$filter=';
279
303
  const filters = this.andFilters.filter((x) => this._isFilterValid(x));
280
- if (filters.length === 0) {
304
+ const allFilterStrings = [
305
+ ...filters.map((x) => x.toGetParameter()),
306
+ ...this.rawFilters.filter((x) => x.trim().length > 0),
307
+ ];
308
+ if (allFilterStrings.length === 0) {
281
309
  return '';
282
310
  }
283
- odataString += filters.map((x) => x.toGetParameter()).join(FilterConcatenation.AND);
311
+ odataString += allFilterStrings.join(FilterConcatenation.AND);
284
312
  return odataString;
285
313
  }
286
314
  addAnd(andFilter) {
287
315
  this.andFilters.push(andFilter);
288
316
  }
317
+ /**
318
+ * Adds a raw OData filter string.
319
+ * Use this for complex filters like OR conditions.
320
+ * Example: "((publishedAt ne null and publishedAt ge '2024-01-01') or (publishedAt eq null and createdAt ge '2024-01-01'))"
321
+ */
322
+ addRaw(rawFilter) {
323
+ this.rawFilters.push(rawFilter);
324
+ }
289
325
  remove(field) {
290
326
  const idx = this.andFilters.findIndex((f) => f.field === field);
291
327
  if (idx >= 0) {
@@ -293,7 +329,7 @@ class OdataFilterCollection {
293
329
  }
294
330
  }
295
331
  hasValidFilters() {
296
- return this.andFilters.filter((f) => this._isFilterValid(f)).length > 0;
332
+ return this.andFilters.filter((f) => this._isFilterValid(f)).length > 0 || this.rawFilters.length > 0;
297
333
  }
298
334
  _isFilterValid(filter) {
299
335
  return !(!filter.type || !filter.field || !filter.operator);
@@ -308,6 +344,12 @@ var ESortDirection;
308
344
  class ODataOrder {
309
345
  column = 'id';
310
346
  direction = ESortDirection.ASC;
347
+ static create(column, direction) {
348
+ const order = new ODataOrder();
349
+ order.column = column;
350
+ order.direction = direction;
351
+ return order;
352
+ }
311
353
  toGetParameter() {
312
354
  return `$orderby=${this.column} ${this.direction}`;
313
355
  }
@@ -363,13 +405,24 @@ class OdataFilter {
363
405
  this.operator = operator;
364
406
  this.type = type;
365
407
  }
408
+ /**
409
+ * Escapes a string value for safe use in OData queries.
410
+ * Prevents OData injection attacks by escaping single quotes.
411
+ */
412
+ escapeODataString(value) {
413
+ if (typeof value !== 'string') {
414
+ return String(value);
415
+ }
416
+ // OData escaping: single quotes are escaped by doubling them
417
+ return value.replace(/'/g, "''");
418
+ }
366
419
  toGetParameter() {
367
420
  if (!this.field || !this.operator || !this.type || !this.value) {
368
421
  return '';
369
422
  }
370
423
  switch (this.operator) {
371
424
  case EFilterOperator.CONTAINS:
372
- return `contains(${this.field},'${this.value}')`;
425
+ return `contains(${this.field},'${this.escapeODataString(String(this.value))}')`;
373
426
  default:
374
427
  return `${this.field} ${this._getODataOperator()} ${this._getTypeDependentValue()}`;
375
428
  }
@@ -391,11 +444,10 @@ class OdataFilter {
391
444
  }
392
445
  _getTypeDependentValue() {
393
446
  if (this.type === EFilterTypes.STRING) {
394
- return `'${this.value}'`;
447
+ return `'${this.escapeODataString(String(this.value))}'`;
395
448
  }
396
449
  if (this.type === EFilterTypes.TIME) {
397
450
  if (!this.value.includes(':')) {
398
- console.warn(this.value, 'not a valid time');
399
451
  return 0;
400
452
  }
401
453
  const minutesSeconds = this.value.split(':');
@@ -426,12 +478,13 @@ class OdataFilter {
426
478
  }
427
479
 
428
480
  class BaseListComponent {
429
- odata = model(new OData());
430
- showPageTitle = input(true);
431
- canEdit = input(true);
432
- openDisplayAsModal = input(true);
481
+ odata = model(new OData(), ...(ngDevMode ? [{ debugName: "odata" }] : []));
482
+ showPageTitle = input(true, ...(ngDevMode ? [{ debugName: "showPageTitle" }] : []));
483
+ canEdit = input(true, ...(ngDevMode ? [{ debugName: "canEdit" }] : []));
484
+ openDisplayAsModal = input(true, ...(ngDevMode ? [{ debugName: "openDisplayAsModal" }] : []));
433
485
  modalWidth = '40%';
434
- data = signal(undefined);
486
+ data = signal(undefined, ...(ngDevMode ? [{ debugName: "data" }] : []));
487
+ loading = signal(false, ...(ngDevMode ? [{ debugName: "loading" }] : []));
435
488
  router = inject(Router);
436
489
  modalService = inject(DialogService);
437
490
  detailModalHeaderText = 'Details';
@@ -441,16 +494,29 @@ class BaseListComponent {
441
494
  this._loadData();
442
495
  }
443
496
  updatePagination($event) {
444
- this.odata.update((odata) => {
445
- const odataNew = new OData();
446
- odataNew.pagination = $event;
447
- odataNew.filter = odata.filter;
448
- odataNew.order = odata.order;
449
- odataNew.expands = odata.expands;
450
- return odataNew;
451
- });
497
+ this.updateOdata({ pagination: $event });
452
498
  this._loadData();
453
499
  }
500
+ updateOdata(changes) {
501
+ this.odata.update((current) => {
502
+ const newOdata = new OData();
503
+ newOdata.filter = changes.filter ?? current.filter;
504
+ newOdata.order = changes.order ?? current.order;
505
+ newOdata.expands = changes.expands ?? current.expands;
506
+ if (changes.resetPaginationToFirstPage) {
507
+ const newPag = new ODataPagination();
508
+ newPag.pageSize = current.pagination.pageSize;
509
+ newPag.totalPages = current.pagination.totalPages;
510
+ newPag.totalElements = current.pagination.totalElements;
511
+ newPag.page = 1;
512
+ newOdata.pagination = newPag;
513
+ }
514
+ else {
515
+ newOdata.pagination = changes.pagination ?? current.pagination;
516
+ }
517
+ return newOdata;
518
+ });
519
+ }
454
520
  openDisplay(id) {
455
521
  if (this.openDisplayAsModal()) {
456
522
  const modalRef = this.modalService.open(this._modalComponent, {
@@ -463,7 +529,7 @@ class BaseListComponent {
463
529
  closable: true,
464
530
  width: this.modalWidth,
465
531
  });
466
- modalRef.onClose.subscribe((result) => {
532
+ modalRef?.onClose.subscribe((result) => {
467
533
  if (result) {
468
534
  this.data.update((data) => {
469
535
  const index = data?.findIndex((item) => item.id === result.id);
@@ -482,9 +548,10 @@ class BaseListComponent {
482
548
  this.router.navigate([this._route, id]);
483
549
  }
484
550
  _loadData() {
551
+ this.loading.set(true);
485
552
  this._repo.odata(this.odata()).subscribe((response) => {
553
+ this.loading.set(false);
486
554
  if (response instanceof MappedApiError) {
487
- console.error(response);
488
555
  return;
489
556
  }
490
557
  this.data.set(response.data.items);
@@ -501,13 +568,13 @@ class BaseListComponent {
501
568
  });
502
569
  });
503
570
  }
504
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
505
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.14", type: BaseListComponent, isStandalone: true, selector: "sftech-pages-base-list", inputs: { odata: { classPropertyName: "odata", publicName: "odata", isSignal: true, isRequired: false, transformFunction: null }, showPageTitle: { classPropertyName: "showPageTitle", publicName: "showPageTitle", isSignal: true, isRequired: false, transformFunction: null }, canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null }, openDisplayAsModal: { classPropertyName: "openDisplayAsModal", publicName: "openDisplayAsModal", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { odata: "odataChange" }, ngImport: i0, template: '<div></div>', isInline: true, styles: [""] });
571
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: BaseListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
572
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "20.3.9", type: BaseListComponent, isStandalone: true, selector: "sftech-pages-base-list", inputs: { odata: { classPropertyName: "odata", publicName: "odata", isSignal: true, isRequired: false, transformFunction: null }, showPageTitle: { classPropertyName: "showPageTitle", publicName: "showPageTitle", isSignal: true, isRequired: false, transformFunction: null }, canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null }, openDisplayAsModal: { classPropertyName: "openDisplayAsModal", publicName: "openDisplayAsModal", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { odata: "odataChange" }, ngImport: i0, template: '<div></div>', isInline: true, styles: [""] });
506
573
  }
507
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseListComponent, decorators: [{
574
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: BaseListComponent, decorators: [{
508
575
  type: Component,
509
576
  args: [{ selector: 'sftech-pages-base-list', standalone: true, imports: [], template: '<div></div>' }]
510
- }], ctorParameters: () => [] });
577
+ }], ctorParameters: () => [], propDecorators: { odata: [{ type: i0.Input, args: [{ isSignal: true, alias: "odata", required: false }] }, { type: i0.Output, args: ["odataChange"] }], showPageTitle: [{ type: i0.Input, args: [{ isSignal: true, alias: "showPageTitle", required: false }] }], canEdit: [{ type: i0.Input, args: [{ isSignal: true, alias: "canEdit", required: false }] }], openDisplayAsModal: [{ type: i0.Input, args: [{ isSignal: true, alias: "openDisplayAsModal", required: false }] }] } });
511
578
 
512
579
  class BaseDisplayComponent extends BaseDialogComponent {
513
580
  id;
@@ -515,8 +582,8 @@ class BaseDisplayComponent extends BaseDialogComponent {
515
582
  canEdit = true;
516
583
  redirectAfterSave = true;
517
584
  form;
518
- model = signal(undefined);
519
- isNew = signal(true);
585
+ model = signal(undefined, ...(ngDevMode ? [{ debugName: "model" }] : []));
586
+ isNew = signal(true, ...(ngDevMode ? [{ debugName: "isNew" }] : []));
520
587
  router = inject(Router);
521
588
  activatedRoute = inject(ActivatedRoute);
522
589
  toastr = inject(MessageService);
@@ -621,10 +688,10 @@ class BaseDisplayComponent extends BaseDialogComponent {
621
688
  mappedApiResponse.data = this.model();
622
689
  return of(mappedApiResponse);
623
690
  }
624
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
625
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: BaseDisplayComponent, isStandalone: true, selector: "lib-core-base-display", inputs: { id: "id", openedAsModal: "openedAsModal", canEdit: "canEdit" }, usesInheritance: true, ngImport: i0, template: '<div></div>', isInline: true, styles: [""] });
691
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: BaseDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
692
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.9", type: BaseDisplayComponent, isStandalone: true, selector: "lib-core-base-display", inputs: { id: "id", openedAsModal: "openedAsModal", canEdit: "canEdit" }, usesInheritance: true, ngImport: i0, template: '<div></div>', isInline: true, styles: [""] });
626
693
  }
627
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseDisplayComponent, decorators: [{
694
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: BaseDisplayComponent, decorators: [{
628
695
  type: Component,
629
696
  args: [{ selector: 'lib-core-base-display', standalone: true, imports: [], template: '<div></div>' }]
630
697
  }], ctorParameters: () => [], propDecorators: { id: [{
@@ -638,24 +705,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
638
705
  class BaseDisplayModalComponent {
639
706
  id;
640
707
  canEdit = true;
641
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseDisplayModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
642
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: BaseDisplayModalComponent, isStandalone: true, selector: "lib-prompt-display-modal", ngImport: i0, template: '', isInline: true, styles: [""] });
708
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: BaseDisplayModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
709
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.9", type: BaseDisplayModalComponent, isStandalone: true, selector: "lib-prompt-display-modal", ngImport: i0, template: '', isInline: true, styles: [""] });
643
710
  }
644
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseDisplayModalComponent, decorators: [{
711
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: BaseDisplayModalComponent, decorators: [{
645
712
  type: Component,
646
713
  args: [{ selector: 'lib-prompt-display-modal', standalone: true, imports: [], template: '' }]
647
714
  }] });
648
715
 
649
716
  class FormErrorDisplayComponent {
650
- control = input(undefined);
651
- label = input(undefined);
652
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FormErrorDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
653
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: FormErrorDisplayComponent, isStandalone: true, selector: "sftech-form-error-display", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (control()?.errors) {\r\n <div class=\"p-1 text-xs text-red-500\">\r\n @if (control()?.errors?.['required']) {\r\n <div>{{ label() }} ist ein Pflichtfeld.</div>\r\n }\r\n </div>\r\n}\r\n", styles: [""] });
717
+ control = input(undefined, ...(ngDevMode ? [{ debugName: "control" }] : []));
718
+ label = input(undefined, ...(ngDevMode ? [{ debugName: "label" }] : []));
719
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FormErrorDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
720
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.9", type: FormErrorDisplayComponent, isStandalone: true, selector: "sftech-form-error-display", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (control()?.errors) {\r\n <div class=\"p-1 text-xs text-red-500\">\r\n @if (control()?.errors?.['required']) {\r\n <div>{{ label() }} ist ein Pflichtfeld.</div>\r\n }\r\n </div>\r\n}\r\n", styles: [""] });
654
721
  }
655
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FormErrorDisplayComponent, decorators: [{
722
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: FormErrorDisplayComponent, decorators: [{
656
723
  type: Component,
657
724
  args: [{ selector: 'sftech-form-error-display', standalone: true, imports: [], template: "@if (control()?.errors) {\r\n <div class=\"p-1 text-xs text-red-500\">\r\n @if (control()?.errors?.['required']) {\r\n <div>{{ label() }} ist ein Pflichtfeld.</div>\r\n }\r\n </div>\r\n}\r\n" }]
658
- }] });
725
+ }], propDecorators: { control: [{ type: i0.Input, args: [{ isSignal: true, alias: "control", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }] } });
659
726
 
660
727
  class PaginatorComponent {
661
728
  pagination;
@@ -701,16 +768,18 @@ class PaginatorComponent {
701
768
  // this.odataChanged.emit(this.pagination);
702
769
  // }
703
770
  onPageChange(event) {
704
- if (event.page !== undefined) {
705
- this.pagination.page = event.page + 1;
706
- }
707
- this.pagination.pageSize = event.rows ?? 10;
708
- this.odataChanged.emit(this.pagination);
709
- }
710
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PaginatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
711
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: PaginatorComponent, isStandalone: true, selector: "sftech-paginator", inputs: { pagination: "pagination" }, outputs: { odataChanged: "odataChanged" }, ngImport: i0, template: "<!--<nav aria-label=\"Table navigation\" class=\"flex items-center flex-wrap md:flex-row justify-between p-2 bg-gradient-to-b from-secondary_accent-500 to-secondary_accent-700\">-->\r\n<!-- <div-->\r\n<!-- class=\"font-normal text-white dark:text-gray-400 md:mb-0 block w-full md:inline md:w-auto\">Ergebnis-->\r\n<!-- <span class=\"font-semibold text-primary_accent-900 dark:text-white\">{{ ((pagination.page - 1) * pagination.pageSize) + 1 }} - {{ pagination.totalPages === pagination.page ? pagination.totalElements : pagination.pageSize * pagination.page}}</span>-->\r\n<!-- von-->\r\n<!-- <span class=\"font-semibold text-primary_accent-900 dark:text-white\">{{ pagination.totalElements }}</span></div>-->\r\n<!-- <ul class=\"inline-flex -space-x-px rtl:space-x-reverse text-sm h-8\">-->\r\n<!-- @for (pageNumber of pageNumbers(); track pageNumber) {-->\r\n<!-- <li>-->\r\n<!-- <a [class.rounded-s-lg]=\"pageNumber === 1\" [class.rounded-e-lg]=\"pageNumber === pagination.totalPages\"-->\r\n<!-- (click)=\"changePage(pageNumber)\"-->\r\n<!-- class=\"flex items-center justify-center px-3 h-8 leading-tight text-gray-500 bg-white border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white\">{{ pageNumber }}</a>-->\r\n<!-- </li>-->\r\n<!-- }-->\r\n<!-- </ul>-->\r\n<!--</nav>-->\r\n\r\n\r\n\r\n\r\n<div class=\"card flex justify-center\">\r\n <p-paginator (onPageChange)=\"onPageChange($event)\" [first]=\"pagination.page - 1 \" [rows]=\"pagination.pageSize\" [totalRecords]=\"pagination.totalElements\" [rowsPerPageOptions]=\"[10, 20, 30]\" />\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: PaginatorModule }, { kind: "component", type: i1.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "appendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }] });
771
+ // Create new instance instead of mutating
772
+ const newPagination = new ODataPagination();
773
+ newPagination.totalPages = this.pagination.totalPages;
774
+ newPagination.totalElements = this.pagination.totalElements;
775
+ newPagination.page = event.page !== undefined ? event.page + 1 : this.pagination.page;
776
+ newPagination.pageSize = event.rows ?? this.pagination.pageSize;
777
+ this.odataChanged.emit(newPagination);
778
+ }
779
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: PaginatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
780
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.9", type: PaginatorComponent, isStandalone: true, selector: "sftech-paginator", inputs: { pagination: "pagination" }, outputs: { odataChanged: "odataChanged" }, ngImport: i0, template: "<!--<nav aria-label=\"Table navigation\" class=\"flex items-center flex-wrap md:flex-row justify-between p-2 bg-gradient-to-b from-secondary_accent-500 to-secondary_accent-700\">-->\r\n<!-- <div-->\r\n<!-- class=\"font-normal text-white dark:text-gray-400 md:mb-0 block w-full md:inline md:w-auto\">Ergebnis-->\r\n<!-- <span class=\"font-semibold text-primary_accent-900 dark:text-white\">{{ ((pagination.page - 1) * pagination.pageSize) + 1 }} - {{ pagination.totalPages === pagination.page ? pagination.totalElements : pagination.pageSize * pagination.page}}</span>-->\r\n<!-- von-->\r\n<!-- <span class=\"font-semibold text-primary_accent-900 dark:text-white\">{{ pagination.totalElements }}</span></div>-->\r\n<!-- <ul class=\"inline-flex -space-x-px rtl:space-x-reverse text-sm h-8\">-->\r\n<!-- @for (pageNumber of pageNumbers(); track pageNumber) {-->\r\n<!-- <li>-->\r\n<!-- <a [class.rounded-s-lg]=\"pageNumber === 1\" [class.rounded-e-lg]=\"pageNumber === pagination.totalPages\"-->\r\n<!-- (click)=\"changePage(pageNumber)\"-->\r\n<!-- class=\"flex items-center justify-center px-3 h-8 leading-tight text-gray-500 bg-white border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white\">{{ pageNumber }}</a>-->\r\n<!-- </li>-->\r\n<!-- }-->\r\n<!-- </ul>-->\r\n<!--</nav>-->\r\n\r\n\r\n\r\n\r\n<div class=\"card flex justify-center\">\r\n <p-paginator (onPageChange)=\"onPageChange($event)\" [first]=\"pagination.page - 1 \" [rows]=\"pagination.pageSize\" [totalRecords]=\"pagination.totalElements\" [rowsPerPageOptions]=\"[10, 20, 30]\" />\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: PaginatorModule }, { kind: "component", type: i1.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first", "appendTo"], outputs: ["onPageChange"] }] });
712
781
  }
713
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PaginatorComponent, decorators: [{
782
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: PaginatorComponent, decorators: [{
714
783
  type: Component,
715
784
  args: [{ selector: 'sftech-paginator', standalone: true, imports: [PaginatorModule], template: "<!--<nav aria-label=\"Table navigation\" class=\"flex items-center flex-wrap md:flex-row justify-between p-2 bg-gradient-to-b from-secondary_accent-500 to-secondary_accent-700\">-->\r\n<!-- <div-->\r\n<!-- class=\"font-normal text-white dark:text-gray-400 md:mb-0 block w-full md:inline md:w-auto\">Ergebnis-->\r\n<!-- <span class=\"font-semibold text-primary_accent-900 dark:text-white\">{{ ((pagination.page - 1) * pagination.pageSize) + 1 }} - {{ pagination.totalPages === pagination.page ? pagination.totalElements : pagination.pageSize * pagination.page}}</span>-->\r\n<!-- von-->\r\n<!-- <span class=\"font-semibold text-primary_accent-900 dark:text-white\">{{ pagination.totalElements }}</span></div>-->\r\n<!-- <ul class=\"inline-flex -space-x-px rtl:space-x-reverse text-sm h-8\">-->\r\n<!-- @for (pageNumber of pageNumbers(); track pageNumber) {-->\r\n<!-- <li>-->\r\n<!-- <a [class.rounded-s-lg]=\"pageNumber === 1\" [class.rounded-e-lg]=\"pageNumber === pagination.totalPages\"-->\r\n<!-- (click)=\"changePage(pageNumber)\"-->\r\n<!-- class=\"flex items-center justify-center px-3 h-8 leading-tight text-gray-500 bg-white border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white\">{{ pageNumber }}</a>-->\r\n<!-- </li>-->\r\n<!-- }-->\r\n<!-- </ul>-->\r\n<!--</nav>-->\r\n\r\n\r\n\r\n\r\n<div class=\"card flex justify-center\">\r\n <p-paginator (onPageChange)=\"onPageChange($event)\" [first]=\"pagination.page - 1 \" [rows]=\"pagination.pageSize\" [totalRecords]=\"pagination.totalElements\" [rowsPerPageOptions]=\"[10, 20, 30]\" />\r\n</div>" }]
716
785
  }], propDecorators: { pagination: [{
@@ -810,12 +879,12 @@ class BaseDbApiService {
810
879
  }
811
880
 
812
881
  class NotPermittedComponent {
813
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NotPermittedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
814
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: NotPermittedComponent, isStandalone: true, selector: "sftech-not-permitted", ngImport: i0, template: "<div class=\"min-h-screen flex flex-col items-center justify-center bg-gray-100\">\n <div class=\"bg-white shadow-md rounded-lg p-6 max-w-lg text-center border border-gray-200\">\n <h1 class=\"text-3xl font-semibold text-red-600 mb-4\">Zugriff verweigert</h1>\n <p class=\"text-lg text-gray-700 mb-6\">\n Du bist nicht berechtigt, auf diese Seite zuzugreifen.\n Bitte \u00FCberpr\u00FCfe deine Berechtigungen oder wende dich an den Administrator.\n </p>\n <a\n class=\"inline-block bg-blue-600 text-white font-medium px-6 py-2 rounded-md hover:bg-blue-700 transition\"\n href=\"/apps/frontend/public\"\n >\n Zur Startseite\n </a>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }] });
882
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NotPermittedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
883
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.9", type: NotPermittedComponent, isStandalone: true, selector: "sftech-not-permitted", ngImport: i0, template: "<div class=\"min-h-screen flex flex-col items-center justify-center bg-gray-100\">\n <div class=\"bg-white shadow-md rounded-lg p-6 max-w-lg text-center border border-gray-200\">\n <h1 class=\"text-3xl font-semibold text-red-600 mb-4\">Zugriff verweigert</h1>\n <p class=\"text-lg text-gray-700 mb-6\">\n Du bist nicht berechtigt, auf diese Seite zuzugreifen.\n Bitte \u00FCberpr\u00FCfe deine Berechtigungen oder wende dich an den Administrator.\n </p>\n <a\n class=\"inline-block bg-blue-600 text-white font-medium px-6 py-2 rounded-md hover:bg-blue-700 transition\"\n href=\"/apps/frontend/public\"\n >\n Zur Startseite\n </a>\n </div>\n</div>\n", styles: [""] });
815
884
  }
816
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: NotPermittedComponent, decorators: [{
885
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.9", ngImport: i0, type: NotPermittedComponent, decorators: [{
817
886
  type: Component,
818
- args: [{ selector: 'sftech-not-permitted', imports: [CommonModule], template: "<div class=\"min-h-screen flex flex-col items-center justify-center bg-gray-100\">\n <div class=\"bg-white shadow-md rounded-lg p-6 max-w-lg text-center border border-gray-200\">\n <h1 class=\"text-3xl font-semibold text-red-600 mb-4\">Zugriff verweigert</h1>\n <p class=\"text-lg text-gray-700 mb-6\">\n Du bist nicht berechtigt, auf diese Seite zuzugreifen.\n Bitte \u00FCberpr\u00FCfe deine Berechtigungen oder wende dich an den Administrator.\n </p>\n <a\n class=\"inline-block bg-blue-600 text-white font-medium px-6 py-2 rounded-md hover:bg-blue-700 transition\"\n href=\"/apps/frontend/public\"\n >\n Zur Startseite\n </a>\n </div>\n</div>\n" }]
887
+ args: [{ selector: 'sftech-not-permitted', imports: [], template: "<div class=\"min-h-screen flex flex-col items-center justify-center bg-gray-100\">\n <div class=\"bg-white shadow-md rounded-lg p-6 max-w-lg text-center border border-gray-200\">\n <h1 class=\"text-3xl font-semibold text-red-600 mb-4\">Zugriff verweigert</h1>\n <p class=\"text-lg text-gray-700 mb-6\">\n Du bist nicht berechtigt, auf diese Seite zuzugreifen.\n Bitte \u00FCberpr\u00FCfe deine Berechtigungen oder wende dich an den Administrator.\n </p>\n <a\n class=\"inline-block bg-blue-600 text-white font-medium px-6 py-2 rounded-md hover:bg-blue-700 transition\"\n href=\"/apps/frontend/public\"\n >\n Zur Startseite\n </a>\n </div>\n</div>\n" }]
819
888
  }] });
820
889
 
821
890
  /**