@sftech/ng-shared 0.0.12 → 0.0.15
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.
|
@@ -7,7 +7,7 @@ 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, faBrain, faClose, faTrash, faDatabase, faQuestion, faBars, faLaptop } from '@fortawesome/free-solid-svg-icons';
|
|
10
|
+
import { faPlus, faHexagonNodes, faArrowLeft, faBrain, faClose, faTrash, faDatabase, faQuestion, faBars, faLaptop } from '@fortawesome/free-solid-svg-icons';
|
|
11
11
|
import { Ripple } from 'primeng/ripple';
|
|
12
12
|
import { StyleClass } from 'primeng/styleclass';
|
|
13
13
|
import { RouterLink, Router, ActivatedRoute } from '@angular/router';
|
|
@@ -47,12 +47,15 @@ const SfTechPreset = definePreset(Aura, {
|
|
|
47
47
|
// biome-ignore lint/complexity/noStaticOnlyClass: <explanation>
|
|
48
48
|
class IconProvider {
|
|
49
49
|
static add = faPlus;
|
|
50
|
+
static agent = faHexagonNodes;
|
|
51
|
+
static back = faArrowLeft;
|
|
50
52
|
static brain = faBrain;
|
|
51
53
|
static close = faClose;
|
|
52
54
|
static delete = faTrash;
|
|
53
55
|
static database = faDatabase;
|
|
54
56
|
static help = faQuestion;
|
|
55
57
|
static menu = faBars;
|
|
58
|
+
static unknown = faQuestion;
|
|
56
59
|
static window = faLaptop;
|
|
57
60
|
}
|
|
58
61
|
|
|
@@ -89,11 +92,11 @@ class HeadMainFooterWithCanvasComponent {
|
|
|
89
92
|
this.drawerRef.close(e);
|
|
90
93
|
}
|
|
91
94
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HeadMainFooterWithCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
92
|
-
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-
|
|
95
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.14", type: HeadMainFooterWithCanvasComponent, isStandalone: true, selector: "sftech-head-main-footer-with-canvas", inputs: { title: "title", maxWidth: "maxWidth", navigationItems: "navigationItems", hasDrawer: "hasDrawer" }, queries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "main", first: true, predicate: ["main"], descendants: true }, { propertyName: "footer", first: true, predicate: ["footer"], descendants: true }], viewQueries: [{ propertyName: "drawerRef", first: true, predicate: ["drawerRef"], descendants: true }], ngImport: i0, template: "<div class=\"h-screen flex flex-col justify-between bg-gradient-to-b from-primary-50/40 via-white to-primary-50/40\">\r\n <p-toast/>\r\n <header class=\"p-3 bg-gradient-to-r from-primary-500 to-primary-900 text-white\">\r\n <div [style.max-width]=\"maxWidth\" class=\"w-full mx-auto\">\r\n @if (hasDrawer) {\r\n <div class=\"flex items-center\">\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=\"flex-grow h-full my-0 \">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto h-full bg-white shadow-xl my-0 overflow-auto\">\r\n <ng-container [ngTemplateOutlet]=\"main\"></ng-container>\r\n </div>\r\n </main>\r\n\r\n <footer class=\"p-3 bg-gradient-to-r from-primary-900 to-primary-500 text-white text-sm\">\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 bg-white shadow-lg\">\r\n <div class=\"flex items-center justify-between px-4 pt-5 pb-5 border-b border-gray-200\">\r\n <span class=\"font-semibold text-2xl text-primary\">Menu</span>\r\n <span>\r\n <p-button type=\"button\" (click)=\"drawerVisible = false\" rounded=\"true\" outlined=\"true\"\r\n styleClass=\"h-9 w-9\"><fa-icon [icon]=\"iconProvider.close\"></fa-icon></p-button>\r\n </span>\r\n </div>\r\n <div class=\"overflow-y-auto px-4 mt-4\">\r\n <sftech-sidebar-navigation [navigation]=\"navigationItems\" (closeDrawer)=\"drawerVisible = false\"></sftech-sidebar-navigation>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </p-drawer>\r\n}", styles: [""], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "mask", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "transform", "a11yRole"] }, { kind: "component", type: Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "component", type: SidebarNavigationComponent, selector: "sftech-sidebar-navigation", inputs: ["navigation"], outputs: ["closeDrawer"] }] });
|
|
93
96
|
}
|
|
94
97
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: HeadMainFooterWithCanvasComponent, decorators: [{
|
|
95
98
|
type: Component,
|
|
96
|
-
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-
|
|
99
|
+
args: [{ selector: 'sftech-head-main-footer-with-canvas', imports: [NgTemplateOutlet, Button, Drawer, FaIconComponent, Toast, SidebarNavigationComponent], template: "<div class=\"h-screen flex flex-col justify-between bg-gradient-to-b from-primary-50/40 via-white to-primary-50/40\">\r\n <p-toast/>\r\n <header class=\"p-3 bg-gradient-to-r from-primary-500 to-primary-900 text-white\">\r\n <div [style.max-width]=\"maxWidth\" class=\"w-full mx-auto\">\r\n @if (hasDrawer) {\r\n <div class=\"flex items-center\">\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=\"flex-grow h-full my-0 \">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto h-full bg-white shadow-xl my-0 overflow-auto\">\r\n <ng-container [ngTemplateOutlet]=\"main\"></ng-container>\r\n </div>\r\n </main>\r\n\r\n <footer class=\"p-3 bg-gradient-to-r from-primary-900 to-primary-500 text-white text-sm\">\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 bg-white shadow-lg\">\r\n <div class=\"flex items-center justify-between px-4 pt-5 pb-5 border-b border-gray-200\">\r\n <span class=\"font-semibold text-2xl text-primary\">Menu</span>\r\n <span>\r\n <p-button type=\"button\" (click)=\"drawerVisible = false\" rounded=\"true\" outlined=\"true\"\r\n styleClass=\"h-9 w-9\"><fa-icon [icon]=\"iconProvider.close\"></fa-icon></p-button>\r\n </span>\r\n </div>\r\n <div class=\"overflow-y-auto px-4 mt-4\">\r\n <sftech-sidebar-navigation [navigation]=\"navigationItems\" (closeDrawer)=\"drawerVisible = false\"></sftech-sidebar-navigation>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </p-drawer>\r\n}" }]
|
|
97
100
|
}], propDecorators: { title: [{
|
|
98
101
|
type: Input
|
|
99
102
|
}], maxWidth: [{
|
|
@@ -137,7 +140,7 @@ class BaseDialogComponent {
|
|
|
137
140
|
}
|
|
138
141
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: BaseDialogComponent, decorators: [{
|
|
139
142
|
type: Component,
|
|
140
|
-
args: [{ selector: 'sftech-base-dialog', imports: [
|
|
143
|
+
args: [{ selector: 'sftech-base-dialog', imports: [NgTemplateOutlet], template: "<!--<p-dialog [(visible)]=\"visible\" [modal]=\"true\" [style]=\"{ width: '25rem' }\">-->\r\n<!-- <ng-template #header>-->\r\n<!-- <div class=\"inline-flex items-center justify-center gap-2\">-->\r\n<!-- <span class=\"font-bold whitespace-nowrap\">Amy Elsner</span>-->\r\n<!-- </div>-->\r\n<!-- </ng-template>-->\r\n<!-- <span class=\"text-surface-500 dark:text-surface-400 block mb-8\">Update your information.</span>-->\r\n<!-- <div class=\"flex items-center gap-4 mb-4\">-->\r\n<!-- <label for=\"username\" class=\"font-semibold w-24\">Username</label>-->\r\n<!-- <input pInputText id=\"username\" class=\"flex-auto\" autocomplete=\"off\" />-->\r\n<!-- </div>-->\r\n<!-- <div class=\"flex items-center gap-4 mb-2\">-->\r\n<!-- <label for=\"email\" class=\"font-semibold w-24\">Email</label>-->\r\n<!-- <input pInputText id=\"email\" class=\"flex-auto\" autocomplete=\"off\" />-->\r\n<!-- </div>-->\r\n<!-- <ng-template #footer>-->\r\n<!-- <p-button label=\"Cancel\" [text]=\"true\" severity=\"secondary\" (click)=\"visible = false\" />-->\r\n<!-- <p-button label=\"Save\" [outlined]=\"true\" severity=\"secondary\" (click)=\"visible = false\" />-->\r\n<!-- </ng-template>-->\r\n<!--</p-dialog>-->\r\n\r\n<div class=\"flex flex-col\">\r\n <div id=\"dialog-body\" class=\"flex-grow overflow-auto\">\r\n <ng-container [ngTemplateOutlet]=\"body\"></ng-container>\r\n </div>\r\n\r\n @if (hasFooter()) {\r\n <div id=\"dialog-footer\" class=\"flex justify-end mt-5\">\r\n <div id=\"footer-content\">\r\n <ng-container [ngTemplateOutlet]=\"footer\"></ng-container>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n" }]
|
|
141
144
|
}], ctorParameters: () => [], propDecorators: { closed: [{
|
|
142
145
|
type: Output
|
|
143
146
|
}], header: [{
|
|
@@ -422,6 +425,8 @@ class BaseListComponent {
|
|
|
422
425
|
data = signal(undefined);
|
|
423
426
|
router = inject(Router);
|
|
424
427
|
modalService = inject(DialogService);
|
|
428
|
+
detailModalHeaderText = 'Details';
|
|
429
|
+
_modalComponent = undefined;
|
|
425
430
|
constructor() { }
|
|
426
431
|
ngOnInit() {
|
|
427
432
|
this._loadData();
|
|
@@ -715,12 +720,11 @@ class BaseDbApiService {
|
|
|
715
720
|
}
|
|
716
721
|
get(id, detailed = false) {
|
|
717
722
|
let url = `${this.url}/${id}`;
|
|
718
|
-
console.log(url);
|
|
719
723
|
if (detailed) {
|
|
720
724
|
url = `${url}/?detailed=${detailed}`;
|
|
721
725
|
}
|
|
722
|
-
return this.http.get(url).pipe(map((response) => this.
|
|
723
|
-
return this.
|
|
726
|
+
return this.http.get(url).pipe(map((response) => this.responseMapping(response)), catchError((error) => {
|
|
727
|
+
return this.httpErrorToApiResponse(error);
|
|
724
728
|
}));
|
|
725
729
|
}
|
|
726
730
|
getAll() {
|
|
@@ -728,18 +732,18 @@ class BaseDbApiService {
|
|
|
728
732
|
return this.odata(odata);
|
|
729
733
|
}
|
|
730
734
|
odata(odataQuery) {
|
|
731
|
-
return this.http.get(`${this.url}/${odataQuery.toGetParameter()}`).pipe(map((response) => this.
|
|
732
|
-
return this.
|
|
735
|
+
return this.http.get(`${this.url}/${odataQuery.toGetParameter()}`).pipe(map((response) => this.responseOdataMapping(response)), catchError((error) => {
|
|
736
|
+
return this.httpErrorToApiResponse(error);
|
|
733
737
|
}));
|
|
734
738
|
}
|
|
735
739
|
insert(dto) {
|
|
736
|
-
return this.http.post(this.url, dto).pipe(map((response) => this.
|
|
737
|
-
return this.
|
|
740
|
+
return this.http.post(this.url, dto).pipe(map((response) => this.responseMapping(response)), catchError((error) => {
|
|
741
|
+
return this.httpErrorToApiResponse(error);
|
|
738
742
|
}));
|
|
739
743
|
}
|
|
740
744
|
update(id, dto) {
|
|
741
|
-
return this.http.put(`${this.url}/${id}`, dto).pipe(map((response) => this.
|
|
742
|
-
return this.
|
|
745
|
+
return this.http.put(`${this.url}/${id}`, dto).pipe(map((response) => this.responseMapping(response)), catchError((error) => {
|
|
746
|
+
return this.httpErrorToApiResponse(error);
|
|
743
747
|
}));
|
|
744
748
|
}
|
|
745
749
|
delete(id) {
|
|
@@ -750,18 +754,18 @@ class BaseDbApiService {
|
|
|
750
754
|
apiReponse.isError = false;
|
|
751
755
|
return apiReponse;
|
|
752
756
|
}), catchError((error) => {
|
|
753
|
-
return this.
|
|
757
|
+
return this.httpErrorToApiResponse(error);
|
|
754
758
|
}));
|
|
755
759
|
}
|
|
756
|
-
|
|
760
|
+
responseOdataMapping(response) {
|
|
757
761
|
const odataResponse = new MappedOdataResponse();
|
|
758
762
|
odataResponse.data.items = this.getNewModel().fromDtos(response.data?.items);
|
|
759
763
|
odataResponse.data.pagination = ODataPagination.fromDto(response.data.pagination);
|
|
760
764
|
return odataResponse;
|
|
761
765
|
}
|
|
762
|
-
|
|
766
|
+
responseMapping(response) {
|
|
763
767
|
if (![200, 201, 202].includes(response.status)) {
|
|
764
|
-
return this.
|
|
768
|
+
return this.errorHandling(response.status, response.messages);
|
|
765
769
|
}
|
|
766
770
|
const apiResponse = new MappedApiResponse();
|
|
767
771
|
apiResponse.status = response.status;
|
|
@@ -777,14 +781,14 @@ class BaseDbApiService {
|
|
|
777
781
|
apiResponse.data = mappedData;
|
|
778
782
|
return apiResponse;
|
|
779
783
|
}
|
|
780
|
-
|
|
784
|
+
errorHandling(statusCode, messages) {
|
|
781
785
|
const apiResponse = new MappedApiError();
|
|
782
786
|
apiResponse.status = statusCode;
|
|
783
787
|
apiResponse.messages = messages ? messages : [];
|
|
784
788
|
apiResponse.isError = true;
|
|
785
789
|
return apiResponse;
|
|
786
790
|
}
|
|
787
|
-
|
|
791
|
+
httpErrorToApiResponse(error) {
|
|
788
792
|
const messages = [];
|
|
789
793
|
if (error.message) {
|
|
790
794
|
messages.push(error.message);
|
|
@@ -792,7 +796,7 @@ class BaseDbApiService {
|
|
|
792
796
|
if (error.error?.messages) {
|
|
793
797
|
messages.push(...error.error.messages);
|
|
794
798
|
}
|
|
795
|
-
return of(this.
|
|
799
|
+
return of(this.errorHandling(error.status, messages));
|
|
796
800
|
}
|
|
797
801
|
}
|
|
798
802
|
|
|
@@ -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/lib/ui/pages/not-permitted/not-permitted.component.ts","../../../../libs/ng-shared/src/lib/ui/pages/not-permitted/not-permitted.component.html","../../../../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 components: {\r\n fieldset: {\r\n background: '{gray.50}',\r\n borderColor: '{primary.50}',\r\n legendBorderColor: '{primary.50}',\r\n legendColor: '#000000',\r\n contentPadding: '0.75em 0 0 0',\r\n legendFontWeight: 'normal',\r\n },\r\n },\r\n});\r\n","import { faBars, faBrain, faBurger, faClose, faDatabase, faHouseChimneyWindow, faLaptop, faPlus, faQuestion, faTrash, faWindowClose } 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 brain = faBrain;\r\n public static readonly close = faClose;\r\n public static readonly delete = faTrash;\r\n public static readonly database = faDatabase;\r\n public static readonly help = faQuestion;\r\n public static readonly menu = faBars;\r\n public static readonly window = faLaptop;\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<div class=\"flex flex-col\">\r\n <div id=\"dialog-body\" class=\"flex-grow overflow-auto\">\r\n <ng-container [ngTemplateOutlet]=\"body\"></ng-container>\r\n </div>\r\n\r\n @if (hasFooter()) {\r\n <div id=\"dialog-footer\" class=\"flex justify-end mt-5\">\r\n <div id=\"footer-content\">\r\n <ng-container [ngTemplateOutlet]=\"footer\"></ng-container>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","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).then((res) => {\r\n if (!res.ok) {\r\n throw new Error('Config load failed');\r\n }\r\n return res.json();\r\n });\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, {\r\n inputValues: { id, canEdit: this.canEdit(), openedAsModal: true },\r\n focusOnShow: false,\r\n modal: true,\r\n dismissableMask: true,\r\n header: this.detailModalHeaderText,\r\n maximizable: true,\r\n closable: true,\r\n width: '40%',\r\n });\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","import { CommonModule } from '@angular/common';\r\nimport { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'sftech-not-permitted',\r\n imports: [CommonModule],\r\n templateUrl: './not-permitted.component.html',\r\n styleUrl: './not-permitted.component.css',\r\n})\r\nexport class NotPermittedComponent {}\r\n","<div class=\"min-h-screen flex flex-col items-center justify-center bg-gray-100\">\n <div class=\"bg-white shadow-md rounded-lg p-6 max-w-lg text-center border border-gray-200\">\n <h1 class=\"text-3xl font-semibold text-red-600 mb-4\">Zugriff verweigert</h1>\n <p class=\"text-lg text-gray-700 mb-6\">\n Du bist nicht berechtigt, auf diese Seite zuzugreifen.\n Bitte überprüfe deine Berechtigungen oder wende dich an den Administrator.\n </p>\n <a\n class=\"inline-block bg-blue-600 text-white font-medium px-6 py-2 rounded-md hover:bg-blue-700 transition\"\n href=\"/apps/frontend/public\"\n >\n Zur Startseite\n </a>\n </div>\n</div>\n","/**\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/lib/ui/pages/not-permitted/not-permitted.component.ts","../../../../libs/ng-shared/src/lib/ui/pages/not-permitted/not-permitted.component.html","../../../../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 components: {\r\n fieldset: {\r\n background: '{gray.50}',\r\n borderColor: '{primary.50}',\r\n legendBorderColor: '{primary.50}',\r\n legendColor: '#000000',\r\n contentPadding: '0.75em 0 0 0',\r\n legendFontWeight: 'normal',\r\n },\r\n },\r\n});\r\n","import { faArrowLeft, faBars, faBrain, faBurger, faClose, faDatabase, faHexagonNodes, faHouseChimneyWindow, faLaptop, faPlus, faQuestion, faTrash, faWindowClose } 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 agent = faHexagonNodes;\r\n public static readonly back = faArrowLeft;\r\n public static readonly brain = faBrain;\r\n public static readonly close = faClose;\r\n public static readonly delete = faTrash;\r\n public static readonly database = faDatabase;\r\n public static readonly help = faQuestion;\r\n public static readonly menu = faBars;\r\n public static readonly unknown = faQuestion;\r\n public static readonly window = faLaptop;\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 bg-gradient-to-b from-primary-50/40 via-white to-primary-50/40\">\r\n <p-toast/>\r\n <header class=\"p-3 bg-gradient-to-r from-primary-500 to-primary-900 text-white\">\r\n <div [style.max-width]=\"maxWidth\" class=\"w-full mx-auto\">\r\n @if (hasDrawer) {\r\n <div class=\"flex items-center\">\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=\"flex-grow h-full my-0 \">\r\n <div [style.max-width]=\"maxWidth\" class=\"mx-auto h-full bg-white shadow-xl my-0 overflow-auto\">\r\n <ng-container [ngTemplateOutlet]=\"main\"></ng-container>\r\n </div>\r\n </main>\r\n\r\n <footer class=\"p-3 bg-gradient-to-r from-primary-900 to-primary-500 text-white text-sm\">\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 bg-white shadow-lg\">\r\n <div class=\"flex items-center justify-between px-4 pt-5 pb-5 border-b border-gray-200\">\r\n <span class=\"font-semibold text-2xl text-primary\">Menu</span>\r\n <span>\r\n <p-button type=\"button\" (click)=\"drawerVisible = false\" rounded=\"true\" outlined=\"true\"\r\n styleClass=\"h-9 w-9\"><fa-icon [icon]=\"iconProvider.close\"></fa-icon></p-button>\r\n </span>\r\n </div>\r\n <div class=\"overflow-y-auto px-4 mt-4\">\r\n <sftech-sidebar-navigation [navigation]=\"navigationItems\" (closeDrawer)=\"drawerVisible = false\"></sftech-sidebar-navigation>\r\n </div>\r\n </div>\r\n </ng-template>\r\n </p-drawer>\r\n}","import { NgTemplateOutlet } from '@angular/common';\r\nimport { Component, ContentChild, EventEmitter, Output, TemplateRef, inject, input } from '@angular/core';\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: [NgTemplateOutlet],\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<div class=\"flex flex-col\">\r\n <div id=\"dialog-body\" class=\"flex-grow overflow-auto\">\r\n <ng-container [ngTemplateOutlet]=\"body\"></ng-container>\r\n </div>\r\n\r\n @if (hasFooter()) {\r\n <div id=\"dialog-footer\" class=\"flex justify-end mt-5\">\r\n <div id=\"footer-content\">\r\n <ng-container [ngTemplateOutlet]=\"footer\"></ng-container>\r\n </div>\r\n </div>\r\n }\r\n</div>\r\n","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).then((res) => {\r\n if (!res.ok) {\r\n throw new Error('Config load failed');\r\n }\r\n return res.json();\r\n });\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 detailModalHeaderText: string = 'Details';\r\n protected _modalComponent?: typeof BaseDisplayModalComponent = undefined;\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!, {\r\n inputValues: { id, canEdit: this.canEdit(), openedAsModal: true },\r\n focusOnShow: false,\r\n modal: true,\r\n dismissableMask: true,\r\n header: this.detailModalHeaderText,\r\n maximizable: true,\r\n closable: true,\r\n width: '40%',\r\n });\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 { Observable, catchError, map, of } from 'rxjs';\r\nimport { IAppConfig } from '../configuration/app-config.interface';\r\nimport { IApiResponse } from '../dtos/api-response.dto';\r\nimport { IBaseDbCreateDto } from '../dtos/base-db-create.dto';\r\nimport { IBaseDbResponseDto } from '../dtos/base-db-response.dto';\r\nimport { IBaseDbUpdateDto } from '../dtos/base-db-update.dto';\r\nimport { IOdataResponseDto } from '../dtos/odata-response.dto';\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\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 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 protected 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 protected 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 protected 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 protected 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","import { CommonModule } from '@angular/common';\r\nimport { Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'sftech-not-permitted',\r\n imports: [CommonModule],\r\n templateUrl: './not-permitted.component.html',\r\n styleUrl: './not-permitted.component.css',\r\n})\r\nexport class NotPermittedComponent {}\r\n","<div class=\"min-h-screen flex flex-col items-center justify-center bg-gray-100\">\n <div class=\"bg-white shadow-md rounded-lg p-6 max-w-lg text-center border border-gray-200\">\n <h1 class=\"text-3xl font-semibold text-red-600 mb-4\">Zugriff verweigert</h1>\n <p class=\"text-lg text-gray-700 mb-6\">\n Du bist nicht berechtigt, auf diese Seite zuzugreifen.\n Bitte überprüfe deine Berechtigungen oder wende dich an den Administrator.\n </p>\n <a\n class=\"inline-block bg-blue-600 text-white font-medium px-6 py-2 rounded-md hover:bg-blue-700 transition\"\n href=\"/apps/frontend/public\"\n >\n Zur Startseite\n </a>\n </div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -19,8 +19,8 @@ export declare abstract class BaseListComponent<TDbModel extends BaseDbModel, TC
|
|
|
19
19
|
private modalService;
|
|
20
20
|
protected abstract _repo: BaseDbApiService<TDbModel, TCreateDto, TUpdateDto, TResponseDto>;
|
|
21
21
|
protected abstract _route: string;
|
|
22
|
-
protected
|
|
23
|
-
protected
|
|
22
|
+
protected detailModalHeaderText: string;
|
|
23
|
+
protected _modalComponent?: typeof BaseDisplayModalComponent;
|
|
24
24
|
constructor();
|
|
25
25
|
ngOnInit(): void;
|
|
26
26
|
updatePagination($event: ODataPagination): void;
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
import { HttpClient } from '@angular/common/http';
|
|
1
|
+
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
|
+
import { IAppConfig } from '../configuration/app-config.interface';
|
|
4
|
+
import { IApiResponse } from '../dtos/api-response.dto';
|
|
5
|
+
import { IBaseDbCreateDto } from '../dtos/base-db-create.dto';
|
|
6
|
+
import { IBaseDbResponseDto } from '../dtos/base-db-response.dto';
|
|
7
|
+
import { IBaseDbUpdateDto } from '../dtos/base-db-update.dto';
|
|
8
|
+
import { IOdataResponseDto } from '../dtos/odata-response.dto';
|
|
3
9
|
import { BaseDbModel } from '../models/base-db.model';
|
|
4
10
|
import { MappedApiError, MappedApiResponse } from '../models/mapped-api-response.model';
|
|
5
11
|
import { MappedOdataResponse } from '../models/mapped-odata-response.model';
|
|
6
12
|
import { OData } from '../models/odata/odata.model';
|
|
7
|
-
import { IBaseDbCreateDto } from '../dtos/base-db-create.dto';
|
|
8
|
-
import { IBaseDbUpdateDto } from "../dtos/base-db-update.dto";
|
|
9
|
-
import { IBaseDbResponseDto } from '../dtos/base-db-response.dto';
|
|
10
|
-
import { IAppConfig } from '../configuration/app-config.interface';
|
|
11
13
|
export declare abstract class BaseDbApiService<TModel extends BaseDbModel, TCreateDto extends IBaseDbCreateDto, TUpdateDto extends IBaseDbUpdateDto, TResponseDto extends IBaseDbResponseDto> {
|
|
12
14
|
protected readonly http: HttpClient;
|
|
13
15
|
protected readonly config: IAppConfig;
|
|
@@ -20,8 +22,8 @@ export declare abstract class BaseDbApiService<TModel extends BaseDbModel, TCrea
|
|
|
20
22
|
update(id: number, dto: TUpdateDto): Observable<MappedApiResponse<TModel> | MappedApiError>;
|
|
21
23
|
delete(id: number): Observable<MappedApiResponse<TModel> | MappedApiError>;
|
|
22
24
|
protected abstract getNewModel(): TModel;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
protected responseOdataMapping(response: IApiResponse<IOdataResponseDto<TResponseDto>>): MappedOdataResponse<TModel>;
|
|
26
|
+
protected responseMapping(response: IApiResponse<TResponseDto>): MappedApiResponse<TModel> | MappedApiError;
|
|
27
|
+
protected errorHandling(statusCode: number, messages: string[] | undefined): MappedApiError;
|
|
28
|
+
protected httpErrorToApiResponse(error: HttpErrorResponse): Observable<MappedApiError>;
|
|
27
29
|
}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
export declare class IconProvider {
|
|
2
2
|
static readonly add: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
3
|
+
static readonly agent: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
4
|
+
static readonly back: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
3
5
|
static readonly brain: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
4
6
|
static readonly close: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
5
7
|
static readonly delete: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
6
8
|
static readonly database: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
7
9
|
static readonly help: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
8
10
|
static readonly menu: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
11
|
+
static readonly unknown: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
9
12
|
static readonly window: import("@fortawesome/fontawesome-common-types").IconDefinition;
|
|
10
13
|
}
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sftech/ng-shared",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.15",
|
|
4
4
|
"dependencies": {
|
|
5
5
|
"@fortawesome/angular-fontawesome": "^1.0.0",
|
|
6
6
|
"@fortawesome/free-solid-svg-icons": "^6.7.2",
|
|
7
7
|
"tslib": "^2.3.0"
|
|
8
8
|
},
|
|
9
9
|
"peerDependencies": {
|
|
10
|
-
"@angular/common": "
|
|
11
|
-
"@angular/core": "
|
|
10
|
+
"@angular/common": ">=19.2.0",
|
|
11
|
+
"@angular/core": ">=19.2.0"
|
|
12
12
|
},
|
|
13
13
|
"sideEffects": false,
|
|
14
14
|
"module": "fesm2022/sftech-ng-shared.mjs",
|