@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.
- package/fesm2022/sftech-ng-shared.mjs +141 -72
- package/fesm2022/sftech-ng-shared.mjs.map +1 -1
- package/index.d.ts +408 -31
- package/package.json +8 -8
- package/lib/components/forms/form-error-display/form-error-display.component.d.ts +0 -8
- package/lib/components/pages/base-display/base-display-modal/base-display-modal.component.d.ts +0 -7
- package/lib/components/pages/base-display/base-display.component.d.ts +0 -43
- package/lib/components/pages/base-list.component.d.ts +0 -32
- package/lib/components/paginator/paginator.component.d.ts +0 -11
- package/lib/core/configuration/app-config.interface.d.ts +0 -3
- package/lib/core/configuration/app-config.loader.d.ts +0 -2
- package/lib/core/dtos/api-response.dto.d.ts +0 -9
- package/lib/core/dtos/base-db-create.dto.d.ts +0 -2
- package/lib/core/dtos/base-db-response.dto.d.ts +0 -5
- package/lib/core/dtos/base-db-update.dto.d.ts +0 -2
- package/lib/core/dtos/base-response.dto.d.ts +0 -1
- package/lib/core/dtos/odata-response.dto.d.ts +0 -13
- package/lib/core/models/base-db.model.d.ts +0 -24
- package/lib/core/models/mapped-api-response.model.d.ts +0 -19
- package/lib/core/models/mapped-odata-response.model.d.ts +0 -12
- package/lib/core/models/odata/filter/filter.enums.d.ts +0 -16
- package/lib/core/models/odata/odata-expands.model.d.ts +0 -7
- package/lib/core/models/odata/odata-filter-collection.model.d.ts +0 -14
- package/lib/core/models/odata/odata-filter.model.d.ts +0 -13
- package/lib/core/models/odata/odata-order.model.d.ts +0 -10
- package/lib/core/models/odata/odata-pagination.model.d.ts +0 -10
- package/lib/core/models/odata/odata.interface.d.ts +0 -3
- package/lib/core/models/odata/odata.model.d.ts +0 -12
- package/lib/core/services/base-db-api.service.d.ts +0 -29
- package/lib/providers/icon.provider.d.ts +0 -21
- package/lib/ui/layouts/base-dialog/base-dialog.component.d.ts +0 -20
- package/lib/ui/layouts/head-main-footer-with-canvas/head-main-footer-with-canvas.component.d.ts +0 -20
- package/lib/ui/layouts/sidebar-navigation/sidebar-navigation.component.d.ts +0 -18
- package/lib/ui/pages/not-permitted/not-permitted.component.d.ts +0 -5
- 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
|
|
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: "
|
|
74
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
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: "
|
|
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: "
|
|
103
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
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: "
|
|
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
|
|
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: "
|
|
147
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
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: "
|
|
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
|
-
|
|
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
|
-
|
|
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 +=
|
|
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.
|
|
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
|
|
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: "
|
|
505
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "
|
|
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: "
|
|
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: "
|
|
625
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
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: "
|
|
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: "
|
|
642
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
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: "
|
|
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: "
|
|
653
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
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: "
|
|
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
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
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: "
|
|
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: "
|
|
814
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
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: "
|
|
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: [
|
|
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
|
/**
|