@sftech/ng-shared 0.0.7 → 0.0.9
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 +48 -46
- package/fesm2022/sftech-ng-shared.mjs.map +1 -1
- package/lib/components/pages/base-display/base-display.component.d.ts +8 -7
- package/lib/components/pages/base-list.component.d.ts +5 -5
- package/lib/core/models/mapped-api-response.model.d.ts +1 -1
- package/lib/providers/icon.provider.d.ts +1 -0
- package/package.json +1 -1
|
@@ -7,13 +7,13 @@ 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 { faClose, faTrash, faBars } from '@fortawesome/free-solid-svg-icons';
|
|
10
|
+
import { faPlus, faClose, faTrash, faBars } 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';
|
|
14
14
|
import { DialogService, DynamicDialogRef } from 'primeng/dynamicdialog';
|
|
15
15
|
import { MessageService } from 'primeng/api';
|
|
16
|
-
import {
|
|
16
|
+
import { map, of, catchError } from 'rxjs';
|
|
17
17
|
import * as i1 from 'primeng/paginator';
|
|
18
18
|
import { PaginatorModule } from 'primeng/paginator';
|
|
19
19
|
|
|
@@ -36,6 +36,7 @@ const SfTechPreset = definePreset(Aura, {
|
|
|
36
36
|
|
|
37
37
|
// biome-ignore lint/complexity/noStaticOnlyClass: <explanation>
|
|
38
38
|
class IconProvider {
|
|
39
|
+
static add = faPlus;
|
|
39
40
|
static close = faClose;
|
|
40
41
|
static delete = faTrash;
|
|
41
42
|
static menu = faBars;
|
|
@@ -44,10 +45,10 @@ class IconProvider {
|
|
|
44
45
|
class SidebarNavigationComponent {
|
|
45
46
|
closeDrawer = new EventEmitter();
|
|
46
47
|
navigation = input([]);
|
|
47
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
48
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.
|
|
48
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: SidebarNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
49
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.11", 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"] }] });
|
|
49
50
|
}
|
|
50
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
51
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: SidebarNavigationComponent, decorators: [{
|
|
51
52
|
type: Component,
|
|
52
53
|
args: [{ selector: 'sftech-sidebar-navigation', imports: [
|
|
53
54
|
Ripple,
|
|
@@ -73,12 +74,12 @@ class HeadMainFooterWithCanvasComponent {
|
|
|
73
74
|
closeCallback(e) {
|
|
74
75
|
this.drawerRef.close(e);
|
|
75
76
|
}
|
|
76
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
77
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.
|
|
77
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: HeadMainFooterWithCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
78
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.11", 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\">\r\n <p-toast/>\r\n <header class=\"p-2 bg-primary-600\">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto\">\r\n @if (hasDrawer) {\r\n <div class=\"flex items-center\">\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\">\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=\"p-2 flex-grow overflow-auto\">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto\">\r\n <ng-container [ngTemplateOutlet]=\"main\"></ng-container>\r\n </div>\r\n </main>\r\n\r\n <footer class=\"p-2 bg-primary-600\">\r\n <div [style.max-width]=\"maxWidth\" class=\"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\">\r\n <div class=\"flex items-center justify-between px-2 pt-4 shrink-0\">\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-2 mt-6\">\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"] }] });
|
|
78
79
|
}
|
|
79
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
80
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: HeadMainFooterWithCanvasComponent, decorators: [{
|
|
80
81
|
type: Component,
|
|
81
|
-
args: [{ selector: 'sftech-head-main-footer-with-canvas', imports: [NgTemplateOutlet, Button, Drawer, FaIconComponent, Toast, SidebarNavigationComponent], template: "<div class=\"
|
|
82
|
+
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\">\r\n <p-toast/>\r\n <header class=\"p-2 bg-primary-600\">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto\">\r\n @if (hasDrawer) {\r\n <div class=\"flex items-center\">\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\">\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=\"p-2 flex-grow overflow-auto\">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto\">\r\n <ng-container [ngTemplateOutlet]=\"main\"></ng-container>\r\n </div>\r\n </main>\r\n\r\n <footer class=\"p-2 bg-primary-600\">\r\n <div [style.max-width]=\"maxWidth\" class=\"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\">\r\n <div class=\"flex items-center justify-between px-2 pt-4 shrink-0\">\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-2 mt-6\">\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}" }]
|
|
82
83
|
}], propDecorators: { title: [{
|
|
83
84
|
type: Input
|
|
84
85
|
}], maxWidth: [{
|
|
@@ -115,10 +116,10 @@ class BaseDialogComponent {
|
|
|
115
116
|
close() {
|
|
116
117
|
this.closed.emit();
|
|
117
118
|
}
|
|
118
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
119
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.
|
|
119
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: BaseDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
120
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.11", 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@if (hasHeader()) {\r\n <div id=\"dialog-header\" class=\"flex justify-between mb-5\">\r\n <div class=\"header-content\">\r\n @if (headerText()) {\r\n <h1>{{ headerText() }}</h1>\r\n } @else {\r\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\r\n }\r\n </div>\r\n <div class=\"header-actions\">\r\n <p-button (onClick)=\"close()\">\r\n <fa-icon [icon]=\"iconProvider.close\"></fa-icon>\r\n </p-button>\r\n </div>\r\n </div>\r\n}\r\n<div id=\"dialog-body\">\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}", styles: [""], dependencies: [{ 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: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }] });
|
|
120
121
|
}
|
|
121
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
122
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: BaseDialogComponent, decorators: [{
|
|
122
123
|
type: Component,
|
|
123
124
|
args: [{ selector: 'sftech-base-dialog', imports: [Button, NgTemplateOutlet, FaIconComponent], 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@if (hasHeader()) {\r\n <div id=\"dialog-header\" class=\"flex justify-between mb-5\">\r\n <div class=\"header-content\">\r\n @if (headerText()) {\r\n <h1>{{ headerText() }}</h1>\r\n } @else {\r\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\r\n }\r\n </div>\r\n <div class=\"header-actions\">\r\n <p-button (onClick)=\"close()\">\r\n <fa-icon [icon]=\"iconProvider.close\"></fa-icon>\r\n </p-button>\r\n </div>\r\n </div>\r\n}\r\n<div id=\"dialog-body\">\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}" }]
|
|
124
125
|
}], ctorParameters: () => [], propDecorators: { closed: [{
|
|
@@ -421,9 +422,6 @@ class BaseListComponent {
|
|
|
421
422
|
this._loadData();
|
|
422
423
|
}
|
|
423
424
|
openDisplay(id) {
|
|
424
|
-
if (id === undefined) {
|
|
425
|
-
return;
|
|
426
|
-
}
|
|
427
425
|
if (this.openDisplayAsModal()) {
|
|
428
426
|
const modalRef = this.modalService.open(this._modalComponent, { inputValues: { id, canEdit: this.canEdit(), openedAsModal: true }, focusOnShow: false, modal: true, dismissableMask: true, width: '70%', contentStyle: { overflow: 'auto' } });
|
|
429
427
|
modalRef.onClose.subscribe((result) => {
|
|
@@ -433,6 +431,9 @@ class BaseListComponent {
|
|
|
433
431
|
if (index !== undefined && index >= 0) {
|
|
434
432
|
data[index] = result.data;
|
|
435
433
|
}
|
|
434
|
+
else {
|
|
435
|
+
data.push(result.data);
|
|
436
|
+
}
|
|
436
437
|
return data;
|
|
437
438
|
});
|
|
438
439
|
}
|
|
@@ -461,10 +462,10 @@ class BaseListComponent {
|
|
|
461
462
|
});
|
|
462
463
|
});
|
|
463
464
|
}
|
|
464
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
465
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.
|
|
465
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: BaseListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
466
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.11", 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: [""] });
|
|
466
467
|
}
|
|
467
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
468
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: BaseListComponent, decorators: [{
|
|
468
469
|
type: Component,
|
|
469
470
|
args: [{ selector: 'sftech-pages-base-list', standalone: true, imports: [], template: '<div></div>' }]
|
|
470
471
|
}], ctorParameters: () => [] });
|
|
@@ -476,7 +477,8 @@ class BaseDisplayComponent {
|
|
|
476
477
|
redirectAfterSave = true;
|
|
477
478
|
ref = inject(DynamicDialogRef);
|
|
478
479
|
form;
|
|
479
|
-
model = signal(
|
|
480
|
+
model = signal(undefined);
|
|
481
|
+
isNew = signal(true);
|
|
480
482
|
iconProvider = IconProvider;
|
|
481
483
|
router = inject(Router);
|
|
482
484
|
activatedRoute = inject(ActivatedRoute);
|
|
@@ -494,28 +496,28 @@ class BaseDisplayComponent {
|
|
|
494
496
|
});
|
|
495
497
|
}
|
|
496
498
|
ngOnInit() {
|
|
497
|
-
let obs;
|
|
498
499
|
if (this.id) {
|
|
499
|
-
|
|
500
|
+
this._loadData(this.id).subscribe((res) => {
|
|
501
|
+
if (res instanceof MappedApiError) {
|
|
502
|
+
this.toastr.add({ severity: 'error', detail: 'Beim Laden der Daten ist ein Fehler aufgetreten' });
|
|
503
|
+
throw new Error(res.messages ? res.messages.join(' | ') : 'Beim Laden der Daten ist ein Fehler aufgetreten');
|
|
504
|
+
}
|
|
505
|
+
this.model.set(res.data);
|
|
506
|
+
this.isNew.set(false);
|
|
507
|
+
if (this.form) {
|
|
508
|
+
this.form.patchValue(this.model());
|
|
509
|
+
this.form.markAsUntouched();
|
|
510
|
+
}
|
|
511
|
+
});
|
|
500
512
|
}
|
|
501
513
|
else {
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
this.id = id;
|
|
505
|
-
return this._loadData(id);
|
|
506
|
-
}));
|
|
507
|
-
}
|
|
508
|
-
obs.subscribe((res) => {
|
|
509
|
-
if (res instanceof MappedApiError) {
|
|
510
|
-
this.toastr.add({ severity: 'error', detail: 'Beim Laden der Daten ist ein Fehler aufgetreten' });
|
|
511
|
-
throw new Error(res.messages ? res.messages.join(' | ') : 'Beim Laden der Daten ist ein Fehler aufgetreten');
|
|
512
|
-
}
|
|
513
|
-
this.model.set(res.data);
|
|
514
|
+
this.model.set(this.getNewModel());
|
|
515
|
+
this.isNew.set(true);
|
|
514
516
|
if (this.form) {
|
|
515
517
|
this.form.patchValue(this.model());
|
|
516
518
|
this.form.markAsUntouched();
|
|
517
519
|
}
|
|
518
|
-
}
|
|
520
|
+
}
|
|
519
521
|
}
|
|
520
522
|
async submitForm() {
|
|
521
523
|
let obs;
|
|
@@ -584,10 +586,10 @@ class BaseDisplayComponent {
|
|
|
584
586
|
close(retVal = { operation: 'aborted' }) {
|
|
585
587
|
this.ref.close(retVal);
|
|
586
588
|
}
|
|
587
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
588
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
589
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: BaseDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
590
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.11", type: BaseDisplayComponent, isStandalone: true, selector: "lib-core-base-display", inputs: { id: "id", openedAsModal: "openedAsModal", canEdit: "canEdit" }, ngImport: i0, template: '<div></div>', isInline: true, styles: [""] });
|
|
589
591
|
}
|
|
590
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
592
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: BaseDisplayComponent, decorators: [{
|
|
591
593
|
type: Component,
|
|
592
594
|
args: [{ selector: 'lib-core-base-display', standalone: true, imports: [], template: '<div></div>' }]
|
|
593
595
|
}], ctorParameters: () => [], propDecorators: { id: [{
|
|
@@ -601,10 +603,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.9", ngImpor
|
|
|
601
603
|
class BaseDisplayModalComponent {
|
|
602
604
|
id;
|
|
603
605
|
canEdit = true;
|
|
604
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
605
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
606
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: BaseDisplayModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
607
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.11", type: BaseDisplayModalComponent, isStandalone: true, selector: "lib-prompt-display-modal", ngImport: i0, template: '', isInline: true, styles: [""] });
|
|
606
608
|
}
|
|
607
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
609
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: BaseDisplayModalComponent, decorators: [{
|
|
608
610
|
type: Component,
|
|
609
611
|
args: [{ selector: 'lib-prompt-display-modal', standalone: true, imports: [], template: '' }]
|
|
610
612
|
}] });
|
|
@@ -612,10 +614,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.9", ngImpor
|
|
|
612
614
|
class FormErrorDisplayComponent {
|
|
613
615
|
control = input(undefined);
|
|
614
616
|
label = input(undefined);
|
|
615
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
616
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.
|
|
617
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: FormErrorDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
618
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.11", 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: [""] });
|
|
617
619
|
}
|
|
618
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
620
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: FormErrorDisplayComponent, decorators: [{
|
|
619
621
|
type: Component,
|
|
620
622
|
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" }]
|
|
621
623
|
}] });
|
|
@@ -670,10 +672,10 @@ class PaginatorComponent {
|
|
|
670
672
|
this.pagination.pageSize = event.rows ?? 10;
|
|
671
673
|
this.odataChanged.emit(this.pagination);
|
|
672
674
|
}
|
|
673
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
674
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
675
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: PaginatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
676
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.11", 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"] }] });
|
|
675
677
|
}
|
|
676
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
678
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImport: i0, type: PaginatorComponent, decorators: [{
|
|
677
679
|
type: Component,
|
|
678
680
|
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>" }]
|
|
679
681
|
}], propDecorators: { pagination: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sftech-ng-shared.mjs","sources":["../../../../libs/ng-shared/src/lib/ui/styles/themes/sftech.preset.ts","../../../../libs/ng-shared/src/lib/providers/icon.provider.ts","../../../../libs/ng-shared/src/lib/ui/layouts/sidebar-navigation/sidebar-navigation.component.ts","../../../../libs/ng-shared/src/lib/ui/layouts/sidebar-navigation/sidebar-navigation.component.html","../../../../libs/ng-shared/src/lib/ui/layouts/head-main-footer-with-canvas/head-main-footer-with-canvas.component.ts","../../../../libs/ng-shared/src/lib/ui/layouts/head-main-footer-with-canvas/head-main-footer-with-canvas.component.html","../../../../libs/ng-shared/src/lib/ui/layouts/base-dialog/base-dialog.component.ts","../../../../libs/ng-shared/src/lib/ui/layouts/base-dialog/base-dialog.component.html","../../../../libs/ng-shared/src/lib/core/configuration/app-config.loader.ts","../../../../libs/ng-shared/src/lib/core/models/base-db.model.ts","../../../../libs/ng-shared/src/lib/core/models/mapped-api-response.model.ts","../../../../libs/ng-shared/src/lib/core/models/odata/odata-pagination.model.ts","../../../../libs/ng-shared/src/lib/core/models/mapped-odata-response.model.ts","../../../../libs/ng-shared/src/lib/core/models/odata/odata-expands.model.ts","../../../../libs/ng-shared/src/lib/core/models/odata/odata-filter-collection.model.ts","../../../../libs/ng-shared/src/lib/core/models/odata/odata-order.model.ts","../../../../libs/ng-shared/src/lib/core/models/odata/odata.model.ts","../../../../libs/ng-shared/src/lib/core/models/odata/filter/filter.enums.ts","../../../../libs/ng-shared/src/lib/core/models/odata/odata-filter.model.ts","../../../../libs/ng-shared/src/lib/components/pages/base-list.component.ts","../../../../libs/ng-shared/src/lib/components/pages/base-display/base-display.component.ts","../../../../libs/ng-shared/src/lib/components/pages/base-display/base-display-modal/base-display-modal.component.ts","../../../../libs/ng-shared/src/lib/components/forms/form-error-display/form-error-display.component.ts","../../../../libs/ng-shared/src/lib/components/forms/form-error-display/form-error-display.component.html","../../../../libs/ng-shared/src/lib/components/paginator/paginator.component.ts","../../../../libs/ng-shared/src/lib/components/paginator/paginator.component.html","../../../../libs/ng-shared/src/lib/core/services/base-db-api.service.ts","../../../../libs/ng-shared/src/sftech-ng-shared.ts"],"sourcesContent":["import { definePreset } from '@primeng/themes';\r\nimport Aura from '@primeng/themes/aura';\r\n\r\nexport const SfTechPreset = definePreset(Aura, {\r\n semantic: {\r\n primary: {\r\n 50: '#9ddcf5',\r\n 100: '#8bd5f2',\r\n 200: '#6bc8ef',\r\n 300: '#4abbe8',\r\n 400: '#2aa8e0',\r\n 500: '#0093d8',\r\n 600: '#0081c3',\r\n 700: '#0071a8',\r\n 800: '#00618c',\r\n 900: '#005272',\r\n },\r\n }\r\n});\r\n","import { faBars, faBurger, faClose, faTrash } from '@fortawesome/free-solid-svg-icons';\r\n\r\n// biome-ignore lint/complexity/noStaticOnlyClass: <explanation>\r\nexport class IconProvider {\r\n public static readonly close = faClose;\r\n public static readonly delete = faTrash;\r\n public static readonly menu = faBars;\r\n}\r\n","import {Component, EventEmitter, input, model, Output} from '@angular/core';\r\nimport {Ripple} from \"primeng/ripple\";\r\nimport {StyleClass} from \"primeng/styleclass\";\r\nimport {FaIconComponent} from \"@fortawesome/angular-fontawesome\";\r\nimport {RouterLink} from \"@angular/router\";\r\n\r\n@Component({\r\n selector: 'sftech-sidebar-navigation',\r\n imports: [\r\n Ripple,\r\n StyleClass,\r\n FaIconComponent,\r\n RouterLink\r\n ],\r\n templateUrl: './sidebar-navigation.component.html',\r\n styleUrl: './sidebar-navigation.component.css'\r\n})\r\nexport class SidebarNavigationComponent {\r\n @Output() closeDrawer = new EventEmitter<void>();\r\n public navigation = input<ISidebarNavigationCategory[]>([])\r\n}\r\n\r\nexport interface ISidebarNavigationCategory {\r\n categoryName: string,\r\n icon?: string,\r\n links: ISidebarNavigationLink[]\r\n}\r\n\r\nexport interface ISidebarNavigationLink {\r\n name: string,\r\n icon?: string,\r\n routerLink: string,\r\n}\r\n","<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>","import { NgTemplateOutlet } from '@angular/common';\r\nimport {Component, ContentChild, Input, model, TemplateRef, ViewChild} from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { Button } from 'primeng/button';\r\nimport { Drawer } from 'primeng/drawer';\r\nimport { Toast } from 'primeng/toast';\r\nimport { IconProvider } from '../../../providers/icon.provider';\r\nimport {\r\n ISidebarNavigationCategory,\r\n SidebarNavigationComponent\r\n} from \"../sidebar-navigation/sidebar-navigation.component\";\r\n\r\n@Component({\r\n selector: 'sftech-head-main-footer-with-canvas',\r\n imports: [NgTemplateOutlet, Button, Drawer, FaIconComponent, Toast, SidebarNavigationComponent],\r\n templateUrl: './head-main-footer-with-canvas.component.html',\r\n styleUrl: './head-main-footer-with-canvas.component.css',\r\n})\r\nexport class HeadMainFooterWithCanvasComponent {\r\n @Input() title = 'demo';\r\n @Input() maxWidth = '100%';\r\n @Input() navigationItems: ISidebarNavigationCategory[] = [];\r\n @Input() hasDrawer = true;\r\n protected drawerVisible = false;\r\n @ContentChild('header') public header: TemplateRef<unknown> | null = null;\r\n @ContentChild('main') public main: TemplateRef<unknown> | null = null;\r\n @ContentChild('footer') public footer: TemplateRef<unknown> | null = null;\r\n\r\n @ViewChild('drawerRef') drawerRef!: Drawer;\r\n\r\n protected iconProvider = IconProvider;\r\n\r\n closeCallback(e: Event): void {\r\n this.drawerRef.close(e);\r\n }\r\n}\r\n","<div class=\"min-h-screen flex flex-col justify-between\">\r\n <p-toast/>\r\n <header class=\"p-2 bg-primary-600\">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto\">\r\n @if (hasDrawer) {\r\n <div class=\"flex items-center\">\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\">\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=\"p-2 h-full flex-grow\">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto\">\r\n <ng-container [ngTemplateOutlet]=\"main\"></ng-container>\r\n </div>\r\n </main>\r\n\r\n <footer class=\"p-2 bg-primary-600\">\r\n <div [style.max-width]=\"maxWidth\" class=\"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\">\r\n <div class=\"flex items-center justify-between px-2 pt-4 shrink-0\">\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-2 mt-6\">\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}","import { NgTemplateOutlet } from '@angular/common';\r\nimport { Component, ContentChild, EventEmitter, Output, TemplateRef, input } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { Button } from 'primeng/button';\r\nimport {IconProvider} from \"../../../providers/icon.provider\";\r\n\r\n@Component({\r\n selector: 'sftech-base-dialog',\r\n imports: [Button, NgTemplateOutlet, FaIconComponent],\r\n templateUrl: './base-dialog.component.html',\r\n styleUrl: './base-dialog.component.css',\r\n})\r\nexport class BaseDialogComponent {\r\n public hasHeader = input<boolean>(true);\r\n public hasFooter = input<boolean>(true);\r\n public showButtons = input<boolean>(true);\r\n public headerText = input<string | undefined>(undefined);\r\n\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n @ContentChild('header') public header: TemplateRef<unknown> | null = null;\r\n @ContentChild('body') public body: TemplateRef<unknown> | null = null;\r\n @ContentChild('footer') public footer: TemplateRef<unknown> | null = null;\r\n\r\n public iconProvider = IconProvider;\r\n\r\n constructor() {}\r\n\r\n public close(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","<!--<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@if (hasHeader()) {\r\n <div id=\"dialog-header\" class=\"flex justify-between mb-5\">\r\n <div class=\"header-content\">\r\n @if (headerText()) {\r\n <h1>{{ headerText() }}</h1>\r\n } @else {\r\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\r\n }\r\n </div>\r\n <div class=\"header-actions\">\r\n <p-button (onClick)=\"close()\">\r\n <fa-icon [icon]=\"iconProvider.close\"></fa-icon>\r\n </p-button>\r\n </div>\r\n </div>\r\n}\r\n<div id=\"dialog-body\">\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}","import {IAppConfig} from \"./app-config.interface\";\r\n\r\nexport async function loadConfig<TConfig extends IAppConfig>(configPath: string): Promise<TConfig> {\r\n return fetch(configPath)\r\n .then((res) => {\r\n if (!res.ok) throw new Error('Config load failed');\r\n return res.json();\r\n });\r\n}","import { IBaseDbResponseDto } from '../dtos/base-db-response.dto';\r\nimport { EFilterTypes } from './odata/filter/filter.enums';\r\n\r\nexport interface IBaseDbModel {\r\n id?: number;\r\n createdAt?: Date;\r\n\r\n propertiesToShow?: string[];\r\n propertyUINames?: Map<string, string>;\r\n\r\n getFilterTypeForProperty(propertyName: string): EFilterTypes | undefined;\r\n getUiNameForProperty(propertyName: string): string;\r\n}\r\n\r\nexport class BaseDbModel implements IBaseDbModel {\r\n public id?: number;\r\n public createdAt?: Date;\r\n\r\n public propertiesToShow: string[] = [];\r\n\r\n public propertyFilterType = new Map<string, EFilterTypes>();\r\n\r\n public propertyUINames = new Map<string, string>();\r\n\r\n public getUiNameForProperty(propertyName: string): string {\r\n return this.propertyUINames.get(propertyName) || propertyName;\r\n }\r\n public getFilterTypeForProperty(propertyName: string): EFilterTypes | undefined {\r\n return this.propertyFilterType.get(propertyName);\r\n }\r\n\r\n public getPropertyValue(propertyName: string): unknown {\r\n return this[propertyName as keyof this];\r\n }\r\n\r\n public static fromDto(dto: IBaseDbResponseDto): IBaseDbModel {\r\n const model = new this();\r\n return model.fromDto(dto);\r\n }\r\n\r\n public static fromDtos(dtos: IBaseDbResponseDto[]): IBaseDbModel[] {\r\n return dtos.map((dto) => this.fromDto(dto));\r\n }\r\n\r\n public fromDto(dto: IBaseDbResponseDto): IBaseDbModel {\r\n this.id = dto.id;\r\n this.createdAt = dto.createdAt;\r\n return this;\r\n }\r\n\r\n public fromDtos(dtos: IBaseDbResponseDto[]): IBaseDbModel[] {\r\n return dtos.map((dto) => this.fromDto(dto));\r\n }\r\n}\r\n","import { BaseDbModel } from \"./base-db.model\";\r\n\r\nexport class MappedApiResponse<TModel extends BaseDbModel> {\r\n public status!: number;\r\n public data: TModel | TModel[] | undefined;\r\n public messages: string[] = [];\r\n public isError = false;\r\n}\r\n\r\nexport class MappedApiResponseRaw<TModel> {\r\n public status!: number;\r\n public data: TModel | undefined;\r\n public messages: string[] = [];\r\n public isError = false;\r\n}\r\n\r\nexport class MappedApiError {\r\n public status!: number;\r\n public data: undefined;\r\n public messages: string[] = [];\r\n public isError = true;\r\n}\r\n","import { IOdata } from './odata.interface';\r\nimport {IOdataResponsePaginationDto} from \"../../dtos/odata-response.dto\";\r\n\r\nexport class ODataPagination implements IOdata {\r\n public pageSize = 20;\r\n public totalPages = 0;\r\n public totalElements = 0;\r\n public page = 1;\r\n\r\n public static fromDto(dto: IOdataResponsePaginationDto): ODataPagination {\r\n const obj = new ODataPagination();\r\n obj.pageSize = dto.pageSize;\r\n obj.totalPages = dto.totalPages;\r\n obj.totalElements = dto.totalElements;\r\n obj.page = dto.page;\r\n return obj;\r\n }\r\n\r\n public toGetParameter(): string {\r\n let odataString = `$top=${this.pageSize}`;\r\n odataString += `&$skip=${(this.page - 1) * this.pageSize}`;\r\n return odataString;\r\n }\r\n}\r\n","import { BaseDbModel } from './base-db.model';\r\nimport { ODataPagination } from './odata/odata-pagination.model';\r\n\r\nexport class MappedOdataResponse<TModel extends BaseDbModel> {\r\n public status!: number;\r\n public data = new MappedOdataResponseData<TModel>();\r\n public messages: string[] = [];\r\n public isError!: boolean;\r\n}\r\n\r\nexport class MappedOdataResponseData<TModel extends BaseDbModel> {\r\n public items!: TModel[];\r\n public pagination = new ODataPagination();\r\n}\r\n","import { IOdata } from './odata.interface';\r\n\r\nexport class OdataExpands implements IOdata {\r\n public expands: string[] = [];\r\n\r\n public constructor(expands: string[] = []) {\r\n this.expands = expands;\r\n }\r\n\r\n public addField(field: string): void {\r\n this.expands.push(field);\r\n }\r\n\r\n public toGetParameter(): string {\r\n return this.expands.length > 0 ? `$expand=${this.expands.join(',')}` : '';\r\n }\r\n}\r\n","import { OdataFilter } from './odata-filter.model';\r\nimport { IOdata } from './odata.interface';\r\n\r\nexport enum FilterConcatenation {\r\n OR = ' or ',\r\n AND = ' and ',\r\n}\r\n\r\nexport class OdataFilterCollection implements IOdata {\r\n public andFilters: OdataFilter[] = [];\r\n\r\n // public orFilters: OdataFilter[] = [];\r\n\r\n public toGetParameter(): string {\r\n let odataString = '$filter=';\r\n const filters = this.andFilters.filter((x) => this._isFilterValid(x));\r\n if (filters.length === 0) {\r\n return '';\r\n }\r\n odataString += filters.map((x) => x.toGetParameter()).join(FilterConcatenation.AND);\r\n return odataString;\r\n }\r\n\r\n public addAnd(andFilter: OdataFilter): void {\r\n this.andFilters.push(andFilter);\r\n }\r\n\r\n public remove(field: string | undefined): void {\r\n const idx = this.andFilters.findIndex((f) => f.field === field);\r\n if (idx >= 0) {\r\n this.andFilters.splice(idx, 1);\r\n }\r\n }\r\n\r\n public hasValidFilters(): boolean {\r\n return this.andFilters.filter((f) => this._isFilterValid(f)).length > 0;\r\n }\r\n\r\n private _isFilterValid(filter: OdataFilter): boolean {\r\n return !(!filter.type || !filter.field || !filter.operator);\r\n }\r\n\r\n // public addOr(field: string, value: string | number | number[], filterType: EODataFilterTypes): void {\r\n // const filter = OdataFilterFactory.createFilter(filterType, field, value);\r\n // if (filter) {\r\n // this.orFilters.push(filter);\r\n // }\r\n // }\r\n}\r\n","import { IOdata } from './odata.interface';\r\n\r\nexport enum ESortDirection {\r\n ASC = 'asc',\r\n DESC = 'desc',\r\n}\r\n\r\nexport class ODataOrder implements IOdata {\r\n public column = 'id';\r\n public direction = ESortDirection.ASC;\r\n\r\n public toGetParameter(): string {\r\n return `$orderby=${this.column} ${this.direction}`;\r\n }\r\n}\r\n","import { OdataExpands } from './odata-expands.model';\r\nimport { OdataFilterCollection } from './odata-filter-collection.model';\r\nimport { ODataOrder } from './odata-order.model';\r\nimport { ODataPagination } from './odata-pagination.model';\r\nimport { IOdata } from './odata.interface';\r\n\r\nexport class OData implements IOdata {\r\n public pagination: ODataPagination = new ODataPagination();\r\n public filter = new OdataFilterCollection();\r\n public expands = new OdataExpands();\r\n public order = new ODataOrder();\r\n\r\n public toGetParameter(): string {\r\n let odataString = `odata?${this.pagination.toGetParameter()}`;\r\n if (this.filter.hasValidFilters()) {\r\n odataString += `&${this.filter.toGetParameter()}`;\r\n }\r\n if (this.order) {\r\n odataString += `&${this.order.toGetParameter()}`;\r\n }\r\n if (this.expands) {\r\n odataString += `&${this.expands.toGetParameter()}`;\r\n }\r\n return odataString;\r\n }\r\n}\r\n","export enum EFilterTypes {\n NUMERIC = 'numeric',\n STRING = 'string',\n DATE = 'date',\n TIME = 'time',\n PACE = 'pace',\n}\n\nexport enum EFilterOperator {\n EQUALS = '=',\n GREATER = '>',\n LESS = '<',\n GREATEREQUALS = '>=',\n LESSEQUALS = '<=',\n BETWEEN = 'zwischen',\n CONTAINS = 'enthält',\n}\n","import { EFilterOperator, EFilterTypes } from './filter/filter.enums';\r\nimport { IOdata } from './odata.interface';\r\n\r\nexport class OdataFilter implements IOdata {\r\n public constructor(\r\n public field?: string,\r\n public value?: string | number,\r\n public operator?: EFilterOperator,\r\n public type?: EFilterTypes,\r\n ) {}\r\n\r\n public toGetParameter(): string {\r\n if (!this.field || !this.operator || !this.type || !this.value) {\r\n return '';\r\n }\r\n switch (this.operator) {\r\n case EFilterOperator.CONTAINS:\r\n return `contains(${this.field},'${this.value}')`;\r\n default:\r\n return `${this.field} ${this._getODataOperator()} ${this._getTypeDependentValue()}`;\r\n }\r\n }\r\n\r\n public static availableOperators(type: EFilterTypes | undefined): EFilterOperator[] {\r\n switch (type) {\r\n case EFilterTypes.NUMERIC:\r\n return [EFilterOperator.GREATER, EFilterOperator.GREATEREQUALS, EFilterOperator.BETWEEN, EFilterOperator.LESS, EFilterOperator.LESSEQUALS, EFilterOperator.EQUALS];\r\n case EFilterTypes.STRING:\r\n return [EFilterOperator.CONTAINS];\r\n case EFilterTypes.DATE:\r\n return [EFilterOperator.GREATER, EFilterOperator.GREATEREQUALS, EFilterOperator.BETWEEN, EFilterOperator.LESS, EFilterOperator.LESSEQUALS, EFilterOperator.EQUALS];\r\n case EFilterTypes.TIME:\r\n case EFilterTypes.PACE:\r\n return [EFilterOperator.GREATER, EFilterOperator.GREATEREQUALS, EFilterOperator.BETWEEN, EFilterOperator.LESS, EFilterOperator.LESSEQUALS, EFilterOperator.EQUALS];\r\n default:\r\n return [EFilterOperator.GREATER, EFilterOperator.GREATEREQUALS, EFilterOperator.BETWEEN, EFilterOperator.LESS, EFilterOperator.LESSEQUALS, EFilterOperator.EQUALS];\r\n }\r\n }\r\n\r\n private _getTypeDependentValue(): string | number {\r\n if (this.type === EFilterTypes.STRING) {\r\n return `'${this.value}'`;\r\n }\r\n\r\n if (this.type === EFilterTypes.TIME) {\r\n if (!(this.value as string).includes(':')) {\r\n console.warn(this.value, 'not a valid time');\r\n return 0;\r\n }\r\n const minutesSeconds = (this.value as string).split(':');\r\n return parseInt(minutesSeconds[0], 10) * 60 + parseInt(minutesSeconds[1], 10);\r\n }\r\n\r\n return this.value!;\r\n }\r\n\r\n private _getODataOperator(): string {\r\n switch (this.operator) {\r\n case EFilterOperator.EQUALS:\r\n return 'eq';\r\n case EFilterOperator.LESS:\r\n return 'lt';\r\n case EFilterOperator.LESSEQUALS:\r\n return 'le';\r\n case EFilterOperator.GREATER:\r\n return 'gt';\r\n case EFilterOperator.GREATEREQUALS:\r\n return 'ge';\r\n case EFilterOperator.BETWEEN:\r\n return 'between';\r\n case EFilterOperator.CONTAINS:\r\n return 'contains';\r\n default:\r\n return 'eq';\r\n }\r\n }\r\n}\r\n","import { Component, OnInit, inject, input, model, signal } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { DialogService } from 'primeng/dynamicdialog';\r\nimport { BaseDbModel } from '../../core/models/base-db.model';\r\nimport { MappedApiError } from '../../core/models/mapped-api-response.model';\r\nimport { MappedOdataResponse } from '../../core/models/mapped-odata-response.model';\r\nimport { ODataPagination } from '../../core/models/odata/odata-pagination.model';\r\nimport { OData } from '../../core/models/odata/odata.model';\r\nimport { BaseDbApiService } from '../../core/services/base-db-api.service';\r\nimport {IBaseDbCreateDto} from \"../../core/dtos/base-db-create.dto\";\r\nimport {IBaseDbUpdateDto} from \"../../core/dtos/base-db-update.dto\";\r\nimport {IBaseDbResponseDto} from \"../../core/dtos/base-db-response.dto\";\r\nimport {BaseDisplayModalComponent} from \"./base-display/base-display-modal/base-display-modal.component\";\r\nimport {IDisplayModalReturnObject} from \"./base-display/base-display.component\";\r\n\r\n@Component({\r\n selector: 'sftech-pages-base-list',\r\n standalone: true,\r\n imports: [],\r\n template: '<div></div>',\r\n styles: '',\r\n})\r\nexport abstract class BaseListComponent<TDbModel extends BaseDbModel, TCreateDto extends IBaseDbCreateDto, TUpdateDto extends IBaseDbUpdateDto, TResponseDto extends IBaseDbResponseDto> implements OnInit {\r\n public odata = model<OData>(new OData());\r\n\r\n public showPageTitle = input<boolean>(true);\r\n public canEdit = input<boolean>(true);\r\n public openDisplayAsModal = input<boolean>(true);\r\n\r\n public data = signal<undefined | TDbModel[]>(undefined);\r\n\r\n protected router = inject(Router);\r\n\r\n private modalService = inject(DialogService);\r\n\r\n protected abstract _repo: BaseDbApiService<TDbModel, TCreateDto, TUpdateDto, TResponseDto>;\r\n protected abstract _route: string;\r\n protected abstract _modalComponent: typeof BaseDisplayModalComponent;\r\n protected abstract detailModalHeaderText: string;\r\n\r\n public constructor() {}\r\n\r\n public ngOnInit(): void {\r\n this._loadData();\r\n }\r\n\r\n public updatePagination($event: ODataPagination) {\r\n this.odata.update((odata) => {\r\n const odataNew = new OData();\r\n odataNew.pagination = $event;\r\n odataNew.filter = odata.filter;\r\n odataNew.order = odata.order;\r\n odataNew.expands = odata.expands;\r\n return odataNew;\r\n });\r\n this._loadData();\r\n }\r\n\r\n public openDisplay(id: number | undefined) {\r\n if (id === undefined) {\r\n return;\r\n }\r\n if (this.openDisplayAsModal()) {\r\n const modalRef = this.modalService.open(this._modalComponent, { inputValues: { id, canEdit: this.canEdit(), openedAsModal: true }, focusOnShow: false, modal: true, dismissableMask: true, width: '70%', contentStyle: { overflow: 'auto' } });\r\n modalRef.onClose.subscribe((result: IDisplayModalReturnObject) => {\r\n if (result) {\r\n this.data.update((data) => {\r\n const index = data?.findIndex((item) => item.id === result.id);\r\n if (index !== undefined && index >= 0) {\r\n data![index] = result.data! as TDbModel;\r\n }\r\n return data;\r\n });\r\n }\r\n });\r\n return;\r\n }\r\n\r\n this.router.navigate([this._route, id]);\r\n }\r\n\r\n private _loadData() {\r\n this._repo.odata(this.odata()).subscribe((response: MappedOdataResponse<TDbModel> | MappedApiError) => {\r\n if (response instanceof MappedApiError) {\r\n console.error(response);\r\n return;\r\n }\r\n this.data.set(response.data.items);\r\n if (!response.data) {\r\n return;\r\n }\r\n this.odata.update((odata) => {\r\n const odataNew = new OData();\r\n odataNew.pagination = response.data.pagination;\r\n odataNew.filter = odata.filter;\r\n odataNew.order = odata.order;\r\n odataNew.expands = odata.expands;\r\n return odataNew;\r\n });\r\n });\r\n }\r\n}\r\n","import { Component, Input, OnInit, effect, inject, input, signal } from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { MessageService } from 'primeng/api';\r\nimport { DynamicDialogRef } from 'primeng/dynamicdialog';\r\nimport { Observable, map, of, switchMap } from 'rxjs';\r\nimport { MappedApiError, MappedApiResponse } from '../../../core/models/mapped-api-response.model';\r\nimport {BaseDbModel, IBaseDbModel} from \"../../../core/models/base-db.model\";\r\nimport {IBaseDbCreateDto} from \"../../../core/dtos/base-db-create.dto\";\r\nimport {IBaseDbUpdateDto} from \"../../../core/dtos/base-db-update.dto\";\r\nimport {IBaseDbResponseDto} from \"../../../core/dtos/base-db-response.dto\";\r\nimport {IconProvider} from \"../../../providers/icon.provider\";\r\nimport {BaseDbApiService} from \"../../../core/services/base-db-api.service\";\r\n\r\n@Component({\r\n selector: 'lib-core-base-display',\r\n standalone: true,\r\n imports: [],\r\n template: '<div></div>',\r\n styles: '',\r\n})\r\nexport abstract class BaseDisplayComponent<TDbModel extends BaseDbModel, TCreateDto extends IBaseDbCreateDto, TUpdateDto extends IBaseDbUpdateDto, TResponseDto extends IBaseDbResponseDto> implements OnInit {\r\n @Input() public id: undefined | number;\r\n @Input() public openedAsModal = false;\r\n @Input() public canEdit = true;\r\n\r\n public redirectAfterSave = true;\r\n\r\n protected ref = inject(DynamicDialogRef);\r\n\r\n public form!: FormGroup;\r\n public model = signal<TDbModel>(this.getNewModel());\r\n public iconProvider = IconProvider;\r\n protected abstract _repo: BaseDbApiService<TDbModel, TCreateDto, TUpdateDto, TResponseDto>;\r\n protected abstract _route: string;\r\n protected router = inject(Router);\r\n protected activatedRoute = inject(ActivatedRoute);\r\n protected toastr = inject(MessageService);\r\n\r\n protected constructor() {\r\n effect(() => {\r\n if (this.model()) {\r\n this.form = this.initializeForm();\r\n if (!this.canEdit) {\r\n for (const control in this.form.controls) {\r\n this.form.controls[control].disable();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n let obs: Observable<MappedApiResponse<TDbModel>>;\r\n if (this.id) {\r\n obs = this._loadData(this.id!);\r\n } else {\r\n obs = this.activatedRoute.params.pipe(\r\n switchMap((params) => {\r\n const id = parseInt(params['id']);\r\n this.id = id;\r\n return this._loadData(id);\r\n }),\r\n );\r\n }\r\n obs.subscribe((res: MappedApiResponse<TDbModel> | MappedApiError) => {\r\n if (res instanceof MappedApiError) {\r\n this.toastr.add({ severity: 'error', detail: 'Beim Laden der Daten ist ein Fehler aufgetreten' });\r\n throw new Error(res.messages ? res.messages.join(' | ') : 'Beim Laden der Daten ist ein Fehler aufgetreten');\r\n }\r\n this.model.set(res.data as TDbModel);\r\n if (this.form) {\r\n this.form.patchValue(this.model());\r\n this.form.markAsUntouched();\r\n }\r\n });\r\n }\r\n\r\n public async submitForm(): Promise<void> {\r\n let obs: Observable<MappedApiResponse<TDbModel> | MappedApiError>;\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n if (this.model().id) {\r\n const dto = this.mapFormToUpdateDto();\r\n obs = this._repo.update(this.model().id!, dto);\r\n } else {\r\n const dto = this.mapFormToCreateDto();\r\n obs = this._repo.insert(dto);\r\n }\r\n obs.subscribe((res) => {\r\n if (res.isError) {\r\n this.toastr.add({ severity: 'error', detail: 'Beim Speichern der Daten ist ein Fehler aufgetreten' });\r\n throw new Error(res.messages ? res.messages.join(' | ') : 'Beim Speichern der Daten ist ein Fehler aufgetreten');\r\n }\r\n this.model.set(res.data as TDbModel);\r\n this.toastr.add({ severity: 'success', detail: `Datensatz mit der Id '${this.model().id}' erfolgreich gespeichert` });\r\n if (this.redirectAfterSave) {\r\n this.goBack({ operation: this.model().id ? 'update' : 'create', id: this.model().id, data: res.data as IBaseDbModel });\r\n }\r\n });\r\n }\r\n\r\n public deleteData(): void {\r\n if (!this.model().id) {\r\n this.model.set(this.getNewModel());\r\n this.form.patchValue(this.model);\r\n return;\r\n }\r\n this._repo.delete(this.model().id!).subscribe((res) => {\r\n if (res.isError) {\r\n this.toastr.add({ severity: 'error', detail: 'Beim Löschen der Daten ist ein Fehler aufgetreten' });\r\n throw new Error(res.messages ? res.messages.join(' | ') : 'Beim Löschen der Daten ist ein Fehler aufgetreten');\r\n }\r\n this.toastr.add({ severity: 'success', detail: `Datensatz mit der Id '${this.model().id}' erfolgreich gelöscht` });\r\n this.goBack({ operation: 'delete', id: this.model().id });\r\n });\r\n }\r\n\r\n public getFormControl(property: string): FormControl | undefined {\r\n return this.form.get(property) as FormControl;\r\n }\r\n\r\n public goBack(retVal: IDisplayModalReturnObject = { operation: 'aborted' }): void {\r\n if (this.openedAsModal) {\r\n this.close(retVal);\r\n return;\r\n }\r\n this.router.navigate([this._route]);\r\n }\r\n\r\n private _loadData(id: number): Observable<MappedApiResponse<TDbModel>> {\r\n if (id) {\r\n return this._repo.get(id, true).pipe(\r\n map((res) => {\r\n if (res instanceof MappedApiError) {\r\n this.toastr.add({ severity: 'error', detail: 'Beim Laden der Daten ist ein Fehler aufgetreten' });\r\n throw new Error(res.messages ? res.messages.join(' | ') : 'Beim Laden der Daten ist ein Fehler aufgetreten');\r\n }\r\n return res;\r\n }),\r\n );\r\n }\r\n const mappedApiResponse = new MappedApiResponse<TDbModel>();\r\n mappedApiResponse.data = this.model();\r\n return of(mappedApiResponse);\r\n }\r\n\r\n protected abstract initializeForm(): FormGroup;\r\n\r\n protected abstract getNewModel(): TDbModel;\r\n\r\n protected abstract mapFormToUpdateDto(): TUpdateDto;\r\n\r\n protected abstract mapFormToCreateDto(): TCreateDto;\r\n\r\n public close(retVal: IDisplayModalReturnObject = { operation: 'aborted' }): void {\r\n this.ref.close(retVal);\r\n }\r\n}\r\n\r\nexport interface IDisplayModalReturnObject {\r\n operation: 'create' | 'update' | 'delete' | 'aborted';\r\n data?: IBaseDbModel;\r\n id?: number;\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-prompt-display-modal',\r\n standalone: true,\r\n imports: [],\r\n template: '',\r\n styles: '',\r\n})\r\nexport class BaseDisplayModalComponent {\r\n public id!: number | undefined;\r\n public canEdit = true;\r\n}\r\n","import { Component, input } from '@angular/core';\nimport {AbstractControl, FormControl} from '@angular/forms';\n\n@Component({\n selector: 'sftech-form-error-display',\n standalone: true,\n imports: [],\n templateUrl: './form-error-display.component.html',\n styleUrl: './form-error-display.component.css',\n})\nexport class FormErrorDisplayComponent {\n public control = input<AbstractControl | undefined>(undefined);\n public label = input<string | undefined>(undefined);\n}\n","@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","import { Component, EventEmitter, Input, Output, computed } from '@angular/core';\r\nimport { Paginator, PaginatorModule, PaginatorState } from 'primeng/paginator';\r\nimport { ODataPagination } from '../../core/models/odata/odata-pagination.model';\r\n\r\n@Component({\r\n selector: 'sftech-paginator',\r\n standalone: true,\r\n imports: [PaginatorModule],\r\n templateUrl: './paginator.component.html',\r\n styleUrl: './paginator.component.css',\r\n})\r\nexport class PaginatorComponent {\r\n @Input() pagination!: ODataPagination;\r\n @Output() public odataChanged = new EventEmitter<ODataPagination>();\r\n // public amountOfPageNumbersToShow = 5;\r\n // public pageNumbers = computed(() => {\r\n // const currentPage = this.pagination!.page;\r\n // const totalPages = this.pagination!.totalPages;\r\n //\r\n // if (totalPages <= this.amountOfPageNumbersToShow) {\r\n // // Wenn die Gesamtseiten kleiner als oder gleich der sichtbaren Seiten sind\r\n // return Array.from({ length: totalPages }, (_, i) => i + 1);\r\n // }\r\n //\r\n // const pagination: number[] = []; // Immer mit 1 starten\r\n //\r\n // // Bereich in der Mitte berechnen\r\n // const middleCount = this.amountOfPageNumbersToShow - 2; // Plätze für Mitte (ohne 1 und x)\r\n // const half = Math.floor(middleCount / 2);\r\n //\r\n // let start = Math.max(2, currentPage - half); // Startpunkt der Mitte\r\n // let end = Math.min(totalPages - 1, currentPage + half); // Endpunkt der Mitte\r\n //\r\n // // Anpassen, falls die Mitte den Anfang oder das Ende überschreitet\r\n // if (end - start < middleCount - 1) {\r\n // if (start === 2) {\r\n // end = start + middleCount - 1;\r\n // } else if (end === totalPages - 1) {\r\n // start = end - middleCount + 1;\r\n // }\r\n // }\r\n //\r\n // // Mittlere Zahlen hinzufügen\r\n // for (let i = start; i <= end; i++) {\r\n // pagination.push(i);\r\n // }\r\n //\r\n // return pagination;\r\n // });\r\n //\r\n // public changePage(pageNumber: number) {\r\n // this.pagination.page = pageNumber;\r\n // this.odataChanged.emit(this.pagination);\r\n // }\r\n\r\n onPageChange(event: PaginatorState) {\r\n if (event.page !== undefined) {\r\n this.pagination.page = event.page + 1;\r\n }\r\n this.pagination.pageSize = event.rows ?? 10;\r\n this.odataChanged.emit(this.pagination);\r\n }\r\n}\r\n","<!--<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>","import { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, catchError, map, of } from 'rxjs';\r\nimport { BaseDbModel } from '../models/base-db.model';\r\nimport { MappedApiError, MappedApiResponse } from '../models/mapped-api-response.model';\r\nimport { MappedOdataResponse } from '../models/mapped-odata-response.model';\r\nimport { ODataPagination } from '../models/odata/odata-pagination.model';\r\nimport { OData } from '../models/odata/odata.model';\r\nimport { IBaseDbCreateDto } from '../dtos/base-db-create.dto';\r\nimport {IBaseDbUpdateDto} from \"../dtos/base-db-update.dto\";\r\nimport { IBaseDbResponseDto } from '../dtos/base-db-response.dto';\r\nimport { IAppConfig } from '../configuration/app-config.interface';\r\nimport {IApiResponse} from \"../dtos/api-response.dto\";\r\nimport {IOdataResponseDto} from \"../dtos/odata-response.dto\";\r\n\r\nexport abstract class BaseDbApiService<TModel extends BaseDbModel, TCreateDto extends IBaseDbCreateDto, TUpdateDto extends IBaseDbUpdateDto, TResponseDto extends IBaseDbResponseDto> {\r\n protected url!: string;\r\n\r\n constructor(\r\n protected readonly http: HttpClient,\r\n protected readonly config: IAppConfig,\r\n ) {}\r\n\r\n public get(id: number, detailed: boolean = false): Observable<MappedApiResponse<TModel> | MappedApiError> {\r\n let url = `${this.url}/${id}`;\r\n console.log(url)\r\n if (detailed) {\r\n url = `${url}/?detailed=${detailed}`;\r\n }\r\n return this.http.get<IApiResponse<TResponseDto>>(url).pipe(\r\n map((response: IApiResponse<TResponseDto>) => this._responseMapping(response)),\r\n catchError((error) => {\r\n return this._httpErrorToApiResponse(error);\r\n }),\r\n );\r\n }\r\n\r\n public getAll(): Observable<MappedOdataResponse<TModel> | MappedApiError> {\r\n const odata = new OData();\r\n return this.odata(odata);\r\n }\r\n\r\n public odata(odataQuery: OData): Observable<MappedOdataResponse<TModel> | MappedApiError> {\r\n return this.http.get<IApiResponse<IOdataResponseDto<TResponseDto>>>(`${this.url}/${odataQuery.toGetParameter()}`).pipe(\r\n map((response: IApiResponse<IOdataResponseDto<TResponseDto>>) => this._responseOdataMapping(response)),\r\n catchError((error) => {\r\n return this._httpErrorToApiResponse(error);\r\n }),\r\n );\r\n }\r\n\r\n public insert(dto: TCreateDto): Observable<MappedApiResponse<TModel> | MappedApiError> {\r\n return this.http.post<IApiResponse<TResponseDto>>(this.url, dto).pipe(\r\n map((response: IApiResponse<TResponseDto>) => this._responseMapping(response)),\r\n catchError((error) => {\r\n return this._httpErrorToApiResponse(error);\r\n }),\r\n );\r\n }\r\n\r\n public update(id: number, dto: TUpdateDto): Observable<MappedApiResponse<TModel> | MappedApiError> {\r\n return this.http.put<IApiResponse<TResponseDto>>(`${this.url}/${id}`, dto).pipe(\r\n map((response: IApiResponse<TResponseDto>) => this._responseMapping(response)),\r\n catchError((error) => {\r\n return this._httpErrorToApiResponse(error);\r\n }),\r\n );\r\n }\r\n\r\n public delete(id: number): Observable<MappedApiResponse<TModel> | MappedApiError> {\r\n return this.http.delete<IApiResponse<TResponseDto>>(`${this.url}/${id}`).pipe(\r\n map((response: IApiResponse<TResponseDto>) => {\r\n const apiReponse = new MappedApiResponse<TModel>();\r\n apiReponse.status = response.status;\r\n apiReponse.messages = response.messages ? response.messages : [];\r\n apiReponse.isError = false;\r\n return apiReponse;\r\n }),\r\n catchError((error) => {\r\n return this._httpErrorToApiResponse(error);\r\n }),\r\n );\r\n }\r\n\r\n protected abstract getNewModel(): TModel;\r\n\r\n private _responseOdataMapping(response: IApiResponse<IOdataResponseDto<TResponseDto>>): MappedOdataResponse<TModel> {\r\n const odataResponse = new MappedOdataResponse<TModel>();\r\n odataResponse.data.items = this.getNewModel().fromDtos((response.data as IOdataResponseDto<TResponseDto>)?.items) as TModel[];\r\n odataResponse.data.pagination = ODataPagination.fromDto((response.data as IOdataResponseDto<TResponseDto>).pagination);\r\n return odataResponse;\r\n }\r\n\r\n private _responseMapping(response: IApiResponse<TResponseDto>): MappedApiResponse<TModel> | MappedApiError {\r\n if (![200, 201, 202].includes(response.status)) {\r\n return this._errorHandling(response.status, response.messages);\r\n }\r\n const apiResponse = new MappedApiResponse<TModel>();\r\n apiResponse.status = response.status;\r\n apiResponse.messages = response.messages ? response.messages : [];\r\n apiResponse.isError = false;\r\n\r\n let mappedData: TModel | TModel[] | undefined;\r\n\r\n if (Array.isArray(response.data)) {\r\n mappedData = this.getNewModel().fromDtos(response.data) as TModel[];\r\n } else {\r\n mappedData = this.getNewModel().fromDto(response.data as TResponseDto) as TModel;\r\n }\r\n\r\n apiResponse.data = mappedData;\r\n return apiResponse;\r\n }\r\n\r\n private _errorHandling(statusCode: number, messages: string[] | undefined) {\r\n const apiResponse = new MappedApiError();\r\n apiResponse.status = statusCode;\r\n apiResponse.messages = messages ? messages : [];\r\n apiResponse.isError = true;\r\n return apiResponse;\r\n }\r\n\r\n private _httpErrorToApiResponse(error: HttpErrorResponse) {\r\n const messages: string[] = [];\r\n if (error.message) {\r\n messages.push(error.message);\r\n }\r\n if (error.error?.messages) {\r\n messages.push(...error.error.messages);\r\n }\r\n return of(this._errorHandling(error.status, messages));\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sftech-ng-shared.mjs","sources":["../../../../libs/ng-shared/src/lib/ui/styles/themes/sftech.preset.ts","../../../../libs/ng-shared/src/lib/providers/icon.provider.ts","../../../../libs/ng-shared/src/lib/ui/layouts/sidebar-navigation/sidebar-navigation.component.ts","../../../../libs/ng-shared/src/lib/ui/layouts/sidebar-navigation/sidebar-navigation.component.html","../../../../libs/ng-shared/src/lib/ui/layouts/head-main-footer-with-canvas/head-main-footer-with-canvas.component.ts","../../../../libs/ng-shared/src/lib/ui/layouts/head-main-footer-with-canvas/head-main-footer-with-canvas.component.html","../../../../libs/ng-shared/src/lib/ui/layouts/base-dialog/base-dialog.component.ts","../../../../libs/ng-shared/src/lib/ui/layouts/base-dialog/base-dialog.component.html","../../../../libs/ng-shared/src/lib/core/configuration/app-config.loader.ts","../../../../libs/ng-shared/src/lib/core/models/base-db.model.ts","../../../../libs/ng-shared/src/lib/core/models/mapped-api-response.model.ts","../../../../libs/ng-shared/src/lib/core/models/odata/odata-pagination.model.ts","../../../../libs/ng-shared/src/lib/core/models/mapped-odata-response.model.ts","../../../../libs/ng-shared/src/lib/core/models/odata/odata-expands.model.ts","../../../../libs/ng-shared/src/lib/core/models/odata/odata-filter-collection.model.ts","../../../../libs/ng-shared/src/lib/core/models/odata/odata-order.model.ts","../../../../libs/ng-shared/src/lib/core/models/odata/odata.model.ts","../../../../libs/ng-shared/src/lib/core/models/odata/filter/filter.enums.ts","../../../../libs/ng-shared/src/lib/core/models/odata/odata-filter.model.ts","../../../../libs/ng-shared/src/lib/components/pages/base-list.component.ts","../../../../libs/ng-shared/src/lib/components/pages/base-display/base-display.component.ts","../../../../libs/ng-shared/src/lib/components/pages/base-display/base-display-modal/base-display-modal.component.ts","../../../../libs/ng-shared/src/lib/components/forms/form-error-display/form-error-display.component.ts","../../../../libs/ng-shared/src/lib/components/forms/form-error-display/form-error-display.component.html","../../../../libs/ng-shared/src/lib/components/paginator/paginator.component.ts","../../../../libs/ng-shared/src/lib/components/paginator/paginator.component.html","../../../../libs/ng-shared/src/lib/core/services/base-db-api.service.ts","../../../../libs/ng-shared/src/sftech-ng-shared.ts"],"sourcesContent":["import { definePreset } from '@primeng/themes';\r\nimport Aura from '@primeng/themes/aura';\r\n\r\nexport const SfTechPreset = definePreset(Aura, {\r\n semantic: {\r\n primary: {\r\n 50: '#9ddcf5',\r\n 100: '#8bd5f2',\r\n 200: '#6bc8ef',\r\n 300: '#4abbe8',\r\n 400: '#2aa8e0',\r\n 500: '#0093d8',\r\n 600: '#0081c3',\r\n 700: '#0071a8',\r\n 800: '#00618c',\r\n 900: '#005272',\r\n },\r\n }\r\n});\r\n","import {faBars, faBurger, faClose, faPlus, faTrash} from '@fortawesome/free-solid-svg-icons';\r\n\r\n// biome-ignore lint/complexity/noStaticOnlyClass: <explanation>\r\nexport class IconProvider {\r\n public static readonly add = faPlus;\r\n public static readonly close = faClose;\r\n public static readonly delete = faTrash;\r\n public static readonly menu = faBars;\r\n}\r\n","import {Component, EventEmitter, input, model, Output} from '@angular/core';\r\nimport {Ripple} from \"primeng/ripple\";\r\nimport {StyleClass} from \"primeng/styleclass\";\r\nimport {FaIconComponent} from \"@fortawesome/angular-fontawesome\";\r\nimport {RouterLink} from \"@angular/router\";\r\n\r\n@Component({\r\n selector: 'sftech-sidebar-navigation',\r\n imports: [\r\n Ripple,\r\n StyleClass,\r\n FaIconComponent,\r\n RouterLink\r\n ],\r\n templateUrl: './sidebar-navigation.component.html',\r\n styleUrl: './sidebar-navigation.component.css'\r\n})\r\nexport class SidebarNavigationComponent {\r\n @Output() closeDrawer = new EventEmitter<void>();\r\n public navigation = input<ISidebarNavigationCategory[]>([])\r\n}\r\n\r\nexport interface ISidebarNavigationCategory {\r\n categoryName: string,\r\n icon?: string,\r\n links: ISidebarNavigationLink[]\r\n}\r\n\r\nexport interface ISidebarNavigationLink {\r\n name: string,\r\n icon?: string,\r\n routerLink: string,\r\n}\r\n","<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>","import { NgTemplateOutlet } from '@angular/common';\r\nimport {Component, ContentChild, Input, model, TemplateRef, ViewChild} from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { Button } from 'primeng/button';\r\nimport { Drawer } from 'primeng/drawer';\r\nimport { Toast } from 'primeng/toast';\r\nimport { IconProvider } from '../../../providers/icon.provider';\r\nimport {\r\n ISidebarNavigationCategory,\r\n SidebarNavigationComponent\r\n} from \"../sidebar-navigation/sidebar-navigation.component\";\r\n\r\n@Component({\r\n selector: 'sftech-head-main-footer-with-canvas',\r\n imports: [NgTemplateOutlet, Button, Drawer, FaIconComponent, Toast, SidebarNavigationComponent],\r\n templateUrl: './head-main-footer-with-canvas.component.html',\r\n styleUrl: './head-main-footer-with-canvas.component.css',\r\n})\r\nexport class HeadMainFooterWithCanvasComponent {\r\n @Input() title = 'demo';\r\n @Input() maxWidth = '100%';\r\n @Input() navigationItems: ISidebarNavigationCategory[] = [];\r\n @Input() hasDrawer = true;\r\n protected drawerVisible = false;\r\n @ContentChild('header') public header: TemplateRef<unknown> | null = null;\r\n @ContentChild('main') public main: TemplateRef<unknown> | null = null;\r\n @ContentChild('footer') public footer: TemplateRef<unknown> | null = null;\r\n\r\n @ViewChild('drawerRef') drawerRef!: Drawer;\r\n\r\n protected iconProvider = IconProvider;\r\n\r\n closeCallback(e: Event): void {\r\n this.drawerRef.close(e);\r\n }\r\n}\r\n","<div class=\"h-screen flex flex-col justify-between\">\r\n <p-toast/>\r\n <header class=\"p-2 bg-primary-600\">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto\">\r\n @if (hasDrawer) {\r\n <div class=\"flex items-center\">\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\">\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=\"p-2 flex-grow overflow-auto\">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto\">\r\n <ng-container [ngTemplateOutlet]=\"main\"></ng-container>\r\n </div>\r\n </main>\r\n\r\n <footer class=\"p-2 bg-primary-600\">\r\n <div [style.max-width]=\"maxWidth\" class=\"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\">\r\n <div class=\"flex items-center justify-between px-2 pt-4 shrink-0\">\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-2 mt-6\">\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}","import { NgTemplateOutlet } from '@angular/common';\r\nimport { Component, ContentChild, EventEmitter, Output, TemplateRef, input } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { Button } from 'primeng/button';\r\nimport {IconProvider} from \"../../../providers/icon.provider\";\r\n\r\n@Component({\r\n selector: 'sftech-base-dialog',\r\n imports: [Button, NgTemplateOutlet, FaIconComponent],\r\n templateUrl: './base-dialog.component.html',\r\n styleUrl: './base-dialog.component.css',\r\n})\r\nexport class BaseDialogComponent {\r\n public hasHeader = input<boolean>(true);\r\n public hasFooter = input<boolean>(true);\r\n public showButtons = input<boolean>(true);\r\n public headerText = input<string | undefined>(undefined);\r\n\r\n @Output() closed = new EventEmitter<void>();\r\n\r\n @ContentChild('header') public header: TemplateRef<unknown> | null = null;\r\n @ContentChild('body') public body: TemplateRef<unknown> | null = null;\r\n @ContentChild('footer') public footer: TemplateRef<unknown> | null = null;\r\n\r\n public iconProvider = IconProvider;\r\n\r\n constructor() {}\r\n\r\n public close(): void {\r\n this.closed.emit();\r\n }\r\n}\r\n","<!--<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@if (hasHeader()) {\r\n <div id=\"dialog-header\" class=\"flex justify-between mb-5\">\r\n <div class=\"header-content\">\r\n @if (headerText()) {\r\n <h1>{{ headerText() }}</h1>\r\n } @else {\r\n <ng-container [ngTemplateOutlet]=\"header\"></ng-container>\r\n }\r\n </div>\r\n <div class=\"header-actions\">\r\n <p-button (onClick)=\"close()\">\r\n <fa-icon [icon]=\"iconProvider.close\"></fa-icon>\r\n </p-button>\r\n </div>\r\n </div>\r\n}\r\n<div id=\"dialog-body\">\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}","import {IAppConfig} from \"./app-config.interface\";\r\n\r\nexport async function loadConfig<TConfig extends IAppConfig>(configPath: string): Promise<TConfig> {\r\n return fetch(configPath)\r\n .then((res) => {\r\n if (!res.ok) throw new Error('Config load failed');\r\n return res.json();\r\n });\r\n}","import { IBaseDbResponseDto } from '../dtos/base-db-response.dto';\r\nimport { EFilterTypes } from './odata/filter/filter.enums';\r\n\r\nexport interface IBaseDbModel {\r\n id?: number;\r\n createdAt?: Date;\r\n\r\n propertiesToShow?: string[];\r\n propertyUINames?: Map<string, string>;\r\n\r\n getFilterTypeForProperty(propertyName: string): EFilterTypes | undefined;\r\n getUiNameForProperty(propertyName: string): string;\r\n}\r\n\r\nexport class BaseDbModel implements IBaseDbModel {\r\n public id?: number;\r\n public createdAt?: Date;\r\n\r\n public propertiesToShow: string[] = [];\r\n\r\n public propertyFilterType = new Map<string, EFilterTypes>();\r\n\r\n public propertyUINames = new Map<string, string>();\r\n\r\n public getUiNameForProperty(propertyName: string): string {\r\n return this.propertyUINames.get(propertyName) || propertyName;\r\n }\r\n public getFilterTypeForProperty(propertyName: string): EFilterTypes | undefined {\r\n return this.propertyFilterType.get(propertyName);\r\n }\r\n\r\n public getPropertyValue(propertyName: string): unknown {\r\n return this[propertyName as keyof this];\r\n }\r\n\r\n public static fromDto(dto: IBaseDbResponseDto): IBaseDbModel {\r\n const model = new this();\r\n return model.fromDto(dto);\r\n }\r\n\r\n public static fromDtos(dtos: IBaseDbResponseDto[]): IBaseDbModel[] {\r\n return dtos.map((dto) => this.fromDto(dto));\r\n }\r\n\r\n public fromDto(dto: IBaseDbResponseDto): IBaseDbModel {\r\n this.id = dto.id;\r\n this.createdAt = dto.createdAt;\r\n return this;\r\n }\r\n\r\n public fromDtos(dtos: IBaseDbResponseDto[]): IBaseDbModel[] {\r\n return dtos.map((dto) => this.fromDto(dto));\r\n }\r\n}\r\n","import { BaseDbModel } from './base-db.model';\r\n\r\nexport class MappedApiResponse<TModel extends BaseDbModel> {\r\n public status!: number;\r\n public data: TModel | TModel[] | undefined;\r\n public messages: string[] = [];\r\n public isError = false;\r\n}\r\n\r\nexport class MappedApiResponseRaw<TModel> {\r\n public status!: number;\r\n public data: TModel | undefined;\r\n public messages: string[] = [];\r\n public isError = false;\r\n}\r\n\r\nexport class MappedApiError {\r\n public status!: number;\r\n public data: undefined;\r\n public messages: string[] = [];\r\n public isError = true;\r\n}\r\n","import { IOdata } from './odata.interface';\r\nimport {IOdataResponsePaginationDto} from \"../../dtos/odata-response.dto\";\r\n\r\nexport class ODataPagination implements IOdata {\r\n public pageSize = 20;\r\n public totalPages = 0;\r\n public totalElements = 0;\r\n public page = 1;\r\n\r\n public static fromDto(dto: IOdataResponsePaginationDto): ODataPagination {\r\n const obj = new ODataPagination();\r\n obj.pageSize = dto.pageSize;\r\n obj.totalPages = dto.totalPages;\r\n obj.totalElements = dto.totalElements;\r\n obj.page = dto.page;\r\n return obj;\r\n }\r\n\r\n public toGetParameter(): string {\r\n let odataString = `$top=${this.pageSize}`;\r\n odataString += `&$skip=${(this.page - 1) * this.pageSize}`;\r\n return odataString;\r\n }\r\n}\r\n","import { BaseDbModel } from './base-db.model';\r\nimport { ODataPagination } from './odata/odata-pagination.model';\r\n\r\nexport class MappedOdataResponse<TModel extends BaseDbModel> {\r\n public status!: number;\r\n public data = new MappedOdataResponseData<TModel>();\r\n public messages: string[] = [];\r\n public isError!: boolean;\r\n}\r\n\r\nexport class MappedOdataResponseData<TModel extends BaseDbModel> {\r\n public items!: TModel[];\r\n public pagination = new ODataPagination();\r\n}\r\n","import { IOdata } from './odata.interface';\r\n\r\nexport class OdataExpands implements IOdata {\r\n public expands: string[] = [];\r\n\r\n public constructor(expands: string[] = []) {\r\n this.expands = expands;\r\n }\r\n\r\n public addField(field: string): void {\r\n this.expands.push(field);\r\n }\r\n\r\n public toGetParameter(): string {\r\n return this.expands.length > 0 ? `$expand=${this.expands.join(',')}` : '';\r\n }\r\n}\r\n","import { OdataFilter } from './odata-filter.model';\r\nimport { IOdata } from './odata.interface';\r\n\r\nexport enum FilterConcatenation {\r\n OR = ' or ',\r\n AND = ' and ',\r\n}\r\n\r\nexport class OdataFilterCollection implements IOdata {\r\n public andFilters: OdataFilter[] = [];\r\n\r\n // public orFilters: OdataFilter[] = [];\r\n\r\n public toGetParameter(): string {\r\n let odataString = '$filter=';\r\n const filters = this.andFilters.filter((x) => this._isFilterValid(x));\r\n if (filters.length === 0) {\r\n return '';\r\n }\r\n odataString += filters.map((x) => x.toGetParameter()).join(FilterConcatenation.AND);\r\n return odataString;\r\n }\r\n\r\n public addAnd(andFilter: OdataFilter): void {\r\n this.andFilters.push(andFilter);\r\n }\r\n\r\n public remove(field: string | undefined): void {\r\n const idx = this.andFilters.findIndex((f) => f.field === field);\r\n if (idx >= 0) {\r\n this.andFilters.splice(idx, 1);\r\n }\r\n }\r\n\r\n public hasValidFilters(): boolean {\r\n return this.andFilters.filter((f) => this._isFilterValid(f)).length > 0;\r\n }\r\n\r\n private _isFilterValid(filter: OdataFilter): boolean {\r\n return !(!filter.type || !filter.field || !filter.operator);\r\n }\r\n\r\n // public addOr(field: string, value: string | number | number[], filterType: EODataFilterTypes): void {\r\n // const filter = OdataFilterFactory.createFilter(filterType, field, value);\r\n // if (filter) {\r\n // this.orFilters.push(filter);\r\n // }\r\n // }\r\n}\r\n","import { IOdata } from './odata.interface';\r\n\r\nexport enum ESortDirection {\r\n ASC = 'asc',\r\n DESC = 'desc',\r\n}\r\n\r\nexport class ODataOrder implements IOdata {\r\n public column = 'id';\r\n public direction = ESortDirection.ASC;\r\n\r\n public toGetParameter(): string {\r\n return `$orderby=${this.column} ${this.direction}`;\r\n }\r\n}\r\n","import { OdataExpands } from './odata-expands.model';\r\nimport { OdataFilterCollection } from './odata-filter-collection.model';\r\nimport { ODataOrder } from './odata-order.model';\r\nimport { ODataPagination } from './odata-pagination.model';\r\nimport { IOdata } from './odata.interface';\r\n\r\nexport class OData implements IOdata {\r\n public pagination: ODataPagination = new ODataPagination();\r\n public filter = new OdataFilterCollection();\r\n public expands = new OdataExpands();\r\n public order = new ODataOrder();\r\n\r\n public toGetParameter(): string {\r\n let odataString = `odata?${this.pagination.toGetParameter()}`;\r\n if (this.filter.hasValidFilters()) {\r\n odataString += `&${this.filter.toGetParameter()}`;\r\n }\r\n if (this.order) {\r\n odataString += `&${this.order.toGetParameter()}`;\r\n }\r\n if (this.expands) {\r\n odataString += `&${this.expands.toGetParameter()}`;\r\n }\r\n return odataString;\r\n }\r\n}\r\n","export enum EFilterTypes {\n NUMERIC = 'numeric',\n STRING = 'string',\n DATE = 'date',\n TIME = 'time',\n PACE = 'pace',\n}\n\nexport enum EFilterOperator {\n EQUALS = '=',\n GREATER = '>',\n LESS = '<',\n GREATEREQUALS = '>=',\n LESSEQUALS = '<=',\n BETWEEN = 'zwischen',\n CONTAINS = 'enthält',\n}\n","import { EFilterOperator, EFilterTypes } from './filter/filter.enums';\r\nimport { IOdata } from './odata.interface';\r\n\r\nexport class OdataFilter implements IOdata {\r\n public constructor(\r\n public field?: string,\r\n public value?: string | number,\r\n public operator?: EFilterOperator,\r\n public type?: EFilterTypes,\r\n ) {}\r\n\r\n public toGetParameter(): string {\r\n if (!this.field || !this.operator || !this.type || !this.value) {\r\n return '';\r\n }\r\n switch (this.operator) {\r\n case EFilterOperator.CONTAINS:\r\n return `contains(${this.field},'${this.value}')`;\r\n default:\r\n return `${this.field} ${this._getODataOperator()} ${this._getTypeDependentValue()}`;\r\n }\r\n }\r\n\r\n public static availableOperators(type: EFilterTypes | undefined): EFilterOperator[] {\r\n switch (type) {\r\n case EFilterTypes.NUMERIC:\r\n return [EFilterOperator.GREATER, EFilterOperator.GREATEREQUALS, EFilterOperator.BETWEEN, EFilterOperator.LESS, EFilterOperator.LESSEQUALS, EFilterOperator.EQUALS];\r\n case EFilterTypes.STRING:\r\n return [EFilterOperator.CONTAINS];\r\n case EFilterTypes.DATE:\r\n return [EFilterOperator.GREATER, EFilterOperator.GREATEREQUALS, EFilterOperator.BETWEEN, EFilterOperator.LESS, EFilterOperator.LESSEQUALS, EFilterOperator.EQUALS];\r\n case EFilterTypes.TIME:\r\n case EFilterTypes.PACE:\r\n return [EFilterOperator.GREATER, EFilterOperator.GREATEREQUALS, EFilterOperator.BETWEEN, EFilterOperator.LESS, EFilterOperator.LESSEQUALS, EFilterOperator.EQUALS];\r\n default:\r\n return [EFilterOperator.GREATER, EFilterOperator.GREATEREQUALS, EFilterOperator.BETWEEN, EFilterOperator.LESS, EFilterOperator.LESSEQUALS, EFilterOperator.EQUALS];\r\n }\r\n }\r\n\r\n private _getTypeDependentValue(): string | number {\r\n if (this.type === EFilterTypes.STRING) {\r\n return `'${this.value}'`;\r\n }\r\n\r\n if (this.type === EFilterTypes.TIME) {\r\n if (!(this.value as string).includes(':')) {\r\n console.warn(this.value, 'not a valid time');\r\n return 0;\r\n }\r\n const minutesSeconds = (this.value as string).split(':');\r\n return parseInt(minutesSeconds[0], 10) * 60 + parseInt(minutesSeconds[1], 10);\r\n }\r\n\r\n return this.value!;\r\n }\r\n\r\n private _getODataOperator(): string {\r\n switch (this.operator) {\r\n case EFilterOperator.EQUALS:\r\n return 'eq';\r\n case EFilterOperator.LESS:\r\n return 'lt';\r\n case EFilterOperator.LESSEQUALS:\r\n return 'le';\r\n case EFilterOperator.GREATER:\r\n return 'gt';\r\n case EFilterOperator.GREATEREQUALS:\r\n return 'ge';\r\n case EFilterOperator.BETWEEN:\r\n return 'between';\r\n case EFilterOperator.CONTAINS:\r\n return 'contains';\r\n default:\r\n return 'eq';\r\n }\r\n }\r\n}\r\n","import { Component, OnInit, inject, input, model, signal } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { DialogService } from 'primeng/dynamicdialog';\r\nimport { IBaseDbCreateDto } from '../../core/dtos/base-db-create.dto';\r\nimport { IBaseDbResponseDto } from '../../core/dtos/base-db-response.dto';\r\nimport { IBaseDbUpdateDto } from '../../core/dtos/base-db-update.dto';\r\nimport { BaseDbModel } from '../../core/models/base-db.model';\r\nimport { MappedApiError } from '../../core/models/mapped-api-response.model';\r\nimport { MappedOdataResponse } from '../../core/models/mapped-odata-response.model';\r\nimport { ODataPagination } from '../../core/models/odata/odata-pagination.model';\r\nimport { OData } from '../../core/models/odata/odata.model';\r\nimport { BaseDbApiService } from '../../core/services/base-db-api.service';\r\nimport { BaseDisplayModalComponent } from './base-display/base-display-modal/base-display-modal.component';\r\nimport { IDisplayModalReturnObject } from './base-display/base-display.component';\r\n\r\n@Component({\r\n selector: 'sftech-pages-base-list',\r\n standalone: true,\r\n imports: [],\r\n template: '<div></div>',\r\n styles: '',\r\n})\r\nexport abstract class BaseListComponent<TDbModel extends BaseDbModel, TCreateDto extends IBaseDbCreateDto, TUpdateDto extends IBaseDbUpdateDto, TResponseDto extends IBaseDbResponseDto> implements OnInit {\r\n public odata = model<OData>(new OData());\r\n\r\n public showPageTitle = input<boolean>(true);\r\n public canEdit = input<boolean>(true);\r\n public openDisplayAsModal = input<boolean>(true);\r\n\r\n public data = signal<undefined | TDbModel[]>(undefined);\r\n\r\n protected router = inject(Router);\r\n\r\n private modalService = inject(DialogService);\r\n\r\n protected abstract _repo: BaseDbApiService<TDbModel, TCreateDto, TUpdateDto, TResponseDto>;\r\n protected abstract _route: string;\r\n protected abstract _modalComponent: typeof BaseDisplayModalComponent;\r\n protected abstract detailModalHeaderText: string;\r\n\r\n public constructor() {}\r\n\r\n public ngOnInit(): void {\r\n this._loadData();\r\n }\r\n\r\n public updatePagination($event: ODataPagination) {\r\n this.odata.update((odata) => {\r\n const odataNew = new OData();\r\n odataNew.pagination = $event;\r\n odataNew.filter = odata.filter;\r\n odataNew.order = odata.order;\r\n odataNew.expands = odata.expands;\r\n return odataNew;\r\n });\r\n this._loadData();\r\n }\r\n\r\n public openDisplay(id?: number) {\r\n if (this.openDisplayAsModal()) {\r\n const modalRef = this.modalService.open(this._modalComponent, { inputValues: { id, canEdit: this.canEdit(), openedAsModal: true }, focusOnShow: false, modal: true, dismissableMask: true, width: '70%', contentStyle: { overflow: 'auto' } });\r\n modalRef.onClose.subscribe((result: IDisplayModalReturnObject) => {\r\n if (result) {\r\n this.data.update((data) => {\r\n const index = data?.findIndex((item) => item.id === result.id);\r\n if (index !== undefined && index >= 0) {\r\n data![index] = result.data! as TDbModel;\r\n } else {\r\n data!.push(result.data! as TDbModel);\r\n }\r\n return data;\r\n });\r\n }\r\n });\r\n return;\r\n }\r\n\r\n this.router.navigate([this._route, id]);\r\n }\r\n\r\n private _loadData() {\r\n this._repo.odata(this.odata()).subscribe((response: MappedOdataResponse<TDbModel> | MappedApiError) => {\r\n if (response instanceof MappedApiError) {\r\n console.error(response);\r\n return;\r\n }\r\n this.data.set(response.data.items);\r\n if (!response.data) {\r\n return;\r\n }\r\n this.odata.update((odata) => {\r\n const odataNew = new OData();\r\n odataNew.pagination = response.data.pagination;\r\n odataNew.filter = odata.filter;\r\n odataNew.order = odata.order;\r\n odataNew.expands = odata.expands;\r\n return odataNew;\r\n });\r\n });\r\n }\r\n}\r\n","import { Component, Input, OnInit, effect, inject, input, signal } from '@angular/core';\r\nimport { FormControl, FormGroup } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { MessageService } from 'primeng/api';\r\nimport { DynamicDialogRef } from 'primeng/dynamicdialog';\r\nimport { Observable, map, of, switchMap } from 'rxjs';\r\nimport { IBaseDbCreateDto } from '../../../core/dtos/base-db-create.dto';\r\nimport { IBaseDbResponseDto } from '../../../core/dtos/base-db-response.dto';\r\nimport { IBaseDbUpdateDto } from '../../../core/dtos/base-db-update.dto';\r\nimport { BaseDbModel, IBaseDbModel } from '../../../core/models/base-db.model';\r\nimport { MappedApiError, MappedApiResponse } from '../../../core/models/mapped-api-response.model';\r\nimport { BaseDbApiService } from '../../../core/services/base-db-api.service';\r\nimport { IconProvider } from '../../../providers/icon.provider';\r\n\r\n@Component({\r\n selector: 'lib-core-base-display',\r\n standalone: true,\r\n imports: [],\r\n template: '<div></div>',\r\n styles: '',\r\n})\r\nexport abstract class BaseDisplayComponent<TDbModel extends BaseDbModel, TCreateDto extends IBaseDbCreateDto, TUpdateDto extends IBaseDbUpdateDto, TResponseDto extends IBaseDbResponseDto> implements OnInit {\r\n @Input() public id: undefined | number;\r\n @Input() public openedAsModal = false;\r\n @Input() public canEdit = true;\r\n\r\n public redirectAfterSave = true;\r\n\r\n protected ref = inject(DynamicDialogRef);\r\n\r\n public form!: FormGroup;\r\n public model = signal<TDbModel | undefined>(undefined);\r\n public isNew = signal<boolean>(true);\r\n public iconProvider = IconProvider;\r\n protected abstract _repo: BaseDbApiService<TDbModel, TCreateDto, TUpdateDto, TResponseDto>;\r\n protected abstract _route: string;\r\n protected router = inject(Router);\r\n protected activatedRoute = inject(ActivatedRoute);\r\n protected toastr = inject(MessageService);\r\n\r\n protected constructor() {\r\n effect(() => {\r\n if (this.model()) {\r\n this.form = this.initializeForm();\r\n if (!this.canEdit) {\r\n for (const control in this.form.controls) {\r\n this.form.controls[control].disable();\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n public ngOnInit(): void {\r\n if (this.id) {\r\n this._loadData(this.id!).subscribe((res: MappedApiResponse<TDbModel> | MappedApiError) => {\r\n if (res instanceof MappedApiError) {\r\n this.toastr.add({ severity: 'error', detail: 'Beim Laden der Daten ist ein Fehler aufgetreten' });\r\n throw new Error(res.messages ? res.messages.join(' | ') : 'Beim Laden der Daten ist ein Fehler aufgetreten');\r\n }\r\n this.model.set(res.data as TDbModel);\r\n this.isNew.set(false);\r\n if (this.form) {\r\n this.form.patchValue(this.model()!);\r\n this.form.markAsUntouched();\r\n }\r\n });\r\n } else {\r\n this.model.set(this.getNewModel());\r\n this.isNew.set(true);\r\n if (this.form) {\r\n this.form.patchValue(this.model()!);\r\n this.form.markAsUntouched();\r\n }\r\n }\r\n }\r\n\r\n public async submitForm(): Promise<void> {\r\n let obs: Observable<MappedApiResponse<TDbModel> | MappedApiError>;\r\n if (!this.form.valid) {\r\n return;\r\n }\r\n if (this.model()!.id) {\r\n const dto = this.mapFormToUpdateDto();\r\n obs = this._repo.update(this.model()!.id!, dto);\r\n } else {\r\n const dto = this.mapFormToCreateDto();\r\n obs = this._repo.insert(dto);\r\n }\r\n obs.subscribe((res) => {\r\n if (res.isError) {\r\n this.toastr.add({ severity: 'error', detail: 'Beim Speichern der Daten ist ein Fehler aufgetreten' });\r\n throw new Error(res.messages ? res.messages.join(' | ') : 'Beim Speichern der Daten ist ein Fehler aufgetreten');\r\n }\r\n this.model.set(res.data as TDbModel);\r\n this.toastr.add({ severity: 'success', detail: `Datensatz mit der Id '${this.model()!.id}' erfolgreich gespeichert` });\r\n if (this.redirectAfterSave) {\r\n this.goBack({ operation: this.model()!.id ? 'update' : 'create', id: this.model()!.id, data: res.data as IBaseDbModel });\r\n }\r\n });\r\n }\r\n\r\n public deleteData(): void {\r\n if (!this.model()!.id) {\r\n this.model.set(this.getNewModel());\r\n this.form.patchValue(this.model);\r\n return;\r\n }\r\n this._repo.delete(this.model()!.id!).subscribe((res) => {\r\n if (res.isError) {\r\n this.toastr.add({ severity: 'error', detail: 'Beim Löschen der Daten ist ein Fehler aufgetreten' });\r\n throw new Error(res.messages ? res.messages.join(' | ') : 'Beim Löschen der Daten ist ein Fehler aufgetreten');\r\n }\r\n this.toastr.add({ severity: 'success', detail: `Datensatz mit der Id '${this.model()!.id}' erfolgreich gelöscht` });\r\n this.goBack({ operation: 'delete', id: this.model()!.id });\r\n });\r\n }\r\n\r\n public getFormControl(property: string): FormControl | undefined {\r\n return this.form.get(property) as FormControl;\r\n }\r\n\r\n public goBack(retVal: IDisplayModalReturnObject = { operation: 'aborted' }): void {\r\n if (this.openedAsModal) {\r\n this.close(retVal);\r\n return;\r\n }\r\n this.router.navigate([this._route]);\r\n }\r\n\r\n private _loadData(id: number): Observable<MappedApiResponse<TDbModel>> {\r\n if (id) {\r\n return this._repo.get(id, true).pipe(\r\n map((res) => {\r\n if (res instanceof MappedApiError) {\r\n this.toastr.add({ severity: 'error', detail: 'Beim Laden der Daten ist ein Fehler aufgetreten' });\r\n throw new Error(res.messages ? res.messages.join(' | ') : 'Beim Laden der Daten ist ein Fehler aufgetreten');\r\n }\r\n return res;\r\n }),\r\n );\r\n }\r\n const mappedApiResponse = new MappedApiResponse<TDbModel>();\r\n mappedApiResponse.data = this.model();\r\n return of(mappedApiResponse);\r\n }\r\n\r\n protected abstract initializeForm(): FormGroup;\r\n\r\n protected abstract getNewModel(): TDbModel;\r\n\r\n protected abstract mapFormToUpdateDto(): TUpdateDto;\r\n\r\n protected abstract mapFormToCreateDto(): TCreateDto;\r\n\r\n public close(retVal: IDisplayModalReturnObject = { operation: 'aborted' }): void {\r\n this.ref.close(retVal);\r\n }\r\n}\r\n\r\nexport interface IDisplayModalReturnObject {\r\n operation: 'create' | 'update' | 'delete' | 'aborted';\r\n data?: IBaseDbModel;\r\n id?: number;\r\n}\r\n","import { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'lib-prompt-display-modal',\r\n standalone: true,\r\n imports: [],\r\n template: '',\r\n styles: '',\r\n})\r\nexport class BaseDisplayModalComponent {\r\n public id!: number | undefined;\r\n public canEdit = true;\r\n}\r\n","import { Component, input } from '@angular/core';\nimport {AbstractControl, FormControl} from '@angular/forms';\n\n@Component({\n selector: 'sftech-form-error-display',\n standalone: true,\n imports: [],\n templateUrl: './form-error-display.component.html',\n styleUrl: './form-error-display.component.css',\n})\nexport class FormErrorDisplayComponent {\n public control = input<AbstractControl | undefined>(undefined);\n public label = input<string | undefined>(undefined);\n}\n","@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","import { Component, EventEmitter, Input, Output, computed } from '@angular/core';\r\nimport { Paginator, PaginatorModule, PaginatorState } from 'primeng/paginator';\r\nimport { ODataPagination } from '../../core/models/odata/odata-pagination.model';\r\n\r\n@Component({\r\n selector: 'sftech-paginator',\r\n standalone: true,\r\n imports: [PaginatorModule],\r\n templateUrl: './paginator.component.html',\r\n styleUrl: './paginator.component.css',\r\n})\r\nexport class PaginatorComponent {\r\n @Input() pagination!: ODataPagination;\r\n @Output() public odataChanged = new EventEmitter<ODataPagination>();\r\n // public amountOfPageNumbersToShow = 5;\r\n // public pageNumbers = computed(() => {\r\n // const currentPage = this.pagination!.page;\r\n // const totalPages = this.pagination!.totalPages;\r\n //\r\n // if (totalPages <= this.amountOfPageNumbersToShow) {\r\n // // Wenn die Gesamtseiten kleiner als oder gleich der sichtbaren Seiten sind\r\n // return Array.from({ length: totalPages }, (_, i) => i + 1);\r\n // }\r\n //\r\n // const pagination: number[] = []; // Immer mit 1 starten\r\n //\r\n // // Bereich in der Mitte berechnen\r\n // const middleCount = this.amountOfPageNumbersToShow - 2; // Plätze für Mitte (ohne 1 und x)\r\n // const half = Math.floor(middleCount / 2);\r\n //\r\n // let start = Math.max(2, currentPage - half); // Startpunkt der Mitte\r\n // let end = Math.min(totalPages - 1, currentPage + half); // Endpunkt der Mitte\r\n //\r\n // // Anpassen, falls die Mitte den Anfang oder das Ende überschreitet\r\n // if (end - start < middleCount - 1) {\r\n // if (start === 2) {\r\n // end = start + middleCount - 1;\r\n // } else if (end === totalPages - 1) {\r\n // start = end - middleCount + 1;\r\n // }\r\n // }\r\n //\r\n // // Mittlere Zahlen hinzufügen\r\n // for (let i = start; i <= end; i++) {\r\n // pagination.push(i);\r\n // }\r\n //\r\n // return pagination;\r\n // });\r\n //\r\n // public changePage(pageNumber: number) {\r\n // this.pagination.page = pageNumber;\r\n // this.odataChanged.emit(this.pagination);\r\n // }\r\n\r\n onPageChange(event: PaginatorState) {\r\n if (event.page !== undefined) {\r\n this.pagination.page = event.page + 1;\r\n }\r\n this.pagination.pageSize = event.rows ?? 10;\r\n this.odataChanged.emit(this.pagination);\r\n }\r\n}\r\n","<!--<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>","import { HttpClient, HttpErrorResponse } from '@angular/common/http';\r\nimport { Injectable } from '@angular/core';\r\nimport { Observable, catchError, map, of } from 'rxjs';\r\nimport { BaseDbModel } from '../models/base-db.model';\r\nimport { MappedApiError, MappedApiResponse } from '../models/mapped-api-response.model';\r\nimport { MappedOdataResponse } from '../models/mapped-odata-response.model';\r\nimport { ODataPagination } from '../models/odata/odata-pagination.model';\r\nimport { OData } from '../models/odata/odata.model';\r\nimport { IBaseDbCreateDto } from '../dtos/base-db-create.dto';\r\nimport {IBaseDbUpdateDto} from \"../dtos/base-db-update.dto\";\r\nimport { IBaseDbResponseDto } from '../dtos/base-db-response.dto';\r\nimport { IAppConfig } from '../configuration/app-config.interface';\r\nimport {IApiResponse} from \"../dtos/api-response.dto\";\r\nimport {IOdataResponseDto} from \"../dtos/odata-response.dto\";\r\n\r\nexport abstract class BaseDbApiService<TModel extends BaseDbModel, TCreateDto extends IBaseDbCreateDto, TUpdateDto extends IBaseDbUpdateDto, TResponseDto extends IBaseDbResponseDto> {\r\n protected url!: string;\r\n\r\n constructor(\r\n protected readonly http: HttpClient,\r\n protected readonly config: IAppConfig,\r\n ) {}\r\n\r\n public get(id: number, detailed: boolean = false): Observable<MappedApiResponse<TModel> | MappedApiError> {\r\n let url = `${this.url}/${id}`;\r\n console.log(url)\r\n if (detailed) {\r\n url = `${url}/?detailed=${detailed}`;\r\n }\r\n return this.http.get<IApiResponse<TResponseDto>>(url).pipe(\r\n map((response: IApiResponse<TResponseDto>) => this._responseMapping(response)),\r\n catchError((error) => {\r\n return this._httpErrorToApiResponse(error);\r\n }),\r\n );\r\n }\r\n\r\n public getAll(): Observable<MappedOdataResponse<TModel> | MappedApiError> {\r\n const odata = new OData();\r\n return this.odata(odata);\r\n }\r\n\r\n public odata(odataQuery: OData): Observable<MappedOdataResponse<TModel> | MappedApiError> {\r\n return this.http.get<IApiResponse<IOdataResponseDto<TResponseDto>>>(`${this.url}/${odataQuery.toGetParameter()}`).pipe(\r\n map((response: IApiResponse<IOdataResponseDto<TResponseDto>>) => this._responseOdataMapping(response)),\r\n catchError((error) => {\r\n return this._httpErrorToApiResponse(error);\r\n }),\r\n );\r\n }\r\n\r\n public insert(dto: TCreateDto): Observable<MappedApiResponse<TModel> | MappedApiError> {\r\n return this.http.post<IApiResponse<TResponseDto>>(this.url, dto).pipe(\r\n map((response: IApiResponse<TResponseDto>) => this._responseMapping(response)),\r\n catchError((error) => {\r\n return this._httpErrorToApiResponse(error);\r\n }),\r\n );\r\n }\r\n\r\n public update(id: number, dto: TUpdateDto): Observable<MappedApiResponse<TModel> | MappedApiError> {\r\n return this.http.put<IApiResponse<TResponseDto>>(`${this.url}/${id}`, dto).pipe(\r\n map((response: IApiResponse<TResponseDto>) => this._responseMapping(response)),\r\n catchError((error) => {\r\n return this._httpErrorToApiResponse(error);\r\n }),\r\n );\r\n }\r\n\r\n public delete(id: number): Observable<MappedApiResponse<TModel> | MappedApiError> {\r\n return this.http.delete<IApiResponse<TResponseDto>>(`${this.url}/${id}`).pipe(\r\n map((response: IApiResponse<TResponseDto>) => {\r\n const apiReponse = new MappedApiResponse<TModel>();\r\n apiReponse.status = response.status;\r\n apiReponse.messages = response.messages ? response.messages : [];\r\n apiReponse.isError = false;\r\n return apiReponse;\r\n }),\r\n catchError((error) => {\r\n return this._httpErrorToApiResponse(error);\r\n }),\r\n );\r\n }\r\n\r\n protected abstract getNewModel(): TModel;\r\n\r\n private _responseOdataMapping(response: IApiResponse<IOdataResponseDto<TResponseDto>>): MappedOdataResponse<TModel> {\r\n const odataResponse = new MappedOdataResponse<TModel>();\r\n odataResponse.data.items = this.getNewModel().fromDtos((response.data as IOdataResponseDto<TResponseDto>)?.items) as TModel[];\r\n odataResponse.data.pagination = ODataPagination.fromDto((response.data as IOdataResponseDto<TResponseDto>).pagination);\r\n return odataResponse;\r\n }\r\n\r\n private _responseMapping(response: IApiResponse<TResponseDto>): MappedApiResponse<TModel> | MappedApiError {\r\n if (![200, 201, 202].includes(response.status)) {\r\n return this._errorHandling(response.status, response.messages);\r\n }\r\n const apiResponse = new MappedApiResponse<TModel>();\r\n apiResponse.status = response.status;\r\n apiResponse.messages = response.messages ? response.messages : [];\r\n apiResponse.isError = false;\r\n\r\n let mappedData: TModel | TModel[] | undefined;\r\n\r\n if (Array.isArray(response.data)) {\r\n mappedData = this.getNewModel().fromDtos(response.data) as TModel[];\r\n } else {\r\n mappedData = this.getNewModel().fromDto(response.data as TResponseDto) as TModel;\r\n }\r\n\r\n apiResponse.data = mappedData;\r\n return apiResponse;\r\n }\r\n\r\n private _errorHandling(statusCode: number, messages: string[] | undefined) {\r\n const apiResponse = new MappedApiError();\r\n apiResponse.status = statusCode;\r\n apiResponse.messages = messages ? messages : [];\r\n apiResponse.isError = true;\r\n return apiResponse;\r\n }\r\n\r\n private _httpErrorToApiResponse(error: HttpErrorResponse) {\r\n const messages: string[] = [];\r\n if (error.message) {\r\n messages.push(error.message);\r\n }\r\n if (error.error?.messages) {\r\n messages.push(...error.error.messages);\r\n }\r\n return of(this._errorHandling(error.status, messages));\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -3,12 +3,12 @@ import { FormControl, FormGroup } from '@angular/forms';
|
|
|
3
3
|
import { ActivatedRoute, Router } from '@angular/router';
|
|
4
4
|
import { MessageService } from 'primeng/api';
|
|
5
5
|
import { DynamicDialogRef } from 'primeng/dynamicdialog';
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { IBaseDbUpdateDto } from
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
6
|
+
import { IBaseDbCreateDto } from '../../../core/dtos/base-db-create.dto';
|
|
7
|
+
import { IBaseDbResponseDto } from '../../../core/dtos/base-db-response.dto';
|
|
8
|
+
import { IBaseDbUpdateDto } from '../../../core/dtos/base-db-update.dto';
|
|
9
|
+
import { BaseDbModel, IBaseDbModel } from '../../../core/models/base-db.model';
|
|
10
|
+
import { BaseDbApiService } from '../../../core/services/base-db-api.service';
|
|
11
|
+
import { IconProvider } from '../../../providers/icon.provider';
|
|
12
12
|
import * as i0 from "@angular/core";
|
|
13
13
|
export declare abstract class BaseDisplayComponent<TDbModel extends BaseDbModel, TCreateDto extends IBaseDbCreateDto, TUpdateDto extends IBaseDbUpdateDto, TResponseDto extends IBaseDbResponseDto> implements OnInit {
|
|
14
14
|
id: undefined | number;
|
|
@@ -17,7 +17,8 @@ export declare abstract class BaseDisplayComponent<TDbModel extends BaseDbModel,
|
|
|
17
17
|
redirectAfterSave: boolean;
|
|
18
18
|
protected ref: DynamicDialogRef<any>;
|
|
19
19
|
form: FormGroup;
|
|
20
|
-
model: import("@angular/core").WritableSignal<TDbModel>;
|
|
20
|
+
model: import("@angular/core").WritableSignal<TDbModel | undefined>;
|
|
21
|
+
isNew: import("@angular/core").WritableSignal<boolean>;
|
|
21
22
|
iconProvider: typeof IconProvider;
|
|
22
23
|
protected abstract _repo: BaseDbApiService<TDbModel, TCreateDto, TUpdateDto, TResponseDto>;
|
|
23
24
|
protected abstract _route: string;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { OnInit } from '@angular/core';
|
|
2
2
|
import { Router } from '@angular/router';
|
|
3
|
+
import { IBaseDbCreateDto } from '../../core/dtos/base-db-create.dto';
|
|
4
|
+
import { IBaseDbResponseDto } from '../../core/dtos/base-db-response.dto';
|
|
5
|
+
import { IBaseDbUpdateDto } from '../../core/dtos/base-db-update.dto';
|
|
3
6
|
import { BaseDbModel } from '../../core/models/base-db.model';
|
|
4
7
|
import { ODataPagination } from '../../core/models/odata/odata-pagination.model';
|
|
5
8
|
import { OData } from '../../core/models/odata/odata.model';
|
|
6
9
|
import { BaseDbApiService } from '../../core/services/base-db-api.service';
|
|
7
|
-
import {
|
|
8
|
-
import { IBaseDbUpdateDto } from "../../core/dtos/base-db-update.dto";
|
|
9
|
-
import { IBaseDbResponseDto } from "../../core/dtos/base-db-response.dto";
|
|
10
|
-
import { BaseDisplayModalComponent } from "./base-display/base-display-modal/base-display-modal.component";
|
|
10
|
+
import { BaseDisplayModalComponent } from './base-display/base-display-modal/base-display-modal.component';
|
|
11
11
|
import * as i0 from "@angular/core";
|
|
12
12
|
export declare abstract class BaseListComponent<TDbModel extends BaseDbModel, TCreateDto extends IBaseDbCreateDto, TUpdateDto extends IBaseDbUpdateDto, TResponseDto extends IBaseDbResponseDto> implements OnInit {
|
|
13
13
|
odata: import("@angular/core").ModelSignal<OData>;
|
|
@@ -24,7 +24,7 @@ export declare abstract class BaseListComponent<TDbModel extends BaseDbModel, TC
|
|
|
24
24
|
constructor();
|
|
25
25
|
ngOnInit(): void;
|
|
26
26
|
updatePagination($event: ODataPagination): void;
|
|
27
|
-
openDisplay(id
|
|
27
|
+
openDisplay(id?: number): void;
|
|
28
28
|
private _loadData;
|
|
29
29
|
static ɵfac: i0.ɵɵFactoryDeclaration<BaseListComponent<any, any, any, any>, never>;
|
|
30
30
|
static ɵcmp: i0.ɵɵComponentDeclaration<BaseListComponent<any, any, any, any>, "sftech-pages-base-list", never, { "odata": { "alias": "odata"; "required": false; "isSignal": true; }; "showPageTitle": { "alias": "showPageTitle"; "required": false; "isSignal": true; }; "canEdit": { "alias": "canEdit"; "required": false; "isSignal": true; }; "openDisplayAsModal": { "alias": "openDisplayAsModal"; "required": false; "isSignal": true; }; }, { "odata": "odataChange"; }, never, never, true, never>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export declare class IconProvider {
|
|
2
|
+
static readonly add: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
2
3
|
static readonly close: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
3
4
|
static readonly delete: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
4
5
|
static readonly menu: import("@fortawesome/fontawesome-common-types").IconDefinition;
|