@lenne.tech/ng-base 14.2.5 → 14.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/base-components/base-components.module.d.ts +4 -3
  2. package/base-components/components/model-form/model-form.component.d.ts +9 -3
  3. package/{src → base-components}/pipes/ellipses.pipe.d.ts +1 -1
  4. package/base-components/public-api.d.ts +1 -0
  5. package/esm2020/base-components/base-components.module.mjs +10 -3
  6. package/esm2020/base-components/components/model-form/model-form.component.mjs +61 -13
  7. package/esm2020/base-components/components/model-table/model-table.component.mjs +10 -4
  8. package/esm2020/base-components/components/select/select.component.mjs +3 -3
  9. package/esm2020/base-components/pipes/ellipses.pipe.mjs +22 -0
  10. package/esm2020/base-components/public-api.mjs +3 -1
  11. package/esm2020/base-prototype/pages/forgot-password/forgot-password.component.mjs +3 -3
  12. package/esm2020/base-prototype/pages/login/login.component.mjs +3 -3
  13. package/esm2020/base-prototype/pages/register/register.component.mjs +3 -3
  14. package/esm2020/public-api.mjs +1 -2
  15. package/esm2020/shared/services/toast.service.mjs +2 -2
  16. package/esm2020/src/base.module.mjs +1 -5
  17. package/fesm2015/lenne.tech-ng-base-base-components.mjs +101 -22
  18. package/fesm2015/lenne.tech-ng-base-base-components.mjs.map +1 -1
  19. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs +6 -6
  20. package/fesm2015/lenne.tech-ng-base-base-prototype.mjs.map +1 -1
  21. package/fesm2015/lenne.tech-ng-base-shared.mjs +1 -1
  22. package/fesm2015/lenne.tech-ng-base-shared.mjs.map +1 -1
  23. package/fesm2015/lenne.tech-ng-base.mjs +1 -24
  24. package/fesm2015/lenne.tech-ng-base.mjs.map +1 -1
  25. package/fesm2020/lenne.tech-ng-base-base-components.mjs +100 -21
  26. package/fesm2020/lenne.tech-ng-base-base-components.mjs.map +1 -1
  27. package/fesm2020/lenne.tech-ng-base-base-prototype.mjs +6 -6
  28. package/fesm2020/lenne.tech-ng-base-base-prototype.mjs.map +1 -1
  29. package/fesm2020/lenne.tech-ng-base-shared.mjs +1 -1
  30. package/fesm2020/lenne.tech-ng-base-shared.mjs.map +1 -1
  31. package/fesm2020/lenne.tech-ng-base.mjs +1 -24
  32. package/fesm2020/lenne.tech-ng-base.mjs.map +1 -1
  33. package/package.json +1 -1
  34. package/public-api.d.ts +0 -1
  35. package/src/base.module.d.ts +5 -6
  36. package/esm2020/src/pipes/ellipses.pipe.mjs +0 -22
@@ -5,7 +5,6 @@ import { apolloOptionsFactory } from './factories/apollo-options.factory';
5
5
  import { LazyLoadDirective } from './directives/lazy-load.directive';
6
6
  import { MatchHeightDirective } from './directives/match-height.directive';
7
7
  import { ResizableDirective } from './directives/resizable.directive';
8
- import { EllipsesPipe } from './pipes/ellipses.pipe';
9
8
  import { SafeHtmlPipe } from './pipes/safe-html.pipe';
10
9
  import { DateAgoPipe } from './pipes/date-ago.pipe';
11
10
  import { AuthService, BASE_MODULE_CONFIG, WsService } from '@lenne.tech/ng-base/shared';
@@ -18,7 +17,6 @@ const elements = [
18
17
  MatchHeightDirective,
19
18
  ResizableDirective,
20
19
  // Pipes
21
- EllipsesPipe,
22
20
  SafeHtmlPipe,
23
21
  DateAgoPipe,
24
22
  ];
@@ -77,7 +75,6 @@ BaseModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14
77
75
  MatchHeightDirective,
78
76
  ResizableDirective,
79
77
  // Pipes
80
- EllipsesPipe,
81
78
  SafeHtmlPipe,
82
79
  DateAgoPipe], imports: [ApolloModule, HttpClientModule], exports: [
83
80
  // Directives
@@ -85,7 +82,6 @@ BaseModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14
85
82
  MatchHeightDirective,
86
83
  ResizableDirective,
87
84
  // Pipes
88
- EllipsesPipe,
89
85
  SafeHtmlPipe,
90
86
  DateAgoPipe, ApolloModule, HttpClientModule] });
91
87
  BaseModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: BaseModule, imports: [ApolloModule, HttpClientModule, ApolloModule, HttpClientModule] });
@@ -97,4 +93,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
97
93
  exports: [...elements, ApolloModule, HttpClientModule],
98
94
  }]
99
95
  }] });
100
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL3NyYy9iYXNlLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQXVCLFFBQVEsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUV4RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsV0FBVyxFQUFvQixrQkFBa0IsRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQzs7QUFFeEQsaUNBQWlDO0FBQ2pDLE1BQU0sUUFBUSxHQUFHO0lBQ2YsYUFBYTtJQUNiLGlCQUFpQjtJQUNqQixvQkFBb0I7SUFDcEIsa0JBQWtCO0lBRWxCLFFBQVE7SUFDUixZQUFZO0lBQ1osWUFBWTtJQUNaLFdBQVc7Q0FDWixDQUFDO0FBRUY7O0dBRUc7QUFNSCxNQUFNLE9BQU8sVUFBVTtJQUNyQjs7T0FFRztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsbUJBQXFDLEVBQUUsRUFBRSxjQUFlO1FBQ3JFLGlCQUFpQjtRQUNqQixNQUFNLE1BQU0sR0FBRztZQUNiLE1BQU0sRUFBRSxFQUFFO1lBQ1Ysb0JBQW9CLEVBQUUsT0FBTztZQUM3QixPQUFPLEVBQUUsS0FBSztZQUNkLE9BQU8sRUFBRSxJQUFJO1lBQ2IsTUFBTSxFQUFFLElBQUk7WUFDWixxQkFBcUIsRUFBRSxHQUFHO1lBQzFCLFlBQVksRUFBRSxHQUFHO1lBQ2pCLFdBQVcsRUFBRSxPQUFPO1lBQ3BCLEdBQUcsZ0JBQWdCO1NBQ3BCLENBQUM7UUFFRixJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDaEM7UUFFRCxvQkFBb0I7UUFDcEIsTUFBTSxTQUFTLEdBQWU7WUFDNUI7Z0JBQ0UsT0FBTyxFQUFFLGtCQUFrQjtnQkFDM0IsUUFBUSxFQUFFLE1BQU07YUFDakI7U0FDRixDQUFDO1FBRUYsd0NBQXdDO1FBQ3hDLElBQUksZ0JBQWdCLENBQUMsTUFBTSxFQUFFO1lBQzNCLFNBQVMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2IsT0FBTyxFQUFFLGNBQWM7Z0JBQ3ZCLFVBQVUsRUFBRSxvQkFBb0I7Z0JBQ2hDLElBQUksRUFBRSxDQUFDLGtCQUFrQixFQUFFLFFBQVEsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQzthQUMvRixDQUFDLENBQUM7U0FDSjthQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUN6QixPQUFPLENBQUMsR0FBRyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7U0FDakU7UUFFRCxxQkFBcUI7UUFDckIsT0FBTztZQUNMLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFNBQVM7U0FDVixDQUFDO0lBQ0osQ0FBQzs7dUdBOUNVLFVBQVU7d0dBQVYsVUFBVTtRQW5CckIsYUFBYTtRQUNiLGlCQUFpQjtRQUNqQixvQkFBb0I7UUFDcEIsa0JBQWtCO1FBRWxCLFFBQVE7UUFDUixZQUFZO1FBQ1osWUFBWTtRQUNaLFdBQVcsYUFPRCxZQUFZLEVBQUUsZ0JBQWdCO1FBZnhDLGFBQWE7UUFDYixpQkFBaUI7UUFDakIsb0JBQW9CO1FBQ3BCLGtCQUFrQjtRQUVsQixRQUFRO1FBQ1IsWUFBWTtRQUNaLFlBQVk7UUFDWixXQUFXLEVBU1ksWUFBWSxFQUFFLGdCQUFnQjt3R0FFMUMsVUFBVSxZQUpYLFlBQVksRUFBRSxnQkFBZ0IsRUFFakIsWUFBWSxFQUFFLGdCQUFnQjsyRkFFMUMsVUFBVTtrQkFMdEIsUUFBUTttQkFBQztvQkFDUixPQUFPLEVBQUUsQ0FBQyxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7b0JBQ3pDLFlBQVksRUFBRSxRQUFRO29CQUN0QixPQUFPLEVBQUUsQ0FBQyxHQUFHLFFBQVEsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUM7aUJBQ3ZEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVBPTExPX09QVElPTlMsIEFwb2xsb01vZHVsZSB9IGZyb20gJ2Fwb2xsby1hbmd1bGFyJztcbmltcG9ydCB7IEh0dHBMaW5rIH0gZnJvbSAnYXBvbGxvLWFuZ3VsYXIvaHR0cCc7XG5pbXBvcnQgeyBNb2R1bGVXaXRoUHJvdmlkZXJzLCBOZ01vZHVsZSwgUHJvdmlkZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgYXBvbGxvT3B0aW9uc0ZhY3RvcnkgfSBmcm9tICcuL2ZhY3Rvcmllcy9hcG9sbG8tb3B0aW9ucy5mYWN0b3J5JztcbmltcG9ydCB7IExhenlMb2FkRGlyZWN0aXZlIH0gZnJvbSAnLi9kaXJlY3RpdmVzL2xhenktbG9hZC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTWF0Y2hIZWlnaHREaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvbWF0Y2gtaGVpZ2h0LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBSZXNpemFibGVEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvcmVzaXphYmxlLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBFbGxpcHNlc1BpcGUgfSBmcm9tICcuL3BpcGVzL2VsbGlwc2VzLnBpcGUnO1xuaW1wb3J0IHsgU2FmZUh0bWxQaXBlIH0gZnJvbSAnLi9waXBlcy9zYWZlLWh0bWwucGlwZSc7XG5pbXBvcnQgeyBEYXRlQWdvUGlwZSB9IGZyb20gJy4vcGlwZXMvZGF0ZS1hZ28ucGlwZSc7XG5pbXBvcnQgeyBBdXRoU2VydmljZSwgQmFzZU1vZHVsZUNvbmZpZywgQkFTRV9NT0RVTEVfQ09ORklHLCBXc1NlcnZpY2UgfSBmcm9tICdAbGVubmUudGVjaC9uZy1iYXNlL3NoYXJlZCc7XG5pbXBvcnQgeyBIdHRwQ2xpZW50TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG4vLyBJbXBvcnRlZCBhbmQgZXhwb3J0ZWQgZWxlbWVudHNcbmNvbnN0IGVsZW1lbnRzID0gW1xuICAvLyBEaXJlY3RpdmVzXG4gIExhenlMb2FkRGlyZWN0aXZlLFxuICBNYXRjaEhlaWdodERpcmVjdGl2ZSxcbiAgUmVzaXphYmxlRGlyZWN0aXZlLFxuXG4gIC8vIFBpcGVzXG4gIEVsbGlwc2VzUGlwZSxcbiAgU2FmZUh0bWxQaXBlLFxuICBEYXRlQWdvUGlwZSxcbl07XG5cbi8qKlxuICogQmFzZSBtb2R1bGVcbiAqL1xuQE5nTW9kdWxlKHtcbiAgaW1wb3J0czogW0Fwb2xsb01vZHVsZSwgSHR0cENsaWVudE1vZHVsZV0sXG4gIGRlY2xhcmF0aW9uczogZWxlbWVudHMsXG4gIGV4cG9ydHM6IFsuLi5lbGVtZW50cywgQXBvbGxvTW9kdWxlLCBIdHRwQ2xpZW50TW9kdWxlXSxcbn0pXG5leHBvcnQgY2xhc3MgQmFzZU1vZHVsZSB7XG4gIC8qKlxuICAgKiBTZXQgY29uZmlndXJhdGlvbiBvZiBiYXNlIG1vZHVsZSBpbiByb290IG1vZHVsZSBvZiB0aGUgYXBwXG4gICAqL1xuICBzdGF0aWMgZm9yUm9vdChiYXNlTW9kdWxlQ29uZmlnOiBCYXNlTW9kdWxlQ29uZmlnID0ge30sIEFwcEF1dGhTZXJ2aWNlPyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8QmFzZU1vZHVsZT4ge1xuICAgIC8vIERlZmF1bHQgY29uZmlnXG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgYXBpVXJsOiAnJyxcbiAgICAgIGF1dGhHdWFyZFJlZGlyZWN0VXJsOiAnL2F1dGgnLFxuICAgICAgbG9nZ2luZzogZmFsc2UsXG4gICAgICB2ZXJzaW9uOiBudWxsLFxuICAgICAgcHJlZml4OiBudWxsLFxuICAgICAgc2Nyb2xsRGV0ZWN0aW9uT2Zmc2V0OiAyMDAsXG4gICAgICBzY3JvbGxPZmZzZXQ6IDEwMCxcbiAgICAgIHN0b3JhZ2VUeXBlOiAnbG9jYWwnLFxuICAgICAgLi4uYmFzZU1vZHVsZUNvbmZpZyxcbiAgICB9O1xuXG4gICAgaWYgKGNvbmZpZy5sb2dnaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZygnQ29uZmlnOicsIGNvbmZpZyk7XG4gICAgfVxuXG4gICAgLy8gUHJlcGFyZSBwcm92aWRlcnNcbiAgICBjb25zdCBwcm92aWRlcnM6IFByb3ZpZGVyW10gPSBbXG4gICAgICB7XG4gICAgICAgIHByb3ZpZGU6IEJBU0VfTU9EVUxFX0NPTkZJRyxcbiAgICAgICAgdXNlVmFsdWU6IGNvbmZpZyxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIC8vIEFkZCBhcG9sbG8gZmVhdHVyZXMgaWYgQVBJIFVSTCBpcyBzZXRcbiAgICBpZiAoYmFzZU1vZHVsZUNvbmZpZy5hcGlVcmwpIHtcbiAgICAgIHByb3ZpZGVycy5wdXNoKHtcbiAgICAgICAgcHJvdmlkZTogQVBPTExPX09QVElPTlMsXG4gICAgICAgIHVzZUZhY3Rvcnk6IGFwb2xsb09wdGlvbnNGYWN0b3J5LFxuICAgICAgICBkZXBzOiBbQkFTRV9NT0RVTEVfQ09ORklHLCBIdHRwTGluaywgQXBwQXV0aFNlcnZpY2UgPyBBcHBBdXRoU2VydmljZSA6IEF1dGhTZXJ2aWNlLCBXc1NlcnZpY2VdLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChjb25maWcubG9nZ2luZykge1xuICAgICAgY29uc29sZS5sb2coJ2FwaVVybCBpcyBtaXNzaW5nLCBBcG9sbG9MaW5rIGlzIG5vdCBpbml0aWFsaXplZCcpO1xuICAgIH1cblxuICAgIC8vIFJldHVybiByb290IG1vZHVsZVxuICAgIHJldHVybiB7XG4gICAgICBuZ01vZHVsZTogQmFzZU1vZHVsZSxcbiAgICAgIHByb3ZpZGVycyxcbiAgICB9O1xuICB9XG59XG4iXX0=
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1iYXNlL3NyYy9iYXNlLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMvQyxPQUFPLEVBQXVCLFFBQVEsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUV4RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxXQUFXLEVBQW9CLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzFHLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDOztBQUV4RCxpQ0FBaUM7QUFDakMsTUFBTSxRQUFRLEdBQUc7SUFDZixhQUFhO0lBQ2IsaUJBQWlCO0lBQ2pCLG9CQUFvQjtJQUNwQixrQkFBa0I7SUFFbEIsUUFBUTtJQUNSLFlBQVk7SUFDWixXQUFXO0NBQ1osQ0FBQztBQUVGOztHQUVHO0FBTUgsTUFBTSxPQUFPLFVBQVU7SUFDckI7O09BRUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFxQyxFQUFFLEVBQUUsY0FBZTtRQUNyRSxpQkFBaUI7UUFDakIsTUFBTSxNQUFNLEdBQUc7WUFDYixNQUFNLEVBQUUsRUFBRTtZQUNWLG9CQUFvQixFQUFFLE9BQU87WUFDN0IsT0FBTyxFQUFFLEtBQUs7WUFDZCxPQUFPLEVBQUUsSUFBSTtZQUNiLE1BQU0sRUFBRSxJQUFJO1lBQ1oscUJBQXFCLEVBQUUsR0FBRztZQUMxQixZQUFZLEVBQUUsR0FBRztZQUNqQixXQUFXLEVBQUUsT0FBTztZQUNwQixHQUFHLGdCQUFnQjtTQUNwQixDQUFDO1FBRUYsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsb0JBQW9CO1FBQ3BCLE1BQU0sU0FBUyxHQUFlO1lBQzVCO2dCQUNFLE9BQU8sRUFBRSxrQkFBa0I7Z0JBQzNCLFFBQVEsRUFBRSxNQUFNO2FBQ2pCO1NBQ0YsQ0FBQztRQUVGLHdDQUF3QztRQUN4QyxJQUFJLGdCQUFnQixDQUFDLE1BQU0sRUFBRTtZQUMzQixTQUFTLENBQUMsSUFBSSxDQUFDO2dCQUNiLE9BQU8sRUFBRSxjQUFjO2dCQUN2QixVQUFVLEVBQUUsb0JBQW9CO2dCQUNoQyxJQUFJLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUM7YUFDL0YsQ0FBQyxDQUFDO1NBQ0o7YUFBTSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUU7WUFDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQscUJBQXFCO1FBQ3JCLE9BQU87WUFDTCxRQUFRLEVBQUUsVUFBVTtZQUNwQixTQUFTO1NBQ1YsQ0FBQztJQUNKLENBQUM7O3VHQTlDVSxVQUFVO3dHQUFWLFVBQVU7UUFsQnJCLGFBQWE7UUFDYixpQkFBaUI7UUFDakIsb0JBQW9CO1FBQ3BCLGtCQUFrQjtRQUVsQixRQUFRO1FBQ1IsWUFBWTtRQUNaLFdBQVcsYUFPRCxZQUFZLEVBQUUsZ0JBQWdCO1FBZHhDLGFBQWE7UUFDYixpQkFBaUI7UUFDakIsb0JBQW9CO1FBQ3BCLGtCQUFrQjtRQUVsQixRQUFRO1FBQ1IsWUFBWTtRQUNaLFdBQVcsRUFTWSxZQUFZLEVBQUUsZ0JBQWdCO3dHQUUxQyxVQUFVLFlBSlgsWUFBWSxFQUFFLGdCQUFnQixFQUVqQixZQUFZLEVBQUUsZ0JBQWdCOzJGQUUxQyxVQUFVO2tCQUx0QixRQUFRO21CQUFDO29CQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQztvQkFDekMsWUFBWSxFQUFFLFFBQVE7b0JBQ3RCLE9BQU8sRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQztpQkFDdkQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBUE9MTE9fT1BUSU9OUywgQXBvbGxvTW9kdWxlIH0gZnJvbSAnYXBvbGxvLWFuZ3VsYXInO1xuaW1wb3J0IHsgSHR0cExpbmsgfSBmcm9tICdhcG9sbG8tYW5ndWxhci9odHRwJztcbmltcG9ydCB7IE1vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlLCBQcm92aWRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBhcG9sbG9PcHRpb25zRmFjdG9yeSB9IGZyb20gJy4vZmFjdG9yaWVzL2Fwb2xsby1vcHRpb25zLmZhY3RvcnknO1xuaW1wb3J0IHsgTGF6eUxvYWREaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZXMvbGF6eS1sb2FkLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBNYXRjaEhlaWdodERpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9tYXRjaC1oZWlnaHQuZGlyZWN0aXZlJztcbmltcG9ydCB7IFJlc2l6YWJsZURpcmVjdGl2ZSB9IGZyb20gJy4vZGlyZWN0aXZlcy9yZXNpemFibGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IFNhZmVIdG1sUGlwZSB9IGZyb20gJy4vcGlwZXMvc2FmZS1odG1sLnBpcGUnO1xuaW1wb3J0IHsgRGF0ZUFnb1BpcGUgfSBmcm9tICcuL3BpcGVzL2RhdGUtYWdvLnBpcGUnO1xuaW1wb3J0IHsgQXV0aFNlcnZpY2UsIEJhc2VNb2R1bGVDb25maWcsIEJBU0VfTU9EVUxFX0NPTkZJRywgV3NTZXJ2aWNlIH0gZnJvbSAnQGxlbm5lLnRlY2gvbmctYmFzZS9zaGFyZWQnO1xuaW1wb3J0IHsgSHR0cENsaWVudE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcblxuLy8gSW1wb3J0ZWQgYW5kIGV4cG9ydGVkIGVsZW1lbnRzXG5jb25zdCBlbGVtZW50cyA9IFtcbiAgLy8gRGlyZWN0aXZlc1xuICBMYXp5TG9hZERpcmVjdGl2ZSxcbiAgTWF0Y2hIZWlnaHREaXJlY3RpdmUsXG4gIFJlc2l6YWJsZURpcmVjdGl2ZSxcblxuICAvLyBQaXBlc1xuICBTYWZlSHRtbFBpcGUsXG4gIERhdGVBZ29QaXBlLFxuXTtcblxuLyoqXG4gKiBCYXNlIG1vZHVsZVxuICovXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbQXBvbGxvTW9kdWxlLCBIdHRwQ2xpZW50TW9kdWxlXSxcbiAgZGVjbGFyYXRpb25zOiBlbGVtZW50cyxcbiAgZXhwb3J0czogWy4uLmVsZW1lbnRzLCBBcG9sbG9Nb2R1bGUsIEh0dHBDbGllbnRNb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBCYXNlTW9kdWxlIHtcbiAgLyoqXG4gICAqIFNldCBjb25maWd1cmF0aW9uIG9mIGJhc2UgbW9kdWxlIGluIHJvb3QgbW9kdWxlIG9mIHRoZSBhcHBcbiAgICovXG4gIHN0YXRpYyBmb3JSb290KGJhc2VNb2R1bGVDb25maWc6IEJhc2VNb2R1bGVDb25maWcgPSB7fSwgQXBwQXV0aFNlcnZpY2U/KTogTW9kdWxlV2l0aFByb3ZpZGVyczxCYXNlTW9kdWxlPiB7XG4gICAgLy8gRGVmYXVsdCBjb25maWdcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBhcGlVcmw6ICcnLFxuICAgICAgYXV0aEd1YXJkUmVkaXJlY3RVcmw6ICcvYXV0aCcsXG4gICAgICBsb2dnaW5nOiBmYWxzZSxcbiAgICAgIHZlcnNpb246IG51bGwsXG4gICAgICBwcmVmaXg6IG51bGwsXG4gICAgICBzY3JvbGxEZXRlY3Rpb25PZmZzZXQ6IDIwMCxcbiAgICAgIHNjcm9sbE9mZnNldDogMTAwLFxuICAgICAgc3RvcmFnZVR5cGU6ICdsb2NhbCcsXG4gICAgICAuLi5iYXNlTW9kdWxlQ29uZmlnLFxuICAgIH07XG5cbiAgICBpZiAoY29uZmlnLmxvZ2dpbmcpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdDb25maWc6JywgY29uZmlnKTtcbiAgICB9XG5cbiAgICAvLyBQcmVwYXJlIHByb3ZpZGVyc1xuICAgIGNvbnN0IHByb3ZpZGVyczogUHJvdmlkZXJbXSA9IFtcbiAgICAgIHtcbiAgICAgICAgcHJvdmlkZTogQkFTRV9NT0RVTEVfQ09ORklHLFxuICAgICAgICB1c2VWYWx1ZTogY29uZmlnLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgLy8gQWRkIGFwb2xsbyBmZWF0dXJlcyBpZiBBUEkgVVJMIGlzIHNldFxuICAgIGlmIChiYXNlTW9kdWxlQ29uZmlnLmFwaVVybCkge1xuICAgICAgcHJvdmlkZXJzLnB1c2goe1xuICAgICAgICBwcm92aWRlOiBBUE9MTE9fT1BUSU9OUyxcbiAgICAgICAgdXNlRmFjdG9yeTogYXBvbGxvT3B0aW9uc0ZhY3RvcnksXG4gICAgICAgIGRlcHM6IFtCQVNFX01PRFVMRV9DT05GSUcsIEh0dHBMaW5rLCBBcHBBdXRoU2VydmljZSA/IEFwcEF1dGhTZXJ2aWNlIDogQXV0aFNlcnZpY2UsIFdzU2VydmljZV0sXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKGNvbmZpZy5sb2dnaW5nKSB7XG4gICAgICBjb25zb2xlLmxvZygnYXBpVXJsIGlzIG1pc3NpbmcsIEFwb2xsb0xpbmsgaXMgbm90IGluaXRpYWxpemVkJyk7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHJvb3QgbW9kdWxlXG4gICAgcmV0dXJuIHtcbiAgICAgIG5nTW9kdWxlOiBCYXNlTW9kdWxlLFxuICAgICAgcHJvdmlkZXJzLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, Component, Input, Output, ViewChild, Directive, Inject, HostListener, NgModule } from '@angular/core';
2
+ import { EventEmitter, Component, Input, Output, ViewChild, Directive, Inject, HostListener, Pipe, NgModule } from '@angular/core';
3
3
  import * as i1 from '@angular/forms';
4
- import { UntypedFormControl, Validators, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
4
+ import { UntypedFormControl, UntypedFormGroup, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
5
5
  import * as i2 from '@angular/common';
6
6
  import { DOCUMENT, CommonModule } from '@angular/common';
7
7
  import { trigger, transition, query, style, animate } from '@angular/animations';
@@ -72,10 +72,10 @@ class SelectComponent {
72
72
  }
73
73
  }
74
74
  SelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: SelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
75
- SelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: SelectComponent, selector: "base-select", inputs: { id: "id", name: "name", label: "label", placeholder: "placeholder", control: "control", tabIndex: "tabIndex", required: "required", multiple: "multiple", search: "search", options: "options" }, viewQueries: [{ propertyName: "select", first: true, predicate: ["select"], descendants: true }], ngImport: i0, template: "<div class=\"form-group mb-3\">\n <label [for]=\"id\" class=\"form-label\" [ngClass]=\"{ required: required }\" *ngIf=\"label\">{{ label }}</label>\n <select\n #select\n [id]=\"id\"\n [name]=\"name\"\n class=\"form-select\"\n [attr.aria-label]=\"placeholder\"\n [attr.data-live-search]=\"search\"\n [formControl]=\"control\"\n [required]=\"required\"\n [tabIndex]=\"tabIndex ?? null\"\n [ngClass]=\"{ 'is-invalid': control?.invalid && control?.touched }\"\n >\n <option [ngValue]=\"null\" selected>{{ placeholder }}</option>\n <option *ngFor=\"let option of options\" [ngValue]=\"option.value\">\n {{ option.text }}\n </option>\n </select>\n\n <div class=\"invalid-feedback m-2\" *ngIf=\"control?.invalid && (control?.dirty || control?.touched)\">\n <div *ngIf=\"control?.errors?.['required']\">Dieses Feld ist ein Pflichtfeld.</div>\n <div *ngIf=\"control?.errors?.['minlength']\">\n Die Mindestl\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['minlength']?.requiredLength}} Zeichen.\n </div>\n <div *ngIf=\"control?.errors?.['maxlength']\">\n Die maximale L\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['maxlength']?.requiredLength}} Zeichen.\n </div>\n <div *ngIf=\"control?.errors?.['email']\">Bitte eine g\u00FCltige E-Mail Adresse angeben.</div>\n </div>\n</div>\n", styles: [".required:after{content:\" *\"}\n"], dependencies: [{ kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
75
+ SelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: SelectComponent, selector: "base-select", inputs: { id: "id", name: "name", label: "label", placeholder: "placeholder", control: "control", tabIndex: "tabIndex", required: "required", multiple: "multiple", search: "search", options: "options" }, viewQueries: [{ propertyName: "select", first: true, predicate: ["select"], descendants: true }], ngImport: i0, template: "<div class=\"form-group mb-3\">\n <label [for]=\"id\" class=\"form-label\" [ngClass]=\"{ required: required }\" *ngIf=\"label\">{{ label }}</label>\n <select\n #select\n [id]=\"id\"\n [name]=\"name\"\n class=\"form-select\"\n [attr.aria-label]=\"placeholder\"\n [attr.data-live-search]=\"search\"\n [formControl]=\"control\"\n [required]=\"required\"\n [tabIndex]=\"tabIndex ?? null\"\n [ngClass]=\"{ 'is-invalid': control?.invalid && control?.touched }\"\n >\n <option [ngValue]=\"null\" disabled selected>{{ placeholder }}</option>\n <option *ngFor=\"let option of options\" [ngValue]=\"option.value\">\n {{ option.text }}\n </option>\n </select>\n\n <div class=\"invalid-feedback m-2\" *ngIf=\"control?.invalid && (control?.dirty || control?.touched)\">\n <div *ngIf=\"control?.errors?.['required']\">Dieses Feld ist ein Pflichtfeld.</div>\n <div *ngIf=\"control?.errors?.['minlength']\">\n Die Mindestl\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['minlength']?.requiredLength}} Zeichen.\n </div>\n <div *ngIf=\"control?.errors?.['maxlength']\">\n Die maximale L\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['maxlength']?.requiredLength}} Zeichen.\n </div>\n <div *ngIf=\"control?.errors?.['email']\">Bitte eine g\u00FCltige E-Mail Adresse angeben.</div>\n </div>\n</div>\n", styles: [".required:after{content:\" *\"}\n"], dependencies: [{ kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
76
76
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: SelectComponent, decorators: [{
77
77
  type: Component,
78
- args: [{ selector: 'base-select', template: "<div class=\"form-group mb-3\">\n <label [for]=\"id\" class=\"form-label\" [ngClass]=\"{ required: required }\" *ngIf=\"label\">{{ label }}</label>\n <select\n #select\n [id]=\"id\"\n [name]=\"name\"\n class=\"form-select\"\n [attr.aria-label]=\"placeholder\"\n [attr.data-live-search]=\"search\"\n [formControl]=\"control\"\n [required]=\"required\"\n [tabIndex]=\"tabIndex ?? null\"\n [ngClass]=\"{ 'is-invalid': control?.invalid && control?.touched }\"\n >\n <option [ngValue]=\"null\" selected>{{ placeholder }}</option>\n <option *ngFor=\"let option of options\" [ngValue]=\"option.value\">\n {{ option.text }}\n </option>\n </select>\n\n <div class=\"invalid-feedback m-2\" *ngIf=\"control?.invalid && (control?.dirty || control?.touched)\">\n <div *ngIf=\"control?.errors?.['required']\">Dieses Feld ist ein Pflichtfeld.</div>\n <div *ngIf=\"control?.errors?.['minlength']\">\n Die Mindestl\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['minlength']?.requiredLength}} Zeichen.\n </div>\n <div *ngIf=\"control?.errors?.['maxlength']\">\n Die maximale L\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['maxlength']?.requiredLength}} Zeichen.\n </div>\n <div *ngIf=\"control?.errors?.['email']\">Bitte eine g\u00FCltige E-Mail Adresse angeben.</div>\n </div>\n</div>\n", styles: [".required:after{content:\" *\"}\n"] }]
78
+ args: [{ selector: 'base-select', template: "<div class=\"form-group mb-3\">\n <label [for]=\"id\" class=\"form-label\" [ngClass]=\"{ required: required }\" *ngIf=\"label\">{{ label }}</label>\n <select\n #select\n [id]=\"id\"\n [name]=\"name\"\n class=\"form-select\"\n [attr.aria-label]=\"placeholder\"\n [attr.data-live-search]=\"search\"\n [formControl]=\"control\"\n [required]=\"required\"\n [tabIndex]=\"tabIndex ?? null\"\n [ngClass]=\"{ 'is-invalid': control?.invalid && control?.touched }\"\n >\n <option [ngValue]=\"null\" disabled selected>{{ placeholder }}</option>\n <option *ngFor=\"let option of options\" [ngValue]=\"option.value\">\n {{ option.text }}\n </option>\n </select>\n\n <div class=\"invalid-feedback m-2\" *ngIf=\"control?.invalid && (control?.dirty || control?.touched)\">\n <div *ngIf=\"control?.errors?.['required']\">Dieses Feld ist ein Pflichtfeld.</div>\n <div *ngIf=\"control?.errors?.['minlength']\">\n Die Mindestl\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['minlength']?.requiredLength}} Zeichen.\n </div>\n <div *ngIf=\"control?.errors?.['maxlength']\">\n Die maximale L\u00E4nge f\u00FCr dieses Feld betr\u00E4gt\n {{control?.errors?.['maxlength']?.requiredLength}} Zeichen.\n </div>\n <div *ngIf=\"control?.errors?.['email']\">Bitte eine g\u00FCltige E-Mail Adresse angeben.</div>\n </div>\n</div>\n", styles: [".required:after{content:\" *\"}\n"] }]
79
79
  }], propDecorators: { select: [{
80
80
  type: ViewChild,
81
81
  args: ['select']
@@ -1026,7 +1026,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
1026
1026
  }] } });
1027
1027
 
1028
1028
  class ModelFormComponent {
1029
- constructor(graphQLMetaService, graphQLService, formsService, authService, router, route, cmsService) {
1029
+ constructor(graphQLMetaService, graphQLService, formsService, authService, router, route, cmsService, toastService) {
1030
1030
  this.graphQLMetaService = graphQLMetaService;
1031
1031
  this.graphQLService = graphQLService;
1032
1032
  this.formsService = formsService;
@@ -1034,15 +1034,26 @@ class ModelFormComponent {
1034
1034
  this.router = router;
1035
1035
  this.route = route;
1036
1036
  this.cmsService = cmsService;
1037
+ this.toastService = toastService;
1037
1038
  this.delete = true;
1038
1039
  this.onlyUpdateMode = false;
1039
1040
  this.duplicate = false;
1040
1041
  this.logging = false;
1041
1042
  this.config = {};
1042
1043
  this.finished = new EventEmitter();
1043
- this.loading = false;
1044
+ this._loading = false;
1044
1045
  this.keys = [];
1045
1046
  }
1047
+ set loading(value) {
1048
+ if (!value) {
1049
+ setTimeout(() => {
1050
+ this._loading = value;
1051
+ }, 400);
1052
+ }
1053
+ else {
1054
+ this._loading = value;
1055
+ }
1056
+ }
1046
1057
  ngOnInit() {
1047
1058
  // Set user for roles check
1048
1059
  this.user = BasicUser.map(this.authService.currentUser);
@@ -1193,13 +1204,11 @@ class ModelFormComponent {
1193
1204
  * @param fields - IGraphQLTypeCollection
1194
1205
  */
1195
1206
  createForm(fields) {
1196
- var _a, _b, _c;
1207
+ var _a;
1197
1208
  const group = {};
1198
1209
  for (const [key, value] of Object.entries(fields)) {
1199
1210
  if (((_a = Object.keys(value === null || value === void 0 ? void 0 : value.fields)) === null || _a === void 0 ? void 0 : _a.length) === 0) {
1200
- group[key] = new UntypedFormControl(null, (this.config[key] && ((_b = this.config[key]) === null || _b === void 0 ? void 0 : _b.required) !== undefined ? (_c = this.config[key]) === null || _c === void 0 ? void 0 : _c.required : value.isRequired)
1201
- ? Validators.required
1202
- : []);
1211
+ group[key] = new UntypedFormControl(null, this.processValidators(this.config[key], value));
1203
1212
  }
1204
1213
  else {
1205
1214
  group[key] = this.createForm(fields[key].fields);
@@ -1210,6 +1219,30 @@ class ModelFormComponent {
1210
1219
  }
1211
1220
  return new UntypedFormGroup(group);
1212
1221
  }
1222
+ /**
1223
+ * Process form validators for control
1224
+ */
1225
+ processValidators(config, value) {
1226
+ const validators = [];
1227
+ if (config) {
1228
+ if ((config === null || config === void 0 ? void 0 : config.required) !== undefined ? config === null || config === void 0 ? void 0 : config.required : value.isRequired) {
1229
+ validators.push(Validators.required);
1230
+ }
1231
+ if ((config === null || config === void 0 ? void 0 : config.type) === 'Email') {
1232
+ validators.push(Validators.email);
1233
+ }
1234
+ if ((config === null || config === void 0 ? void 0 : config.type) === 'Password') {
1235
+ validators.push(Validators.minLength(6));
1236
+ }
1237
+ if (typeof (config === null || config === void 0 ? void 0 : config.min) === 'number') {
1238
+ validators.push(Validators.min(config.min));
1239
+ }
1240
+ if (typeof (config === null || config === void 0 ? void 0 : config.max) === 'number') {
1241
+ validators.push(Validators.max(config.max));
1242
+ }
1243
+ }
1244
+ return validators;
1245
+ }
1213
1246
  /**
1214
1247
  * It calls the graphQLService to delete the object with the id of the object that is currently being edited
1215
1248
  */
@@ -1299,13 +1332,13 @@ class ModelFormComponent {
1299
1332
  if (this.form.invalid && !secret) {
1300
1333
  this.formsService.validateAllFormFields(this.form);
1301
1334
  this.loading = false;
1302
- reject();
1335
+ resolve(null);
1303
1336
  return;
1304
1337
  }
1305
1338
  if (this.operation === 'update' && !this.id) {
1306
1339
  console.error('ID is missing for update!');
1307
1340
  this.loading = false;
1308
- reject();
1341
+ resolve(null);
1309
1342
  return;
1310
1343
  }
1311
1344
  if (this.logging) {
@@ -1347,6 +1380,12 @@ class ModelFormComponent {
1347
1380
  if (!secret) {
1348
1381
  this.loading = false;
1349
1382
  this.finished.emit(null);
1383
+ this.toastService.show({
1384
+ id: this.modelName + '-success',
1385
+ type: ToastType.SUCCESS,
1386
+ title: 'Erfolgreich',
1387
+ description: this.label + ' wurde erfolgreich ' + (this.operation === 'create' ? 'erstellt.' : 'aktualisiert.'),
1388
+ });
1350
1389
  }
1351
1390
  resolve(value);
1352
1391
  },
@@ -1354,6 +1393,15 @@ class ModelFormComponent {
1354
1393
  if (!secret) {
1355
1394
  console.error('Failed on ' + this.operation, err);
1356
1395
  this.loading = false;
1396
+ this.toastService.show({
1397
+ id: this.modelName + '-success',
1398
+ type: ToastType.ERROR,
1399
+ description: 'Beim ' +
1400
+ (this.operation === 'create' ? 'erstellen' : 'aktualisieren') +
1401
+ ' von ' +
1402
+ this.label +
1403
+ ' ist etwas schiefgelaufen.',
1404
+ });
1357
1405
  }
1358
1406
  reject();
1359
1407
  },
@@ -1361,12 +1409,12 @@ class ModelFormComponent {
1361
1409
  });
1362
1410
  }
1363
1411
  }
1364
- ModelFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ModelFormComponent, deps: [{ token: i1$1.GraphQLMetaService }, { token: i1$1.GraphQLService }, { token: i1$1.FormsService }, { token: i1$1.AuthService }, { token: i2$1.Router }, { token: i2$1.ActivatedRoute }, { token: i1$1.CmsService }], target: i0.ɵɵFactoryTarget.Component });
1365
- ModelFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: ModelFormComponent, selector: "base-model-form", inputs: { modelName: "modelName", label: "label", id: "id", delete: "delete", onlyUpdateMode: "onlyUpdateMode", duplicate: "duplicate", logging: "logging", config: "config" }, outputs: { finished: "finished" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"w-100\" *ngIf=\"form\">\n <div class=\"d-flex flex-row justify-content-between mt-3\">\n <h2 class=\"mb-0\">\n {{ label ? label : capitalizeFirstLetter(modelName) }} {{ operation === 'update' ? 'bearbeiten' : 'erstellen' }}\n </h2>\n\n <div class=\"d-flex flex-row align-items-center justify-content-end\">\n <button class=\"btn btn-outline-primary me-2\" *ngIf=\"id && duplicate && !loading\" (click)=\"duplicateObject()\">\n Duplizieren\n </button>\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"submit(false)\" *ngIf=\"!loading\">\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n\n <form [formGroup]=\"form\">\n <base-model-form-sub\n [fields]=\"fields\"\n [config]=\"config\"\n [form]=\"form\"\n (imageChanged)=\"imageChanged($event)\"\n ></base-model-form-sub>\n\n <div class=\"d-flex mt-4\" [ngClass]=\"id && delete ? 'justify-content-between' : 'justify-content-end'\">\n <div *ngIf=\"id && delete\">\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteObject()\">L\u00F6schen</button>\n </div>\n <div>\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"submit(false)\" *ngIf=\"!loading\">\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n </form>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ModelFormSubComponent, selector: "base-model-form-sub", inputs: ["fields", "form", "config"], outputs: ["imageChanged"] }] });
1412
+ ModelFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ModelFormComponent, deps: [{ token: i1$1.GraphQLMetaService }, { token: i1$1.GraphQLService }, { token: i1$1.FormsService }, { token: i1$1.AuthService }, { token: i2$1.Router }, { token: i2$1.ActivatedRoute }, { token: i1$1.CmsService }, { token: i1$1.ToastService }], target: i0.ɵɵFactoryTarget.Component });
1413
+ ModelFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: ModelFormComponent, selector: "base-model-form", inputs: { modelName: "modelName", label: "label", id: "id", delete: "delete", onlyUpdateMode: "onlyUpdateMode", duplicate: "duplicate", logging: "logging", config: "config" }, outputs: { finished: "finished" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"w-100\" *ngIf=\"form\">\n <div class=\"d-flex flex-row justify-content-between mt-3\">\n <h2 class=\"mb-0\">\n {{ label ? label : capitalizeFirstLetter(modelName) }} {{ operation === 'update' ? 'bearbeiten' : 'erstellen' }}\n </h2>\n\n <div class=\"d-flex flex-row align-items-center justify-content-end\">\n <button class=\"btn btn-outline-primary me-2\" *ngIf=\"id && duplicate && !_loading\" (click)=\"duplicateObject()\">\n Duplizieren\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!form.touched && !form.dirty\"\n (click)=\"submit(false)\"\n *ngIf=\"!_loading\"\n >\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"_loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n\n <form [formGroup]=\"form\">\n <base-model-form-sub\n [fields]=\"fields\"\n [config]=\"config\"\n [form]=\"form\"\n (imageChanged)=\"imageChanged($event)\"\n ></base-model-form-sub>\n\n <div class=\"d-flex mt-4\" [ngClass]=\"id && delete ? 'justify-content-between' : 'justify-content-end'\">\n <div *ngIf=\"id && delete\">\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteObject()\">L\u00F6schen</button>\n </div>\n <div>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!form.touched && !form.dirty\"\n (click)=\"submit(false)\"\n *ngIf=\"!_loading\"\n >\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"_loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n </form>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ModelFormSubComponent, selector: "base-model-form-sub", inputs: ["fields", "form", "config"], outputs: ["imageChanged"] }] });
1366
1414
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ModelFormComponent, decorators: [{
1367
1415
  type: Component,
1368
- args: [{ selector: 'base-model-form', template: "<div class=\"w-100\" *ngIf=\"form\">\n <div class=\"d-flex flex-row justify-content-between mt-3\">\n <h2 class=\"mb-0\">\n {{ label ? label : capitalizeFirstLetter(modelName) }} {{ operation === 'update' ? 'bearbeiten' : 'erstellen' }}\n </h2>\n\n <div class=\"d-flex flex-row align-items-center justify-content-end\">\n <button class=\"btn btn-outline-primary me-2\" *ngIf=\"id && duplicate && !loading\" (click)=\"duplicateObject()\">\n Duplizieren\n </button>\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"submit(false)\" *ngIf=\"!loading\">\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n\n <form [formGroup]=\"form\">\n <base-model-form-sub\n [fields]=\"fields\"\n [config]=\"config\"\n [form]=\"form\"\n (imageChanged)=\"imageChanged($event)\"\n ></base-model-form-sub>\n\n <div class=\"d-flex mt-4\" [ngClass]=\"id && delete ? 'justify-content-between' : 'justify-content-end'\">\n <div *ngIf=\"id && delete\">\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteObject()\">L\u00F6schen</button>\n </div>\n <div>\n <button class=\"btn btn-primary\" type=\"button\" (click)=\"submit(false)\" *ngIf=\"!loading\">\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n </form>\n</div>\n" }]
1369
- }], ctorParameters: function () { return [{ type: i1$1.GraphQLMetaService }, { type: i1$1.GraphQLService }, { type: i1$1.FormsService }, { type: i1$1.AuthService }, { type: i2$1.Router }, { type: i2$1.ActivatedRoute }, { type: i1$1.CmsService }]; }, propDecorators: { modelName: [{
1416
+ args: [{ selector: 'base-model-form', template: "<div class=\"w-100\" *ngIf=\"form\">\n <div class=\"d-flex flex-row justify-content-between mt-3\">\n <h2 class=\"mb-0\">\n {{ label ? label : capitalizeFirstLetter(modelName) }} {{ operation === 'update' ? 'bearbeiten' : 'erstellen' }}\n </h2>\n\n <div class=\"d-flex flex-row align-items-center justify-content-end\">\n <button class=\"btn btn-outline-primary me-2\" *ngIf=\"id && duplicate && !_loading\" (click)=\"duplicateObject()\">\n Duplizieren\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!form.touched && !form.dirty\"\n (click)=\"submit(false)\"\n *ngIf=\"!_loading\"\n >\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"_loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n\n <form [formGroup]=\"form\">\n <base-model-form-sub\n [fields]=\"fields\"\n [config]=\"config\"\n [form]=\"form\"\n (imageChanged)=\"imageChanged($event)\"\n ></base-model-form-sub>\n\n <div class=\"d-flex mt-4\" [ngClass]=\"id && delete ? 'justify-content-between' : 'justify-content-end'\">\n <div *ngIf=\"id && delete\">\n <button class=\"btn btn-danger\" type=\"button\" (click)=\"deleteObject()\">L\u00F6schen</button>\n </div>\n <div>\n <button\n class=\"btn btn-primary\"\n type=\"button\"\n [disabled]=\"!form.touched && !form.dirty\"\n (click)=\"submit(false)\"\n *ngIf=\"!_loading\"\n >\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}\n </button>\n <button class=\"btn btn-primary\" type=\"button\" disabled *ngIf=\"_loading\">\n <span class=\"spinner-border spinner-border-sm\" role=\"status\" aria-hidden=\"true\"></span>\n {{ operation === 'create' ? 'Erstellen' : 'Speichern' }}...\n </button>\n </div>\n </div>\n </form>\n</div>\n" }]
1417
+ }], ctorParameters: function () { return [{ type: i1$1.GraphQLMetaService }, { type: i1$1.GraphQLService }, { type: i1$1.FormsService }, { type: i1$1.AuthService }, { type: i2$1.Router }, { type: i2$1.ActivatedRoute }, { type: i1$1.CmsService }, { type: i1$1.ToastService }]; }, propDecorators: { modelName: [{
1370
1418
  type: Input
1371
1419
  }], label: [{
1372
1420
  type: Input
@@ -1386,6 +1434,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
1386
1434
  type: Output
1387
1435
  }] } });
1388
1436
 
1437
+ /**
1438
+ * Truncate string with ellipses
1439
+ */
1440
+ class EllipsesPipe {
1441
+ transform(value, limit) {
1442
+ if (!value) {
1443
+ return null;
1444
+ }
1445
+ return value.length > limit ? value.substring(0, limit) + '...' : value;
1446
+ }
1447
+ }
1448
+ EllipsesPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: EllipsesPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
1449
+ EllipsesPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "14.1.0", ngImport: i0, type: EllipsesPipe, name: "baseEllipses" });
1450
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: EllipsesPipe, decorators: [{
1451
+ type: Pipe,
1452
+ args: [{
1453
+ name: 'baseEllipses',
1454
+ }]
1455
+ }] });
1456
+
1389
1457
  class ModelTableComponent {
1390
1458
  constructor(graphQLMetaService, graphQLService, cmsService) {
1391
1459
  this.graphQLMetaService = graphQLMetaService;
@@ -1493,10 +1561,15 @@ class ModelTableComponent {
1493
1561
  * @param fields - string[] - The fields you want to load from the database.
1494
1562
  */
1495
1563
  loadObjects(fields) {
1564
+ const requestFields = [...fields];
1565
+ const idInFields = requestFields.find((e) => e === 'id');
1566
+ if (!idInFields) {
1567
+ requestFields.push('id');
1568
+ }
1496
1569
  this.objects = [];
1497
1570
  this.graphQLService
1498
1571
  .graphQl(this.queryName, {
1499
- fields,
1572
+ fields: requestFields,
1500
1573
  type: GraphQLRequestType.QUERY,
1501
1574
  })
1502
1575
  .subscribe({
@@ -1564,10 +1637,10 @@ class ModelTableComponent {
1564
1637
  }
1565
1638
  }
1566
1639
  ModelTableComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ModelTableComponent, deps: [{ token: i1$1.GraphQLMetaService }, { token: i1$1.GraphQLService }, { token: i1$1.CmsService }], target: i0.ɵɵFactoryTarget.Component });
1567
- ModelTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: ModelTableComponent, selector: "base-model-table", inputs: { modelName: "modelName", objectId: "objectId", createMode: "createMode", logging: "logging", create: "create", update: "update", delete: "delete", duplicate: "duplicate", config: "config", fieldConfig: "fieldConfig" }, outputs: { idSelected: "idSelected", createModeChanged: "createModeChanged" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"!selectedId && !createMode\">\n <div class=\"w-100 d-flex flex-row justify-content-between align-items-center mb-4\">\n <h2 class=\"mb-0\" *ngIf=\"modelName\">\n {{\n config?.plural ? config?.plural : config?.label ? config?.label : capitalizeFirstLetter(camelModelName) + 's'\n }}\n </h2>\n <div class=\"d-flex align-items-center\">\n <button class=\"btn btn-primary\" (click)=\"createNewObject()\" *ngIf=\"create\">Erstellen</button>\n </div>\n </div>\n\n <div\n class=\"table-responsive\"\n [ltContextMenu]=\"contextMenu\"\n [selectors]=\"'.object-col'\"\n #contextMenuData=\"contextMenuData\"\n >\n <table class=\"table table-hover bg-white\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let field of availableFields\"\n [baseSort]=\"objects\"\n data-order=\"desc\"\n [attr.data-name]=\"field\"\n >\n {{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr class=\"object-col\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <td class=\"cursor-pointer\" *ngFor=\"let field of availableFields\" (click)=\"selectId(object)\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date: tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] }}\n </ng-container>\n </td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"context-menu\" #contextMenu>\n <div class=\"context-menu-item\" (click)=\"selectId({ id: contextMenuData.clickedElement?.id })\">Bearbeiten</div>\n <div class=\"context-menu-item\" *ngIf=\"duplicate\" (click)=\"duplicateObject(contextMenuData.clickedElement?.id)\">\n Duplizieren\n </div>\n <div class=\"context-menu-item\" *ngIf=\"delete\" (click)=\"deleteObject(contextMenuData.clickedElement?.id)\">\n L\u00F6schen\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"w-100\" *ngIf=\"selectedId || createMode\">\n <button class=\"btn btn-outline-primary mb-3\" (click)=\"selectId('')\">Zur\u00FCck</button>\n <base-model-form\n [modelName]=\"camelModelName\"\n [label]=\"config?.label\"\n [config]=\"fieldConfig\"\n [logging]=\"logging\"\n [id]=\"selectedId\"\n (finished)=\"selectId('')\"\n [delete]=\"delete\"\n [duplicate]=\"duplicate\"\n ></base-model-form>\n</div>\n", styles: [".cursor-pointer{cursor:pointer}.asc:after,.desc:after{border-style:solid;border-width:.2em .2em 0 0;content:\"\";display:inline-block;height:.45em;left:5px;position:relative;transform:rotate(-45deg);vertical-align:middle;width:.45em}.asc:after{transform:rotate(135deg)}td{vertical-align:middle}.bi,th{cursor:pointer;-webkit-user-select:none;user-select:none}.table>:not(:first-child){border-top:0}table{border-radius:.25rem;border-color:#e2e8f0!important}table thead{text-transform:uppercase;font-size:12px}table thead th{padding:12px 24px}table tbody tr td{font-weight:400!important;font-size:16px;padding:16px 24px}.context-menu{opacity:.01%;pointer-events:none;background-color:#fff;border:1px solid #ccc;box-shadow:1px 1px 10px #0000001a;padding:10px 0;position:fixed;top:0;left:0;width:200px}.context-menu-item{cursor:pointer;padding:8px 15px}.context-menu-item:hover{color:var(--bs-primary)}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: SortDirective, selector: "[baseSort]", inputs: ["baseSort"] }, { kind: "directive", type: ContextMenuDirective, selector: "[ltContextMenu]", inputs: ["contextMenuData", "ltContextMenu", "xGap", "yGap", "overflowSpace", "selectors"], outputs: ["clickedElement"], exportAs: ["contextMenuData"] }, { kind: "component", type: ModelFormComponent, selector: "base-model-form", inputs: ["modelName", "label", "id", "delete", "onlyUpdateMode", "duplicate", "logging", "config"], outputs: ["finished"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
1640
+ ModelTableComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: ModelTableComponent, selector: "base-model-table", inputs: { modelName: "modelName", objectId: "objectId", createMode: "createMode", logging: "logging", create: "create", update: "update", delete: "delete", duplicate: "duplicate", config: "config", fieldConfig: "fieldConfig" }, outputs: { idSelected: "idSelected", createModeChanged: "createModeChanged" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"!selectedId && !createMode\">\n <div class=\"w-100 d-flex flex-row justify-content-between align-items-center mb-4\">\n <h2 class=\"mb-0\" *ngIf=\"modelName\">\n {{\n config?.plural ? config?.plural : config?.label ? config?.label : capitalizeFirstLetter(camelModelName) + 's'\n }}\n </h2>\n <div class=\"d-flex align-items-center\">\n <button class=\"btn btn-primary\" (click)=\"createNewObject()\" *ngIf=\"create\">Erstellen</button>\n </div>\n </div>\n\n <div\n class=\"table-responsive\"\n [ltContextMenu]=\"contextMenu\"\n [selectors]=\"'.object-col'\"\n #contextMenuData=\"contextMenuData\"\n >\n <table class=\"table table-hover bg-white\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let field of availableFields\"\n [baseSort]=\"objects\"\n data-order=\"desc\"\n [attr.data-name]=\"field\"\n >\n {{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr class=\"object-col\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <td class=\"cursor-pointer\" *ngFor=\"let field of availableFields\" (click)=\"selectId(object)\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date: tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] | baseEllipses: 60 }}\n </ng-container>\n </td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"context-menu\" #contextMenu>\n <div class=\"context-menu-item\" (click)=\"selectId({ id: contextMenuData.clickedElement?.id })\">Bearbeiten</div>\n <div class=\"context-menu-item\" *ngIf=\"duplicate\" (click)=\"duplicateObject(contextMenuData.clickedElement?.id)\">\n Duplizieren\n </div>\n <div class=\"context-menu-item\" *ngIf=\"delete\" (click)=\"deleteObject(contextMenuData.clickedElement?.id)\">\n L\u00F6schen\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"w-100\" *ngIf=\"selectedId || createMode\">\n <button class=\"btn btn-outline-primary mb-3\" (click)=\"selectId('')\">Zur\u00FCck</button>\n <base-model-form\n [modelName]=\"camelModelName\"\n [label]=\"config?.label\"\n [config]=\"fieldConfig\"\n [logging]=\"logging\"\n [id]=\"selectedId\"\n (finished)=\"selectId('')\"\n [delete]=\"delete\"\n [duplicate]=\"duplicate\"\n ></base-model-form>\n</div>\n", styles: [".cursor-pointer{cursor:pointer}.asc:after,.desc:after{border-style:solid;border-width:.2em .2em 0 0;content:\"\";display:inline-block;height:.45em;left:5px;position:relative;transform:rotate(-45deg);vertical-align:middle;width:.45em}.asc:after{transform:rotate(135deg)}td{vertical-align:middle}.bi,th{cursor:pointer;-webkit-user-select:none;user-select:none}.table>:not(:first-child){border-top:0}table{border-radius:.25rem;border-color:#e2e8f0!important}table thead{text-transform:uppercase;font-size:12px}table thead th{padding:12px 24px}table tbody tr td{font-weight:400!important;font-size:16px;padding:16px 24px}.context-menu{opacity:.01%;pointer-events:none;background-color:#fff;border:1px solid #ccc;box-shadow:1px 1px 10px #0000001a;padding:10px 0;position:fixed;top:0;left:0;width:200px}.context-menu-item{cursor:pointer;padding:8px 15px}.context-menu-item:hover{color:var(--bs-primary)}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: SortDirective, selector: "[baseSort]", inputs: ["baseSort"] }, { kind: "directive", type: ContextMenuDirective, selector: "[ltContextMenu]", inputs: ["contextMenuData", "ltContextMenu", "xGap", "yGap", "overflowSpace", "selectors"], outputs: ["clickedElement"], exportAs: ["contextMenuData"] }, { kind: "component", type: ModelFormComponent, selector: "base-model-form", inputs: ["modelName", "label", "id", "delete", "onlyUpdateMode", "duplicate", "logging", "config"], outputs: ["finished"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }, { kind: "pipe", type: EllipsesPipe, name: "baseEllipses" }] });
1568
1641
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ModelTableComponent, decorators: [{
1569
1642
  type: Component,
1570
- args: [{ selector: 'base-model-table', template: "<div *ngIf=\"!selectedId && !createMode\">\n <div class=\"w-100 d-flex flex-row justify-content-between align-items-center mb-4\">\n <h2 class=\"mb-0\" *ngIf=\"modelName\">\n {{\n config?.plural ? config?.plural : config?.label ? config?.label : capitalizeFirstLetter(camelModelName) + 's'\n }}\n </h2>\n <div class=\"d-flex align-items-center\">\n <button class=\"btn btn-primary\" (click)=\"createNewObject()\" *ngIf=\"create\">Erstellen</button>\n </div>\n </div>\n\n <div\n class=\"table-responsive\"\n [ltContextMenu]=\"contextMenu\"\n [selectors]=\"'.object-col'\"\n #contextMenuData=\"contextMenuData\"\n >\n <table class=\"table table-hover bg-white\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let field of availableFields\"\n [baseSort]=\"objects\"\n data-order=\"desc\"\n [attr.data-name]=\"field\"\n >\n {{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr class=\"object-col\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <td class=\"cursor-pointer\" *ngFor=\"let field of availableFields\" (click)=\"selectId(object)\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date: tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] }}\n </ng-container>\n </td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"context-menu\" #contextMenu>\n <div class=\"context-menu-item\" (click)=\"selectId({ id: contextMenuData.clickedElement?.id })\">Bearbeiten</div>\n <div class=\"context-menu-item\" *ngIf=\"duplicate\" (click)=\"duplicateObject(contextMenuData.clickedElement?.id)\">\n Duplizieren\n </div>\n <div class=\"context-menu-item\" *ngIf=\"delete\" (click)=\"deleteObject(contextMenuData.clickedElement?.id)\">\n L\u00F6schen\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"w-100\" *ngIf=\"selectedId || createMode\">\n <button class=\"btn btn-outline-primary mb-3\" (click)=\"selectId('')\">Zur\u00FCck</button>\n <base-model-form\n [modelName]=\"camelModelName\"\n [label]=\"config?.label\"\n [config]=\"fieldConfig\"\n [logging]=\"logging\"\n [id]=\"selectedId\"\n (finished)=\"selectId('')\"\n [delete]=\"delete\"\n [duplicate]=\"duplicate\"\n ></base-model-form>\n</div>\n", styles: [".cursor-pointer{cursor:pointer}.asc:after,.desc:after{border-style:solid;border-width:.2em .2em 0 0;content:\"\";display:inline-block;height:.45em;left:5px;position:relative;transform:rotate(-45deg);vertical-align:middle;width:.45em}.asc:after{transform:rotate(135deg)}td{vertical-align:middle}.bi,th{cursor:pointer;-webkit-user-select:none;user-select:none}.table>:not(:first-child){border-top:0}table{border-radius:.25rem;border-color:#e2e8f0!important}table thead{text-transform:uppercase;font-size:12px}table thead th{padding:12px 24px}table tbody tr td{font-weight:400!important;font-size:16px;padding:16px 24px}.context-menu{opacity:.01%;pointer-events:none;background-color:#fff;border:1px solid #ccc;box-shadow:1px 1px 10px #0000001a;padding:10px 0;position:fixed;top:0;left:0;width:200px}.context-menu-item{cursor:pointer;padding:8px 15px}.context-menu-item:hover{color:var(--bs-primary)}\n"] }]
1643
+ args: [{ selector: 'base-model-table', template: "<div *ngIf=\"!selectedId && !createMode\">\n <div class=\"w-100 d-flex flex-row justify-content-between align-items-center mb-4\">\n <h2 class=\"mb-0\" *ngIf=\"modelName\">\n {{\n config?.plural ? config?.plural : config?.label ? config?.label : capitalizeFirstLetter(camelModelName) + 's'\n }}\n </h2>\n <div class=\"d-flex align-items-center\">\n <button class=\"btn btn-primary\" (click)=\"createNewObject()\" *ngIf=\"create\">Erstellen</button>\n </div>\n </div>\n\n <div\n class=\"table-responsive\"\n [ltContextMenu]=\"contextMenu\"\n [selectors]=\"'.object-col'\"\n #contextMenuData=\"contextMenuData\"\n >\n <table class=\"table table-hover bg-white\">\n <thead>\n <tr>\n <th\n scope=\"col\"\n *ngFor=\"let field of availableFields\"\n [baseSort]=\"objects\"\n data-order=\"desc\"\n [attr.data-name]=\"field\"\n >\n {{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr class=\"object-col\" *ngFor=\"let object of objects\" [id]=\"object[uniqueField]\">\n <td class=\"cursor-pointer\" *ngFor=\"let field of availableFields\" (click)=\"selectId(object)\">\n <ng-container *ngIf=\"tableFields[field]?.dateFormat\">\n {{ object[field] | date: tableFields[field]?.dateFormat }} Uhr\n </ng-container>\n\n <ng-container *ngIf=\"tableFields[field]?.enumValues\">\n {{ tableFields[field]?.enumValues[object[field]]?.text }}\n </ng-container>\n\n <ng-container *ngIf=\"!tableFields[field]?.dateFormat && !tableFields[field]?.enumValues\">\n {{ object[field] | baseEllipses: 60 }}\n </ng-container>\n </td>\n </tr>\n </tbody>\n </table>\n\n <div class=\"context-menu\" #contextMenu>\n <div class=\"context-menu-item\" (click)=\"selectId({ id: contextMenuData.clickedElement?.id })\">Bearbeiten</div>\n <div class=\"context-menu-item\" *ngIf=\"duplicate\" (click)=\"duplicateObject(contextMenuData.clickedElement?.id)\">\n Duplizieren\n </div>\n <div class=\"context-menu-item\" *ngIf=\"delete\" (click)=\"deleteObject(contextMenuData.clickedElement?.id)\">\n L\u00F6schen\n </div>\n </div>\n </div>\n</div>\n\n<div class=\"w-100\" *ngIf=\"selectedId || createMode\">\n <button class=\"btn btn-outline-primary mb-3\" (click)=\"selectId('')\">Zur\u00FCck</button>\n <base-model-form\n [modelName]=\"camelModelName\"\n [label]=\"config?.label\"\n [config]=\"fieldConfig\"\n [logging]=\"logging\"\n [id]=\"selectedId\"\n (finished)=\"selectId('')\"\n [delete]=\"delete\"\n [duplicate]=\"duplicate\"\n ></base-model-form>\n</div>\n", styles: [".cursor-pointer{cursor:pointer}.asc:after,.desc:after{border-style:solid;border-width:.2em .2em 0 0;content:\"\";display:inline-block;height:.45em;left:5px;position:relative;transform:rotate(-45deg);vertical-align:middle;width:.45em}.asc:after{transform:rotate(135deg)}td{vertical-align:middle}.bi,th{cursor:pointer;-webkit-user-select:none;user-select:none}.table>:not(:first-child){border-top:0}table{border-radius:.25rem;border-color:#e2e8f0!important}table thead{text-transform:uppercase;font-size:12px}table thead th{padding:12px 24px}table tbody tr td{font-weight:400!important;font-size:16px;padding:16px 24px}.context-menu{opacity:.01%;pointer-events:none;background-color:#fff;border:1px solid #ccc;box-shadow:1px 1px 10px #0000001a;padding:10px 0;position:fixed;top:0;left:0;width:200px}.context-menu-item{cursor:pointer;padding:8px 15px}.context-menu-item:hover{color:var(--bs-primary)}\n"] }]
1571
1644
  }], ctorParameters: function () { return [{ type: i1$1.GraphQLMetaService }, { type: i1$1.GraphQLService }, { type: i1$1.CmsService }]; }, propDecorators: { modelName: [{
1572
1645
  type: Input
1573
1646
  }], objectId: [{
@@ -1637,6 +1710,8 @@ const elements = [
1637
1710
  ModelFormSubComponent,
1638
1711
  UploadImageComponent,
1639
1712
  RefenceInputComponent,
1713
+ // Pipes
1714
+ EllipsesPipe,
1640
1715
  ];
1641
1716
  class BaseComponentsModule {
1642
1717
  }
@@ -1660,7 +1735,9 @@ BaseComponentsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", ve
1660
1735
  ModelTableComponent,
1661
1736
  ModelFormSubComponent,
1662
1737
  UploadImageComponent,
1663
- RefenceInputComponent
1738
+ RefenceInputComponent,
1739
+ // Pipes
1740
+ EllipsesPipe
1664
1741
  ], imports: [FormsModule, ReactiveFormsModule, CommonModule], exports: [
1665
1742
  // Directives
1666
1743
  SortDirective,
@@ -1680,7 +1757,9 @@ BaseComponentsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", ve
1680
1757
  ModelTableComponent,
1681
1758
  ModelFormSubComponent,
1682
1759
  UploadImageComponent,
1683
- RefenceInputComponent
1760
+ RefenceInputComponent,
1761
+ // Pipes
1762
+ EllipsesPipe
1684
1763
  ] });
1685
1764
  BaseComponentsModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: BaseComponentsModule, imports: [imports] });
1686
1765
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: BaseComponentsModule, decorators: [{
@@ -1700,5 +1779,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
1700
1779
  * Generated bundle index. Do not edit.
1701
1780
  */
1702
1781
 
1703
- export { BackButtonDirective, BaseComponentsModule, BreadcrumbComponent, CheckboxComponent, ContextMenuDirective, InputComponent, LoadingBarComponent, ModelFormComponent, ModelFormSubComponent, ModelTableComponent, RefenceInputComponent, SelectComponent, SkeletonLoaderComponent, SortDirective, TagsComponent, TextareaComponent, ToastComponent, UploadImageComponent };
1782
+ export { BackButtonDirective, BaseComponentsModule, BreadcrumbComponent, CheckboxComponent, ContextMenuDirective, EllipsesPipe, InputComponent, LoadingBarComponent, ModelFormComponent, ModelFormSubComponent, ModelTableComponent, RefenceInputComponent, SelectComponent, SkeletonLoaderComponent, SortDirective, TagsComponent, TextareaComponent, ToastComponent, UploadImageComponent };
1704
1783
  //# sourceMappingURL=lenne.tech-ng-base-base-components.mjs.map