@es.framework/ng.ui.core 2.0.66 → 2.0.67

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 (174) hide show
  1. package/README.md +3 -3
  2. package/attachments/README.md +3 -3
  3. package/base-crud/README.md +3 -3
  4. package/breadcrumb/README.md +3 -3
  5. package/checkbox/README.md +3 -3
  6. package/collapsible/README.md +3 -3
  7. package/color-picker/README.md +3 -3
  8. package/column-settings-popover/README.md +3 -3
  9. package/custom-switch/README.md +3 -3
  10. package/datepicker/README.md +3 -3
  11. package/deactivation-reason/README.md +3 -3
  12. package/excel-import/README.md +3 -3
  13. package/fesm2022/es.framework-ng.ui.core-attachments.mjs +2 -2
  14. package/fesm2022/es.framework-ng.ui.core-attachments.mjs.map +1 -1
  15. package/fesm2022/es.framework-ng.ui.core-base-crud.mjs.map +1 -1
  16. package/fesm2022/es.framework-ng.ui.core-breadcrumb.mjs +110 -109
  17. package/fesm2022/es.framework-ng.ui.core-breadcrumb.mjs.map +1 -1
  18. package/fesm2022/es.framework-ng.ui.core-checkbox.mjs +54 -54
  19. package/fesm2022/es.framework-ng.ui.core-checkbox.mjs.map +1 -1
  20. package/fesm2022/es.framework-ng.ui.core-collapsible.mjs.map +1 -1
  21. package/fesm2022/es.framework-ng.ui.core-color-picker.mjs +44 -44
  22. package/fesm2022/es.framework-ng.ui.core-color-picker.mjs.map +1 -1
  23. package/fesm2022/es.framework-ng.ui.core-column-settings-popover.mjs +2 -2
  24. package/fesm2022/es.framework-ng.ui.core-column-settings-popover.mjs.map +1 -1
  25. package/fesm2022/es.framework-ng.ui.core-custom-switch.mjs.map +1 -1
  26. package/fesm2022/es.framework-ng.ui.core-datepicker.mjs +178 -178
  27. package/fesm2022/es.framework-ng.ui.core-datepicker.mjs.map +1 -1
  28. package/fesm2022/es.framework-ng.ui.core-deactivation-reason.mjs +46 -46
  29. package/fesm2022/es.framework-ng.ui.core-deactivation-reason.mjs.map +1 -1
  30. package/fesm2022/es.framework-ng.ui.core-excel-import.mjs.map +1 -1
  31. package/fesm2022/es.framework-ng.ui.core-filter-templates.mjs +624 -624
  32. package/fesm2022/es.framework-ng.ui.core-filter-templates.mjs.map +1 -1
  33. package/fesm2022/es.framework-ng.ui.core-form-button.mjs.map +1 -1
  34. package/fesm2022/es.framework-ng.ui.core-form-field.mjs +80 -80
  35. package/fesm2022/es.framework-ng.ui.core-form-field.mjs.map +1 -1
  36. package/fesm2022/es.framework-ng.ui.core-form-template.mjs.map +1 -1
  37. package/fesm2022/es.framework-ng.ui.core-formly-avatar-image.mjs.map +1 -1
  38. package/fesm2022/es.framework-ng.ui.core-formly-avatar-label.mjs +44 -44
  39. package/fesm2022/es.framework-ng.ui.core-formly-avatar-label.mjs.map +1 -1
  40. package/fesm2022/es.framework-ng.ui.core-formly-button-selector.mjs +92 -92
  41. package/fesm2022/es.framework-ng.ui.core-formly-button-selector.mjs.map +1 -1
  42. package/fesm2022/es.framework-ng.ui.core-formly-button.mjs +24 -24
  43. package/fesm2022/es.framework-ng.ui.core-formly-button.mjs.map +1 -1
  44. package/fesm2022/es.framework-ng.ui.core-formly-presets.mjs.map +1 -1
  45. package/fesm2022/es.framework-ng.ui.core-formly-prime-icon-picker.mjs +366 -366
  46. package/fesm2022/es.framework-ng.ui.core-formly-prime-icon-picker.mjs.map +1 -1
  47. package/fesm2022/es.framework-ng.ui.core-formly-split-button.mjs +16 -16
  48. package/fesm2022/es.framework-ng.ui.core-formly-split-button.mjs.map +1 -1
  49. package/fesm2022/es.framework-ng.ui.core-formly-ui-all.mjs.map +1 -1
  50. package/fesm2022/es.framework-ng.ui.core-formly-ui.mjs.map +1 -1
  51. package/fesm2022/es.framework-ng.ui.core-formly-username-with-domain.mjs +16 -16
  52. package/fesm2022/es.framework-ng.ui.core-formly-username-with-domain.mjs.map +1 -1
  53. package/fesm2022/es.framework-ng.ui.core-generic-assets.mjs.map +1 -1
  54. package/fesm2022/es.framework-ng.ui.core-generic-autocomplete.mjs +38 -38
  55. package/fesm2022/es.framework-ng.ui.core-generic-autocomplete.mjs.map +1 -1
  56. package/fesm2022/es.framework-ng.ui.core-generic-button.mjs +2 -2
  57. package/fesm2022/es.framework-ng.ui.core-generic-button.mjs.map +1 -1
  58. package/fesm2022/es.framework-ng.ui.core-generic-card.mjs +2 -2
  59. package/fesm2022/es.framework-ng.ui.core-generic-card.mjs.map +1 -1
  60. package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs +12 -5
  61. package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs.map +1 -1
  62. package/fesm2022/es.framework-ng.ui.core-generic-dialog.mjs +2 -2
  63. package/fesm2022/es.framework-ng.ui.core-generic-dialog.mjs.map +1 -1
  64. package/fesm2022/es.framework-ng.ui.core-generic-errormessage.mjs +2 -2
  65. package/fesm2022/es.framework-ng.ui.core-generic-errormessage.mjs.map +1 -1
  66. package/fesm2022/es.framework-ng.ui.core-generic-formly-fields.mjs +2 -2
  67. package/fesm2022/es.framework-ng.ui.core-generic-formly-fields.mjs.map +1 -1
  68. package/fesm2022/es.framework-ng.ui.core-generic-listbox.mjs +64 -64
  69. package/fesm2022/es.framework-ng.ui.core-generic-listbox.mjs.map +1 -1
  70. package/fesm2022/es.framework-ng.ui.core-generic-loadingspinner.mjs +2 -2
  71. package/fesm2022/es.framework-ng.ui.core-generic-loadingspinner.mjs.map +1 -1
  72. package/fesm2022/es.framework-ng.ui.core-generic-report-tabs.mjs +68 -68
  73. package/fesm2022/es.framework-ng.ui.core-generic-report-tabs.mjs.map +1 -1
  74. package/fesm2022/es.framework-ng.ui.core-generic-report.mjs +4 -2
  75. package/fesm2022/es.framework-ng.ui.core-generic-report.mjs.map +1 -1
  76. package/fesm2022/es.framework-ng.ui.core-generic-search-advanced.mjs +518 -495
  77. package/fesm2022/es.framework-ng.ui.core-generic-search-advanced.mjs.map +1 -1
  78. package/fesm2022/es.framework-ng.ui.core-generic-search.mjs +2 -2
  79. package/fesm2022/es.framework-ng.ui.core-generic-search.mjs.map +1 -1
  80. package/fesm2022/es.framework-ng.ui.core-generic-selector.mjs.map +1 -1
  81. package/fesm2022/es.framework-ng.ui.core-generic-table.mjs +4 -4
  82. package/fesm2022/es.framework-ng.ui.core-generic-table.mjs.map +1 -1
  83. package/fesm2022/es.framework-ng.ui.core-generic-view.mjs +2 -2
  84. package/fesm2022/es.framework-ng.ui.core-generic-view.mjs.map +1 -1
  85. package/fesm2022/es.framework-ng.ui.core-header-wrapper.mjs +2 -2
  86. package/fesm2022/es.framework-ng.ui.core-header-wrapper.mjs.map +1 -1
  87. package/fesm2022/es.framework-ng.ui.core-icon-picker.mjs +106 -106
  88. package/fesm2022/es.framework-ng.ui.core-icon-picker.mjs.map +1 -1
  89. package/fesm2022/es.framework-ng.ui.core-input-switch.mjs +58 -58
  90. package/fesm2022/es.framework-ng.ui.core-input-switch.mjs.map +1 -1
  91. package/fesm2022/es.framework-ng.ui.core-input-with-icon.mjs +26 -26
  92. package/fesm2022/es.framework-ng.ui.core-input-with-icon.mjs.map +1 -1
  93. package/fesm2022/es.framework-ng.ui.core-input.mjs +64 -64
  94. package/fesm2022/es.framework-ng.ui.core-input.mjs.map +1 -1
  95. package/fesm2022/es.framework-ng.ui.core-label-type.mjs +16 -16
  96. package/fesm2022/es.framework-ng.ui.core-label-type.mjs.map +1 -1
  97. package/fesm2022/es.framework-ng.ui.core-loading-skeletons.mjs +22 -22
  98. package/fesm2022/es.framework-ng.ui.core-loading-skeletons.mjs.map +1 -1
  99. package/fesm2022/es.framework-ng.ui.core-odata-query-builder.mjs +2 -2
  100. package/fesm2022/es.framework-ng.ui.core-odata-query-builder.mjs.map +1 -1
  101. package/fesm2022/es.framework-ng.ui.core-query-type.mjs +14 -14
  102. package/fesm2022/es.framework-ng.ui.core-query-type.mjs.map +1 -1
  103. package/fesm2022/es.framework-ng.ui.core-radio.mjs +30 -30
  104. package/fesm2022/es.framework-ng.ui.core-radio.mjs.map +1 -1
  105. package/fesm2022/es.framework-ng.ui.core-repeat.mjs +354 -354
  106. package/fesm2022/es.framework-ng.ui.core-repeat.mjs.map +1 -1
  107. package/fesm2022/es.framework-ng.ui.core-select.mjs +84 -84
  108. package/fesm2022/es.framework-ng.ui.core-select.mjs.map +1 -1
  109. package/fesm2022/es.framework-ng.ui.core-sidebar-cards.mjs +2 -2
  110. package/fesm2022/es.framework-ng.ui.core-sidebar-cards.mjs.map +1 -1
  111. package/fesm2022/es.framework-ng.ui.core-sidebar-toggles.mjs +2 -2
  112. package/fesm2022/es.framework-ng.ui.core-sidebar-toggles.mjs.map +1 -1
  113. package/fesm2022/es.framework-ng.ui.core-tabs.mjs +14 -14
  114. package/fesm2022/es.framework-ng.ui.core-tabs.mjs.map +1 -1
  115. package/fesm2022/es.framework-ng.ui.core-tag-type.mjs +80 -80
  116. package/fesm2022/es.framework-ng.ui.core-tag-type.mjs.map +1 -1
  117. package/fesm2022/es.framework-ng.ui.core-text-editor.mjs.map +1 -1
  118. package/fesm2022/es.framework-ng.ui.core-textarea.mjs.map +1 -1
  119. package/fesm2022/es.framework-ng.ui.core-wrappers.mjs +118 -118
  120. package/fesm2022/es.framework-ng.ui.core-wrappers.mjs.map +1 -1
  121. package/fesm2022/es.framework-ng.ui.core.mjs +2 -2
  122. package/fesm2022/es.framework-ng.ui.core.mjs.map +1 -1
  123. package/filter-templates/README.md +3 -3
  124. package/form-button/README.md +3 -3
  125. package/form-field/README.md +3 -3
  126. package/form-template/README.md +3 -3
  127. package/formly-avatar-image/README.md +3 -3
  128. package/formly-avatar-label/README.md +3 -3
  129. package/formly-button/README.md +3 -3
  130. package/formly-button-selector/README.md +3 -3
  131. package/formly-presets/README.md +3 -3
  132. package/formly-prime-icon-picker/README.md +3 -3
  133. package/formly-split-button/README.md +3 -3
  134. package/formly-ui/README.md +3 -3
  135. package/formly-ui-all/README.md +3 -3
  136. package/formly-username-with-domain/README.md +3 -3
  137. package/generic-assets/README.md +3 -3
  138. package/generic-autocomplete/README.md +3 -3
  139. package/generic-button/README.md +3 -3
  140. package/generic-card/README.md +3 -3
  141. package/generic-crud-table/README.md +3 -3
  142. package/generic-dialog/README.md +3 -3
  143. package/generic-errormessage/README.md +3 -3
  144. package/generic-formly-fields/README.md +3 -3
  145. package/generic-loadingspinner/README.md +3 -3
  146. package/generic-report/README.md +3 -3
  147. package/generic-search/README.md +3 -3
  148. package/generic-search-advanced/README.md +3 -3
  149. package/generic-selector/README.md +3 -3
  150. package/generic-table/README.md +3 -3
  151. package/generic-view/README.md +3 -3
  152. package/header-wrapper/README.md +3 -3
  153. package/icon-picker/README.md +3 -3
  154. package/input/README.md +3 -3
  155. package/input-switch/README.md +3 -3
  156. package/input-with-icon/README.md +3 -3
  157. package/label-type/README.md +3 -3
  158. package/loading-skeletons/README.md +3 -3
  159. package/odata-query-builder/README.md +3 -3
  160. package/package.json +1 -1
  161. package/query-type/README.md +3 -3
  162. package/radio/README.md +3 -3
  163. package/repeat/README.md +3 -3
  164. package/select/README.md +3 -3
  165. package/sidebar-cards/README.md +3 -3
  166. package/sidebar-toggles/README.md +3 -3
  167. package/styles.css +0 -0
  168. package/tabs/README.md +3 -3
  169. package/tag-type/README.md +3 -3
  170. package/text-editor/README.md +3 -3
  171. package/textarea/README.md +3 -3
  172. package/types/es.framework-ng.ui.core-generic-crud-table.d.ts +1 -0
  173. package/types/es.framework-ng.ui.core-generic-search-advanced.d.ts +5 -2
  174. package/wrappers/README.md +3 -3
@@ -315,23 +315,23 @@ class FilterTemplateEditorDialogComponent {
315
315
  this.onVisibleChange(false);
316
316
  }
317
317
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: FilterTemplateEditorDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
318
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: FilterTemplateEditorDialogComponent, isStandalone: true, selector: "filter-template-editor-dialog", inputs: { visible: "visible", mode: "mode", model: "model", filterFields: "filterFields", apiName: "apiName", moduleName: "moduleName", idField: "idField", defaultFeature: "defaultFeature", defaultPermission: "defaultPermission", defaultCategory: "defaultCategory", dialogMaxWidth: "dialogMaxWidth", currentUserId: "currentUserId" }, outputs: { visibleChange: "visibleChange", saved: "saved" }, providers: [BaseService], ngImport: i0, template: `
319
- <app-generic-dialog
320
- [service]="svc"
321
- [apiName]="apiName"
322
- [idField]="idField"
323
- [form]="form"
324
- [formFields]="computedFields"
325
- [model]="model"
326
- [isEditMode]="mode === 'edit'"
327
- [isViewMode]="false"
328
- [displayMode]="'dialog'"
329
- [dialogVisible]="visible"
330
- [dialogMaxWidth]="dialogMaxWidth"
331
- [beforeSaveTransform]="beforeSaveTransform"
332
- (visibleChange)="onVisibleChange($event)"
333
- (afterSave)="onAfterSave($event)"
334
- ></app-generic-dialog>
318
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: FilterTemplateEditorDialogComponent, isStandalone: true, selector: "filter-template-editor-dialog", inputs: { visible: "visible", mode: "mode", model: "model", filterFields: "filterFields", apiName: "apiName", moduleName: "moduleName", idField: "idField", defaultFeature: "defaultFeature", defaultPermission: "defaultPermission", defaultCategory: "defaultCategory", dialogMaxWidth: "dialogMaxWidth", currentUserId: "currentUserId" }, outputs: { visibleChange: "visibleChange", saved: "saved" }, providers: [BaseService], ngImport: i0, template: `
319
+ <app-generic-dialog
320
+ [service]="svc"
321
+ [apiName]="apiName"
322
+ [idField]="idField"
323
+ [form]="form"
324
+ [formFields]="computedFields"
325
+ [model]="model"
326
+ [isEditMode]="mode === 'edit'"
327
+ [isViewMode]="false"
328
+ [displayMode]="'dialog'"
329
+ [dialogVisible]="visible"
330
+ [dialogMaxWidth]="dialogMaxWidth"
331
+ [beforeSaveTransform]="beforeSaveTransform"
332
+ (visibleChange)="onVisibleChange($event)"
333
+ (afterSave)="onAfterSave($event)"
334
+ ></app-generic-dialog>
335
335
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: GenericDialogComponent, selector: "app-generic-dialog", inputs: ["form", "service", "formFields", "model", "apiName", "moduleName", "idField", "dialogMaxWidth", "displayMode", "mode", "forceState", "drawerVisible", "dialogVisible", "isViewMode", "isEditMode", "useConfirmOnSave", "loading", "errorMsg", "errorMessage", "beforeSaveTransform", "hideTable", "autoShowForm"], outputs: ["action", "afterSave", "afterDelete", "beforeSave", "beforeDelete", "formCancel", "formInit", "dataLoaded", "selectionChange", "error", "visibleChange"] }] });
336
336
  }
337
337
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: FilterTemplateEditorDialogComponent, decorators: [{
@@ -341,23 +341,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
341
341
  standalone: true,
342
342
  imports: [CommonModule, GenericDialogComponent],
343
343
  providers: [BaseService],
344
- template: `
345
- <app-generic-dialog
346
- [service]="svc"
347
- [apiName]="apiName"
348
- [idField]="idField"
349
- [form]="form"
350
- [formFields]="computedFields"
351
- [model]="model"
352
- [isEditMode]="mode === 'edit'"
353
- [isViewMode]="false"
354
- [displayMode]="'dialog'"
355
- [dialogVisible]="visible"
356
- [dialogMaxWidth]="dialogMaxWidth"
357
- [beforeSaveTransform]="beforeSaveTransform"
358
- (visibleChange)="onVisibleChange($event)"
359
- (afterSave)="onAfterSave($event)"
360
- ></app-generic-dialog>
344
+ template: `
345
+ <app-generic-dialog
346
+ [service]="svc"
347
+ [apiName]="apiName"
348
+ [idField]="idField"
349
+ [form]="form"
350
+ [formFields]="computedFields"
351
+ [model]="model"
352
+ [isEditMode]="mode === 'edit'"
353
+ [isViewMode]="false"
354
+ [displayMode]="'dialog'"
355
+ [dialogVisible]="visible"
356
+ [dialogMaxWidth]="dialogMaxWidth"
357
+ [beforeSaveTransform]="beforeSaveTransform"
358
+ (visibleChange)="onVisibleChange($event)"
359
+ (afterSave)="onAfterSave($event)"
360
+ ></app-generic-dialog>
361
361
  `,
362
362
  }]
363
363
  }], propDecorators: { visible: [{
@@ -546,292 +546,292 @@ class SavedReportTemplatesDrawerComponent {
546
546
  this.templateEditorVisible = false;
547
547
  }
548
548
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: SavedReportTemplatesDrawerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
549
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: SavedReportTemplatesDrawerComponent, isStandalone: true, selector: "saved-report-templates-drawer", inputs: { apiName: "apiName", module: "module", service: "service", category: "category", feature: "feature", visible: "visible", position: "position", showCloseIcon: "showCloseIcon", modal: "modal", dismissable: "dismissable", closeOnEscape: "closeOnEscape", blockScroll: "blockScroll", filterFields: "filterFields", moduleName: "moduleName", defaultFeature: "defaultFeature", defaultCategory: "defaultCategory", defaultPermission: "defaultPermission", currentUserId: "currentUserId" }, outputs: { templateSelected: "templateSelected", edit: "edit", add: "add", visibleChange: "visibleChange" }, providers: [BaseService], ngImport: i0, template: `
550
- <p-drawer
551
- [visible]="visible"
552
- (visibleChange)="onVisibleChange($event)"
553
- [position]="position"
554
- [modal]="modal"
555
- [dismissible]="dismissable"
556
- [closeOnEscape]="closeOnEscape"
557
- [blockScroll]="blockScroll"
558
- [showCloseIcon]="showCloseIcon"
559
- >
560
- <div class="h-full flex flex-col bg-white">
561
-
562
- <!-- Header -->
563
- <div class="sticky top-0 z-10 bg-white border-b border-gray-200 px-4 py-4">
564
- <div class="flex items-center gap-3">
565
- <div class="w-9 h-9 rounded-xl flex items-center justify-center bg-gray-100 text-gray-700">
566
- <i class="pi pi-bookmark"></i>
567
- </div>
568
-
569
- <div class="flex-1 min-w-0">
570
- <div class="text-xs text-gray-500">
571
- {{ 'TEMPLATES' | translate }}
572
- </div>
573
- <div class="text-base font-semibold text-gray-900 truncate">
574
- {{ selected ? getName(selected) : ('SELECT_TEMPLATE' | translate) }}
575
- </div>
576
- </div>
577
-
578
- <button
579
- pButton
580
- type="button"
581
- class="p-button-rounded p-button-sm p-button-text"
582
- icon="pi pi-refresh"
583
- (click)="refresh()"
584
- [disabled]="loading"
585
- pTooltip="{{ 'REFRESH' | translate }}"
586
- tooltipPosition="bottom"
587
- ></button>
588
-
589
- <button
590
- pButton
591
- type="button"
592
- class="p-button-rounded p-button-sm p-button-primary"
593
- icon="pi pi-plus"
594
- (click)="openTemplateCreate()"
595
- [disabled]="loading"
596
- pTooltip="{{ 'COMMON.ADD' | translate }}"
597
- tooltipPosition="bottom"
598
- ></button>
599
- </div>
600
-
601
- <!-- Search -->
602
- <div class="mt-4">
603
- <span class="p-input-icon-left w-full">
604
- <i class="pi pi-search"></i>
605
- <input
606
- pInputText
607
- class="w-full !rounded-xl"
608
- [(ngModel)]="search"
609
- [disabled]="loading"
610
- [placeholder]="'SEARCH_FOR_A_VIEW' | translate"
611
- />
612
- </span>
613
- </div>
614
- </div>
615
-
616
- <!-- Content -->
617
- <div class="flex-1 overflow-auto px-3 py-3">
618
-
619
- <!-- ✅ Loading -->
620
- <div *ngIf="loading" class="py-4">
621
- <app-loading-skeleton [itemsCount]="4"></app-loading-skeleton>
622
- </div>
623
-
624
- <!-- ✅ Empty -->
625
- <div *ngIf="!loading && filteredAll.length === 0" class="text-sm text-gray-500 text-center py-12">
626
- <div class="mx-auto mb-3 w-12 h-12 rounded-2xl bg-gray-100 flex items-center justify-center">
627
- <i class="pi pi-inbox text-gray-500"></i>
628
- </div>
629
- {{ 'NO_DATA_FOUND' | translate }}
630
- </div>
631
-
632
- <!-- ✅ Content when not loading -->
633
- <ng-container *ngIf="!loading">
634
-
635
- <!-- Favorites -->
636
- <ng-container *ngIf="favList.length > 0">
637
- <button
638
- type="button"
639
- class="w-full flex items-center justify-between px-2 py-2 text-sm font-semibold text-gray-800"
640
- (click)="favOpen = !favOpen"
641
- >
642
- <span class="flex items-center gap-2">
643
- <i class="pi pi-star-fill text-yellow-500"></i>
644
- {{ 'FAVOURITES' | translate }}
645
- <span class="text-xs px-2 py-0.5 rounded-full bg-gray-100 text-gray-600">{{ favList.length }}</span>
646
- </span>
647
- <i class="pi text-xs" [ngClass]="favOpen ? 'pi-chevron-up' : 'pi-chevron-down'"></i>
648
- </button>
649
-
650
- <div *ngIf="favOpen" class="mt-1 space-y-1">
651
- <ng-container *ngFor="let t of favList">
652
- <div
653
- class="group relative flex items-center gap-3 px-3 py-2 rounded-xl transition cursor-pointer
654
- hover:bg-gray-50"
655
- [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-50, rgba(59,130,246,0.10))' : ''"
656
- (click)="select(t)"
657
- >
658
- <span
659
- class="absolute left-0 top-1 bottom-1 w-1 rounded-full"
660
- [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : 'transparent'"
661
- ></span>
662
-
663
- <i class="text-base shrink-0"
664
- [ngClass]="t.icon || 'pi pi-check-circle'"
665
- [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''"></i>
666
-
667
- <span class="flex-1 truncate"
668
- [class.font-semibold]="isSelected(t)"
669
- [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''">
670
- {{ getName(t) }}
671
- </span>
672
-
673
- <!-- Actions -->
674
- <div class="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition"
675
- (click)="$event.stopPropagation()">
676
- <button pButton type="button" class="p-button-text p-button-sm"
677
- [icon]="t.isFav ? 'pi pi-star-fill' : 'pi pi-star'"
678
- (click)="toggleFav(t)"></button>
679
-
680
- @if (!isSelected(t)) {
681
- <button pButton type="button" class="p-button-text p-button-sm"
682
- icon="pi pi-pencil"
683
- (click)="openTemplateEdit(t)"></button>
684
-
685
- <button pButton type="button" class="p-button-text p-button-sm p-button-danger"
686
- icon="pi pi-trash"
687
- (click)="confirmDelete(t)"></button>
688
- }
689
- </div>
690
- </div>
691
- </ng-container>
692
- </div>
693
-
694
- <div class="my-3 border-b border-gray-200"></div>
695
- </ng-container>
696
-
697
- <!-- Shared -->
698
- <ng-container *ngIf="sharedList.length > 0">
699
- <button
700
- type="button"
701
- class="w-full flex items-center justify-between px-2 py-2 text-sm font-semibold text-gray-800"
702
- (click)="sharedOpen = !sharedOpen"
703
- >
704
- <span class="flex items-center gap-2">
705
- <i class="pi pi-users text-gray-600"></i>
706
- {{ 'SHARED' | translate }}
707
- <span class="text-xs px-2 py-0.5 rounded-full bg-gray-100 text-gray-600">{{ sharedList.length }}</span>
708
- </span>
709
- <i class="pi text-xs" [ngClass]="sharedOpen ? 'pi-chevron-up' : 'pi-chevron-down'"></i>
710
- </button>
711
-
712
- <div *ngIf="sharedOpen" class="mt-1 space-y-1">
713
- <ng-container *ngFor="let t of sharedList">
714
- <div
715
- class="group relative flex items-center gap-3 px-3 py-2 rounded-xl transition cursor-pointer hover:bg-gray-50"
716
- [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-50, rgba(59,130,246,0.10))' : ''"
717
- (click)="select(t)"
718
- >
719
- <span
720
- class="absolute left-0 top-1 bottom-1 w-1 rounded-full"
721
- [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : 'transparent'"
722
- ></span>
723
-
724
- <i class="text-base shrink-0"
725
- [ngClass]="t.icon || 'pi pi-check-circle'"
726
- [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''"></i>
727
-
728
- <span class="flex-1 truncate"
729
- [class.font-semibold]="isSelected(t)"
730
- [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''">
731
- {{ getName(t) }}
732
- </span>
733
-
734
- <div class="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition"
735
- (click)="$event.stopPropagation()">
736
- <button pButton type="button" class="p-button-text p-button-sm"
737
- [icon]="t.isFav ? 'pi pi-star-fill' : 'pi pi-star'"
738
- (click)="toggleFav(t)"></button>
739
-
740
- @if (!isSelected(t)) {
741
- <button pButton type="button" class="p-button-text p-button-sm"
742
- icon="pi pi-pencil"
743
- (click)="openTemplateEdit(t)"></button>
744
-
745
- <button pButton type="button" class="p-button-text p-button-sm p-button-danger"
746
- icon="pi pi-trash"
747
- (click)="confirmDelete(t)"></button>
748
- }
749
- </div>
750
- </div>
751
- </ng-container>
752
- </div>
753
-
754
- <div class="my-3 border-b border-gray-200"></div>
755
- </ng-container>
756
-
757
- <!-- Private -->
758
- <ng-container *ngIf="privateList.length > 0">
759
- <button
760
- type="button"
761
- class="w-full flex items-center justify-between px-2 py-2 text-sm font-semibold text-gray-800"
762
- (click)="privateOpen = !privateOpen"
763
- >
764
- <span class="flex items-center gap-2">
765
- <i class="pi pi-lock text-gray-600"></i>
766
- {{ 'PRIVATE' | translate }}
767
- <span class="text-xs px-2 py-0.5 rounded-full bg-gray-100 text-gray-600">{{ privateList.length }}</span>
768
- </span>
769
- <i class="pi text-xs" [ngClass]="privateOpen ? 'pi-chevron-up' : 'pi-chevron-down'"></i>
770
- </button>
771
-
772
- <div *ngIf="privateOpen" class="mt-1 space-y-1">
773
- <ng-container *ngFor="let t of privateList">
774
- <div
775
- class="group relative flex items-center gap-3 px-3 py-2 rounded-xl transition cursor-pointer hover:bg-gray-50"
776
- [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-50, rgba(59,130,246,0.10))' : ''"
777
- (click)="select(t)"
778
- >
779
- <span
780
- class="absolute left-0 top-1 bottom-1 w-1 rounded-full"
781
- [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : 'transparent'"
782
- ></span>
783
-
784
- <i class="text-base shrink-0"
785
- [ngClass]="t.icon || 'pi pi-check-circle'"
786
- [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''"></i>
787
-
788
- <span class="flex-1 truncate"
789
- [class.font-semibold]="isSelected(t)"
790
- [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''">
791
- {{ getName(t) }}
792
- </span>
793
-
794
- <div class="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition"
795
- (click)="$event.stopPropagation()">
796
- <button pButton type="button" class="p-button-text p-button-sm"
797
- [icon]="t.isFav ? 'pi pi-star-fill' : 'pi pi-star'"
798
- (click)="toggleFav(t)"></button>
799
-
800
- @if (!isSelected(t)) {
801
- <button pButton type="button" class="p-button-text p-button-sm"
802
- icon="pi pi-pencil"
803
- (click)="openTemplateEdit(t)"></button>
804
-
805
- <button pButton type="button" class="p-button-text p-button-sm p-button-danger"
806
- icon="pi pi-trash"
807
- (click)="confirmDelete(t)"></button>
808
- }
809
- </div>
810
- </div>
811
- </ng-container>
812
- </div>
813
- </ng-container>
814
-
815
- </ng-container>
816
- </div>
817
- </div>
818
- </p-drawer>
819
-
820
- <filter-template-editor-dialog
821
- [(visible)]="templateEditorVisible"
822
- [mode]="templateEditorMode"
823
- [model]="templateEditorModel"
824
- [filterFields]="filterFields"
825
- [moduleName]="moduleName"
826
- [apiName]="apiName"
827
- [defaultFeature]="defaultFeature"
828
- [defaultCategory]="defaultCategory"
829
- [defaultPermission]="defaultPermission"
830
- [currentUserId]="currentUserId"
831
- (saved)="onTemplateSaved($event)">
832
- </filter-template-editor-dialog>
833
-
834
-
549
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: SavedReportTemplatesDrawerComponent, isStandalone: true, selector: "saved-report-templates-drawer", inputs: { apiName: "apiName", module: "module", service: "service", category: "category", feature: "feature", visible: "visible", position: "position", showCloseIcon: "showCloseIcon", modal: "modal", dismissable: "dismissable", closeOnEscape: "closeOnEscape", blockScroll: "blockScroll", filterFields: "filterFields", moduleName: "moduleName", defaultFeature: "defaultFeature", defaultCategory: "defaultCategory", defaultPermission: "defaultPermission", currentUserId: "currentUserId" }, outputs: { templateSelected: "templateSelected", edit: "edit", add: "add", visibleChange: "visibleChange" }, providers: [BaseService], ngImport: i0, template: `
550
+ <p-drawer
551
+ [visible]="visible"
552
+ (visibleChange)="onVisibleChange($event)"
553
+ [position]="position"
554
+ [modal]="modal"
555
+ [dismissible]="dismissable"
556
+ [closeOnEscape]="closeOnEscape"
557
+ [blockScroll]="blockScroll"
558
+ [showCloseIcon]="showCloseIcon"
559
+ >
560
+ <div class="h-full flex flex-col bg-white">
561
+
562
+ <!-- Header -->
563
+ <div class="sticky top-0 z-10 bg-white border-b border-gray-200 px-4 py-4">
564
+ <div class="flex items-center gap-3">
565
+ <div class="w-9 h-9 rounded-xl flex items-center justify-center bg-gray-100 text-gray-700">
566
+ <i class="pi pi-bookmark"></i>
567
+ </div>
568
+
569
+ <div class="flex-1 min-w-0">
570
+ <div class="text-xs text-gray-500">
571
+ {{ 'TEMPLATES' | translate }}
572
+ </div>
573
+ <div class="text-base font-semibold text-gray-900 truncate">
574
+ {{ selected ? getName(selected) : ('SELECT_TEMPLATE' | translate) }}
575
+ </div>
576
+ </div>
577
+
578
+ <button
579
+ pButton
580
+ type="button"
581
+ class="p-button-rounded p-button-sm p-button-text"
582
+ icon="pi pi-refresh"
583
+ (click)="refresh()"
584
+ [disabled]="loading"
585
+ pTooltip="{{ 'REFRESH' | translate }}"
586
+ tooltipPosition="bottom"
587
+ ></button>
588
+
589
+ <button
590
+ pButton
591
+ type="button"
592
+ class="p-button-rounded p-button-sm p-button-primary"
593
+ icon="pi pi-plus"
594
+ (click)="openTemplateCreate()"
595
+ [disabled]="loading"
596
+ pTooltip="{{ 'COMMON.ADD' | translate }}"
597
+ tooltipPosition="bottom"
598
+ ></button>
599
+ </div>
600
+
601
+ <!-- Search -->
602
+ <div class="mt-4">
603
+ <span class="p-input-icon-left w-full">
604
+ <i class="pi pi-search"></i>
605
+ <input
606
+ pInputText
607
+ class="w-full !rounded-xl"
608
+ [(ngModel)]="search"
609
+ [disabled]="loading"
610
+ [placeholder]="'SEARCH_FOR_A_VIEW' | translate"
611
+ />
612
+ </span>
613
+ </div>
614
+ </div>
615
+
616
+ <!-- Content -->
617
+ <div class="flex-1 overflow-auto px-3 py-3">
618
+
619
+ <!-- ✅ Loading -->
620
+ <div *ngIf="loading" class="py-4">
621
+ <app-loading-skeleton [itemsCount]="4"></app-loading-skeleton>
622
+ </div>
623
+
624
+ <!-- ✅ Empty -->
625
+ <div *ngIf="!loading && filteredAll.length === 0" class="text-sm text-gray-500 text-center py-12">
626
+ <div class="mx-auto mb-3 w-12 h-12 rounded-2xl bg-gray-100 flex items-center justify-center">
627
+ <i class="pi pi-inbox text-gray-500"></i>
628
+ </div>
629
+ {{ 'NO_DATA_FOUND' | translate }}
630
+ </div>
631
+
632
+ <!-- ✅ Content when not loading -->
633
+ <ng-container *ngIf="!loading">
634
+
635
+ <!-- Favorites -->
636
+ <ng-container *ngIf="favList.length > 0">
637
+ <button
638
+ type="button"
639
+ class="w-full flex items-center justify-between px-2 py-2 text-sm font-semibold text-gray-800"
640
+ (click)="favOpen = !favOpen"
641
+ >
642
+ <span class="flex items-center gap-2">
643
+ <i class="pi pi-star-fill text-yellow-500"></i>
644
+ {{ 'FAVOURITES' | translate }}
645
+ <span class="text-xs px-2 py-0.5 rounded-full bg-gray-100 text-gray-600">{{ favList.length }}</span>
646
+ </span>
647
+ <i class="pi text-xs" [ngClass]="favOpen ? 'pi-chevron-up' : 'pi-chevron-down'"></i>
648
+ </button>
649
+
650
+ <div *ngIf="favOpen" class="mt-1 space-y-1">
651
+ <ng-container *ngFor="let t of favList">
652
+ <div
653
+ class="group relative flex items-center gap-3 px-3 py-2 rounded-xl transition cursor-pointer
654
+ hover:bg-gray-50"
655
+ [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-50, rgba(59,130,246,0.10))' : ''"
656
+ (click)="select(t)"
657
+ >
658
+ <span
659
+ class="absolute left-0 top-1 bottom-1 w-1 rounded-full"
660
+ [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : 'transparent'"
661
+ ></span>
662
+
663
+ <i class="text-base shrink-0"
664
+ [ngClass]="t.icon || 'pi pi-check-circle'"
665
+ [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''"></i>
666
+
667
+ <span class="flex-1 truncate"
668
+ [class.font-semibold]="isSelected(t)"
669
+ [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''">
670
+ {{ getName(t) }}
671
+ </span>
672
+
673
+ <!-- Actions -->
674
+ <div class="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition"
675
+ (click)="$event.stopPropagation()">
676
+ <button pButton type="button" class="p-button-text p-button-sm"
677
+ [icon]="t.isFav ? 'pi pi-star-fill' : 'pi pi-star'"
678
+ (click)="toggleFav(t)"></button>
679
+
680
+ @if (!isSelected(t)) {
681
+ <button pButton type="button" class="p-button-text p-button-sm"
682
+ icon="pi pi-pencil"
683
+ (click)="openTemplateEdit(t)"></button>
684
+
685
+ <button pButton type="button" class="p-button-text p-button-sm p-button-danger"
686
+ icon="pi pi-trash"
687
+ (click)="confirmDelete(t)"></button>
688
+ }
689
+ </div>
690
+ </div>
691
+ </ng-container>
692
+ </div>
693
+
694
+ <div class="my-3 border-b border-gray-200"></div>
695
+ </ng-container>
696
+
697
+ <!-- Shared -->
698
+ <ng-container *ngIf="sharedList.length > 0">
699
+ <button
700
+ type="button"
701
+ class="w-full flex items-center justify-between px-2 py-2 text-sm font-semibold text-gray-800"
702
+ (click)="sharedOpen = !sharedOpen"
703
+ >
704
+ <span class="flex items-center gap-2">
705
+ <i class="pi pi-users text-gray-600"></i>
706
+ {{ 'SHARED' | translate }}
707
+ <span class="text-xs px-2 py-0.5 rounded-full bg-gray-100 text-gray-600">{{ sharedList.length }}</span>
708
+ </span>
709
+ <i class="pi text-xs" [ngClass]="sharedOpen ? 'pi-chevron-up' : 'pi-chevron-down'"></i>
710
+ </button>
711
+
712
+ <div *ngIf="sharedOpen" class="mt-1 space-y-1">
713
+ <ng-container *ngFor="let t of sharedList">
714
+ <div
715
+ class="group relative flex items-center gap-3 px-3 py-2 rounded-xl transition cursor-pointer hover:bg-gray-50"
716
+ [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-50, rgba(59,130,246,0.10))' : ''"
717
+ (click)="select(t)"
718
+ >
719
+ <span
720
+ class="absolute left-0 top-1 bottom-1 w-1 rounded-full"
721
+ [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : 'transparent'"
722
+ ></span>
723
+
724
+ <i class="text-base shrink-0"
725
+ [ngClass]="t.icon || 'pi pi-check-circle'"
726
+ [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''"></i>
727
+
728
+ <span class="flex-1 truncate"
729
+ [class.font-semibold]="isSelected(t)"
730
+ [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''">
731
+ {{ getName(t) }}
732
+ </span>
733
+
734
+ <div class="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition"
735
+ (click)="$event.stopPropagation()">
736
+ <button pButton type="button" class="p-button-text p-button-sm"
737
+ [icon]="t.isFav ? 'pi pi-star-fill' : 'pi pi-star'"
738
+ (click)="toggleFav(t)"></button>
739
+
740
+ @if (!isSelected(t)) {
741
+ <button pButton type="button" class="p-button-text p-button-sm"
742
+ icon="pi pi-pencil"
743
+ (click)="openTemplateEdit(t)"></button>
744
+
745
+ <button pButton type="button" class="p-button-text p-button-sm p-button-danger"
746
+ icon="pi pi-trash"
747
+ (click)="confirmDelete(t)"></button>
748
+ }
749
+ </div>
750
+ </div>
751
+ </ng-container>
752
+ </div>
753
+
754
+ <div class="my-3 border-b border-gray-200"></div>
755
+ </ng-container>
756
+
757
+ <!-- Private -->
758
+ <ng-container *ngIf="privateList.length > 0">
759
+ <button
760
+ type="button"
761
+ class="w-full flex items-center justify-between px-2 py-2 text-sm font-semibold text-gray-800"
762
+ (click)="privateOpen = !privateOpen"
763
+ >
764
+ <span class="flex items-center gap-2">
765
+ <i class="pi pi-lock text-gray-600"></i>
766
+ {{ 'PRIVATE' | translate }}
767
+ <span class="text-xs px-2 py-0.5 rounded-full bg-gray-100 text-gray-600">{{ privateList.length }}</span>
768
+ </span>
769
+ <i class="pi text-xs" [ngClass]="privateOpen ? 'pi-chevron-up' : 'pi-chevron-down'"></i>
770
+ </button>
771
+
772
+ <div *ngIf="privateOpen" class="mt-1 space-y-1">
773
+ <ng-container *ngFor="let t of privateList">
774
+ <div
775
+ class="group relative flex items-center gap-3 px-3 py-2 rounded-xl transition cursor-pointer hover:bg-gray-50"
776
+ [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-50, rgba(59,130,246,0.10))' : ''"
777
+ (click)="select(t)"
778
+ >
779
+ <span
780
+ class="absolute left-0 top-1 bottom-1 w-1 rounded-full"
781
+ [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : 'transparent'"
782
+ ></span>
783
+
784
+ <i class="text-base shrink-0"
785
+ [ngClass]="t.icon || 'pi pi-check-circle'"
786
+ [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''"></i>
787
+
788
+ <span class="flex-1 truncate"
789
+ [class.font-semibold]="isSelected(t)"
790
+ [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''">
791
+ {{ getName(t) }}
792
+ </span>
793
+
794
+ <div class="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition"
795
+ (click)="$event.stopPropagation()">
796
+ <button pButton type="button" class="p-button-text p-button-sm"
797
+ [icon]="t.isFav ? 'pi pi-star-fill' : 'pi pi-star'"
798
+ (click)="toggleFav(t)"></button>
799
+
800
+ @if (!isSelected(t)) {
801
+ <button pButton type="button" class="p-button-text p-button-sm"
802
+ icon="pi pi-pencil"
803
+ (click)="openTemplateEdit(t)"></button>
804
+
805
+ <button pButton type="button" class="p-button-text p-button-sm p-button-danger"
806
+ icon="pi pi-trash"
807
+ (click)="confirmDelete(t)"></button>
808
+ }
809
+ </div>
810
+ </div>
811
+ </ng-container>
812
+ </div>
813
+ </ng-container>
814
+
815
+ </ng-container>
816
+ </div>
817
+ </div>
818
+ </p-drawer>
819
+
820
+ <filter-template-editor-dialog
821
+ [(visible)]="templateEditorVisible"
822
+ [mode]="templateEditorMode"
823
+ [model]="templateEditorModel"
824
+ [filterFields]="filterFields"
825
+ [moduleName]="moduleName"
826
+ [apiName]="apiName"
827
+ [defaultFeature]="defaultFeature"
828
+ [defaultCategory]="defaultCategory"
829
+ [defaultPermission]="defaultPermission"
830
+ [currentUserId]="currentUserId"
831
+ (saved)="onTemplateSaved($event)">
832
+ </filter-template-editor-dialog>
833
+
834
+
835
835
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i5.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i6.Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "component", type: LoadingSkeletonComponent, selector: "app-loading-skeleton", inputs: ["itemsCount"] }, { kind: "component", type: FilterTemplateEditorDialogComponent, selector: "filter-template-editor-dialog", inputs: ["visible", "mode", "model", "filterFields", "apiName", "moduleName", "idField", "defaultFeature", "defaultPermission", "defaultCategory", "dialogMaxWidth", "currentUserId"], outputs: ["visibleChange", "saved"] }, { kind: "pipe", type: i7.TranslatePipe, name: "translate" }] });
836
836
  }
837
837
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: SavedReportTemplatesDrawerComponent, decorators: [{
@@ -851,292 +851,292 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
851
851
  FilterTemplateEditorDialogComponent
852
852
  ],
853
853
  providers: [BaseService],
854
- template: `
855
- <p-drawer
856
- [visible]="visible"
857
- (visibleChange)="onVisibleChange($event)"
858
- [position]="position"
859
- [modal]="modal"
860
- [dismissible]="dismissable"
861
- [closeOnEscape]="closeOnEscape"
862
- [blockScroll]="blockScroll"
863
- [showCloseIcon]="showCloseIcon"
864
- >
865
- <div class="h-full flex flex-col bg-white">
866
-
867
- <!-- Header -->
868
- <div class="sticky top-0 z-10 bg-white border-b border-gray-200 px-4 py-4">
869
- <div class="flex items-center gap-3">
870
- <div class="w-9 h-9 rounded-xl flex items-center justify-center bg-gray-100 text-gray-700">
871
- <i class="pi pi-bookmark"></i>
872
- </div>
873
-
874
- <div class="flex-1 min-w-0">
875
- <div class="text-xs text-gray-500">
876
- {{ 'TEMPLATES' | translate }}
877
- </div>
878
- <div class="text-base font-semibold text-gray-900 truncate">
879
- {{ selected ? getName(selected) : ('SELECT_TEMPLATE' | translate) }}
880
- </div>
881
- </div>
882
-
883
- <button
884
- pButton
885
- type="button"
886
- class="p-button-rounded p-button-sm p-button-text"
887
- icon="pi pi-refresh"
888
- (click)="refresh()"
889
- [disabled]="loading"
890
- pTooltip="{{ 'REFRESH' | translate }}"
891
- tooltipPosition="bottom"
892
- ></button>
893
-
894
- <button
895
- pButton
896
- type="button"
897
- class="p-button-rounded p-button-sm p-button-primary"
898
- icon="pi pi-plus"
899
- (click)="openTemplateCreate()"
900
- [disabled]="loading"
901
- pTooltip="{{ 'COMMON.ADD' | translate }}"
902
- tooltipPosition="bottom"
903
- ></button>
904
- </div>
905
-
906
- <!-- Search -->
907
- <div class="mt-4">
908
- <span class="p-input-icon-left w-full">
909
- <i class="pi pi-search"></i>
910
- <input
911
- pInputText
912
- class="w-full !rounded-xl"
913
- [(ngModel)]="search"
914
- [disabled]="loading"
915
- [placeholder]="'SEARCH_FOR_A_VIEW' | translate"
916
- />
917
- </span>
918
- </div>
919
- </div>
920
-
921
- <!-- Content -->
922
- <div class="flex-1 overflow-auto px-3 py-3">
923
-
924
- <!-- ✅ Loading -->
925
- <div *ngIf="loading" class="py-4">
926
- <app-loading-skeleton [itemsCount]="4"></app-loading-skeleton>
927
- </div>
928
-
929
- <!-- ✅ Empty -->
930
- <div *ngIf="!loading && filteredAll.length === 0" class="text-sm text-gray-500 text-center py-12">
931
- <div class="mx-auto mb-3 w-12 h-12 rounded-2xl bg-gray-100 flex items-center justify-center">
932
- <i class="pi pi-inbox text-gray-500"></i>
933
- </div>
934
- {{ 'NO_DATA_FOUND' | translate }}
935
- </div>
936
-
937
- <!-- ✅ Content when not loading -->
938
- <ng-container *ngIf="!loading">
939
-
940
- <!-- Favorites -->
941
- <ng-container *ngIf="favList.length > 0">
942
- <button
943
- type="button"
944
- class="w-full flex items-center justify-between px-2 py-2 text-sm font-semibold text-gray-800"
945
- (click)="favOpen = !favOpen"
946
- >
947
- <span class="flex items-center gap-2">
948
- <i class="pi pi-star-fill text-yellow-500"></i>
949
- {{ 'FAVOURITES' | translate }}
950
- <span class="text-xs px-2 py-0.5 rounded-full bg-gray-100 text-gray-600">{{ favList.length }}</span>
951
- </span>
952
- <i class="pi text-xs" [ngClass]="favOpen ? 'pi-chevron-up' : 'pi-chevron-down'"></i>
953
- </button>
954
-
955
- <div *ngIf="favOpen" class="mt-1 space-y-1">
956
- <ng-container *ngFor="let t of favList">
957
- <div
958
- class="group relative flex items-center gap-3 px-3 py-2 rounded-xl transition cursor-pointer
959
- hover:bg-gray-50"
960
- [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-50, rgba(59,130,246,0.10))' : ''"
961
- (click)="select(t)"
962
- >
963
- <span
964
- class="absolute left-0 top-1 bottom-1 w-1 rounded-full"
965
- [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : 'transparent'"
966
- ></span>
967
-
968
- <i class="text-base shrink-0"
969
- [ngClass]="t.icon || 'pi pi-check-circle'"
970
- [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''"></i>
971
-
972
- <span class="flex-1 truncate"
973
- [class.font-semibold]="isSelected(t)"
974
- [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''">
975
- {{ getName(t) }}
976
- </span>
977
-
978
- <!-- Actions -->
979
- <div class="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition"
980
- (click)="$event.stopPropagation()">
981
- <button pButton type="button" class="p-button-text p-button-sm"
982
- [icon]="t.isFav ? 'pi pi-star-fill' : 'pi pi-star'"
983
- (click)="toggleFav(t)"></button>
984
-
985
- @if (!isSelected(t)) {
986
- <button pButton type="button" class="p-button-text p-button-sm"
987
- icon="pi pi-pencil"
988
- (click)="openTemplateEdit(t)"></button>
989
-
990
- <button pButton type="button" class="p-button-text p-button-sm p-button-danger"
991
- icon="pi pi-trash"
992
- (click)="confirmDelete(t)"></button>
993
- }
994
- </div>
995
- </div>
996
- </ng-container>
997
- </div>
998
-
999
- <div class="my-3 border-b border-gray-200"></div>
1000
- </ng-container>
1001
-
1002
- <!-- Shared -->
1003
- <ng-container *ngIf="sharedList.length > 0">
1004
- <button
1005
- type="button"
1006
- class="w-full flex items-center justify-between px-2 py-2 text-sm font-semibold text-gray-800"
1007
- (click)="sharedOpen = !sharedOpen"
1008
- >
1009
- <span class="flex items-center gap-2">
1010
- <i class="pi pi-users text-gray-600"></i>
1011
- {{ 'SHARED' | translate }}
1012
- <span class="text-xs px-2 py-0.5 rounded-full bg-gray-100 text-gray-600">{{ sharedList.length }}</span>
1013
- </span>
1014
- <i class="pi text-xs" [ngClass]="sharedOpen ? 'pi-chevron-up' : 'pi-chevron-down'"></i>
1015
- </button>
1016
-
1017
- <div *ngIf="sharedOpen" class="mt-1 space-y-1">
1018
- <ng-container *ngFor="let t of sharedList">
1019
- <div
1020
- class="group relative flex items-center gap-3 px-3 py-2 rounded-xl transition cursor-pointer hover:bg-gray-50"
1021
- [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-50, rgba(59,130,246,0.10))' : ''"
1022
- (click)="select(t)"
1023
- >
1024
- <span
1025
- class="absolute left-0 top-1 bottom-1 w-1 rounded-full"
1026
- [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : 'transparent'"
1027
- ></span>
1028
-
1029
- <i class="text-base shrink-0"
1030
- [ngClass]="t.icon || 'pi pi-check-circle'"
1031
- [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''"></i>
1032
-
1033
- <span class="flex-1 truncate"
1034
- [class.font-semibold]="isSelected(t)"
1035
- [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''">
1036
- {{ getName(t) }}
1037
- </span>
1038
-
1039
- <div class="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition"
1040
- (click)="$event.stopPropagation()">
1041
- <button pButton type="button" class="p-button-text p-button-sm"
1042
- [icon]="t.isFav ? 'pi pi-star-fill' : 'pi pi-star'"
1043
- (click)="toggleFav(t)"></button>
1044
-
1045
- @if (!isSelected(t)) {
1046
- <button pButton type="button" class="p-button-text p-button-sm"
1047
- icon="pi pi-pencil"
1048
- (click)="openTemplateEdit(t)"></button>
1049
-
1050
- <button pButton type="button" class="p-button-text p-button-sm p-button-danger"
1051
- icon="pi pi-trash"
1052
- (click)="confirmDelete(t)"></button>
1053
- }
1054
- </div>
1055
- </div>
1056
- </ng-container>
1057
- </div>
1058
-
1059
- <div class="my-3 border-b border-gray-200"></div>
1060
- </ng-container>
1061
-
1062
- <!-- Private -->
1063
- <ng-container *ngIf="privateList.length > 0">
1064
- <button
1065
- type="button"
1066
- class="w-full flex items-center justify-between px-2 py-2 text-sm font-semibold text-gray-800"
1067
- (click)="privateOpen = !privateOpen"
1068
- >
1069
- <span class="flex items-center gap-2">
1070
- <i class="pi pi-lock text-gray-600"></i>
1071
- {{ 'PRIVATE' | translate }}
1072
- <span class="text-xs px-2 py-0.5 rounded-full bg-gray-100 text-gray-600">{{ privateList.length }}</span>
1073
- </span>
1074
- <i class="pi text-xs" [ngClass]="privateOpen ? 'pi-chevron-up' : 'pi-chevron-down'"></i>
1075
- </button>
1076
-
1077
- <div *ngIf="privateOpen" class="mt-1 space-y-1">
1078
- <ng-container *ngFor="let t of privateList">
1079
- <div
1080
- class="group relative flex items-center gap-3 px-3 py-2 rounded-xl transition cursor-pointer hover:bg-gray-50"
1081
- [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-50, rgba(59,130,246,0.10))' : ''"
1082
- (click)="select(t)"
1083
- >
1084
- <span
1085
- class="absolute left-0 top-1 bottom-1 w-1 rounded-full"
1086
- [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : 'transparent'"
1087
- ></span>
1088
-
1089
- <i class="text-base shrink-0"
1090
- [ngClass]="t.icon || 'pi pi-check-circle'"
1091
- [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''"></i>
1092
-
1093
- <span class="flex-1 truncate"
1094
- [class.font-semibold]="isSelected(t)"
1095
- [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''">
1096
- {{ getName(t) }}
1097
- </span>
1098
-
1099
- <div class="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition"
1100
- (click)="$event.stopPropagation()">
1101
- <button pButton type="button" class="p-button-text p-button-sm"
1102
- [icon]="t.isFav ? 'pi pi-star-fill' : 'pi pi-star'"
1103
- (click)="toggleFav(t)"></button>
1104
-
1105
- @if (!isSelected(t)) {
1106
- <button pButton type="button" class="p-button-text p-button-sm"
1107
- icon="pi pi-pencil"
1108
- (click)="openTemplateEdit(t)"></button>
1109
-
1110
- <button pButton type="button" class="p-button-text p-button-sm p-button-danger"
1111
- icon="pi pi-trash"
1112
- (click)="confirmDelete(t)"></button>
1113
- }
1114
- </div>
1115
- </div>
1116
- </ng-container>
1117
- </div>
1118
- </ng-container>
1119
-
1120
- </ng-container>
1121
- </div>
1122
- </div>
1123
- </p-drawer>
1124
-
1125
- <filter-template-editor-dialog
1126
- [(visible)]="templateEditorVisible"
1127
- [mode]="templateEditorMode"
1128
- [model]="templateEditorModel"
1129
- [filterFields]="filterFields"
1130
- [moduleName]="moduleName"
1131
- [apiName]="apiName"
1132
- [defaultFeature]="defaultFeature"
1133
- [defaultCategory]="defaultCategory"
1134
- [defaultPermission]="defaultPermission"
1135
- [currentUserId]="currentUserId"
1136
- (saved)="onTemplateSaved($event)">
1137
- </filter-template-editor-dialog>
1138
-
1139
-
854
+ template: `
855
+ <p-drawer
856
+ [visible]="visible"
857
+ (visibleChange)="onVisibleChange($event)"
858
+ [position]="position"
859
+ [modal]="modal"
860
+ [dismissible]="dismissable"
861
+ [closeOnEscape]="closeOnEscape"
862
+ [blockScroll]="blockScroll"
863
+ [showCloseIcon]="showCloseIcon"
864
+ >
865
+ <div class="h-full flex flex-col bg-white">
866
+
867
+ <!-- Header -->
868
+ <div class="sticky top-0 z-10 bg-white border-b border-gray-200 px-4 py-4">
869
+ <div class="flex items-center gap-3">
870
+ <div class="w-9 h-9 rounded-xl flex items-center justify-center bg-gray-100 text-gray-700">
871
+ <i class="pi pi-bookmark"></i>
872
+ </div>
873
+
874
+ <div class="flex-1 min-w-0">
875
+ <div class="text-xs text-gray-500">
876
+ {{ 'TEMPLATES' | translate }}
877
+ </div>
878
+ <div class="text-base font-semibold text-gray-900 truncate">
879
+ {{ selected ? getName(selected) : ('SELECT_TEMPLATE' | translate) }}
880
+ </div>
881
+ </div>
882
+
883
+ <button
884
+ pButton
885
+ type="button"
886
+ class="p-button-rounded p-button-sm p-button-text"
887
+ icon="pi pi-refresh"
888
+ (click)="refresh()"
889
+ [disabled]="loading"
890
+ pTooltip="{{ 'REFRESH' | translate }}"
891
+ tooltipPosition="bottom"
892
+ ></button>
893
+
894
+ <button
895
+ pButton
896
+ type="button"
897
+ class="p-button-rounded p-button-sm p-button-primary"
898
+ icon="pi pi-plus"
899
+ (click)="openTemplateCreate()"
900
+ [disabled]="loading"
901
+ pTooltip="{{ 'COMMON.ADD' | translate }}"
902
+ tooltipPosition="bottom"
903
+ ></button>
904
+ </div>
905
+
906
+ <!-- Search -->
907
+ <div class="mt-4">
908
+ <span class="p-input-icon-left w-full">
909
+ <i class="pi pi-search"></i>
910
+ <input
911
+ pInputText
912
+ class="w-full !rounded-xl"
913
+ [(ngModel)]="search"
914
+ [disabled]="loading"
915
+ [placeholder]="'SEARCH_FOR_A_VIEW' | translate"
916
+ />
917
+ </span>
918
+ </div>
919
+ </div>
920
+
921
+ <!-- Content -->
922
+ <div class="flex-1 overflow-auto px-3 py-3">
923
+
924
+ <!-- ✅ Loading -->
925
+ <div *ngIf="loading" class="py-4">
926
+ <app-loading-skeleton [itemsCount]="4"></app-loading-skeleton>
927
+ </div>
928
+
929
+ <!-- ✅ Empty -->
930
+ <div *ngIf="!loading && filteredAll.length === 0" class="text-sm text-gray-500 text-center py-12">
931
+ <div class="mx-auto mb-3 w-12 h-12 rounded-2xl bg-gray-100 flex items-center justify-center">
932
+ <i class="pi pi-inbox text-gray-500"></i>
933
+ </div>
934
+ {{ 'NO_DATA_FOUND' | translate }}
935
+ </div>
936
+
937
+ <!-- ✅ Content when not loading -->
938
+ <ng-container *ngIf="!loading">
939
+
940
+ <!-- Favorites -->
941
+ <ng-container *ngIf="favList.length > 0">
942
+ <button
943
+ type="button"
944
+ class="w-full flex items-center justify-between px-2 py-2 text-sm font-semibold text-gray-800"
945
+ (click)="favOpen = !favOpen"
946
+ >
947
+ <span class="flex items-center gap-2">
948
+ <i class="pi pi-star-fill text-yellow-500"></i>
949
+ {{ 'FAVOURITES' | translate }}
950
+ <span class="text-xs px-2 py-0.5 rounded-full bg-gray-100 text-gray-600">{{ favList.length }}</span>
951
+ </span>
952
+ <i class="pi text-xs" [ngClass]="favOpen ? 'pi-chevron-up' : 'pi-chevron-down'"></i>
953
+ </button>
954
+
955
+ <div *ngIf="favOpen" class="mt-1 space-y-1">
956
+ <ng-container *ngFor="let t of favList">
957
+ <div
958
+ class="group relative flex items-center gap-3 px-3 py-2 rounded-xl transition cursor-pointer
959
+ hover:bg-gray-50"
960
+ [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-50, rgba(59,130,246,0.10))' : ''"
961
+ (click)="select(t)"
962
+ >
963
+ <span
964
+ class="absolute left-0 top-1 bottom-1 w-1 rounded-full"
965
+ [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : 'transparent'"
966
+ ></span>
967
+
968
+ <i class="text-base shrink-0"
969
+ [ngClass]="t.icon || 'pi pi-check-circle'"
970
+ [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''"></i>
971
+
972
+ <span class="flex-1 truncate"
973
+ [class.font-semibold]="isSelected(t)"
974
+ [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''">
975
+ {{ getName(t) }}
976
+ </span>
977
+
978
+ <!-- Actions -->
979
+ <div class="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition"
980
+ (click)="$event.stopPropagation()">
981
+ <button pButton type="button" class="p-button-text p-button-sm"
982
+ [icon]="t.isFav ? 'pi pi-star-fill' : 'pi pi-star'"
983
+ (click)="toggleFav(t)"></button>
984
+
985
+ @if (!isSelected(t)) {
986
+ <button pButton type="button" class="p-button-text p-button-sm"
987
+ icon="pi pi-pencil"
988
+ (click)="openTemplateEdit(t)"></button>
989
+
990
+ <button pButton type="button" class="p-button-text p-button-sm p-button-danger"
991
+ icon="pi pi-trash"
992
+ (click)="confirmDelete(t)"></button>
993
+ }
994
+ </div>
995
+ </div>
996
+ </ng-container>
997
+ </div>
998
+
999
+ <div class="my-3 border-b border-gray-200"></div>
1000
+ </ng-container>
1001
+
1002
+ <!-- Shared -->
1003
+ <ng-container *ngIf="sharedList.length > 0">
1004
+ <button
1005
+ type="button"
1006
+ class="w-full flex items-center justify-between px-2 py-2 text-sm font-semibold text-gray-800"
1007
+ (click)="sharedOpen = !sharedOpen"
1008
+ >
1009
+ <span class="flex items-center gap-2">
1010
+ <i class="pi pi-users text-gray-600"></i>
1011
+ {{ 'SHARED' | translate }}
1012
+ <span class="text-xs px-2 py-0.5 rounded-full bg-gray-100 text-gray-600">{{ sharedList.length }}</span>
1013
+ </span>
1014
+ <i class="pi text-xs" [ngClass]="sharedOpen ? 'pi-chevron-up' : 'pi-chevron-down'"></i>
1015
+ </button>
1016
+
1017
+ <div *ngIf="sharedOpen" class="mt-1 space-y-1">
1018
+ <ng-container *ngFor="let t of sharedList">
1019
+ <div
1020
+ class="group relative flex items-center gap-3 px-3 py-2 rounded-xl transition cursor-pointer hover:bg-gray-50"
1021
+ [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-50, rgba(59,130,246,0.10))' : ''"
1022
+ (click)="select(t)"
1023
+ >
1024
+ <span
1025
+ class="absolute left-0 top-1 bottom-1 w-1 rounded-full"
1026
+ [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : 'transparent'"
1027
+ ></span>
1028
+
1029
+ <i class="text-base shrink-0"
1030
+ [ngClass]="t.icon || 'pi pi-check-circle'"
1031
+ [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''"></i>
1032
+
1033
+ <span class="flex-1 truncate"
1034
+ [class.font-semibold]="isSelected(t)"
1035
+ [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''">
1036
+ {{ getName(t) }}
1037
+ </span>
1038
+
1039
+ <div class="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition"
1040
+ (click)="$event.stopPropagation()">
1041
+ <button pButton type="button" class="p-button-text p-button-sm"
1042
+ [icon]="t.isFav ? 'pi pi-star-fill' : 'pi pi-star'"
1043
+ (click)="toggleFav(t)"></button>
1044
+
1045
+ @if (!isSelected(t)) {
1046
+ <button pButton type="button" class="p-button-text p-button-sm"
1047
+ icon="pi pi-pencil"
1048
+ (click)="openTemplateEdit(t)"></button>
1049
+
1050
+ <button pButton type="button" class="p-button-text p-button-sm p-button-danger"
1051
+ icon="pi pi-trash"
1052
+ (click)="confirmDelete(t)"></button>
1053
+ }
1054
+ </div>
1055
+ </div>
1056
+ </ng-container>
1057
+ </div>
1058
+
1059
+ <div class="my-3 border-b border-gray-200"></div>
1060
+ </ng-container>
1061
+
1062
+ <!-- Private -->
1063
+ <ng-container *ngIf="privateList.length > 0">
1064
+ <button
1065
+ type="button"
1066
+ class="w-full flex items-center justify-between px-2 py-2 text-sm font-semibold text-gray-800"
1067
+ (click)="privateOpen = !privateOpen"
1068
+ >
1069
+ <span class="flex items-center gap-2">
1070
+ <i class="pi pi-lock text-gray-600"></i>
1071
+ {{ 'PRIVATE' | translate }}
1072
+ <span class="text-xs px-2 py-0.5 rounded-full bg-gray-100 text-gray-600">{{ privateList.length }}</span>
1073
+ </span>
1074
+ <i class="pi text-xs" [ngClass]="privateOpen ? 'pi-chevron-up' : 'pi-chevron-down'"></i>
1075
+ </button>
1076
+
1077
+ <div *ngIf="privateOpen" class="mt-1 space-y-1">
1078
+ <ng-container *ngFor="let t of privateList">
1079
+ <div
1080
+ class="group relative flex items-center gap-3 px-3 py-2 rounded-xl transition cursor-pointer hover:bg-gray-50"
1081
+ [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-50, rgba(59,130,246,0.10))' : ''"
1082
+ (click)="select(t)"
1083
+ >
1084
+ <span
1085
+ class="absolute left-0 top-1 bottom-1 w-1 rounded-full"
1086
+ [style.backgroundColor]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : 'transparent'"
1087
+ ></span>
1088
+
1089
+ <i class="text-base shrink-0"
1090
+ [ngClass]="t.icon || 'pi pi-check-circle'"
1091
+ [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''"></i>
1092
+
1093
+ <span class="flex-1 truncate"
1094
+ [class.font-semibold]="isSelected(t)"
1095
+ [style.color]="isSelected(t) ? 'var(--p-primary-color, #3b82f6)' : ''">
1096
+ {{ getName(t) }}
1097
+ </span>
1098
+
1099
+ <div class="flex items-center gap-1 opacity-0 group-hover:opacity-100 transition"
1100
+ (click)="$event.stopPropagation()">
1101
+ <button pButton type="button" class="p-button-text p-button-sm"
1102
+ [icon]="t.isFav ? 'pi pi-star-fill' : 'pi pi-star'"
1103
+ (click)="toggleFav(t)"></button>
1104
+
1105
+ @if (!isSelected(t)) {
1106
+ <button pButton type="button" class="p-button-text p-button-sm"
1107
+ icon="pi pi-pencil"
1108
+ (click)="openTemplateEdit(t)"></button>
1109
+
1110
+ <button pButton type="button" class="p-button-text p-button-sm p-button-danger"
1111
+ icon="pi pi-trash"
1112
+ (click)="confirmDelete(t)"></button>
1113
+ }
1114
+ </div>
1115
+ </div>
1116
+ </ng-container>
1117
+ </div>
1118
+ </ng-container>
1119
+
1120
+ </ng-container>
1121
+ </div>
1122
+ </div>
1123
+ </p-drawer>
1124
+
1125
+ <filter-template-editor-dialog
1126
+ [(visible)]="templateEditorVisible"
1127
+ [mode]="templateEditorMode"
1128
+ [model]="templateEditorModel"
1129
+ [filterFields]="filterFields"
1130
+ [moduleName]="moduleName"
1131
+ [apiName]="apiName"
1132
+ [defaultFeature]="defaultFeature"
1133
+ [defaultCategory]="defaultCategory"
1134
+ [defaultPermission]="defaultPermission"
1135
+ [currentUserId]="currentUserId"
1136
+ (saved)="onTemplateSaved($event)">
1137
+ </filter-template-editor-dialog>
1138
+
1139
+
1140
1140
  `,
1141
1141
  }]
1142
1142
  }], propDecorators: { apiName: [{
@@ -1210,15 +1210,15 @@ class ReportTemplatesWrapperComponent {
1210
1210
  this.context.closeTemplates();
1211
1211
  }
1212
1212
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ReportTemplatesWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1213
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ReportTemplatesWrapperComponent, isStandalone: true, selector: "app-report-templates-wrapper", ngImport: i0, template: `
1214
- <saved-report-templates-drawer
1215
- [visible]="context.templateDrawerVisible()"
1216
- [filterFields]="context.filters()"
1217
- [service]="context.moduleName()"
1218
- [category]="context.category()"
1219
- [feature]="context.feature()"
1220
- (templateSelected)="onSelect($event)">
1221
- </saved-report-templates-drawer>
1213
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ReportTemplatesWrapperComponent, isStandalone: true, selector: "app-report-templates-wrapper", ngImport: i0, template: `
1214
+ <saved-report-templates-drawer
1215
+ [visible]="context.templateDrawerVisible()"
1216
+ [filterFields]="context.filters()"
1217
+ [service]="context.moduleName()"
1218
+ [category]="context.category()"
1219
+ [feature]="context.feature()"
1220
+ (templateSelected)="onSelect($event)">
1221
+ </saved-report-templates-drawer>
1222
1222
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: SavedReportTemplatesDrawerComponent, selector: "saved-report-templates-drawer", inputs: ["apiName", "module", "service", "category", "feature", "visible", "position", "showCloseIcon", "modal", "dismissable", "closeOnEscape", "blockScroll", "filterFields", "moduleName", "defaultFeature", "defaultCategory", "defaultPermission", "currentUserId"], outputs: ["templateSelected", "edit", "add", "visibleChange"] }] });
1223
1223
  }
1224
1224
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ReportTemplatesWrapperComponent, decorators: [{
@@ -1227,15 +1227,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1227
1227
  selector: 'app-report-templates-wrapper',
1228
1228
  standalone: true,
1229
1229
  imports: [CommonModule, SavedReportTemplatesDrawerComponent],
1230
- template: `
1231
- <saved-report-templates-drawer
1232
- [visible]="context.templateDrawerVisible()"
1233
- [filterFields]="context.filters()"
1234
- [service]="context.moduleName()"
1235
- [category]="context.category()"
1236
- [feature]="context.feature()"
1237
- (templateSelected)="onSelect($event)">
1238
- </saved-report-templates-drawer>
1230
+ template: `
1231
+ <saved-report-templates-drawer
1232
+ [visible]="context.templateDrawerVisible()"
1233
+ [filterFields]="context.filters()"
1234
+ [service]="context.moduleName()"
1235
+ [category]="context.category()"
1236
+ [feature]="context.feature()"
1237
+ (templateSelected)="onSelect($event)">
1238
+ </saved-report-templates-drawer>
1239
1239
  `
1240
1240
  }]
1241
1241
  }] });