@lenne.tech/ng-base 14.0.5 → 14.1.0

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 (39) hide show
  1. package/base-components/base-components.module.d.ts +20 -17
  2. package/base-components/components/model-form/model-form.component.d.ts +3 -3
  3. package/base-components/components/model-table/model-table.component.d.ts +14 -5
  4. package/{shared → base-components}/directives/back-button.directive.d.ts +1 -1
  5. package/{src → base-components}/directives/context-menu.directive.d.ts +0 -0
  6. package/{shared → base-components}/directives/sort.directive.d.ts +2 -2
  7. package/base-components/public-api.d.ts +3 -0
  8. package/esm2020/base-components/base-components.module.mjs +16 -1
  9. package/esm2020/base-components/components/model-form/model-form.component.mjs +34 -49
  10. package/esm2020/base-components/components/model-table/model-table.component.mjs +29 -12
  11. package/esm2020/{shared → base-components}/directives/back-button.directive.mjs +2 -2
  12. package/esm2020/base-components/directives/context-menu.directive.mjs +108 -0
  13. package/esm2020/base-components/directives/sort.directive.mjs +54 -0
  14. package/esm2020/base-components/public-api.mjs +5 -1
  15. package/esm2020/public-api.mjs +1 -2
  16. package/esm2020/shared/classes/sort.class.mjs +1 -8
  17. package/esm2020/shared/public-api.mjs +2 -4
  18. package/esm2020/shared/services/cms.service.mjs +75 -0
  19. package/esm2020/src/base.module.mjs +1 -5
  20. package/fesm2015/lenne.tech-ng-base-base-components.mjs +259 -64
  21. package/fesm2015/lenne.tech-ng-base-base-components.mjs.map +1 -1
  22. package/fesm2015/lenne.tech-ng-base-shared.mjs +122 -129
  23. package/fesm2015/lenne.tech-ng-base-shared.mjs.map +1 -1
  24. package/fesm2015/lenne.tech-ng-base.mjs +2 -113
  25. package/fesm2015/lenne.tech-ng-base.mjs.map +1 -1
  26. package/fesm2020/lenne.tech-ng-base-base-components.mjs +249 -61
  27. package/fesm2020/lenne.tech-ng-base-base-components.mjs.map +1 -1
  28. package/fesm2020/lenne.tech-ng-base-shared.mjs +120 -127
  29. package/fesm2020/lenne.tech-ng-base-shared.mjs.map +1 -1
  30. package/fesm2020/lenne.tech-ng-base.mjs +2 -112
  31. package/fesm2020/lenne.tech-ng-base.mjs.map +1 -1
  32. package/package.json +1 -1
  33. package/public-api.d.ts +0 -1
  34. package/shared/classes/sort.class.d.ts +0 -7
  35. package/shared/public-api.d.ts +1 -2
  36. package/shared/services/cms.service.d.ts +23 -0
  37. package/src/base.module.d.ts +9 -10
  38. package/esm2020/shared/directives/sort.directive.mjs +0 -54
  39. package/esm2020/src/directives/context-menu.directive.mjs +0 -109
@@ -1,13 +1,13 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, Component, Input, Output, ViewChild, NgModule } from '@angular/core';
2
+ import { EventEmitter, Component, Input, Output, ViewChild, Directive, Inject, HostListener, NgModule } from '@angular/core';
3
3
  import * as i1 from '@angular/forms';
4
4
  import { UntypedFormControl, Validators, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
5
5
  import * as i2 from '@angular/common';
6
- import { CommonModule } from '@angular/common';
6
+ import { DOCUMENT, CommonModule } from '@angular/common';
7
7
  import { trigger, transition, query, style, animate } from '@angular/animations';
8
8
  import { Subscription } from 'rxjs';
9
9
  import * as i1$1 from '@lenne.tech/ng-base/shared';
10
- import { ToastType, GraphQLRequestType, BasicUser } from '@lenne.tech/ng-base/shared';
10
+ import { ToastType, Sort, GraphQLRequestType, BasicUser } from '@lenne.tech/ng-base/shared';
11
11
  import * as i2$1 from '@angular/router';
12
12
  import * as i1$2 from '@angular/common/http';
13
13
  import { HttpHeaders } from '@angular/common/http';
@@ -443,6 +443,162 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
443
443
  args: [{ selector: 'base-breadcrumb', template: "<ul class=\"pt-3\">\n <li *ngFor=\"let breadcrumb of breadcrumbs$ | async\">\n <a [routerLink]=\"breadcrumb.url\">{{ breadcrumb.label }}</a>\n </li>\n</ul>\n", styles: ["ul{list-style:none;margin:0;padding:0}ul li{display:inline}ul li:before{content:\">\";margin:0 6px}ul li:first-child:before{content:\"\";margin:0}\n"] }]
444
444
  }], ctorParameters: function () { return [{ type: i1$1.BreadcrumbService }]; } });
445
445
 
446
+ class SortDirective {
447
+ constructor(renderer, targetElem, document) {
448
+ this.renderer = renderer;
449
+ this.targetElem = targetElem;
450
+ }
451
+ /**
452
+ * Sorts columns on click
453
+ */
454
+ sortColumn() {
455
+ const items = document.getElementsByTagName('th');
456
+ for (let i = 0; i < items.length; i++) {
457
+ items[i].classList.remove('asc');
458
+ items[i].classList.remove('desc');
459
+ }
460
+ const sort = new Sort();
461
+ const elem = this.targetElem.nativeElement;
462
+ const order = elem.getAttribute('data-order');
463
+ const type = elem.getAttribute('data-type');
464
+ const property = elem.getAttribute('data-name');
465
+ if (order === 'desc') {
466
+ this.baseSort.sort(sort.startSort(property, order, type));
467
+ elem.setAttribute('data-order', 'asc');
468
+ elem.classList.remove('desc');
469
+ elem.classList.add('asc');
470
+ }
471
+ else {
472
+ this.baseSort.sort(sort.startSort(property, order, type));
473
+ elem.setAttribute('data-order', 'desc');
474
+ elem.classList.remove('asc');
475
+ elem.classList.add('desc');
476
+ }
477
+ }
478
+ }
479
+ SortDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: SortDirective, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Directive });
480
+ SortDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.1.0", type: SortDirective, selector: "[baseSort]", inputs: { baseSort: "baseSort" }, host: { listeners: { "click": "sortColumn()" } }, ngImport: i0 });
481
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: SortDirective, decorators: [{
482
+ type: Directive,
483
+ args: [{
484
+ selector: '[baseSort]',
485
+ }]
486
+ }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: Document, decorators: [{
487
+ type: Inject,
488
+ args: [DOCUMENT]
489
+ }] }]; }, propDecorators: { baseSort: [{
490
+ type: Input
491
+ }], sortColumn: [{
492
+ type: HostListener,
493
+ args: ['click']
494
+ }] } });
495
+
496
+ /**
497
+ * Directive vor context menu
498
+ * See https://stackblitz.com/edit/angular-custom-context-menu
499
+ */
500
+ class ContextMenuDirective {
501
+ constructor(el) {
502
+ this.el = el;
503
+ this.xGap = 0;
504
+ this.yGap = 0;
505
+ this.overflowSpace = 10;
506
+ this.selectors = '*';
507
+ this.clickedElement = null;
508
+ this.previousDisplayStatus = null;
509
+ }
510
+ ngOnInit() {
511
+ if (this.ltContextMenu) {
512
+ this.previousDisplayStatus = this.ltContextMenu.style.display;
513
+ }
514
+ // Add a click listener to the window,
515
+ // so that we can close the context menu on left click
516
+ window.addEventListener('click', () => {
517
+ this.showContextMenu(null, false);
518
+ });
519
+ // Close context menu when escape is pressed
520
+ window.addEventListener('keydown', (e) => {
521
+ if (e.code === 'Escape') {
522
+ this.showContextMenu(null, false);
523
+ }
524
+ });
525
+ // Add an event listener to listen to the 'contextmenu' event
526
+ this.el.nativeElement.addEventListener('contextmenu', (e) => {
527
+ // Prevent the default context menu to popup
528
+ if (e.preventDefault) {
529
+ e.preventDefault();
530
+ }
531
+ // Shows our own context menu
532
+ this.showContextMenu(e, true);
533
+ });
534
+ }
535
+ // Shows or hides our custom context menu, which is specified as a input
536
+ showContextMenu(event, show) {
537
+ const cm = this.ltContextMenu;
538
+ if (cm) {
539
+ // Try to open context menu
540
+ if (show && event && event instanceof MouseEvent) {
541
+ // Get valid clicked structureElement
542
+ const clickedElement = event?.target?.closest(this.selectors);
543
+ if (clickedElement) {
544
+ this.clickedElement = clickedElement;
545
+ setTimeout(() => {
546
+ // Set display status
547
+ cm.style.display = 'block';
548
+ // Calculate top position
549
+ let top = event.y + this.yGap;
550
+ if (top + cm.offsetHeight + 10 > document.documentElement.clientHeight) {
551
+ top = document.documentElement.clientHeight - cm.offsetHeight - this.overflowSpace;
552
+ }
553
+ // Calculate left position
554
+ let left = event.x + this.xGap;
555
+ if (left + cm.offsetWidth + 10 > document.documentElement.clientWidth) {
556
+ left = document.documentElement.clientWidth - cm.offsetWidth - this.overflowSpace;
557
+ }
558
+ // Set position
559
+ cm.style.top = top + 'px';
560
+ cm.style.left = left + 'px';
561
+ // Show
562
+ cm.style.opacity = '1.0';
563
+ cm.style['pointer-events'] = 'auto';
564
+ }, 1);
565
+ return;
566
+ }
567
+ }
568
+ // Close context menu
569
+ this.clickedElement = null;
570
+ if (this.previousDisplayStatus) {
571
+ cm.style.display = this.previousDisplayStatus;
572
+ }
573
+ cm.style.opacity = '0.01';
574
+ cm.style['pointer-events'] = 'none';
575
+ }
576
+ }
577
+ }
578
+ ContextMenuDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ContextMenuDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
579
+ ContextMenuDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.1.0", type: ContextMenuDirective, selector: "[ltContextMenu]", inputs: { contextMenuData: "contextMenuData", ltContextMenu: "ltContextMenu", xGap: "xGap", yGap: "yGap", overflowSpace: "overflowSpace", selectors: "selectors" }, outputs: { clickedElement: "clickedElement" }, exportAs: ["contextMenuData"], ngImport: i0 });
580
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ContextMenuDirective, decorators: [{
581
+ type: Directive,
582
+ args: [{
583
+ selector: '[ltContextMenu]',
584
+ exportAs: 'contextMenuData',
585
+ }]
586
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { contextMenuData: [{
587
+ type: Input
588
+ }], ltContextMenu: [{
589
+ type: Input
590
+ }], xGap: [{
591
+ type: Input
592
+ }], yGap: [{
593
+ type: Input
594
+ }], overflowSpace: [{
595
+ type: Input
596
+ }], selectors: [{
597
+ type: Input
598
+ }], clickedElement: [{
599
+ type: Output
600
+ }] } });
601
+
446
602
  class UploadImageComponent {
447
603
  constructor(httpClient, authService) {
448
604
  this.httpClient = httpClient;
@@ -844,13 +1000,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
844
1000
  }] } });
845
1001
 
846
1002
  class ModelFormComponent {
847
- constructor(graphQLMetaService, graphQLService, formsService, authService, router, route) {
1003
+ constructor(graphQLMetaService, graphQLService, formsService, authService, router, route, cmsService) {
848
1004
  this.graphQLMetaService = graphQLMetaService;
849
1005
  this.graphQLService = graphQLService;
850
1006
  this.formsService = formsService;
851
1007
  this.authService = authService;
852
1008
  this.router = router;
853
1009
  this.route = route;
1010
+ this.cmsService = cmsService;
854
1011
  this.delete = true;
855
1012
  this.duplicate = false;
856
1013
  this.logging = false;
@@ -927,12 +1084,20 @@ class ModelFormComponent {
927
1084
  // Process patchFields for reference input
928
1085
  for (const [key, value] of Object.entries(this.config)) {
929
1086
  // If it not an array
930
- if (this.config[key]?.patchField && !this.fields[key]?.isList) {
931
- this.form.get(key).setValue(response[this.config[key]?.patchField]?.id);
1087
+ if (this.config[key]?.type === 'Reference' && !this.fields[key]?.isList) {
1088
+ if (this.form.get(key)) {
1089
+ this.form
1090
+ .get(key)
1091
+ .patchValue(response[this.config[key]?.patchField ? this.config[key]?.patchField : key]?.id);
1092
+ }
932
1093
  }
933
1094
  // If value is an array
934
- if (this.config[key]?.patchField && this.fields[key]?.isList) {
935
- this.form.get(key).setValue(response[this.config[key]?.patchField]?.map((e) => e?.id));
1095
+ if (this.config[key]?.type === 'Reference' && this.fields[key]?.isList) {
1096
+ if (this.form.get(key)) {
1097
+ this.form
1098
+ .get(key)
1099
+ .patchValue(response[this.config[key]?.patchField ? this.config[key]?.patchField : key]?.map((e) => e?.id));
1100
+ }
936
1101
  }
937
1102
  }
938
1103
  if (this.logging) {
@@ -955,12 +1120,15 @@ class ModelFormComponent {
955
1120
  createRequestObject(fields) {
956
1121
  const requestFields = [];
957
1122
  for (const [key, value] of Object.entries(fields)) {
1123
+ if (this.config[key]?.exclude !== undefined && this.config[key]?.exclude) {
1124
+ continue;
1125
+ }
958
1126
  if (Object.keys(fields[key]?.fields)?.length === 0) {
959
- if (!this.config[key]?.patchField) {
1127
+ if (this.config[key]?.type !== 'Reference') {
960
1128
  requestFields.push(key);
961
1129
  }
962
1130
  else {
963
- requestFields.push({ [this.config[key]?.patchField]: ['id'] });
1131
+ requestFields.push({ [this.config[key]?.patchField ? this.config[key]?.patchField : key]: ['id'] });
964
1132
  }
965
1133
  }
966
1134
  else {
@@ -1001,49 +1169,22 @@ class ModelFormComponent {
1001
1169
  * It calls the graphQLService to delete the object with the id of the object that is currently being edited
1002
1170
  */
1003
1171
  deleteObject() {
1004
- if (confirm('Möchtest du das Objekt wirklich löschen?')) {
1005
- this.graphQLService
1006
- .graphQl('delete' + this.capitalizeFirstLetter(this.modelName), {
1007
- arguments: { id: this.id },
1008
- fields: ['id'],
1009
- type: GraphQLRequestType.MUTATION,
1010
- })
1011
- .subscribe({
1012
- next: (value) => {
1013
- this.finished.emit(null);
1014
- },
1015
- error: (err) => {
1016
- console.error('Error on delete object', err);
1017
- },
1018
- });
1019
- }
1172
+ this.cmsService.deleteObject(this.id, this.modelName).then(() => {
1173
+ this.finished.emit(null);
1174
+ });
1020
1175
  }
1021
1176
  /**
1022
1177
  * It sends a GraphQL mutation to the server to duplicate the object
1023
1178
  */
1024
1179
  async duplicateObject() {
1025
- if (confirm('Möchtest du das Objekt wirklich duplizieren?')) {
1026
- await this.submit(true);
1027
- this.graphQLService
1028
- .graphQl('duplicate' + this.capitalizeFirstLetter(this.modelName), {
1029
- arguments: { id: this.id },
1030
- fields: ['id'],
1031
- type: GraphQLRequestType.MUTATION,
1032
- })
1033
- .subscribe({
1034
- next: (value) => {
1035
- if (value?.id) {
1036
- this.router.navigate(['../' + value.id], { relativeTo: this.route });
1037
- }
1038
- else {
1039
- this.finished.emit(null);
1040
- }
1041
- },
1042
- error: (err) => {
1043
- console.error('Error on duplicate object', err);
1044
- },
1045
- });
1046
- }
1180
+ this.cmsService.duplicateObject(this.id, this.modelName).then((value) => {
1181
+ if (value?.id) {
1182
+ this.router.navigate(['../' + value.id], { relativeTo: this.route });
1183
+ }
1184
+ else {
1185
+ this.finished.emit(null);
1186
+ }
1187
+ });
1047
1188
  }
1048
1189
  /**
1049
1190
  * It takes a string, capitalizes the first letter, and returns the modified string
@@ -1052,7 +1193,7 @@ class ModelFormComponent {
1052
1193
  * @returns The first letter of the string is being capitalized and the rest of the string is being returned.
1053
1194
  */
1054
1195
  capitalizeFirstLetter(value) {
1055
- return value.charAt(0).toUpperCase() + value.slice(1);
1196
+ return this.cmsService.capitalizeFirstLetter(value);
1056
1197
  }
1057
1198
  /**
1058
1199
  * It takes an AbstractControl and returns a FormControl
@@ -1171,12 +1312,12 @@ class ModelFormComponent {
1171
1312
  });
1172
1313
  }
1173
1314
  }
1174
- 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 }], target: i0.ɵɵFactoryTarget.Component });
1315
+ 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 });
1175
1316
  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", 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"] }] });
1176
1317
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ModelFormComponent, decorators: [{
1177
1318
  type: Component,
1178
1319
  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" }]
1179
- }], 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 }]; }, propDecorators: { modelName: [{
1320
+ }], 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: [{
1180
1321
  type: Input
1181
1322
  }], label: [{
1182
1323
  type: Input
@@ -1195,9 +1336,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
1195
1336
  }] } });
1196
1337
 
1197
1338
  class ModelTableComponent {
1198
- constructor(graphQLMetaService, graphQLService) {
1339
+ constructor(graphQLMetaService, graphQLService, cmsService) {
1199
1340
  this.graphQLMetaService = graphQLMetaService;
1200
1341
  this.graphQLService = graphQLService;
1342
+ this.cmsService = cmsService;
1201
1343
  this.createMode = false;
1202
1344
  this.logging = false;
1203
1345
  this.create = true;
@@ -1206,6 +1348,7 @@ class ModelTableComponent {
1206
1348
  this.duplicate = true;
1207
1349
  this.config = {};
1208
1350
  this.fieldConfig = {};
1351
+ this.uniqueField = 'id';
1209
1352
  this.idSelected = new EventEmitter();
1210
1353
  this.createModeChanged = new EventEmitter();
1211
1354
  this.tableFields = {
@@ -1325,22 +1468,35 @@ class ModelTableComponent {
1325
1468
  this.idSelected.emit(this.selectedId);
1326
1469
  }
1327
1470
  }
1471
+ /**
1472
+ * It calls the duplicateObject function in the cmsService, passing in the id of the object to be duplicated and the
1473
+ * modelName of the object
1474
+ */
1475
+ async duplicateObject(id) {
1476
+ await this.cmsService.duplicateObject(id, this.modelName);
1477
+ this.loadObjects(this.availableFields);
1478
+ }
1479
+ /**
1480
+ * It calls the deleteObject function in the cmsService, passing in the id of the object to delete and the name of the
1481
+ * model
1482
+ */
1483
+ async deleteObject(id) {
1484
+ await this.cmsService.deleteObject(id, this.modelName);
1485
+ this.loadObjects(this.availableFields);
1486
+ }
1328
1487
  /**
1329
1488
  * It takes a string, capitalizes the first letter, and returns the modified string
1330
- *
1331
- * @param value - The string to capitalize.
1332
- * @returns The first letter of the string is being capitalized and the rest of the string is being returned.
1333
1489
  */
1334
1490
  capitalizeFirstLetter(value) {
1335
- return value.charAt(0).toUpperCase() + value.slice(1);
1491
+ return this.cmsService.capitalizeFirstLetter(value);
1336
1492
  }
1337
1493
  }
1338
- 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 }], target: i0.ɵɵFactoryTarget.Component });
1339
- 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 {{ config?.plural ? config?.plural : config?.label ? config?.label : capitalizeFirstLetter(modelName) + 's' }}\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 <table class=\"table table-hover table-responsive bg-white\">\n <thead>\n <tr>\n <th scope=\"col\" *ngFor=\"let field of availableFields\">\n {{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let object of objects\">\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]?.dateFormat\">\n {{ object[field] }}\n </ng-container>\n </td>\n </tr>\n </tbody>\n </table>\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]=\"modelName\"\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}.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}\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: "component", type: ModelFormComponent, selector: "base-model-form", inputs: ["modelName", "label", "id", "delete", "duplicate", "logging", "config"], outputs: ["finished"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
1494
+ 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 });
1495
+ 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 {{ config?.plural ? config?.plural : config?.label ? config?.label : capitalizeFirstLetter(modelName) + 's' }}\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]?.dateFormat\">\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]=\"modelName\"\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", "duplicate", "logging", "config"], outputs: ["finished"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
1340
1496
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: ModelTableComponent, decorators: [{
1341
1497
  type: Component,
1342
- 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 {{ config?.plural ? config?.plural : config?.label ? config?.label : capitalizeFirstLetter(modelName) + 's' }}\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 <table class=\"table table-hover table-responsive bg-white\">\n <thead>\n <tr>\n <th scope=\"col\" *ngFor=\"let field of availableFields\">\n {{ tableFields[field]?.label ? tableFields[field]?.label : capitalizeFirstLetter(field) }}\n </th>\n </tr>\n </thead>\n <tbody>\n <tr *ngFor=\"let object of objects\">\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]?.dateFormat\">\n {{ object[field] }}\n </ng-container>\n </td>\n </tr>\n </tbody>\n </table>\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]=\"modelName\"\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}.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}\n"] }]
1343
- }], ctorParameters: function () { return [{ type: i1$1.GraphQLMetaService }, { type: i1$1.GraphQLService }]; }, propDecorators: { modelName: [{
1498
+ 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 {{ config?.plural ? config?.plural : config?.label ? config?.label : capitalizeFirstLetter(modelName) + 's' }}\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]?.dateFormat\">\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]=\"modelName\"\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"] }]
1499
+ }], ctorParameters: function () { return [{ type: i1$1.GraphQLMetaService }, { type: i1$1.GraphQLService }, { type: i1$1.CmsService }]; }, propDecorators: { modelName: [{
1344
1500
  type: Input
1345
1501
  }], objectId: [{
1346
1502
  type: Input
@@ -1366,10 +1522,34 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
1366
1522
  type: Output
1367
1523
  }] } });
1368
1524
 
1525
+ class BackButtonDirective {
1526
+ constructor(navigation) {
1527
+ this.navigation = navigation;
1528
+ }
1529
+ onClick() {
1530
+ this.navigation.back();
1531
+ }
1532
+ }
1533
+ BackButtonDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: BackButtonDirective, deps: [{ token: i1$1.NavigationService }], target: i0.ɵɵFactoryTarget.Directive });
1534
+ BackButtonDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.1.0", type: BackButtonDirective, selector: "[baseBackButton]", host: { listeners: { "click": "onClick()" } }, ngImport: i0 });
1535
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: BackButtonDirective, decorators: [{
1536
+ type: Directive,
1537
+ args: [{
1538
+ selector: '[baseBackButton]',
1539
+ }]
1540
+ }], ctorParameters: function () { return [{ type: i1$1.NavigationService }]; }, propDecorators: { onClick: [{
1541
+ type: HostListener,
1542
+ args: ['click']
1543
+ }] } });
1544
+
1369
1545
  // Modules
1370
1546
  const imports = [FormsModule, ReactiveFormsModule, CommonModule];
1371
1547
  // Imported and exported elements
1372
1548
  const elements = [
1549
+ // Directives
1550
+ SortDirective,
1551
+ BackButtonDirective,
1552
+ ContextMenuDirective,
1373
1553
  // Components
1374
1554
  InputComponent,
1375
1555
  SelectComponent,
@@ -1390,6 +1570,10 @@ class BaseComponentsModule {
1390
1570
  }
1391
1571
  BaseComponentsModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: BaseComponentsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1392
1572
  BaseComponentsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "14.1.0", ngImport: i0, type: BaseComponentsModule, declarations: [
1573
+ // Directives
1574
+ SortDirective,
1575
+ BackButtonDirective,
1576
+ ContextMenuDirective,
1393
1577
  // Components
1394
1578
  InputComponent,
1395
1579
  SelectComponent,
@@ -1405,6 +1589,10 @@ BaseComponentsModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", ve
1405
1589
  ModelFormSubComponent,
1406
1590
  UploadImageComponent,
1407
1591
  RefenceInputComponent], imports: [FormsModule, ReactiveFormsModule, CommonModule], exports: [
1592
+ // Directives
1593
+ SortDirective,
1594
+ BackButtonDirective,
1595
+ ContextMenuDirective,
1408
1596
  // Components
1409
1597
  InputComponent,
1410
1598
  SelectComponent,
@@ -1438,5 +1626,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImpor
1438
1626
  * Generated bundle index. Do not edit.
1439
1627
  */
1440
1628
 
1441
- export { BaseComponentsModule, BreadcrumbComponent, CheckboxComponent, InputComponent, LoadingBarComponent, ModelFormComponent, ModelFormSubComponent, ModelTableComponent, RefenceInputComponent, SelectComponent, SkeletonLoaderComponent, TagsComponent, TextareaComponent, ToastComponent, UploadImageComponent };
1629
+ export { BackButtonDirective, BaseComponentsModule, BreadcrumbComponent, CheckboxComponent, ContextMenuDirective, InputComponent, LoadingBarComponent, ModelFormComponent, ModelFormSubComponent, ModelTableComponent, RefenceInputComponent, SelectComponent, SkeletonLoaderComponent, SortDirective, TagsComponent, TextareaComponent, ToastComponent, UploadImageComponent };
1442
1630
  //# sourceMappingURL=lenne.tech-ng-base-base-components.mjs.map