@sftech/ng-shared 0.0.9 → 0.0.10
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 +33 -34
- package/fesm2022/sftech-ng-shared.mjs.map +1 -1
- package/lib/components/pages/base-display/base-display.component.d.ts +2 -6
- package/lib/providers/icon.provider.d.ts +1 -0
- package/lib/ui/layouts/base-dialog/base-dialog.component.d.ts +4 -2
- package/package.json +1 -1
|
@@ -2,16 +2,16 @@ import { definePreset } from '@primeng/themes';
|
|
|
2
2
|
import Aura from '@primeng/themes/aura';
|
|
3
3
|
import { NgTemplateOutlet } from '@angular/common';
|
|
4
4
|
import * as i0 from '@angular/core';
|
|
5
|
-
import { EventEmitter, input, Output, Component, ViewChild, ContentChild, Input, model, signal,
|
|
5
|
+
import { EventEmitter, input, Output, Component, ViewChild, ContentChild, Input, inject, model, signal, effect } from '@angular/core';
|
|
6
6
|
import { FaIconComponent } from '@fortawesome/angular-fontawesome';
|
|
7
7
|
import { Button } from 'primeng/button';
|
|
8
8
|
import { Drawer } from 'primeng/drawer';
|
|
9
9
|
import { Toast } from 'primeng/toast';
|
|
10
|
-
import { faPlus, faClose, faTrash, faBars } from '@fortawesome/free-solid-svg-icons';
|
|
10
|
+
import { faPlus, faClose, faTrash, faQuestion, 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
|
-
import {
|
|
14
|
+
import { DynamicDialogRef, DialogService } from 'primeng/dynamicdialog';
|
|
15
15
|
import { MessageService } from 'primeng/api';
|
|
16
16
|
import { map, of, catchError } from 'rxjs';
|
|
17
17
|
import * as i1 from 'primeng/paginator';
|
|
@@ -39,16 +39,17 @@ class IconProvider {
|
|
|
39
39
|
static add = faPlus;
|
|
40
40
|
static close = faClose;
|
|
41
41
|
static delete = faTrash;
|
|
42
|
+
static help = faQuestion;
|
|
42
43
|
static menu = faBars;
|
|
43
44
|
}
|
|
44
45
|
|
|
45
46
|
class SidebarNavigationComponent {
|
|
46
47
|
closeDrawer = new EventEmitter();
|
|
47
48
|
navigation = input([]);
|
|
48
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
49
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.
|
|
49
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SidebarNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
50
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: SidebarNavigationComponent, isStandalone: true, selector: "sftech-sidebar-navigation", inputs: { navigation: { classPropertyName: "navigation", publicName: "navigation", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closeDrawer: "closeDrawer" }, ngImport: i0, template: "<ul class=\"list-none p-4 m-0\">\r\n @for (category of navigation(); track category) {\r\n <li>\r\n <div\r\n pRipple\r\n pStyleClass=\"@next\"\r\n enterFromClass=\"hidden\"\r\n enterActiveClass=\"animate-slidedown\"\r\n leaveToClass=\"hidden\"\r\n leaveActiveClass=\"animate-slideup\"\r\n class=\"py-2 flex items-center justify-between cursor-pointer p-ripple\"\r\n >\r\n @if (category.icon) {\r\n <fa-icon [icon]=\"category.icon\"></fa-icon>\r\n }\r\n <span class=\"font-bold\">{{ category.categoryName }}</span>\r\n </div>\r\n <ul class=\"list-none p-0 m-0 overflow-hidden\">\r\n @for (link of category.links; track link) {\r\n <li class=\"py-1\">\r\n <a [routerLink]=\"[link.routerLink]\" (click)=\"closeDrawer.emit()\" pRipple class=\"flex items-center cursor-pointer px-4 py-2.5 rounded-border hover:bg-primary-50 duration-150 transition-colors p-ripple\">\r\n @if (link.icon) {\r\n <fa-icon [icon]=\"link.icon\"></fa-icon>\r\n }\r\n <span class=\"font-medium\">{{ link.name}}</span>\r\n </a>\r\n </li>\r\n }\r\n </ul>\r\n </li>\r\n }\r\n</ul>", styles: [""], dependencies: [{ kind: "directive", type: Ripple, selector: "[pRipple]" }, { kind: "directive", type: StyleClass, selector: "[pStyleClass]", inputs: ["pStyleClass", "enterClass", "enterFromClass", "enterActiveClass", "enterToClass", "leaveClass", "leaveFromClass", "leaveActiveClass", "leaveToClass", "hideOnOutsideClick", "toggleClass", "hideOnEscape"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
50
51
|
}
|
|
51
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
52
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: SidebarNavigationComponent, decorators: [{
|
|
52
53
|
type: Component,
|
|
53
54
|
args: [{ selector: 'sftech-sidebar-navigation', imports: [
|
|
54
55
|
Ripple,
|
|
@@ -74,10 +75,10 @@ class HeadMainFooterWithCanvasComponent {
|
|
|
74
75
|
closeCallback(e) {
|
|
75
76
|
this.drawerRef.close(e);
|
|
76
77
|
}
|
|
77
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
78
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.
|
|
78
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HeadMainFooterWithCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
79
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: HeadMainFooterWithCanvasComponent, isStandalone: true, selector: "sftech-head-main-footer-with-canvas", inputs: { title: "title", maxWidth: "maxWidth", navigationItems: "navigationItems", hasDrawer: "hasDrawer" }, queries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "main", first: true, predicate: ["main"], descendants: true }, { propertyName: "footer", first: true, predicate: ["footer"], descendants: true }], viewQueries: [{ propertyName: "drawerRef", first: true, predicate: ["drawerRef"], descendants: true }], ngImport: i0, template: "<div class=\"h-screen flex flex-col justify-between\">\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"] }] });
|
|
79
80
|
}
|
|
80
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
81
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HeadMainFooterWithCanvasComponent, decorators: [{
|
|
81
82
|
type: Component,
|
|
82
83
|
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}" }]
|
|
83
84
|
}], propDecorators: { title: [{
|
|
@@ -112,14 +113,16 @@ class BaseDialogComponent {
|
|
|
112
113
|
body = null;
|
|
113
114
|
footer = null;
|
|
114
115
|
iconProvider = IconProvider;
|
|
116
|
+
ref = inject(DynamicDialogRef);
|
|
115
117
|
constructor() { }
|
|
116
|
-
close() {
|
|
118
|
+
close(retVal = undefined) {
|
|
119
|
+
this.ref.close(retVal);
|
|
117
120
|
this.closed.emit();
|
|
118
121
|
}
|
|
119
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
120
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.
|
|
122
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
123
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: BaseDialogComponent, isStandalone: true, selector: "sftech-base-dialog", inputs: { hasHeader: { classPropertyName: "hasHeader", publicName: "hasHeader", isSignal: true, isRequired: false, transformFunction: null }, hasFooter: { classPropertyName: "hasFooter", publicName: "hasFooter", isSignal: true, isRequired: false, transformFunction: null }, showButtons: { classPropertyName: "showButtons", publicName: "showButtons", isSignal: true, isRequired: false, transformFunction: null }, headerText: { classPropertyName: "headerText", publicName: "headerText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closed: "closed" }, queries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "body", first: true, predicate: ["body"], descendants: true }, { propertyName: "footer", first: true, predicate: ["footer"], descendants: true }], ngImport: i0, template: "<!--<p-dialog [(visible)]=\"visible\" [modal]=\"true\" [style]=\"{ width: '25rem' }\">-->\r\n<!-- <ng-template #header>-->\r\n<!-- <div class=\"inline-flex items-center justify-center gap-2\">-->\r\n<!-- <span class=\"font-bold whitespace-nowrap\">Amy Elsner</span>-->\r\n<!-- </div>-->\r\n<!-- </ng-template>-->\r\n<!-- <span class=\"text-surface-500 dark:text-surface-400 block mb-8\">Update your information.</span>-->\r\n<!-- <div class=\"flex items-center gap-4 mb-4\">-->\r\n<!-- <label for=\"username\" class=\"font-semibold w-24\">Username</label>-->\r\n<!-- <input pInputText id=\"username\" class=\"flex-auto\" autocomplete=\"off\" />-->\r\n<!-- </div>-->\r\n<!-- <div class=\"flex items-center gap-4 mb-2\">-->\r\n<!-- <label for=\"email\" class=\"font-semibold w-24\">Email</label>-->\r\n<!-- <input pInputText id=\"email\" class=\"flex-auto\" autocomplete=\"off\" />-->\r\n<!-- </div>-->\r\n<!-- <ng-template #footer>-->\r\n<!-- <p-button label=\"Cancel\" [text]=\"true\" severity=\"secondary\" (click)=\"visible = false\" />-->\r\n<!-- <p-button label=\"Save\" [outlined]=\"true\" severity=\"secondary\" (click)=\"visible = false\" />-->\r\n<!-- </ng-template>-->\r\n<!--</p-dialog>-->\r\n\r\n@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"] }] });
|
|
121
124
|
}
|
|
122
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
125
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseDialogComponent, decorators: [{
|
|
123
126
|
type: Component,
|
|
124
127
|
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}" }]
|
|
125
128
|
}], ctorParameters: () => [], propDecorators: { closed: [{
|
|
@@ -462,28 +465,27 @@ class BaseListComponent {
|
|
|
462
465
|
});
|
|
463
466
|
});
|
|
464
467
|
}
|
|
465
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
466
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.
|
|
468
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
469
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.14", type: BaseListComponent, isStandalone: true, selector: "sftech-pages-base-list", inputs: { odata: { classPropertyName: "odata", publicName: "odata", isSignal: true, isRequired: false, transformFunction: null }, showPageTitle: { classPropertyName: "showPageTitle", publicName: "showPageTitle", isSignal: true, isRequired: false, transformFunction: null }, canEdit: { classPropertyName: "canEdit", publicName: "canEdit", isSignal: true, isRequired: false, transformFunction: null }, openDisplayAsModal: { classPropertyName: "openDisplayAsModal", publicName: "openDisplayAsModal", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { odata: "odataChange" }, ngImport: i0, template: '<div></div>', isInline: true, styles: [""] });
|
|
467
470
|
}
|
|
468
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
471
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseListComponent, decorators: [{
|
|
469
472
|
type: Component,
|
|
470
473
|
args: [{ selector: 'sftech-pages-base-list', standalone: true, imports: [], template: '<div></div>' }]
|
|
471
474
|
}], ctorParameters: () => [] });
|
|
472
475
|
|
|
473
|
-
class BaseDisplayComponent {
|
|
476
|
+
class BaseDisplayComponent extends BaseDialogComponent {
|
|
474
477
|
id;
|
|
475
478
|
openedAsModal = false;
|
|
476
479
|
canEdit = true;
|
|
477
480
|
redirectAfterSave = true;
|
|
478
|
-
ref = inject(DynamicDialogRef);
|
|
479
481
|
form;
|
|
480
482
|
model = signal(undefined);
|
|
481
483
|
isNew = signal(true);
|
|
482
|
-
iconProvider = IconProvider;
|
|
483
484
|
router = inject(Router);
|
|
484
485
|
activatedRoute = inject(ActivatedRoute);
|
|
485
486
|
toastr = inject(MessageService);
|
|
486
487
|
constructor() {
|
|
488
|
+
super();
|
|
487
489
|
effect(() => {
|
|
488
490
|
if (this.model()) {
|
|
489
491
|
this.form = this.initializeForm();
|
|
@@ -583,13 +585,10 @@ class BaseDisplayComponent {
|
|
|
583
585
|
mappedApiResponse.data = this.model();
|
|
584
586
|
return of(mappedApiResponse);
|
|
585
587
|
}
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
}
|
|
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: [""] });
|
|
588
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
589
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: BaseDisplayComponent, isStandalone: true, selector: "lib-core-base-display", inputs: { id: "id", openedAsModal: "openedAsModal", canEdit: "canEdit" }, usesInheritance: true, ngImport: i0, template: '<div></div>', isInline: true, styles: [""] });
|
|
591
590
|
}
|
|
592
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
591
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseDisplayComponent, decorators: [{
|
|
593
592
|
type: Component,
|
|
594
593
|
args: [{ selector: 'lib-core-base-display', standalone: true, imports: [], template: '<div></div>' }]
|
|
595
594
|
}], ctorParameters: () => [], propDecorators: { id: [{
|
|
@@ -603,10 +602,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImpo
|
|
|
603
602
|
class BaseDisplayModalComponent {
|
|
604
603
|
id;
|
|
605
604
|
canEdit = true;
|
|
606
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
607
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
605
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseDisplayModalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
606
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: BaseDisplayModalComponent, isStandalone: true, selector: "lib-prompt-display-modal", ngImport: i0, template: '', isInline: true, styles: [""] });
|
|
608
607
|
}
|
|
609
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
608
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseDisplayModalComponent, decorators: [{
|
|
610
609
|
type: Component,
|
|
611
610
|
args: [{ selector: 'lib-prompt-display-modal', standalone: true, imports: [], template: '' }]
|
|
612
611
|
}] });
|
|
@@ -614,10 +613,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.11", ngImpo
|
|
|
614
613
|
class FormErrorDisplayComponent {
|
|
615
614
|
control = input(undefined);
|
|
616
615
|
label = input(undefined);
|
|
617
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
618
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.
|
|
616
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FormErrorDisplayComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
617
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: FormErrorDisplayComponent, isStandalone: true, selector: "sftech-form-error-display", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (control()?.errors) {\r\n <div class=\"p-1 text-xs text-red-500\">\r\n @if (control()?.errors?.['required']) {\r\n <div>{{ label() }} ist ein Pflichtfeld.</div>\r\n }\r\n </div>\r\n}\r\n", styles: [""] });
|
|
619
618
|
}
|
|
620
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
619
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: FormErrorDisplayComponent, decorators: [{
|
|
621
620
|
type: Component,
|
|
622
621
|
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" }]
|
|
623
622
|
}] });
|
|
@@ -672,10 +671,10 @@ class PaginatorComponent {
|
|
|
672
671
|
this.pagination.pageSize = event.rows ?? 10;
|
|
673
672
|
this.odataChanged.emit(this.pagination);
|
|
674
673
|
}
|
|
675
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.
|
|
676
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.
|
|
674
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PaginatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
675
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: PaginatorComponent, isStandalone: true, selector: "sftech-paginator", inputs: { pagination: "pagination" }, outputs: { odataChanged: "odataChanged" }, ngImport: i0, template: "<!--<nav aria-label=\"Table navigation\" class=\"flex items-center flex-wrap md:flex-row justify-between p-2 bg-gradient-to-b from-secondary_accent-500 to-secondary_accent-700\">-->\r\n<!-- <div-->\r\n<!-- class=\"font-normal text-white dark:text-gray-400 md:mb-0 block w-full md:inline md:w-auto\">Ergebnis-->\r\n<!-- <span class=\"font-semibold text-primary_accent-900 dark:text-white\">{{ ((pagination.page - 1) * pagination.pageSize) + 1 }} - {{ pagination.totalPages === pagination.page ? pagination.totalElements : pagination.pageSize * pagination.page}}</span>-->\r\n<!-- von-->\r\n<!-- <span class=\"font-semibold text-primary_accent-900 dark:text-white\">{{ pagination.totalElements }}</span></div>-->\r\n<!-- <ul class=\"inline-flex -space-x-px rtl:space-x-reverse text-sm h-8\">-->\r\n<!-- @for (pageNumber of pageNumbers(); track pageNumber) {-->\r\n<!-- <li>-->\r\n<!-- <a [class.rounded-s-lg]=\"pageNumber === 1\" [class.rounded-e-lg]=\"pageNumber === pagination.totalPages\"-->\r\n<!-- (click)=\"changePage(pageNumber)\"-->\r\n<!-- class=\"flex items-center justify-center px-3 h-8 leading-tight text-gray-500 bg-white border border-gray-300 hover:bg-gray-100 hover:text-gray-700 dark:bg-gray-800 dark:border-gray-700 dark:text-gray-400 dark:hover:bg-gray-700 dark:hover:text-white\">{{ pageNumber }}</a>-->\r\n<!-- </li>-->\r\n<!-- }-->\r\n<!-- </ul>-->\r\n<!--</nav>-->\r\n\r\n\r\n\r\n\r\n<div class=\"card flex justify-center\">\r\n <p-paginator (onPageChange)=\"onPageChange($event)\" [first]=\"pagination.page - 1 \" [rows]=\"pagination.pageSize\" [totalRecords]=\"pagination.totalElements\" [rowsPerPageOptions]=\"[10, 20, 30]\" />\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type: PaginatorModule }, { kind: "component", type: i1.Paginator, selector: "p-paginator", inputs: ["pageLinkSize", "style", "styleClass", "alwaysShow", "dropdownAppendTo", "templateLeft", "templateRight", "appendTo", "dropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showFirstLastIcon", "totalRecords", "rows", "rowsPerPageOptions", "showJumpToPageDropdown", "showJumpToPageInput", "jumpToPageItemTemplate", "showPageLinks", "locale", "dropdownItemTemplate", "first"], outputs: ["onPageChange"] }] });
|
|
677
676
|
}
|
|
678
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.
|
|
677
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: PaginatorComponent, decorators: [{
|
|
679
678
|
type: Component,
|
|
680
679
|
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>" }]
|
|
681
680
|
}], 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, 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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"}
|
|
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, faQuestion, 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 help = faQuestion;\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, inject, input } from '@angular/core';\r\nimport { FaIconComponent } from '@fortawesome/angular-fontawesome';\r\nimport { Button } from 'primeng/button';\r\nimport { DynamicDialogRef } from 'primeng/dynamicdialog';\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 protected ref = inject(DynamicDialogRef);\r\n\r\n constructor() {}\r\n\r\n public close(retVal: unknown = undefined): void {\r\n this.ref.close(retVal);\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\nimport { BaseDialogComponent } from '../../../ui/layouts/base-dialog/base-dialog.component';\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> extends BaseDialogComponent 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 public form!: FormGroup;\r\n public model = signal<TDbModel | undefined>(undefined);\r\n public isNew = signal<boolean>(true);\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 super();\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\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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"}
|
|
@@ -2,24 +2,21 @@ import { OnInit } from '@angular/core';
|
|
|
2
2
|
import { FormControl, FormGroup } from '@angular/forms';
|
|
3
3
|
import { ActivatedRoute, Router } from '@angular/router';
|
|
4
4
|
import { MessageService } from 'primeng/api';
|
|
5
|
-
import { DynamicDialogRef } from 'primeng/dynamicdialog';
|
|
6
5
|
import { IBaseDbCreateDto } from '../../../core/dtos/base-db-create.dto';
|
|
7
6
|
import { IBaseDbResponseDto } from '../../../core/dtos/base-db-response.dto';
|
|
8
7
|
import { IBaseDbUpdateDto } from '../../../core/dtos/base-db-update.dto';
|
|
9
8
|
import { BaseDbModel, IBaseDbModel } from '../../../core/models/base-db.model';
|
|
10
9
|
import { BaseDbApiService } from '../../../core/services/base-db-api.service';
|
|
11
|
-
import {
|
|
10
|
+
import { BaseDialogComponent } from '../../../ui/layouts/base-dialog/base-dialog.component';
|
|
12
11
|
import * as i0 from "@angular/core";
|
|
13
|
-
export declare abstract class BaseDisplayComponent<TDbModel extends BaseDbModel, TCreateDto extends IBaseDbCreateDto, TUpdateDto extends IBaseDbUpdateDto, TResponseDto extends IBaseDbResponseDto> implements OnInit {
|
|
12
|
+
export declare abstract class BaseDisplayComponent<TDbModel extends BaseDbModel, TCreateDto extends IBaseDbCreateDto, TUpdateDto extends IBaseDbUpdateDto, TResponseDto extends IBaseDbResponseDto> extends BaseDialogComponent implements OnInit {
|
|
14
13
|
id: undefined | number;
|
|
15
14
|
openedAsModal: boolean;
|
|
16
15
|
canEdit: boolean;
|
|
17
16
|
redirectAfterSave: boolean;
|
|
18
|
-
protected ref: DynamicDialogRef<any>;
|
|
19
17
|
form: FormGroup;
|
|
20
18
|
model: import("@angular/core").WritableSignal<TDbModel | undefined>;
|
|
21
19
|
isNew: import("@angular/core").WritableSignal<boolean>;
|
|
22
|
-
iconProvider: typeof IconProvider;
|
|
23
20
|
protected abstract _repo: BaseDbApiService<TDbModel, TCreateDto, TUpdateDto, TResponseDto>;
|
|
24
21
|
protected abstract _route: string;
|
|
25
22
|
protected router: Router;
|
|
@@ -36,7 +33,6 @@ export declare abstract class BaseDisplayComponent<TDbModel extends BaseDbModel,
|
|
|
36
33
|
protected abstract getNewModel(): TDbModel;
|
|
37
34
|
protected abstract mapFormToUpdateDto(): TUpdateDto;
|
|
38
35
|
protected abstract mapFormToCreateDto(): TCreateDto;
|
|
39
|
-
close(retVal?: IDisplayModalReturnObject): void;
|
|
40
36
|
static ɵfac: i0.ɵɵFactoryDeclaration<BaseDisplayComponent<any, any, any, any>, never>;
|
|
41
37
|
static ɵcmp: i0.ɵɵComponentDeclaration<BaseDisplayComponent<any, any, any, any>, "lib-core-base-display", never, { "id": { "alias": "id"; "required": false; }; "openedAsModal": { "alias": "openedAsModal"; "required": false; }; "canEdit": { "alias": "canEdit"; "required": false; }; }, {}, never, never, true, never>;
|
|
42
38
|
}
|
|
@@ -2,5 +2,6 @@ export declare class IconProvider {
|
|
|
2
2
|
static readonly add: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
3
3
|
static readonly close: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
4
4
|
static readonly delete: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
5
|
+
static readonly help: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
5
6
|
static readonly menu: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
6
7
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { EventEmitter, TemplateRef } from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { DynamicDialogRef } from 'primeng/dynamicdialog';
|
|
3
|
+
import { IconProvider } from '../../../providers/icon.provider';
|
|
3
4
|
import * as i0 from "@angular/core";
|
|
4
5
|
export declare class BaseDialogComponent {
|
|
5
6
|
hasHeader: import("@angular/core").InputSignal<boolean>;
|
|
@@ -11,8 +12,9 @@ export declare class BaseDialogComponent {
|
|
|
11
12
|
body: TemplateRef<unknown> | null;
|
|
12
13
|
footer: TemplateRef<unknown> | null;
|
|
13
14
|
iconProvider: typeof IconProvider;
|
|
15
|
+
protected ref: DynamicDialogRef<any>;
|
|
14
16
|
constructor();
|
|
15
|
-
close(): void;
|
|
17
|
+
close(retVal?: unknown): void;
|
|
16
18
|
static ɵfac: i0.ɵɵFactoryDeclaration<BaseDialogComponent, never>;
|
|
17
19
|
static ɵcmp: i0.ɵɵComponentDeclaration<BaseDialogComponent, "sftech-base-dialog", never, { "hasHeader": { "alias": "hasHeader"; "required": false; "isSignal": true; }; "hasFooter": { "alias": "hasFooter"; "required": false; "isSignal": true; }; "showButtons": { "alias": "showButtons"; "required": false; "isSignal": true; }; "headerText": { "alias": "headerText"; "required": false; "isSignal": true; }; }, { "closed": "closed"; }, ["header", "body", "footer"], never, true, never>;
|
|
18
20
|
}
|