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

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 (176) 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 +108 -108
  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 +8 -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 +14 -3
  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 +19 -3
  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 +442 -442
  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 +16 -8
  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-button.d.ts +3 -1
  173. package/types/es.framework-ng.ui.core-generic-crud-table.d.ts +1 -0
  174. package/types/es.framework-ng.ui.core-generic-report.d.ts +1 -0
  175. package/types/es.framework-ng.ui.core-generic-table.d.ts +1 -1
  176. package/wrappers/README.md +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"es.framework-ng.ui.core-generic-crud-table.mjs","sources":["../../../../libs/ng.ui.core/generic-crud-table/src/lib/generic-crud-table-module.ts","../../../../libs/ng.ui.core/generic-crud-table/src/lib/generic-crud-header.ts","../../../../libs/ng.ui.core/generic-crud-table/src/lib/generic-crud-header.html","../../../../libs/ng.ui.core/generic-crud-table/src/lib/generic-crud-table.ts","../../../../libs/ng.ui.core/generic-crud-table/src/lib/generic-crud-table.html","../../../../libs/ng.ui.core/generic-crud-table/src/es.framework-ng.ui.core-generic-crud-table.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { GenericButtonModule } from '@es.framework/ng.ui.core/generic-button';\n\n@NgModule({\n imports: [CommonModule,GenericButtonModule],\n})\nexport class GenericCrudTableModule {}\n","import { Component, EventEmitter, inject, Input, Output } from '@angular/core';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { ButtonConfig } from '@es.framework/ng.core/models';\r\nimport { GenericButton } from '@es.framework/ng.ui.core/generic-button';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\n\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { DividerModule } from 'primeng/divider';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { Menu } from 'primeng/menu';\r\nimport { DialogService } from 'primeng/dynamicdialog';\r\nimport { BreadcrumbComponent } from '@es.framework/ng.ui.core/breadcrumb';\r\nimport { GenericSearchAdvanced } from '@es.framework/ng.ui.core/generic-search-advanced';\r\nimport { GenericReportComponent } from '@es.framework/ng.ui.core/generic-report';\r\nimport { LocalizationService } from '@es.framework/ng.core/services';\r\nimport { SelectButtonModule } from 'primeng/selectbutton';\r\nimport { TabbedSearchComponent } from '@es.framework/ng.ui.core/generic-report-tabs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormlyFieldConfig } from '@ngx-formly/core';\r\n\r\n@Component({\r\n selector: 'app-generic-crud-header',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n GenericButton,\r\n TranslatePipe,\r\n BreadcrumbComponent,\r\n ButtonModule,\r\n DividerModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TooltipModule,\r\n Menu,\r\n GenericSearchAdvanced,\r\n SelectButtonModule,\r\n TabbedSearchComponent,\r\n],\r\n templateUrl: './generic-crud-header.html',\r\n providers: [DialogService],\r\n\r\n})\r\nexport class GenericCrudHeaderComponent {\r\n\r\n translate = inject(LocalizationService);\r\n dialogService = inject(DialogService);\r\n // 🟢 Inputs\r\n @Input() mode: 'full' | 'form-only' | 'table-only' | 'detail' = 'full';\r\n @Input() breadcrumb: MenuItem[] | undefined;\r\n @Input() isSingleItemSelected = false;\r\n @Input() selectedItems: any[] = [];\r\n @Input() singleActionButtons: ButtonConfig[] = [];\r\n @Input() bulkActionButtons: ButtonConfig[] = [];\r\n @Input() addButtonConfigs: ButtonConfig[] = [];\r\n @Input() mergedButtonConfigs: ButtonConfig[] = [];\r\n @Input() filters: any;\r\n @Input() filterModel: any = {};\r\n @Input() showSearch = true;\r\n @Input() first = 0; // Add input for current 'first' index\r\n @Input() rows = 10; // Add input for current 'rows' per page\r\n @Input() totalRecords = 0; // Add input for total records\r\n @Input() moduleName: string = '';\r\n @Input() apiName: string = '';\r\n @Input() actions:MenuItem[] = [\r\n {\r\n label: this.translate.instant('REPORT'),\r\n icon: 'pi pi-file-export',\r\n command:(e:any)=>{\r\n this.openReportDialog();\r\n }\r\n }\r\n ];\r\n\r\n\r\n // 🟢 Outputs\r\n @Output() singleItemAction = new EventEmitter<ButtonConfig>();\r\n @Output() bulkAction = new EventEmitter<ButtonConfig>();\r\n @Output() search = new EventEmitter<any>();\r\n @Output() resetSearch = new EventEmitter<void>();\r\n @Output() action = new EventEmitter<{ name: string; row: any }>();\r\n @Output() paginateChange = new EventEmitter<{ first: number; rows: number }>(); // NEW OUTPUT\r\n\r\n\r\n // 🟢 Inputs الجديدة\r\n @Input() showAdvancedFilter = false; // متغير للتحكم في ظهور الزر\r\n @Input() advancedFilterIcon = 'pi pi-filter-fill'; // أيقونة اختيارية\r\n // 🟢 الحالة الخاصة بالفلتر المتقدم\r\n isAdvancedFilterVisible = false; // لإخفاء وإظهار المكون عند الضغط\r\n // أضف هذا الـ Input\r\n@Input() searchTabs: FormlyFieldConfig[] = []; // مصفوفة التبويبات\r\n\r\n// 🟢 ميزة تبديل العرض\r\n@Input() showViewMode = false;\r\n@Input() viewMode: 'table' | 'grid' = 'table';\r\n@Output() viewModeChange = new EventEmitter<'table' | 'grid'>();\r\n\r\n// تعريف الخيارات\r\nviewOptions: any[] = [\r\n { icon: 'pi pi-list', value: 'table', title: 'TABLE_VIEW' },\r\n { icon: 'pi pi-th-large', value: 'grid', title: 'GRID_VIEW' }\r\n];\r\n\r\n\r\nonViewChange(event: any) {\r\n // PrimeNG SelectButton event.value يحتوي على القيمة المختارة\r\n if (event.value) {\r\n this.viewModeChange.emit(event.value);\r\n }\r\n}\r\n\r\n// 🟢 Actions\r\ntoggleAdvancedFilter() {\r\n this.isAdvancedFilterVisible = !this.isAdvancedFilterVisible;\r\n}\r\n\r\n\r\n\r\n // 🟢 Helpers\r\n trackByIdx = (index: number) => index;\r\n\r\n // 🟢 Actions\r\n onSingleItemAction(btn: ButtonConfig) {\r\n this.singleItemAction.emit(btn);\r\n }\r\n onInternalBulkAction(btn: ButtonConfig) {\r\n this.bulkAction.emit(btn);\r\n }\r\npaginationChange(value: any) {\r\n this.rows = value.top;\r\n }\r\n applySearch(value: any) {\r\n this.search.emit(value);\r\n }\r\n reset() {\r\n this.resetSearch.emit();\r\n }\r\n\r\n\r\n // Go to previous page\r\n // 🟢 Actions (Keep or adapt your existing pagination logic)\r\n totalPages(): number {\r\n if (this.totalRecords === 0 || this.rows === 0) return 0;\r\n return Math.ceil(this.totalRecords / this.rows);\r\n }\r\n pageInput: number | null = null;\r\n showPageMenu: boolean = false;\r\n\r\n // Get current page number (1-based)\r\n get currentPage(): number {\r\n return Math.floor(this.first / this.rows) + 1;\r\n }\r\n\r\n // Go to specific page from menu\r\n goToPageMenu() {\r\n if (this.pageInput && this.pageInput >= 1 && this.pageInput <= this.totalPages()) {\r\n const newFirst = (this.pageInput - 1) * this.rows;\r\n this.paginateChange.emit({ first: newFirst, rows: this.rows });\r\n this.pageInput = null;\r\n this.showPageMenu = false; // Close menu after navigation\r\n }\r\n }\r\n\r\n // Go to specific page (original method)\r\n goToPage() {\r\n this.goToPageMenu(); // Reuse the same logic\r\n }\r\n\r\n // Go to first page\r\ngoFirst() {\r\n this.paginateChange.emit({ first: 0, rows: this.rows }); // EMIT EVENT\r\n}\r\n\r\n// Go to last page\r\ngoLast() {\r\n const maxFirst = Math.max(0, (this.totalPages() - 1) * this.rows);\r\n this.paginateChange.emit({ first: maxFirst, rows: this.rows }); // EMIT EVENT\r\n}\r\n\r\n // Go to previous page\r\n goPrev() {\r\n const newFirst = Math.max(this.first - this.rows, 0);\r\n this.paginateChange.emit({ first: newFirst, rows: this.rows }); // EMIT EVENT\r\n }\r\n\r\n // Go to next page\r\n goNext() {\r\n const maxFirst = Math.max(0, (this.totalPages() - 1) * this.rows);\r\n const newFirst = Math.min(this.first + this.rows, maxFirst);\r\n this.paginateChange.emit({ first: newFirst, rows: this.rows }); // EMIT EVENT\r\n }\r\n\r\n // Check first/last page\r\n isFirstPage() {\r\n return this.first === 0;\r\n }\r\n\r\n isLastPage() {\r\n return this.first + this.rows >= this.totalRecords;\r\n }\r\n\r\n\r\n // Detect RTL direction\r\n get isRTL(): boolean {\r\n return document.documentElement.dir === 'rtl' ||\r\n document.body.dir === 'rtl' ||\r\n // this.translateService?.currentLang === 'ar' || // if using translation\r\n false; // default to LTR\r\n }\r\n /**\r\n * Handles button click in a unified way.\r\n * - If btn.action is defined, execute it.\r\n * - Otherwise, emit event with actionName or default 'add'.\r\n */\r\n async handleButtonClick(btn: ButtonConfig) {\r\n try {\r\n if (btn.action) {\r\n // Execute the provided action\r\n await btn.action(null); // You can pass row or context here\r\n } else {\r\n // Fallback to emitting event\r\n this.action.emit({\r\n name: btn.actionName ?? 'add',\r\n row: null!, // provide row if available\r\n });\r\n }\r\n } catch (err) {\r\n console.error('Button action error', err);\r\n }\r\n }\r\n\r\n openReportDialog() {\r\n const ref = this.dialogService.open(GenericReportComponent, {\r\n header: this.translate.instant('REPORT'),\r\n showHeader:false,\r\n width: '90%',\r\n height: 'auto',\r\n modal: true,\r\n focusOnShow:false,\r\n data: {\r\n apiName:this.apiName,\r\n moduleName:this.moduleName,\r\n filterFields: this.filters,\r\n filterModel: { /* status: 'Active' */},\r\n defaultFileName:this.translate.instant('REPORT') + ' ' + this.translate.instant(this.breadcrumb?.length ? this.breadcrumb[this.breadcrumb.length - 1].label ??'': '')\r\n\r\n }\r\n });\r\n\r\n ref?.onClose.subscribe((exportConfig: any) => {\r\n if (exportConfig) {\r\n console.log('Export configuration:', exportConfig);\r\n // Handle the export - call your API service here\r\n this.handleExport(exportConfig);\r\n }\r\n });\r\n }\r\n\r\n private handleExport(config: any) {\r\n // Your export logic here\r\n // if (config.exportType === 'EXCEL') {\r\n // this.exportToExcel(config);\r\n // } else if (config.exportType === 'PDF') {\r\n // this.exportToPdf(config);\r\n // }\r\n // etc.\r\n }\r\n\r\n}\r\n","@if (mode !== 'form-only' && mode !== 'detail') {\r\n<div class=\"flex items-start gap-2 justify-between\">\r\n <div>\r\n <app-breadcrumb\r\n class=\"xs:block hidden\"\r\n [breadcrumb]=\"breadcrumb\"\r\n ></app-breadcrumb>\r\n </div>\r\n\r\n <div class=\"flex items-center gap-2 justify-end flex-wrap\">\r\n @if (mode === 'full') {\r\n <!-- أزرار العناصر المفردة -->\r\n @if (isSingleItemSelected) {\r\n @for (btn of singleActionButtons; track trackByIdx($index)) {\r\n @if (!btn.visible || (btn.visible && btn.visible === true)) {\r\n <lib-generic-button\r\n [icon]=\"btn.icon\"\r\n [label]=\"btn.label | translate\"\r\n [variant]=\"btn.variant\"\r\n [size]=\"btn.size\"\r\n [severity]=\"btn.severity\"\r\n [model]=\"btn.splitActions\"\r\n [permission]=\"btn.permission\"\r\n (clicked)=\"onSingleItemAction(btn)\"\r\n ></lib-generic-button>\r\n }\r\n }\r\n }\r\n\r\n <!-- أزرار متعددة العناصر -->\r\n @if (selectedItems.length > 0) {\r\n @for (btn of bulkActionButtons; track trackByIdx($index)) {\r\n @if (!btn.visible || (btn.visible && btn.visible === true)) {\r\n <lib-generic-button\r\n [icon]=\"btn.icon\"\r\n [label]=\"btn.label | translate\"\r\n [variant]=\"btn.variant\"\r\n [size]=\"btn.size\"\r\n [severity]=\"btn.severity\"\r\n [model]=\"btn.splitActions\"\r\n [permission]=\"btn.permission\"\r\n (clicked)=\"onInternalBulkAction(btn)\"\r\n ></lib-generic-button>\r\n }\r\n }\r\n }\r\n\r\n <!-- أزرار الإضافة -->\r\n @for (btn of mergedButtonConfigs; track trackByIdx($index)) {\r\n @if (!btn.visible || (btn.visible && btn.visible === true)) {\r\n <lib-generic-button\r\n [icon]=\"btn.icon\"\r\n [label]=\"btn.label | translate\"\r\n [variant]=\"btn.variant\"\r\n [size]=\"btn.size\"\r\n [severity]=\"btn.severity\"\r\n [model]=\"btn.splitActions\"\r\n [permission]=\"btn.permission\"\r\n (clicked)=\"handleButtonClick(btn)\"\r\n ></lib-generic-button>\r\n }\r\n }\r\n }\r\n </div>\r\n</div>\r\n}\r\n\r\n@if (mode !== 'form-only' && mode !== 'detail') {\r\n<div class=\"mt-2 mb-4 flex items-center justify-between\">\r\n <!-- البحث -->\r\n @if (showSearch && filters) {\r\n <lib-generic-search-advanced\r\n [model]=\"filterModel\"\r\n [fields]=\"filters\"\r\n (search)=\"applySearch($event)\"\r\n (paginationChange)=\"paginationChange($event)\"\r\n >\r\n</lib-generic-search-advanced>\r\n } @else {\r\n <div></div>\r\n }\r\n\r\n <!-- أدوات إضافية -->\r\n <div class=\"flex items-center gap-3 rtl:space-x-reverse\">\r\n\r\n @if (showAdvancedFilter && searchTabs.length > 0) {\r\n <p-button\r\n [icon]=\"advancedFilterIcon\"\r\n [outlined]=\"!isAdvancedFilterVisible\"\r\n severity=\"secondary\"\r\n [pTooltip]=\"'ADVANCED_FILTER' | translate\"\r\n tooltipPosition=\"top\"\r\n (onClick)=\"toggleAdvancedFilter()\"\r\n class=\"hidden sm:inline-flex\"\r\n />\r\n}\r\n <!-- Refresh Button -->\r\n <p-button\r\n icon=\"pi pi-refresh\"\r\n outlined\r\n severity=\"secondary\"\r\n class=\"hidden xs:block\"\r\n (onClick)=\"reset()\"\r\n />\r\n\r\n <p-divider layout=\"vertical\" class=\"m-0 p-0 hidden xs:block\" />\r\n\r\n\r\n <!-- <p-button (click)=\"menu.toggle($event)\" class=\"xs:block\" severity=\"secondary\" outlined icon=\"pi pi-ellipsis-v\"/>\r\n <p-menu #menu [model]=\"actions\" [popup]=\"true\" /> -->\r\n\r\n\r\n <!-- Pagination Controls -->\r\n <div class=\"flex items-center gap-1 rtl:space-x-reverse\">\r\n\r\n @if ( showViewMode ) {\r\n<p-selectButton\r\n [options]=\"viewOptions\"\r\n [(ngModel)]=\"viewMode\"\r\n (onChange)=\"onViewChange($event)\"\r\n [unselectable]=\"false\"\r\n optionLabel=\"icon\"\r\n optionValue=\"value\"\r\n\r\n styleClass=\"inline-flex bg-slate-100 dark:bg-slate-800 p-1 rounded-xl border border-slate-200 dark:border-slate-700 shadow-inner\"\r\n>\r\n\r\n <ng-template let-item pTemplate=\"item\">\r\n <div\r\n class=\"flex items-center justify-center rounded-lg transition-all duration-200\"\r\n [ngClass]=\"{\r\n ' dark:bg-slate-600 shadow-sm': viewMode === item.value,\r\n 'text-slate-500 hover:bg-slate-200 dark:hover:bg-slate-700': viewMode !== item.value\r\n }\"\r\n [pTooltip]=\"item.title | translate\"\r\n tooltipPosition=\"top\"\r\n >\r\n <i [class]=\"item.icon\" class=\"text-base\"></i>\r\n </div>\r\n </ng-template>\r\n\r\n</p-selectButton>\r\n }\r\n <p-divider layout=\"vertical\" class=\"m-0 p-0 hidden xs:block\" />\r\n\r\n <!-- First Page Button -->\r\n <p-button\r\n [icon]=\"isRTL ? 'pi pi-angle-double-right' : 'pi pi-angle-double-left'\"\r\n outlined\r\n severity=\"secondary\"\r\n class=\"hidden xs:block\"\r\n (click)=\"goFirst()\"\r\n [disabled]=\"isFirstPage()\"\r\n ></p-button>\r\n\r\n <!-- Previous Page Button -->\r\n <p-button\r\n [icon]=\"isRTL ? 'pi pi-chevron-right' : 'pi pi-chevron-left'\"\r\n outlined\r\n severity=\"secondary\"\r\n class=\"xs:block\"\r\n (click)=\"goPrev()\"\r\n [disabled]=\"isFirstPage()\"\r\n ></p-button>\r\n\r\n\r\n <!-- Current Page Display with Dropdown -->\r\n <div class=\"relative\">\r\n\r\n <p-button\r\n [label]=\"currentPage + ' / ' + totalPages()\"\r\n outlined\r\n severity=\"secondary\"\r\n class=\"hidden xs:block\"\r\n (click)=\"showPageMenu = !showPageMenu\"\r\n pTooltip=\"{{totalRecords}}\"\r\n tooltipPosition=\"top\"\r\n />\r\n\r\n\r\n </div>\r\n <!-- Next Page Button -->\r\n <p-button\r\n [icon]=\"isRTL ? 'pi pi-chevron-left' : 'pi pi-chevron-right'\"\r\n outlined\r\n severity=\"secondary\"\r\n class=\"xs:block\"\r\n (click)=\"goNext()\"\r\n [disabled]=\"isLastPage()\"\r\n ></p-button>\r\n\r\n <!-- Last Page Button -->\r\n <p-button\r\n [icon]=\"isRTL ? 'pi pi-angle-double-left' : 'pi pi-angle-double-right'\"\r\n outlined\r\n severity=\"secondary\"\r\n class=\"hidden xs:block\"\r\n (click)=\"goLast()\"\r\n [disabled]=\"isLastPage()\"\r\n ></p-button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n @if (showSearch && showAdvancedFilter && searchTabs.length > 0) {\r\n <div\r\n [ngClass]=\"{\r\n 'block': true,\r\n 'sm:hidden': !isAdvancedFilterVisible,\r\n 'sm:block': isAdvancedFilterVisible\r\n }\"\r\n class=\"animate-fade-in\"\r\n >\r\n <app-tabbed-search\r\n [fields]=\"searchTabs\"\r\n [model]=\"filterModel\"\r\n (onSearch)=\"applySearch($event)\"\r\n (onReset)=\"reset()\"\r\n (paginationChange)=\"paginationChange($event)\">\r\n </app-tabbed-search>\r\n </div>\r\n}\r\n}\r\n","/* eslint-disable @angular-eslint/no-output-on-prefix */\r\n/* eslint-disable @angular-eslint/no-output-native */\r\nimport { DividerModule } from 'primeng/divider';\r\nimport { Component, Input, Output, EventEmitter, ViewChild, inject, OnInit } from '@angular/core';\r\nimport { MessageModule } from 'primeng/message';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { PaginatorState } from 'primeng/paginator';\r\nimport { TableModule,TableLazyLoadEvent } from 'primeng/table';\r\nimport { ToolbarModule } from 'primeng/toolbar';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { FormlyFieldConfig, FormlyFormOptions } from '@ngx-formly/core';\r\nimport { IconFieldModule } from 'primeng/iconfield';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { DrawerModule } from 'primeng/drawer';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { FormsModule, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\r\nimport { BaseService, LocalizationService } from '@es.framework/ng.core/services';\r\nimport { ButtonConfig, PaginatedResult } from '@es.framework/ng.core/models';\r\nimport { SwalService } from '@es.framework/ng.core/services';\r\nimport { ActionDef } from '@es.framework/ng.core/models';\r\nimport { GenericCrudHeaderComponent } from './generic-crud-header';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { GenericTable } from '@es.framework/ng.ui.core/generic-table';\r\nimport { GenericDialogComponent } from '@es.framework/ng.ui.core/generic-dialog';\r\nimport { DetailTab, GenericViewComponent } from '@es.framework/ng.ui.core/generic-view';\r\nimport { QueryBuilderService } from '@es.framework/ng.ui.core/generic-search-advanced';\r\nimport { DialogService } from 'primeng/dynamicdialog';\r\nimport { GenericReportComponent } from '@es.framework/ng.ui.core/generic-report';\r\nimport { cloneDeep } from 'lodash';\r\n// import { SavedReportTemplatesDrawerComponent } from '@es.framework/ng.ui.core/filter-templates';\r\n\r\nexport interface PageChangePayload extends PaginatorState {\r\nsort?: string;\r\nfilters?: Record<string, any>;\r\n}\r\n\r\nexport type ActionsMode = 'buttons' | 'menu';\r\n\r\n/**\r\n * مكون جدول CRUD عام يمكن إعادة استخدامه\r\n * يدعم العمليات الأساسية: إنشاء، قراءة، تحديث، حذف\r\n * مع إمكانية التخصيص عبر عدة أوضاع وعرض\r\n */\r\n@Component({\r\n selector: 'app-generic-crud-table',\r\n standalone: true,\r\n imports: [\r\n TableModule,\r\n ButtonModule,\r\n GenericTable,\r\n ToolbarModule,\r\n TranslatePipe,\r\n DividerModule,\r\n IconFieldModule,\r\n DrawerModule,\r\n ReactiveFormsModule,\r\n FormsModule,\r\n MessageModule,\r\n DialogModule,\r\n GenericDialogComponent,\r\n GenericCrudHeaderComponent,\r\n GenericViewComponent,\r\n // SavedReportTemplatesDrawerComponent\r\n\r\n],\r\n templateUrl: './generic-crud-table.html',\r\n host: {\r\n class: ''\r\n },\r\n})\r\n\r\nexport class GenericCrudTableComponent<T> implements OnInit {\r\n @ViewChild('genericTable') genericTable!: GenericTable<T>;\r\n @ViewChild('dialog') dialog!: GenericDialogComponent;\r\n translate:LocalizationService = inject(LocalizationService);\r\n private swalService = inject(SwalService);\r\n private queryBuilder = inject(QueryBuilderService);\r\n private dialogService = inject(DialogService);\r\n\r\n home: MenuItem | undefined = { icon: 'pi pi-home', routerLink: '/' };\r\n @Input() data: T[] = [];\r\n formFields_: FormlyFieldConfig[] = []; \r\n @Input() formFields: FormlyFieldConfig[] = []; \r\n @Input() columnFormFields: FormlyFieldConfig[] = [];\r\n @Input() columns: FormlyFieldConfig[] = []; \r\n @Input() dialogMaxWidth = '40rem'; // unset , fit-content\r\n @Input() isViewMode = false;\r\n @Input() displayMode:\r\n | 'drawer' | 'dialog' | 'route' | 'inline'\r\n | Partial<Record<'add' | 'edit' | 'view', 'drawer' | 'dialog' | 'route' | 'inline'>>\r\n = 'drawer';\r\n @Input() useConfirmOnSave = false;\r\n @Input() isEditMode = false;\r\n @Input() drawerVisible = false;\r\n @Input() dialogVisible = false;\r\n form = new UntypedFormGroup({});\r\n @Input() model: any;\r\n model_: any = {};\r\n @Input() loading = false;\r\n @Input() errorMsg = '';\r\n @Input() errorMessage: string|any = '';\r\n\r\noptions: FormlyFormOptions = {};\r\n\r\n @Input() actions: ActionDef<T>[] = [];\r\n /** تحدد طريقة العرض: 'buttons' أو 'menu' */\r\n @Input() actionsMode: ActionsMode = 'buttons';\r\n @Output() action = new EventEmitter<{ name: string; row: T }>();\r\n @Output() bulkAction = new EventEmitter<{ name: string; items: T[] }>();\r\n @Output() singleAction = new EventEmitter<{ name: string; item: T }>();\r\n @Input() beforeSaveTransform?: (record: any, isEdit: boolean) => any; // ⚡ دوال مخصصة قبل الحفظ\r\n\r\n\r\n @Output() afterSave = new EventEmitter<{ record: T; isEdit: boolean; response?: any }>();\r\n @Output() afterDelete = new EventEmitter<{ record: T; response?: any }>();\r\n @Output() beforeSave = new EventEmitter<{ record: T; isEdit: boolean }>();\r\n @Output() beforeDelete = new EventEmitter<{ record: T }>();\r\n @Output() formCancel = new EventEmitter<void>();\r\n @Output() formInit = new EventEmitter<{ form: UntypedFormGroup; model: any }>();\r\n @Output() dataLoaded = new EventEmitter<{ data: T[]; total: number }>();\r\n @Output() selectionChange = new EventEmitter<{ selected: T[]; selectedCount: number }>();\r\n @Output() error = new EventEmitter<{ error: any; context: string }>();\r\n\r\n // البحث\r\n// Search\r\n @Input() filters: any;\r\n @Input() filterModel: any = {};\r\n @Output() search = new EventEmitter<{ field: string; global: string }>();\r\n\r\n/** للتحكم بإظهار/إخفاء قسم البحث */\r\n @Input() showSearch = true;\r\n\r\n /** Pagination Inputs */\r\n @Input() first = 0;\r\n @Input() rows = 10;\r\n @Input() totalRecords = 0;\r\n @Output() pageChange = new EventEmitter<PageChangePayload>();\r\n @Output() onSearch = new EventEmitter<any>();\r\n\r\n@Output() visibleChange: EventEmitter<boolean> = new EventEmitter<boolean>();;\r\n\r\n// @Output() visibleChange = new EventEmitter<boolean>();\r\n /** لجعل الجدول قابل لتعديل الصفوف (افتراضي false) */\r\n @Input() rowEditable = false;\r\n// @Output() visibleChange = new EventEmitter<boolean>();\r\n /** لجعل الجدول قابل لاختيار الصفوف (افتراضي false) */\r\n @Input() rowSelectable = false;\r\n /** حدث يخرج الصف المحدّد */\r\n @Output() rowSelect = new EventEmitter<T>();\r\n\r\n selection: T | null = null;\r\n\r\n // الفرز\r\n sortField?: string;\r\n sortOrder: 1 | -1 = 1;\r\n\r\n@Input() scrollHeight = '400px';\r\n\r\n @Input() paginator = true;\r\n\r\n@Input() service: BaseService = inject(BaseService);\r\n@Input() apiName = '';\r\n@Input() moduleName = '';\r\n@Input() idField = 'id';\r\n\r\n @Input() showRowSelectionCheckbox = false;\r\n\r\n @Input() showAddButton = true;\r\n @Input() showPrintButton = true;\r\n\r\n@Input() PermissionName?:string;\r\nmergedButtonConfigs: ButtonConfig[] = [];\r\n\r\n @Input() addButtonConfigs: ButtonConfig[] = [];\r\n\r\nbuildButtons(): void {\r\n const fixedButtons: ButtonConfig[] = [\r\n {\r\n icon: 'pi pi-plus',\r\n label: 'ADD',\r\n variant: 'raised',\r\n severity: 'primary',\r\n size: 'small',\r\n actionName: 'add',\r\n visible: this.showAddButton,\r\n permission: `${this.PermissionName}:AD`,\r\n },\r\n {\r\n icon: 'pi pi-print',\r\n label: 'PRINT',\r\n variant: 'raised',\r\n severity: 'secondary',\r\n size: 'small',\r\n actionName: 'print',\r\n visible: this.showPrintButton,\r\n permission: `${this.PermissionName}:PR`,\r\n action: async () => {\r\n this.openReportDialog();\r\n },\r\n },\r\n ];\r\n\r\n this.mergedButtonConfigs = [\r\n ...fixedButtons,\r\n ...(this.addButtonConfigs || []),\r\n ];\r\n}\r\n\r\n @Input() createEditActions: ButtonConfig[] = [\r\n {\r\n icon: 'pi pi-check',\r\n label: 'SAVE',\r\n variant: 'raised',\r\n severity: 'primary',\r\n size: 'small',\r\n actionName: 'save',\r\n type: 'submit',\r\n splitActions: [\r\n {\r\n label: this.translate.instant('SAVE_AND_ADD'),\r\n icon: 'pi pi-save',\r\n actionName: 'saveAndAdd'\r\n }\r\n ]\r\n },\r\n {\r\n icon: 'pi pi-times',\r\n label: 'CANCEL',\r\n variant: 'raised',\r\n severity: 'danger',\r\n size: 'small',\r\n actionName: 'cancel',\r\n type: 'button',\r\n },\r\n];\r\n\r\n @Input() supportSubPage: boolean = true;\r\n\r\n @Input() tabs: DetailTab[] = [];\r\n @Input() bulkActionButtons: ButtonConfig[] = [];\r\n @Input() singleActionButtons: ButtonConfig[] = [];\r\n\r\n _selectedRows: T[] = [];\r\n\r\nget isSingleItemSelected(): boolean {\r\n return this._selectedRows.length === 1;\r\n}\r\n\r\nget isMultipleItemSelected(): boolean {\r\n return this._selectedRows.length > 1;\r\n}\r\n\r\nget selectedItems(): T[] {\r\n return this._selectedRows;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n@Input() breadcrumb: MenuItem[] | undefined;\r\n\r\n\r\nget breadcrumb_(): MenuItem[] | undefined {\r\n return this.breadcrumb?.map(v => ({\r\n ...v,\r\n label: this.translate.instant(v.label ?? '')\r\n }));\r\n}\r\nget rtl(): boolean {\r\n try {\r\n return document?.documentElement?.dir === 'rtl';\r\n } catch (error) {\r\n return true;\r\n }\r\n}\r\n\r\n /**\r\n * Modes to control what parts of the component are visible\r\n * - 'full': Table + CRUD operations (default)\r\n * - 'form-only': Only show form (for create/edit/view)\r\n * - 'table-only': Only show table (read-only mode)\r\n */\r\n @Input() mode: 'full' | 'form-only' | 'table-only' | 'detail' = 'full';\r\n\r\n /** Force the component to show specific state */\r\n @Input() forceState: 'create' | 'edit' | 'view' | null = null;\r\n\r\n /** Hide table completely when in form-only mode */\r\n @Input() get hideTable(): boolean {\r\n return (this.mode === 'form-only' || this.mode === 'detail' || (this.forceState && this.mode !== 'table-only') )?? false;\r\n }\r\n\r\n /** Auto-show form when in form-only mode with forceState */\r\n @Input() get autoShowForm(): boolean {\r\n return this.mode === 'form-only' && !!this.forceState;\r\n }\r\n//لتغيير لون صف معيّن\r\n @Input() rowStyleFn?: (row: T) => any;\r\n\r\n // ✅ لتعيين كلاس CSS أو Tailwind على الصف\r\n @Input() rowClassFn?: (row: T) => string | string[] | Set<string>;\r\n\r\n //آخر لتجميد / تعطيل checkbox الاختيار\r\n @Input() disableRowCheckboxFn?: (row: T) => boolean;\r\n tableClass = 'h-full flex-1 flex flex-col overflow-y-auto border border-surface rounded-2xl xs:rounded-2xl p-4 bg-white';\r\n\r\n // 🟢 Inputs الجديدة\r\n @Input() showAdvancedFilter = false; // متغير للتحكم في ظهور الزر\r\n @Input() advancedFilterIcon = 'pi pi-filter-fill'; // أيقونة اختيارية\r\n // 🟢 الحالة الخاصة بالفلتر المتقدم\r\n\r\n // أضف هذا الـ Input\r\n@Input() searchTabs: FormlyFieldConfig[] = []; // مصفوفة التبويبات\r\n\r\n// 🟢 ميزة تبديل العرض\r\n@Input() showViewMode = false;\r\n@Input() viewMode: 'table' | 'grid' = 'table';\r\n@Output() viewModeChange = new EventEmitter<'table' | 'grid'>();\r\n\r\n// 🟢 Outputs\r\n @Output() templateSelected = new EventEmitter<any>();\r\n @Input() templateDrawerVisible: boolean = false;\r\n @Output() templateDrawerVisibleChange = new EventEmitter<boolean>();\r\n @Input() category = '';\r\n @Input() feature = '';\r\n\r\nonViewModeChange(mode: 'table' | 'grid') {\r\n this.viewMode = mode;\r\n this.viewModeChange.emit(mode);\r\n // هنا يمكنك إضافة منطق إضافي إذا أردت تغيير طريقة عرض البيانات فوراً\r\n}\r\n\r\n private route = inject(ActivatedRoute);\r\nprivate router = inject(Router);\r\ncurrentId?: string | number;\r\n\r\n ngOnInit() {\r\n if (this.moduleName) {\r\n this.service.moduleName = this.moduleName;\r\n }\r\n\r\n if(this.apiName && this.apiName != ''){\r\n this.service.apiName = this.apiName ;\r\n }\r\n\r\n if(this.tabs.length == 0){\r\n this.formFields_ = this.formFields;\r\n this.tabs.push({ header: 'التفاصيل',icon:'pi pi-info-circle', fields: this.formFields_, model: this.model });\r\n }\r\n if (this.supportSubPage) {\r\n this.route.paramMap.subscribe(params => {\r\n const id = params.get(this.idField);\r\n if (id && id !== 'new' && id !== 'create' && id !== 'add') {\r\n this.currentId = id;\r\n this.mode = 'detail';\r\n this.loadDetail(id);\r\n } else if (id == 'new' || id == 'create' || id == 'add') {\r\n this.mode = 'detail';\r\n } else {\r\n this.currentId = undefined;\r\n }\r\n });\r\n}\r\n this.buildButtons();\r\n }\r\n\r\n // 3. Handle Header's Paginate Change Event\r\n onHeaderPaginateChange(event: { first: number; rows: number }) {\r\n this.first = event.first; // Update the 'first' index\r\n this.rows = event.rows;\r\n\r\n\r\n const lazyLoadEvent: TableLazyLoadEvent = {\r\n first: this.first,\r\n rows: this.rows,\r\n // You'd typically include current sorting and filtering state here\r\n sortField: this.sortField,\r\n sortOrder: 1,\r\n filters: this.filters ,\r\n globalFilter: null, // or your current global filter value\r\n };\r\n this.onLazyLoad(lazyLoadEvent);\r\n }\r\n\r\n loadDetail(id: string | number) {\r\n this.currentId = id;\r\n\r\n const model = cloneDeep(this.model) ?? {};\r\n\r\n // Create advancedFilters if missing\r\n if (!Array.isArray(model.advancedFilters)) {\r\n model.advancedFilters = [\r\n {\r\n logicalOperator: 'and',\r\n conditions: []\r\n }\r\n ];\r\n }\r\n\r\n // Ensure first group exists\r\n if (!model.advancedFilters.length) {\r\n model.advancedFilters.push({\r\n logicalOperator: 'and',\r\n conditions: []\r\n });\r\n }\r\n\r\n // Inject ID condition into first filter group\r\n model.advancedFilters[0].conditions.push({\r\n field: this.idField, // or 'id'\r\n operator: 'eq',\r\n value: id\r\n });\r\n\r\n // Build query\r\n const odataParams = this.queryBuilder.buildODataFromQueryModel(\r\n model,\r\n this.formFields_\r\n );\r\n\r\n const queryString = this.queryBuilder.toODataQueryString(odataParams);\r\n\r\n const filters = {\r\n query: queryString,\r\n maxResultCount: 1,\r\n skipCount: 0\r\n };\r\n\r\n this.service.getList(filters).subscribe({\r\n next: (res: PaginatedResult<any>) => {\r\n this.model = res.items?.[0] ?? null;\r\n },\r\n error: err => {\r\n console.error('Error loading detail', err);\r\n }\r\n });\r\n}\r\n// loadDetail(id: string | number) {\r\n// this.service.get(id as any).subscribe({\r\n// next: res => {\r\n// this.model = res;\r\n// }\r\n// });\r\n// }\r\n\r\n// Helper method to open form programmatically\r\nopenForm(mode: 'create' | 'edit' | 'view', model?: any) {\r\n this.dialog.openForm(mode,model);\r\n}\r\n\r\n\r\n// private destroy$ = new Subject<void>();\r\n /** الآن يتلقّى pagination + sort في حدث واحد */\r\nonLazyLoad(event: TableLazyLoadEvent) {\r\n // this.model_= this.model ?? {};\r\n\r\n this.model= this.model ?? {};\r\n\r\n this.formFields_ = this.formFields;\r\n const first = event.first ?? this.first;\r\n const rows = event.rows ?? this.rows;\r\n const sortField = typeof event.sortField === 'string'\r\n ? event.sortField\r\n : this.sortField;\r\n const sortOrder = event.sortOrder === -1 ? -1 : 1;\r\n\r\n\r\n const filters: Record<string, any> = {};\r\n if (event.filters) {\r\n Object.entries(event.filters).forEach(([field, meta]) => {\r\n const value = (meta as any).value;\r\n if (value != null && value !== '') {\r\n filters[field] = value;\r\n }\r\n });\r\n }\r\n\r\n var queryString = '';\r\n // Default query\r\n if(!filters['query']){\r\n // Use the new QueryBuilderService methods\r\n const odataParams = this.queryBuilder.buildODataFromQueryModel(this.filterModel, this.formFields_);\r\n // this.odataSearch.emit(odataParams);\r\n\r\n // Generate query string using the unified method\r\n queryString = this.queryBuilder.toODataQueryString(odataParams);\r\n // console.log('OData Query String:', queryString);\r\n\r\n\r\n }\r\n\r\n this.first = first;\r\n this.rows = rows;\r\n this.sortField = sortField;\r\n this.sortOrder = sortOrder as 1| -1;\r\nconst dir = sortOrder === 1 ? 'asc' : 'desc';\r\n const sort = sortField ? `${sortField} ${dir}` : undefined;\r\n\r\n // this.pageChange.emit({ first, rows ,sort, filters });\r\n this.applySearch(\r\n {\r\n filter:this.model['filter'],\r\n query:queryString,\r\n sorting:sort,\r\n skipCount:first,\r\n maxResultCount:rows,\r\n\r\n }\r\n );\r\n\r\n\r\n // يبني النص وإرساله\r\n\r\n}\r\n\r\n\r\n /** تصيير البيانات حسب الصفحة */\r\n get pagedData(): T[] {\r\n // return this.data ? this.data.slice(this.first, this.first + this.rows) : [];\r\n\r\n return this.data;\r\n }\r\n\r\n\r\n\r\nget globalFilterFields(): string[] {\r\n return this.columns.map(c => String(c.key));\r\n}\r\n\r\n\r\n\r\n\r\n\r\n /** أرسل إلى الأب لأتمتة شكل البحث إذا يحتاج */\r\n// from generic-crud-table.component.ts\r\n/** بدّل applySearch لتبث pageChange مباشرةً */\r\nresetPage(filters: any) {\r\n // this.genericTable.applyFilter(global);\r\n this.first = 0;\r\n this.rows = 10;\r\n }\r\n/** بدّل applySearch لتبث pageChange مباشرةً */\r\n applySearch(filters: any) {\r\n // this.genericTable.applyFilter(global);\r\n this.onSearch.emit(filters);\r\n }\r\n\r\n\r\n /** دالة تنفّذ عند النقر على صف */\r\n onRowClick(row: T) {\r\n if (this.rowSelectable) {\r\n this.rowSelect.emit(row);\r\n }\r\n }\r\n\r\n\r\n\r\nonSubmit() {\r\n if (this.mode != 'form-only') {\r\n\r\n this.applySearch('');\r\n }\r\n}\r\n\r\n trackByIdx(index: number, item: any): number {\r\n return index;\r\n }\r\n\r\nonSingleItemAction(btn: ButtonConfig): void {\r\n if (!this.isSingleItemSelected) return;\r\n\r\n const selectedItem = this._selectedRows[0];\r\n this.singleAction.emit({\r\n name: btn.actionName ?? 'singleAction',\r\n item: selectedItem\r\n });\r\n}\r\n\r\nonInternalBulkAction(btn: ButtonConfig): void {\r\n if (!this.isMultipleItemSelected) return;\r\n\r\n this.bulkAction.emit({\r\n name: btn.actionName ?? 'bulkAction',\r\n items: [...this._selectedRows] // نرسل نسخة من المصفوفة\r\n });\r\n}\r\n\r\n\r\n openReportDialog() {\r\n const ref = this.dialogService.open(GenericReportComponent, {\r\n header: this.translate.instant('REPORT'),\r\n showHeader:false,\r\n width: '90%',\r\n height: 'auto',\r\n modal: true,\r\n focusOnShow:false,\r\n data: {\r\n apiName:this.apiName,\r\n moduleName:this.moduleName,\r\n filterFields: this.filters,\r\n filterModel: { /* status: 'Active' */},\r\n defaultFileName:this.translate.instant('REPORT') + ' ' + this.translate.instant(this.breadcrumb?.length ? this.breadcrumb[this.breadcrumb.length - 1].label ??'': '')\r\n\r\n }\r\n });\r\n\r\n ref?.onClose.subscribe((exportConfig: any) => {\r\n if (exportConfig) {\r\n console.log('Export configuration:', exportConfig);\r\n // Handle the export - call your API service here\r\n this.handleExport(exportConfig);\r\n }\r\n });\r\n }\r\n\r\n private handleExport(config: any) {\r\n // Your export logic here\r\n // if (config.exportType === 'EXCEL') {\r\n // this.exportToExcel(config);\r\n // } else if (config.exportType === 'PDF') {\r\n // this.exportToPdf(config);\r\n // }\r\n // etc.\r\n }\r\n}\r\n","<div\r\n [class]=\"mode !== 'form-only' && mode !== 'detail' ? tableClass : ''\"\r\n>\r\n <app-generic-crud-header\r\n [mode]=\"mode\"\r\n [breadcrumb]=\"breadcrumb_\"\r\n [isSingleItemSelected]=\"isSingleItemSelected\"\r\n [selectedItems]=\"_selectedRows\"\r\n [singleActionButtons]=\"singleActionButtons\"\r\n [bulkActionButtons]=\"bulkActionButtons\"\r\n [addButtonConfigs]=\"addButtonConfigs\"\r\n [mergedButtonConfigs]=\"mergedButtonConfigs\"\r\n [apiName]=\"service.apiName\"\r\n [moduleName]=\"service.moduleName\"\r\n [filters]=\"filters\"\r\n [filterModel]=\"filterModel\"\r\n [showSearch]=\"showSearch\"\r\n (singleItemAction)=\"onSingleItemAction($event)\"\r\n (bulkAction)=\"onInternalBulkAction($event)\"\r\n (action)=\"action.emit($event)\"\r\n (search)=\"resetPage($event);applySearch($event);\"\r\n (resetSearch)=\"resetPage($event);applySearch('');\"\r\n (paginateChange)=\"onHeaderPaginateChange($event)\"\r\n [first]=\"first\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalRecords\"\r\n [searchTabs]=\"searchTabs\"\r\n [showAdvancedFilter]=\"showAdvancedFilter\"\r\n [advancedFilterIcon]=\"advancedFilterIcon\"\r\n [showViewMode]=\"showViewMode\"\r\n [viewMode]=\"viewMode\"\r\n (viewModeChange)=\"onViewModeChange($event)\"\r\n/>\r\n\r\n @if (!hideTable) {\r\n <lib-generic-table\r\n [data]=\"data\"\r\n [columns]=\"columns\"\r\n [columnFormFields]=\"columnFormFields\"\r\n [paginator]=\"paginator\"\r\n [loading]=\"loading\"\r\n [actions]=\"actions\"\r\n [actionsMode]=\"actionsMode\"\r\n [first]=\"first\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalRecords\"\r\n [sortField]=\"sortField\"\r\n [sortOrder]=\"sortOrder\"\r\n [addButtonConfigs]=\"addButtonConfigs\"\r\n [globalFilterFields]=\"globalFilterFields\"\r\n [scrollHeight]=\"scrollHeight\"\r\n [showRowSelectionCheckbox]=\"showRowSelectionCheckbox\"\r\n (action)=\"action.emit($event)\"\r\n (onAddNew)=\"action.emit($event)\"\r\n (pageChange)=\"onLazyLoad($event)\"\r\n [rowSelectable]=\"rowSelectable\"\r\n [rowEditable]=\"rowEditable\"\r\n (rowSelect)=\"onRowClick($event)\"\r\n [(selection)]=\"_selectedRows\"\r\n #genericTable\r\n ></lib-generic-table>\r\n\r\n }\r\n\r\n <app-generic-dialog\r\n #dialog\r\n [service]=\"service\"\r\n [formFields]=\"formFields\"\r\n [model]=\"model\"\r\n [apiName]=\"service.apiName\"\r\n [moduleName]=\"service.moduleName\"\r\n [idField]=\"idField\"\r\n [dialogMaxWidth]=\"dialogMaxWidth\"\r\n [displayMode]=\"displayMode\"\r\n [mode]=\"mode\"\r\n [forceState]=\"forceState\"\r\n [drawerVisible]=\"drawerVisible\"\r\n [dialogVisible]=\"dialogVisible\"\r\n [isViewMode]=\"isViewMode\"\r\n [isEditMode]=\"isEditMode\"\r\n [useConfirmOnSave]=\"useConfirmOnSave\"\r\n [loading]=\"loading\"\r\n [errorMsg]=\"errorMsg\"\r\n [errorMessage]=\"errorMessage\"\r\n [beforeSaveTransform]=\"beforeSaveTransform\"\r\n (action)=\"action.emit($event)\"\r\n (afterSave)=\"afterSave.emit($event);onSubmit();\"\r\n (afterDelete)=\"afterDelete.emit($event)\"\r\n (beforeSave)=\"beforeSave.emit($event)\"\r\n (beforeDelete)=\"beforeDelete.emit($event)\"\r\n (formCancel)=\"formCancel.emit()\"\r\n (formInit)=\"formInit.emit($event)\"\r\n (dataLoaded)=\"dataLoaded.emit($event)\"\r\n (selectionChange)=\"selectionChange.emit($event)\"\r\n (error)=\"error.emit($event)\"\r\n (visibleChange)=\"visibleChange.emit($event)\"\r\n >\r\n </app-generic-dialog>\r\n\r\n <app-detail-view\r\n [displayMode]=\"displayMode\"\r\n [mode]=\"mode\"\r\n [title]=\"breadcrumb_?.[0]?.label || 'Detail'\"\r\n [service]=\"service\"\r\n [apiName]=\"service.apiName\"\r\n [moduleName]=\"service.moduleName\"\r\n [idField]=\"idField\"\r\n [actions]=\"actions\"\r\n [formFields]=\"formFields\"\r\n [model]=\"model\"\r\n [tabs]=\"tabs\"\r\n [loading]=\"loading\"\r\n [breadcrumb]=\"breadcrumb_\"\r\n [createEditActions]=\"createEditActions\"\r\n (action)=\"action.emit($event)\"\r\n >\r\n </app-detail-view>\r\n\r\n <!-- 🟢 مكون درج القوالب المحفوظة -->\r\n<!-- <saved-report-templates-drawer\r\n [(visible)]=\"templateDrawerVisible\"\r\n (visibleChange)=\"templateDrawerVisibleChange.emit($event)\"\r\n [filterFields]=\"filters\"\r\n [service]=\"service.moduleName\"\r\n [category]=\"category\"\r\n [feature]=\"feature\"\r\n (templateSelected)=\"templateSelected.emit($event)\">\r\n</saved-report-templates-drawer> -->\r\n\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAOa,sBAAsB,CAAA;uGAAtB,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;wGAAtB,sBAAsB,EAAA,OAAA,EAAA,CAFvB,YAAY,EAAC,mBAAmB,CAAA,EAAA,CAAA;wGAE/B,sBAAsB,EAAA,OAAA,EAAA,CAFvB,YAAY,EAAC,mBAAmB,CAAA,EAAA,CAAA;;2FAE/B,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAHlC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAC,mBAAmB,CAAC;AAC5C,iBAAA;;;MCqCY,0BAA0B,CAAA;AAErC,IAAA,SAAS,GAAI,MAAM,CAAC,mBAAmB,CAAC;AACxC,IAAA,aAAa,GAAI,MAAM,CAAC,aAAa,CAAC;;IAE7B,IAAI,GAAmD,MAAM;AAC7D,IAAA,UAAU;IACV,oBAAoB,GAAG,KAAK;IAC5B,aAAa,GAAU,EAAE;IACzB,mBAAmB,GAAmB,EAAE;IACxC,iBAAiB,GAAmB,EAAE;IACtC,gBAAgB,GAAmB,EAAE;IACrC,mBAAmB,GAAmB,EAAE;AACxC,IAAA,OAAO;IACP,WAAW,GAAQ,EAAE;IACrB,UAAU,GAAG,IAAI;AAChB,IAAA,KAAK,GAAG,CAAC,CAAC;AACX,IAAA,IAAI,GAAG,EAAE,CAAC;AACV,IAAA,YAAY,GAAG,CAAC,CAAC;IACjB,UAAU,GAAW,EAAE;IACvB,OAAO,GAAW,EAAE;AACnB,IAAA,OAAO,GAAc;AACrB,QAAA;YACY,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;AACvC,YAAA,IAAI,EAAE,mBAAmB;AACzB,YAAA,OAAO,EAAC,CAAC,CAAK,KAAG;gBACf,IAAI,CAAC,gBAAgB,EAAE;YACzB;AACH;KACZ;;AAIG,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAgB;AACnD,IAAA,UAAU,GAAG,IAAI,YAAY,EAAgB;AAC7C,IAAA,MAAM,GAAG,IAAI,YAAY,EAAO;AAChC,IAAA,WAAW,GAAG,IAAI,YAAY,EAAQ;AACtC,IAAA,MAAM,GAAG,IAAI,YAAY,EAA8B;AACxD,IAAA,cAAc,GAAG,IAAI,YAAY,EAAmC,CAAC;;AAIrE,IAAA,kBAAkB,GAAG,KAAK,CAAC;AAC3B,IAAA,kBAAkB,GAAG,mBAAmB,CAAC;;AAElD,IAAA,uBAAuB,GAAG,KAAK,CAAC;;AAEzB,IAAA,UAAU,GAAwB,EAAE,CAAC;;IAGrC,YAAY,GAAG,KAAK;IACpB,QAAQ,GAAqB,OAAO;AACnC,IAAA,cAAc,GAAG,IAAI,YAAY,EAAoB;;AAG/D,IAAA,WAAW,GAAU;QACnB,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE;QAC3D,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW;KAC5D;AAGD,IAAA,YAAY,CAAC,KAAU,EAAA;;AAErB,QAAA,IAAI,KAAK,CAAC,KAAK,EAAE;YACf,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACvC;IACF;;IAGA,oBAAoB,GAAA;AAClB,QAAA,IAAI,CAAC,uBAAuB,GAAG,CAAC,IAAI,CAAC,uBAAuB;IAC9D;;AAKE,IAAA,UAAU,GAAG,CAAC,KAAa,KAAK,KAAK;;AAGrC,IAAA,kBAAkB,CAAC,GAAiB,EAAA;AAClC,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC;IACjC;AACA,IAAA,oBAAoB,CAAC,GAAiB,EAAA;AACpC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;IAC3B;AACF,IAAA,gBAAgB,CAAC,KAAU,EAAA;AACvB,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG;IACvB;AACA,IAAA,WAAW,CAAC,KAAU,EAAA;AACpB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;IACzB;IACA,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;IACzB;;;IAKA,UAAU,GAAA;QACR,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;AAAE,YAAA,OAAO,CAAC;AACxD,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;IACjD;IACD,SAAS,GAAkB,IAAI;IAC9B,YAAY,GAAY,KAAK;;AAG7B,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/C;;IAGA,YAAY,GAAA;AACV,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;AAChF,YAAA,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI;AACjD,YAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AAC9D,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,YAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;QAC5B;IACF;;IAGA,QAAQ,GAAA;AACN,QAAA,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB;;IAGF,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D;;IAGA,MAAM,GAAA;QACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;AACjE,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACjE;;IAGE,MAAM,GAAA;AACJ,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACpD,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACjE;;IAGA,MAAM,GAAA;QACJ,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;AACjE,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;AAC3D,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACjE;;IAGA,WAAW,GAAA;AACT,QAAA,OAAO,IAAI,CAAC,KAAK,KAAK,CAAC;IACzB;IAEA,UAAU,GAAA;QACR,OAAO,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY;IACpD;;AAIA,IAAA,IAAI,KAAK,GAAA;AACP,QAAA,OAAO,QAAQ,CAAC,eAAe,CAAC,GAAG,KAAK,KAAK;AACtC,YAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK;;YAE3B,KAAK,CAAC;IACf;AACC;;;;AAIE;IACH,MAAM,iBAAiB,CAAC,GAAiB,EAAA;AACvC,QAAA,IAAI;AACF,YAAA,IAAI,GAAG,CAAC,MAAM,EAAE;;gBAEd,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACzB;iBAAO;;AAEL,gBAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AACf,oBAAA,IAAI,EAAE,GAAG,CAAC,UAAU,IAAI,KAAK;oBAC7B,GAAG,EAAE,IAAK;AACX,iBAAA,CAAC;YACJ;QACF;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,GAAG,CAAC;QAC3C;IACF;IAEA,gBAAgB,GAAA;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAC1D,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;AACxC,YAAA,UAAU,EAAC,KAAK;AAChB,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,WAAW,EAAC,KAAK;AACjB,YAAA,IAAI,EAAE;gBACJ,OAAO,EAAC,IAAI,CAAC,OAAO;gBACpB,UAAU,EAAC,IAAI,CAAC,UAAU;gBAC1B,YAAY,EAAE,IAAI,CAAC,OAAO;gBAC1B,WAAW,EAAE,0BAA0B;gBACzC,eAAe,EAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,IAAG,EAAE,GAAE,EAAE;AAEnK;AACF,SAAA,CAAC;QAEF,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,YAAiB,KAAI;YAC3C,IAAI,YAAY,EAAE;AAChB,gBAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,YAAY,CAAC;;AAElD,gBAAA,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;YACjC;AACF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,YAAY,CAAC,MAAW,EAAA;;;;;;;;IAQhC;uGA/NS,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA1B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,MAAA,EAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,MAAA,EAAA,QAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,SAAA,EAHzB,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECxC7B,q5OA+NA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDtMI,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,aAAa,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,MAAA,EAAA,cAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,cAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEb,mBAAmB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,YAAA,EAAA,eAAA,EAAA,WAAA,EAAA,WAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EAAA,SAAA,EAAA,aAAA,EAAA,UAAA,EAAA,aAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,EAAA,cAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,eAAA,EAAA,QAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,aAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,WAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAEb,qBAAqB,EAAA,QAAA,EAAA,6BAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,cAAA,EAAA,aAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,kBAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACrB,kBAAkB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,iDAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAClB,qBAAqB,oJAVrB,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAgBJ,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAtBtC,SAAS;+BACE,yBAAyB,EAAA,UAAA,EACvB,IAAI,EAAA,OAAA,EACP;wBACP,YAAY;wBACZ,aAAa;wBACb,aAAa;wBACb,mBAAmB;wBACnB,YAAY;wBACZ,aAAa;wBACb,WAAW;wBACX,mBAAmB;wBACnB,aAAa;wBACb,IAAI;wBACJ,qBAAqB;wBACrB,kBAAkB;wBAClB,qBAAqB;qBACxB,EAAA,SAAA,EAEa,CAAC,aAAa,CAAC,EAAA,QAAA,EAAA,q5OAAA,EAAA;;sBAQ1B;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACC;;sBACD;;sBACA;;sBACA;;sBACA;;sBACC;;sBAYD;;sBACA;;sBACA;;sBACA;;sBACA;;sBACD;;sBAIC;;sBACA;;sBAIF;;sBAGA;;sBACA;;sBACA;;;AE/FD;AACA;AAqCA;;;;AAIG;MA6BU,yBAAyB,CAAA;AACV,IAAA,YAAY;AAClB,IAAA,MAAM;AAC3B,IAAA,SAAS,GAAuB,MAAM,CAAC,mBAAmB,CAAC;AACnD,IAAA,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;AAChC,IAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC1C,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAE3C,IAAI,GAAyB,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,EAAE;IAC7D,IAAI,GAAQ,EAAE;IACtB,WAAW,GAAwB,EAAE;IAC7B,UAAU,GAAwB,EAAE;IACpC,gBAAgB,GAAwB,EAAE;IAC1C,OAAO,GAAwB,EAAE;AACjC,IAAA,cAAc,GAAG,OAAO,CAAC;IACzB,UAAU,GAAG,KAAK;IAChB,WAAW,GAGlB,QAAQ;IACH,gBAAgB,GAAG,KAAK;IACxB,UAAU,GAAG,KAAK;IAClB,aAAa,GAAG,KAAK;IACrB,aAAa,GAAG,KAAK;AAC7B,IAAA,IAAI,GAAG,IAAI,gBAAgB,CAAC,EAAE,CAAC;AACxB,IAAA,KAAK;IACb,MAAM,GAAQ,EAAE;IACP,OAAO,GAAG,KAAK;IACf,QAAQ,GAAG,EAAE;IACb,YAAY,GAAe,EAAE;IAExC,OAAO,GAAsB,EAAE;IAEpB,OAAO,GAAmB,EAAE;;IAE5B,WAAW,GAAgB,SAAS;AACnC,IAAA,MAAM,GAAG,IAAI,YAAY,EAA4B;AACrD,IAAA,UAAU,GAAG,IAAI,YAAY,EAAgC;AAC7D,IAAA,YAAY,GAAG,IAAI,YAAY,EAA6B;IAC7D,mBAAmB,CAAyC;AAG1D,IAAA,SAAS,GAAG,IAAI,YAAY,EAAkD;AAC/E,IAAA,WAAW,GAAG,IAAI,YAAY,EAAiC;AAC/D,IAAA,UAAU,GAAG,IAAI,YAAY,EAAkC;AAC/D,IAAA,YAAY,GAAG,IAAI,YAAY,EAAiB;AAChD,IAAA,UAAU,GAAG,IAAI,YAAY,EAAQ;AACrC,IAAA,QAAQ,GAAG,IAAI,YAAY,EAA0C;AACrE,IAAA,UAAU,GAAG,IAAI,YAAY,EAAgC;AAC7D,IAAA,eAAe,GAAG,IAAI,YAAY,EAA4C;AAC9E,IAAA,KAAK,GAAG,IAAI,YAAY,EAAmC;;;AAI5D,IAAA,OAAO;IACN,WAAW,GAAQ,EAAE;AACrB,IAAA,MAAM,GAAG,IAAI,YAAY,EAAqC;;IAG/D,UAAU,GAAG,IAAI;;IAGjB,KAAK,GAAG,CAAC;IACT,IAAI,GAAG,EAAE;IACT,YAAY,GAAG,CAAC;AACf,IAAA,UAAU,GAAG,IAAI,YAAY,EAAqB;AAClD,IAAA,QAAQ,GAAG,IAAI,YAAY,EAAO;AAEpC,IAAA,aAAa,GAA0B,IAAI,YAAY,EAAW;;;;IAIjE,WAAW,GAAG,KAAK;;;IAGnB,aAAa,GAAG,KAAK;;AAEpB,IAAA,SAAS,GAAG,IAAI,YAAY,EAAK;IAE3C,SAAS,GAAa,IAAI;;AAG1B,IAAA,SAAS;IACT,SAAS,GAAW,CAAC;IAEd,YAAY,GAAG,OAAO;IAErB,SAAS,GAAG,IAAI;AAEjB,IAAA,OAAO,GAAgB,MAAM,CAAC,WAAW,CAAC;IAC1C,OAAO,GAAG,EAAE;IACZ,UAAU,GAAG,EAAE;IACf,OAAO,GAAG,IAAI;IAEb,wBAAwB,GAAG,KAAK;IAE/B,aAAa,GAAG,IAAI;IACpB,eAAe,GAAG,IAAI;AAExB,IAAA,cAAc;IACvB,mBAAmB,GAAmB,EAAE;IAE7B,gBAAgB,GAAmB,EAAE;IAEhD,YAAY,GAAA;AACV,QAAA,MAAM,YAAY,GAAmB;AACnC,YAAA;AACE,gBAAA,IAAI,EAAE,YAAY;AAClB,gBAAA,KAAK,EAAE,KAAK;AACZ,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,UAAU,EAAE,KAAK;gBACjB,OAAO,EAAE,IAAI,CAAC,aAAa;AAC3B,gBAAA,UAAU,EAAE,CAAA,EAAG,IAAI,CAAC,cAAc,CAAA,GAAA,CAAK;AACxC,aAAA;AACD,YAAA;AACE,gBAAA,IAAI,EAAE,aAAa;AACnB,gBAAA,KAAK,EAAE,OAAO;AACd,gBAAA,OAAO,EAAE,QAAQ;AACjB,gBAAA,QAAQ,EAAE,WAAW;AACrB,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,UAAU,EAAE,OAAO;gBACnB,OAAO,EAAE,IAAI,CAAC,eAAe;AAC7B,gBAAA,UAAU,EAAE,CAAA,EAAG,IAAI,CAAC,cAAc,CAAA,GAAA,CAAK;gBACrC,MAAM,EAAE,YAAW;oBACvB,IAAI,CAAC,gBAAgB,EAAE;gBACzB,CAAC;AACE,aAAA;SACF;QAED,IAAI,CAAC,mBAAmB,GAAG;AACzB,YAAA,GAAG,YAAY;AACf,YAAA,IAAI,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC;SACjC;IACH;AAEU,IAAA,iBAAiB,GAAmB;AAC5C,QAAA;AACE,YAAA,IAAI,EAAE,aAAa;AACnB,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,QAAQ,EAAE,SAAS;AACnB,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,UAAU,EAAE,MAAM;AAClB,YAAA,IAAI,EAAE,QAAQ;AACd,YAAA,YAAY,EAAE;AACb,gBAAA;oBACC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC;AAC7C,oBAAA,IAAI,EAAE,YAAY;AACjB,oBAAA,UAAU,EAAE;AACd;AACF;AACA,SAAA;AACA,QAAA;AACC,YAAA,IAAI,EAAE,aAAa;AACnB,YAAA,KAAK,EAAE,QAAQ;AACf,YAAA,OAAO,EAAE,QAAQ;AACjB,YAAA,QAAQ,EAAE,QAAQ;AAClB,YAAA,IAAI,EAAE,OAAO;AACb,YAAA,UAAU,EAAE,QAAQ;AACpB,YAAA,IAAI,EAAE,QAAQ;AACf,SAAA;KACF;IAES,cAAc,GAAY,IAAI;IAE9B,IAAI,GAAgB,EAAE;IACrB,iBAAiB,GAAmB,EAAE;IACtC,mBAAmB,GAAmB,EAAE;IAElD,aAAa,GAAQ,EAAE;AAExB,IAAA,IAAI,oBAAoB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;IACxC;AAEA,IAAA,IAAI,sBAAsB,GAAA;AACxB,QAAA,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC;IACtC;AAEA,IAAA,IAAI,aAAa,GAAA;QACf,OAAO,IAAI,CAAC,aAAa;IAC3B;AAMS,IAAA,UAAU;AAGnB,IAAA,IAAI,WAAW,GAAA;QACb,OAAO,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK;AAChC,YAAA,GAAG,CAAC;AACJ,YAAA,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;AAC5C,SAAA,CAAC,CAAC;IACL;AACA,IAAA,IAAI,GAAG,GAAA;AACL,QAAA,IAAI;AACF,YAAA,OAAO,QAAQ,EAAE,eAAe,EAAE,GAAG,KAAK,KAAK;QACjD;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,IAAI;QACb;IACF;AAEC;;;;;AAKI;IACM,IAAI,GAAmD,MAAM;;IAG7D,UAAU,GAAsC,IAAI;;AAG7D,IAAA,IAAa,SAAS,GAAA;QACpB,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,KAAK,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,CAAC,KAAK,KAAK;IAC1H;;AAGA,IAAA,IAAa,YAAY,GAAA;QACvB,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU;IACvD;;AAES,IAAA,UAAU;;AAGV,IAAA,UAAU;;AAGV,IAAA,oBAAoB;IAC9B,UAAU,GAAG,2GAA2G;;AAG9G,IAAA,kBAAkB,GAAG,KAAK,CAAC;AAC3B,IAAA,kBAAkB,GAAG,mBAAmB,CAAC;;;AAI3C,IAAA,UAAU,GAAwB,EAAE,CAAC;;IAGrC,YAAY,GAAG,KAAK;IACpB,QAAQ,GAAqB,OAAO;AACnC,IAAA,cAAc,GAAG,IAAI,YAAY,EAAoB;;AAGnD,IAAA,gBAAgB,GAAG,IAAI,YAAY,EAAO;IAC3C,qBAAqB,GAAY,KAAK;AACrC,IAAA,2BAA2B,GAAG,IAAI,YAAY,EAAW;IAC1D,QAAQ,GAAG,EAAE;IACb,OAAO,GAAG,EAAE;AAEvB,IAAA,gBAAgB,CAAC,IAAsB,EAAA;AACrC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;;IAEhC;AAES,IAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AAC/B,IAAA,SAAS;IAEP,QAAQ,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,UAAU,EAAE;YACtB,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;QAC3C;QAEE,IAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,IAAI,EAAE,EAAC;YACpC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO;QACrC;QAEF,IAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAC;AACvB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU;YAClC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAC,IAAI,EAAC,mBAAmB,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;QAC9G;AACD,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;YACxB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,IAAG;gBACrC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;AACnC,gBAAA,IAAI,EAAE,IAAI,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,KAAK,EAAE;AACzD,oBAAA,IAAI,CAAC,SAAS,GAAG,EAAE;AACnB,oBAAA,IAAI,CAAC,IAAI,GAAG,QAAQ;AACpB,oBAAA,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrB;AAAO,qBAAA,IAAI,EAAE,IAAI,KAAK,IAAI,EAAE,IAAI,QAAQ,IAAI,EAAE,IAAI,KAAK,EAAE;AACvD,oBAAA,IAAI,CAAC,IAAI,GAAG,QAAQ;gBACtB;qBAAO;AACL,oBAAA,IAAI,CAAC,SAAS,GAAG,SAAS;gBAC5B;AACF,YAAA,CAAC,CAAC;QACJ;QACC,IAAI,CAAC,YAAY,EAAE;IAClB;;AAGA,IAAA,sBAAsB,CAAC,KAAsC,EAAA;QAC3D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;AACzB,QAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;AAGnB,QAAA,MAAM,aAAa,GAAuB;YACzC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;;YAEf,SAAS,EAAE,IAAI,CAAC,SAAS;AACzB,YAAA,SAAS,EAAE,CAAC;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,YAAY,EAAE,IAAI;SACrB;AACD,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;IAChC;AAEA,IAAA,UAAU,CAAC,EAAmB,EAAA;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;QAEnB,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;;QAGzC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE;YACzC,KAAK,CAAC,eAAe,GAAG;AACtB,gBAAA;AACE,oBAAA,eAAe,EAAE,KAAK;AACtB,oBAAA,UAAU,EAAE;AACb;aACF;QACH;;AAGA,QAAA,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE;AACjC,YAAA,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC;AACzB,gBAAA,eAAe,EAAE,KAAK;AACtB,gBAAA,UAAU,EAAE;AACb,aAAA,CAAC;QACJ;;QAGA,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;AACvC,YAAA,KAAK,EAAE,IAAI,CAAC,OAAO;AACnB,YAAA,QAAQ,EAAE,IAAI;AACd,YAAA,KAAK,EAAE;AACR,SAAA,CAAC;;AAGF,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAC5D,KAAK,EACL,IAAI,CAAC,WAAW,CACjB;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,WAAW,CAAC;AAErE,QAAA,MAAM,OAAO,GAAG;AACd,YAAA,KAAK,EAAE,WAAW;AAClB,YAAA,cAAc,EAAE,CAAC;AACjB,YAAA,SAAS,EAAE;SACZ;QAED,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC;AACtC,YAAA,IAAI,EAAE,CAAC,GAAyB,KAAI;AAClC,gBAAA,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI;YACrC,CAAC;YACD,KAAK,EAAE,GAAG,IAAG;AACX,gBAAA,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,GAAG,CAAC;YAC5C;AACD,SAAA,CAAC;IACJ;;;;;;;;;IAUA,QAAQ,CAAC,IAAgC,EAAE,KAAW,EAAA;QACpD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAC,KAAK,CAAC;IAClC;;;AAKA,IAAA,UAAU,CAAC,KAAyB,EAAA;;QAGlC,IAAI,CAAC,KAAK,GAAE,IAAI,CAAC,KAAK,IAAI,EAAE;AAE5B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU;QAClC,MAAM,KAAK,GAAO,KAAK,CAAC,KAAK,IAAK,IAAI,CAAC,KAAK;QAC5C,MAAM,IAAI,GAAQ,KAAK,CAAC,IAAI,IAAM,IAAI,CAAC,IAAI;AAC3C,QAAA,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC,SAAS,KAAK;cACzB,KAAK,CAAC;AACR,cAAE,IAAI,CAAC,SAAS;AAClC,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;QAGjD,MAAM,OAAO,GAAwB,EAAE;AACrC,QAAA,IAAI,KAAK,CAAC,OAAO,EAAE;AACjB,YAAA,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,KAAI;AACtD,gBAAA,MAAM,KAAK,GAAI,IAAY,CAAC,KAAK;gBACjC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE;AACjC,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;gBACxB;AACF,YAAA,CAAC,CAAC;QACJ;QAEA,IAAI,WAAW,GAAG,EAAE;;AAEtB,QAAA,IAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAC;;AAEnB,YAAA,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC;;;YAIjG,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,WAAW,CAAC;;QAIlE;AAEA,QAAA,IAAI,CAAC,KAAK,GAAO,KAAK;AACtB,QAAA,IAAI,CAAC,IAAI,GAAQ,IAAI;AACrB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC1B,QAAA,IAAI,CAAC,SAAS,GAAG,SAAkB;AACrC,QAAA,MAAM,GAAG,GAAG,SAAS,KAAK,CAAC,GAAG,KAAK,GAAG,MAAM;AAC3C,QAAA,MAAM,IAAI,GAAG,SAAS,GAAG,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,GAAG,SAAS;;QAGxD,IAAI,CAAC,WAAW,CACb;AACE,YAAA,MAAM,EAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;AAC3B,YAAA,KAAK,EAAC,WAAW;AACjB,YAAA,OAAO,EAAC,IAAI;AACZ,YAAA,SAAS,EAAC,KAAK;AACf,YAAA,cAAc,EAAC,IAAI;AAEtB,SAAA,CACF;;IAKH;;AAIE,IAAA,IAAI,SAAS,GAAA;;QAGX,OAAO,IAAI,CAAC,IAAI;IAClB;AAIF,IAAA,IAAI,kBAAkB,GAAA;AACpB,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7C;;;;AASA,IAAA,SAAS,CAAC,OAAY,EAAA;;AAElB,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC;AACd,QAAA,IAAI,CAAC,IAAI,GAAG,EAAE;IAChB;;AAED,IAAA,WAAW,CAAC,OAAY,EAAA;;AAEnB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IAC/B;;AAIA,IAAA,UAAU,CAAC,GAAM,EAAA;AACf,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE;AACtB,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1B;IACF;IAIF,QAAQ,GAAA;AACP,QAAA,IAAI,IAAI,CAAC,IAAI,IAAI,WAAW,EAAE;AAErB,YAAA,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACtB;IACR;IAEK,UAAU,CAAC,KAAa,EAAE,IAAS,EAAA;AACtC,QAAA,OAAO,KAAK;IACb;AAED,IAAA,kBAAkB,CAAC,GAAiB,EAAA;QAClC,IAAI,CAAC,IAAI,CAAC,oBAAoB;YAAE;QAEhC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAC1C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;AACrB,YAAA,IAAI,EAAE,GAAG,CAAC,UAAU,IAAI,cAAc;AACtC,YAAA,IAAI,EAAE;AACP,SAAA,CAAC;IACJ;AAEA,IAAA,oBAAoB,CAAC,GAAiB,EAAA;QACpC,IAAI,CAAC,IAAI,CAAC,sBAAsB;YAAE;AAElC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;AACnB,YAAA,IAAI,EAAE,GAAG,CAAC,UAAU,IAAI,YAAY;YACpC,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC;AAC/B,SAAA,CAAC;IACJ;IAGE,gBAAgB,GAAA;QACZ,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,sBAAsB,EAAE;YAC1D,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC;AACxC,YAAA,UAAU,EAAC,KAAK;AAChB,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,MAAM,EAAE,MAAM;AACd,YAAA,KAAK,EAAE,IAAI;AACX,YAAA,WAAW,EAAC,KAAK;AACjB,YAAA,IAAI,EAAE;gBACJ,OAAO,EAAC,IAAI,CAAC,OAAO;gBACpB,UAAU,EAAC,IAAI,CAAC,UAAU;gBAC1B,YAAY,EAAE,IAAI,CAAC,OAAO;gBAC1B,WAAW,EAAE,0BAA0B;gBACzC,eAAe,EAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,IAAG,EAAE,GAAE,EAAE;AAEnK;AACF,SAAA,CAAC;QAEF,GAAG,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,YAAiB,KAAI;YAC3C,IAAI,YAAY,EAAE;AAChB,gBAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,YAAY,CAAC;;AAElD,gBAAA,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;YACjC;AACF,QAAA,CAAC,CAAC;IACJ;AAEY,IAAA,YAAY,CAAC,MAAW,EAAA;;;;;;;;IAQpC;uGAziBS,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,wBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,WAAA,EAAA,aAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,eAAA,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,cAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,OAAA,EAAA,SAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,KAAA,EAAA,OAAA,EAAA,IAAA,EAAA,MAAA,EAAA,YAAA,EAAA,cAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,eAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,EAAA,SAAA,EAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,wBAAA,EAAA,0BAAA,EAAA,aAAA,EAAA,eAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,IAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,WAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,QAAA,EAAA,UAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,OAAA,EAAA,SAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,kBAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,cAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,QAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECvEtC,wlJAkIA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EDnFI,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,YAAY,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,kBAAA,EAAA,SAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,aAAA,EAAA,OAAA,EAAA,MAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,oBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,aAAA,EAAA,eAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,0BAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,YAAA,EAAA,UAAA,EAAA,WAAA,EAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAEb,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,eAAe,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACf,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACZ,mBAAmB,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACnB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACX,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACb,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACZ,sBAAsB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,SAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,EAAA,YAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,aAAA,EAAA,MAAA,EAAA,YAAA,EAAA,eAAA,EAAA,eAAA,EAAA,YAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,cAAA,EAAA,qBAAA,EAAA,WAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,WAAA,EAAA,aAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACtB,0BAA0B,2hBAC1B,oBAAoB,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,YAAA,EAAA,SAAA,EAAA,YAAA,EAAA,SAAA,EAAA,YAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,gBAAA,EAAA,OAAA,EAAA,WAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,YAAA,EAAA,OAAA,EAAA,aAAA,EAAA,MAAA,EAAA,SAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,aAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAUX,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBA5BrC,SAAS;+BACE,wBAAwB,EAAA,UAAA,EACtB,IAAI,EAAA,OAAA,EACP;wBACP,WAAW;wBACX,YAAY;wBACZ,YAAY;wBACZ,aAAa;wBACb,aAAa;wBACb,aAAa;wBACb,eAAe;wBACf,YAAY;wBACZ,mBAAmB;wBACnB,WAAW;wBACX,aAAa;wBACb,YAAY;wBACZ,sBAAsB;wBACtB,0BAA0B;wBAC1B,oBAAoB;;qBAGvB,EAAA,IAAA,EAEQ;AACD,wBAAA,KAAK,EAAE;AACV,qBAAA,EAAA,QAAA,EAAA,wlJAAA,EAAA;;sBAIH,SAAS;uBAAC,cAAc;;sBACxB,SAAS;uBAAC,QAAQ;;sBAOjB;;sBAEA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACE;;sBAIF;;sBACA;;sBACA;;sBACA;;sBAED;;sBAEC;;sBACA;;sBACA;;sBAIA;;sBAEA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAGC;;sBACD;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAIA;;sBACC;;sBACD;;sBAGA;;sBAGA;;sBACA;;sBACA;;sBACA;;sBACA;;sBAEF;;sBAIE;;sBAGA;;sBAEA;;sBAQF;;sBAEC;;sBAED;;sBACA;;sBACA;;sBACA;;sBAEC;;sBAEC;;sBACA;;sBAEF;;sBAGE;;sBAmCD;;sBA4BA;;sBAEA;;sBACC;;sBACA;;sBAoBF;;sBAuBE;;sBAGA;;sBAGA;;sBAKA;;sBAIA;;sBAGA;;sBAGA;;sBAIA;;sBACA;;sBAIF;;sBAGA;;sBACA;;sBACA;;sBAGE;;sBACA;;sBACA;;sBACA;;sBACA;;;AErUH;;AAEG;;;;"}
1
+ {"version":3,"file":"es.framework-ng.ui.core-generic-crud-table.mjs","sources":["../../../../libs/ng.ui.core/generic-crud-table/src/lib/generic-crud-table-module.ts","../../../../libs/ng.ui.core/generic-crud-table/src/lib/generic-crud-header.ts","../../../../libs/ng.ui.core/generic-crud-table/src/lib/generic-crud-header.html","../../../../libs/ng.ui.core/generic-crud-table/src/lib/generic-crud-table.ts","../../../../libs/ng.ui.core/generic-crud-table/src/lib/generic-crud-table.html","../../../../libs/ng.ui.core/generic-crud-table/src/es.framework-ng.ui.core-generic-crud-table.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { GenericButtonModule } from '@es.framework/ng.ui.core/generic-button';\r\n\r\n@NgModule({\r\n imports: [CommonModule,GenericButtonModule],\r\n})\r\nexport class GenericCrudTableModule {}\r\n","import { Component, EventEmitter, inject, Input, Output } from '@angular/core';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { ButtonConfig } from '@es.framework/ng.core/models';\r\nimport { GenericButton } from '@es.framework/ng.ui.core/generic-button';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\n\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { DividerModule } from 'primeng/divider';\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { Menu } from 'primeng/menu';\r\nimport { DialogService } from 'primeng/dynamicdialog';\r\nimport { BreadcrumbComponent } from '@es.framework/ng.ui.core/breadcrumb';\r\nimport { GenericSearchAdvanced } from '@es.framework/ng.ui.core/generic-search-advanced';\r\nimport { GenericReportComponent } from '@es.framework/ng.ui.core/generic-report';\r\nimport { LocalizationService } from '@es.framework/ng.core/services';\r\nimport { SelectButtonModule } from 'primeng/selectbutton';\r\nimport { TabbedSearchComponent } from '@es.framework/ng.ui.core/generic-report-tabs';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormlyFieldConfig } from '@ngx-formly/core';\r\n\r\n@Component({\r\n selector: 'app-generic-crud-header',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n GenericButton,\r\n TranslatePipe,\r\n BreadcrumbComponent,\r\n ButtonModule,\r\n DividerModule,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TooltipModule,\r\n Menu,\r\n GenericSearchAdvanced,\r\n SelectButtonModule,\r\n TabbedSearchComponent,\r\n],\r\n templateUrl: './generic-crud-header.html',\r\n providers: [DialogService],\r\n\r\n})\r\nexport class GenericCrudHeaderComponent {\r\n\r\n translate = inject(LocalizationService);\r\n dialogService = inject(DialogService);\r\n // 🟢 Inputs\r\n @Input() mode: 'full' | 'form-only' | 'table-only' | 'detail' = 'full';\r\n @Input() breadcrumb: MenuItem[] | undefined;\r\n @Input() isSingleItemSelected = false;\r\n @Input() selectedItems: any[] = [];\r\n @Input() singleActionButtons: ButtonConfig[] = [];\r\n @Input() bulkActionButtons: ButtonConfig[] = [];\r\n @Input() addButtonConfigs: ButtonConfig[] = [];\r\n @Input() mergedButtonConfigs: ButtonConfig[] = [];\r\n @Input() filters: any;\r\n @Input() filterModel: any = {};\r\n @Input() showSearch = true;\r\n @Input() first = 0; // Add input for current 'first' index\r\n @Input() rows = 10; // Add input for current 'rows' per page\r\n @Input() totalRecords = 0; // Add input for total records\r\n @Input() moduleName: string = '';\r\n @Input() apiName: string = '';\r\n @Input() actions:MenuItem[] = [\r\n {\r\n label: this.translate.instant('REPORT'),\r\n icon: 'pi pi-file-export',\r\n command:(e:any)=>{\r\n this.openReportDialog();\r\n }\r\n }\r\n ];\r\n\r\n\r\n // 🟢 Outputs\r\n @Output() singleItemAction = new EventEmitter<ButtonConfig>();\r\n @Output() bulkAction = new EventEmitter<ButtonConfig>();\r\n @Output() search = new EventEmitter<any>();\r\n @Output() resetSearch = new EventEmitter<void>();\r\n @Output() action = new EventEmitter<{ name: string; row: any }>();\r\n @Output() paginateChange = new EventEmitter<{ first: number; rows: number }>(); // NEW OUTPUT\r\n\r\n\r\n // 🟢 Inputs الجديدة\r\n @Input() showAdvancedFilter = false; // متغير للتحكم في ظهور الزر\r\n @Input() advancedFilterIcon = 'pi pi-filter-fill'; // أيقونة اختيارية\r\n // 🟢 الحالة الخاصة بالفلتر المتقدم\r\n isAdvancedFilterVisible = false; // لإخفاء وإظهار المكون عند الضغط\r\n // أضف هذا الـ Input\r\n@Input() searchTabs: FormlyFieldConfig[] = []; // مصفوفة التبويبات\r\n\r\n// 🟢 ميزة تبديل العرض\r\n@Input() showViewMode = false;\r\n@Input() viewMode: 'table' | 'grid' = 'table';\r\n@Output() viewModeChange = new EventEmitter<'table' | 'grid'>();\r\n\r\n// تعريف الخيارات\r\nviewOptions: any[] = [\r\n { icon: 'pi pi-list', value: 'table', title: 'TABLE_VIEW' },\r\n { icon: 'pi pi-th-large', value: 'grid', title: 'GRID_VIEW' }\r\n];\r\n\r\n\r\nonViewChange(event: any) {\r\n // PrimeNG SelectButton event.value يحتوي على القيمة المختارة\r\n if (event.value) {\r\n this.viewModeChange.emit(event.value);\r\n }\r\n}\r\n\r\n// 🟢 Actions\r\ntoggleAdvancedFilter() {\r\n this.isAdvancedFilterVisible = !this.isAdvancedFilterVisible;\r\n}\r\n\r\n\r\n\r\n // 🟢 Helpers\r\n trackByIdx = (index: number) => index;\r\n\r\n // 🟢 Actions\r\n onSingleItemAction(btn: ButtonConfig) {\r\n this.singleItemAction.emit(btn);\r\n }\r\n onInternalBulkAction(btn: ButtonConfig) {\r\n this.bulkAction.emit(btn);\r\n }\r\npaginationChange(value: any) {\r\n this.rows = value.top;\r\n }\r\n applySearch(value: any) {\r\n this.search.emit(value);\r\n }\r\n reset() {\r\n this.resetSearch.emit();\r\n }\r\n\r\n\r\n // Go to previous page\r\n // 🟢 Actions (Keep or adapt your existing pagination logic)\r\n totalPages(): number {\r\n if (this.totalRecords === 0 || this.rows === 0) return 0;\r\n return Math.ceil(this.totalRecords / this.rows);\r\n }\r\n pageInput: number | null = null;\r\n showPageMenu: boolean = false;\r\n\r\n // Get current page number (1-based)\r\n get currentPage(): number {\r\n return Math.floor(this.first / this.rows) + 1;\r\n }\r\n\r\n // Go to specific page from menu\r\n goToPageMenu() {\r\n if (this.pageInput && this.pageInput >= 1 && this.pageInput <= this.totalPages()) {\r\n const newFirst = (this.pageInput - 1) * this.rows;\r\n this.paginateChange.emit({ first: newFirst, rows: this.rows });\r\n this.pageInput = null;\r\n this.showPageMenu = false; // Close menu after navigation\r\n }\r\n }\r\n\r\n // Go to specific page (original method)\r\n goToPage() {\r\n this.goToPageMenu(); // Reuse the same logic\r\n }\r\n\r\n // Go to first page\r\ngoFirst() {\r\n this.paginateChange.emit({ first: 0, rows: this.rows }); // EMIT EVENT\r\n}\r\n\r\n// Go to last page\r\ngoLast() {\r\n const maxFirst = Math.max(0, (this.totalPages() - 1) * this.rows);\r\n this.paginateChange.emit({ first: maxFirst, rows: this.rows }); // EMIT EVENT\r\n}\r\n\r\n // Go to previous page\r\n goPrev() {\r\n const newFirst = Math.max(this.first - this.rows, 0);\r\n this.paginateChange.emit({ first: newFirst, rows: this.rows }); // EMIT EVENT\r\n }\r\n\r\n // Go to next page\r\n goNext() {\r\n const maxFirst = Math.max(0, (this.totalPages() - 1) * this.rows);\r\n const newFirst = Math.min(this.first + this.rows, maxFirst);\r\n this.paginateChange.emit({ first: newFirst, rows: this.rows }); // EMIT EVENT\r\n }\r\n\r\n // Check first/last page\r\n isFirstPage() {\r\n return this.first === 0;\r\n }\r\n\r\n isLastPage() {\r\n return this.first + this.rows >= this.totalRecords;\r\n }\r\n\r\n\r\n // Detect RTL direction\r\n get isRTL(): boolean {\r\n return document.documentElement.dir === 'rtl' ||\r\n document.body.dir === 'rtl' ||\r\n // this.translateService?.currentLang === 'ar' || // if using translation\r\n false; // default to LTR\r\n }\r\n /**\r\n * Handles button click in a unified way.\r\n * - If btn.action is defined, execute it.\r\n * - Otherwise, emit event with actionName or default 'add'.\r\n */\r\n async handleButtonClick(btn: ButtonConfig) {\r\n try {\r\n if (btn.action) {\r\n // Execute the provided action\r\n await btn.action(null); // You can pass row or context here\r\n } else {\r\n // Fallback to emitting event\r\n this.action.emit({\r\n name: btn.actionName ?? 'add',\r\n row: null!, // provide row if available\r\n });\r\n }\r\n } catch (err) {\r\n console.error('Button action error', err);\r\n }\r\n }\r\n\r\n openReportDialog() {\r\n const ref = this.dialogService.open(GenericReportComponent, {\r\n header: this.translate.instant('REPORT'),\r\n showHeader:false,\r\n width: '90%',\r\n height: 'auto',\r\n modal: true,\r\n focusOnShow:false,\r\n data: {\r\n apiName:this.apiName,\r\n moduleName:this.moduleName,\r\n filterFields: this.filters,\r\n filterModel: { /* status: 'Active' */},\r\n defaultFileName:this.translate.instant('REPORT') + ' ' + this.translate.instant(this.breadcrumb?.length ? this.breadcrumb[this.breadcrumb.length - 1].label ??'': '')\r\n\r\n }\r\n });\r\n\r\n ref?.onClose.subscribe((exportConfig: any) => {\r\n if (exportConfig) {\r\n console.log('Export configuration:', exportConfig);\r\n // Handle the export - call your API service here\r\n this.handleExport(exportConfig);\r\n }\r\n });\r\n }\r\n\r\n private handleExport(config: any) {\r\n // Your export logic here\r\n // if (config.exportType === 'EXCEL') {\r\n // this.exportToExcel(config);\r\n // } else if (config.exportType === 'PDF') {\r\n // this.exportToPdf(config);\r\n // }\r\n // etc.\r\n }\r\n\r\n}\r\n","@if (mode !== 'form-only' && mode !== 'detail') {\r\n<div class=\"flex items-start gap-2 justify-between\">\r\n <div>\r\n <app-breadcrumb\r\n class=\"xs:block hidden\"\r\n [breadcrumb]=\"breadcrumb\"\r\n ></app-breadcrumb>\r\n </div>\r\n\r\n <div class=\"flex items-center gap-2 justify-end flex-wrap\">\r\n @if (mode === 'full') {\r\n <!-- أزرار العناصر المفردة -->\r\n @if (isSingleItemSelected) {\r\n @for (btn of singleActionButtons; track trackByIdx($index)) {\r\n @if (!btn.visible || (btn.visible && btn.visible === true)) {\r\n <lib-generic-button\r\n [icon]=\"btn.icon\"\r\n [label]=\"btn.label | translate\"\r\n [variant]=\"btn.variant\"\r\n [size]=\"btn.size\"\r\n [severity]=\"btn.severity\"\r\n [model]=\"btn.splitActions\"\r\n [permission]=\"btn.permission\"\r\n (clicked)=\"onSingleItemAction(btn)\"\r\n ></lib-generic-button>\r\n }\r\n }\r\n }\r\n\r\n <!-- أزرار متعددة العناصر -->\r\n @if (selectedItems.length > 0) {\r\n @for (btn of bulkActionButtons; track trackByIdx($index)) {\r\n @if (!btn.visible || (btn.visible && btn.visible === true)) {\r\n <lib-generic-button\r\n [icon]=\"btn.icon\"\r\n [label]=\"btn.label | translate\"\r\n [variant]=\"btn.variant\"\r\n [size]=\"btn.size\"\r\n [severity]=\"btn.severity\"\r\n [model]=\"btn.splitActions\"\r\n [permission]=\"btn.permission\"\r\n (clicked)=\"onInternalBulkAction(btn)\"\r\n ></lib-generic-button>\r\n }\r\n }\r\n }\r\n\r\n <!-- أزرار الإضافة -->\r\n @for (btn of mergedButtonConfigs; track trackByIdx($index)) {\r\n @if (!btn.visible || (btn.visible && btn.visible === true)) {\r\n <lib-generic-button\r\n [icon]=\"btn.icon\"\r\n [label]=\"btn.label | translate\"\r\n [variant]=\"btn.variant\"\r\n [size]=\"btn.size\"\r\n [severity]=\"btn.severity\"\r\n [model]=\"btn.splitActions\"\r\n [permission]=\"btn.permission\"\r\n (clicked)=\"handleButtonClick(btn)\"\r\n ></lib-generic-button>\r\n }\r\n }\r\n }\r\n </div>\r\n</div>\r\n}\r\n\r\n@if (mode !== 'form-only' && mode !== 'detail') {\r\n<div class=\"mt-2 mb-4 flex items-center justify-between\">\r\n <!-- البحث -->\r\n @if (showSearch && filters) {\r\n <lib-generic-search-advanced\r\n [model]=\"filterModel\"\r\n [fields]=\"filters\"\r\n (search)=\"applySearch($event)\"\r\n (paginationChange)=\"paginationChange($event)\"\r\n >\r\n</lib-generic-search-advanced>\r\n } @else {\r\n <div></div>\r\n }\r\n\r\n <!-- أدوات إضافية -->\r\n <div class=\"flex items-center gap-3 rtl:space-x-reverse\">\r\n\r\n @if (showAdvancedFilter && searchTabs.length > 0) {\r\n <p-button\r\n [icon]=\"advancedFilterIcon\"\r\n [outlined]=\"!isAdvancedFilterVisible\"\r\n severity=\"secondary\"\r\n [pTooltip]=\"'ADVANCED_FILTER' | translate\"\r\n tooltipPosition=\"top\"\r\n (onClick)=\"toggleAdvancedFilter()\"\r\n class=\"hidden sm:inline-flex\"\r\n />\r\n}\r\n <!-- Refresh Button -->\r\n <p-button\r\n icon=\"pi pi-refresh\"\r\n outlined\r\n severity=\"secondary\"\r\n class=\"hidden xs:block\"\r\n (onClick)=\"reset()\"\r\n />\r\n\r\n <p-divider layout=\"vertical\" class=\"m-0 p-0 hidden xs:block\" />\r\n\r\n\r\n <!-- <p-button (click)=\"menu.toggle($event)\" class=\"xs:block\" severity=\"secondary\" outlined icon=\"pi pi-ellipsis-v\"/>\r\n <p-menu #menu [model]=\"actions\" [popup]=\"true\" /> -->\r\n\r\n\r\n <!-- Pagination Controls -->\r\n <div class=\"flex items-center gap-1 rtl:space-x-reverse\">\r\n\r\n @if ( showViewMode ) {\r\n<p-selectButton\r\n [options]=\"viewOptions\"\r\n [(ngModel)]=\"viewMode\"\r\n (onChange)=\"onViewChange($event)\"\r\n [unselectable]=\"false\"\r\n optionLabel=\"icon\"\r\n optionValue=\"value\"\r\n\r\n styleClass=\"inline-flex bg-slate-100 dark:bg-slate-800 p-1 rounded-xl border border-slate-200 dark:border-slate-700 shadow-inner\"\r\n>\r\n\r\n <ng-template let-item pTemplate=\"item\">\r\n <div\r\n class=\"flex items-center justify-center rounded-lg transition-all duration-200\"\r\n [ngClass]=\"{\r\n ' dark:bg-slate-600 shadow-sm': viewMode === item.value,\r\n 'text-slate-500 hover:bg-slate-200 dark:hover:bg-slate-700': viewMode !== item.value\r\n }\"\r\n [pTooltip]=\"item.title | translate\"\r\n tooltipPosition=\"top\"\r\n >\r\n <i [class]=\"item.icon\" class=\"text-base\"></i>\r\n </div>\r\n </ng-template>\r\n\r\n</p-selectButton>\r\n }\r\n <p-divider layout=\"vertical\" class=\"m-0 p-0 hidden xs:block\" />\r\n\r\n <!-- First Page Button -->\r\n <p-button\r\n [icon]=\"isRTL ? 'pi pi-angle-double-right' : 'pi pi-angle-double-left'\"\r\n outlined\r\n severity=\"secondary\"\r\n class=\"hidden xs:block\"\r\n (click)=\"goFirst()\"\r\n [disabled]=\"isFirstPage()\"\r\n ></p-button>\r\n\r\n <!-- Previous Page Button -->\r\n <p-button\r\n [icon]=\"isRTL ? 'pi pi-chevron-right' : 'pi pi-chevron-left'\"\r\n outlined\r\n severity=\"secondary\"\r\n class=\"xs:block\"\r\n (click)=\"goPrev()\"\r\n [disabled]=\"isFirstPage()\"\r\n ></p-button>\r\n\r\n\r\n <!-- Current Page Display with Dropdown -->\r\n <div class=\"relative\">\r\n\r\n <p-button\r\n [label]=\"currentPage + ' / ' + totalPages()\"\r\n outlined\r\n severity=\"secondary\"\r\n class=\"hidden xs:block\"\r\n (click)=\"showPageMenu = !showPageMenu\"\r\n pTooltip=\"{{totalRecords}}\"\r\n tooltipPosition=\"top\"\r\n />\r\n\r\n\r\n </div>\r\n <!-- Next Page Button -->\r\n <p-button\r\n [icon]=\"isRTL ? 'pi pi-chevron-left' : 'pi pi-chevron-right'\"\r\n outlined\r\n severity=\"secondary\"\r\n class=\"xs:block\"\r\n (click)=\"goNext()\"\r\n [disabled]=\"isLastPage()\"\r\n ></p-button>\r\n\r\n <!-- Last Page Button -->\r\n <p-button\r\n [icon]=\"isRTL ? 'pi pi-angle-double-left' : 'pi pi-angle-double-right'\"\r\n outlined\r\n severity=\"secondary\"\r\n class=\"hidden xs:block\"\r\n (click)=\"goLast()\"\r\n [disabled]=\"isLastPage()\"\r\n ></p-button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n @if (showSearch && showAdvancedFilter && searchTabs.length > 0) {\r\n <div\r\n [ngClass]=\"{\r\n 'block': true,\r\n 'sm:hidden': !isAdvancedFilterVisible,\r\n 'sm:block': isAdvancedFilterVisible\r\n }\"\r\n class=\"animate-fade-in\"\r\n >\r\n <app-tabbed-search\r\n [fields]=\"searchTabs\"\r\n [model]=\"filterModel\"\r\n (onSearch)=\"applySearch($event)\"\r\n (onReset)=\"reset()\"\r\n (paginationChange)=\"paginationChange($event)\">\r\n </app-tabbed-search>\r\n </div>\r\n}\r\n}\r\n","/* eslint-disable @angular-eslint/no-output-on-prefix */\r\n/* eslint-disable @angular-eslint/no-output-native */\r\nimport { DividerModule } from 'primeng/divider';\r\nimport { Component, Input, Output, EventEmitter, ViewChild, inject, OnInit } from '@angular/core';\r\nimport { MessageModule } from 'primeng/message';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { PaginatorState } from 'primeng/paginator';\r\nimport { TableModule,TableLazyLoadEvent } from 'primeng/table';\r\nimport { ToolbarModule } from 'primeng/toolbar';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { FormlyFieldConfig, FormlyFormOptions } from '@ngx-formly/core';\r\nimport { IconFieldModule } from 'primeng/iconfield';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { DrawerModule } from 'primeng/drawer';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { FormsModule, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\r\nimport { BaseService, LocalizationService } from '@es.framework/ng.core/services';\r\nimport { ButtonConfig, PaginatedResult } from '@es.framework/ng.core/models';\r\nimport { SwalService } from '@es.framework/ng.core/services';\r\nimport { ActionDef } from '@es.framework/ng.core/models';\r\nimport { GenericCrudHeaderComponent } from './generic-crud-header';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { GenericTable } from '@es.framework/ng.ui.core/generic-table';\r\nimport { GenericDialogComponent } from '@es.framework/ng.ui.core/generic-dialog';\r\nimport { DetailTab, GenericViewComponent } from '@es.framework/ng.ui.core/generic-view';\r\nimport { QueryBuilderService } from '@es.framework/ng.ui.core/generic-search-advanced';\r\nimport { DialogService } from 'primeng/dynamicdialog';\r\nimport { GenericReportComponent } from '@es.framework/ng.ui.core/generic-report';\r\nimport { cloneDeep } from 'lodash';\r\n// import { SavedReportTemplatesDrawerComponent } from '@es.framework/ng.ui.core/filter-templates';\r\n\r\nexport interface PageChangePayload extends PaginatorState {\r\nsort?: string;\r\nfilters?: Record<string, any>;\r\n}\r\n\r\nexport type ActionsMode = 'buttons' | 'menu';\r\n\r\n/**\r\n * مكون جدول CRUD عام يمكن إعادة استخدامه\r\n * يدعم العمليات الأساسية: إنشاء، قراءة، تحديث، حذف\r\n * مع إمكانية التخصيص عبر عدة أوضاع وعرض\r\n */\r\n@Component({\r\n selector: 'app-generic-crud-table',\r\n standalone: true,\r\n imports: [\r\n TableModule,\r\n ButtonModule,\r\n GenericTable,\r\n ToolbarModule,\r\n TranslatePipe,\r\n DividerModule,\r\n IconFieldModule,\r\n DrawerModule,\r\n ReactiveFormsModule,\r\n FormsModule,\r\n MessageModule,\r\n DialogModule,\r\n GenericDialogComponent,\r\n GenericCrudHeaderComponent,\r\n GenericViewComponent,\r\n // SavedReportTemplatesDrawerComponent\r\n\r\n],\r\n templateUrl: './generic-crud-table.html',\r\n host: {\r\n class: ''\r\n },\r\n})\r\n\r\nexport class GenericCrudTableComponent<T> implements OnInit {\r\n @ViewChild('genericTable') genericTable!: GenericTable<T>;\r\n @ViewChild('dialog') dialog!: GenericDialogComponent;\r\n translate:LocalizationService = inject(LocalizationService);\r\n private swalService = inject(SwalService);\r\n private queryBuilder = inject(QueryBuilderService);\r\n private dialogService = inject(DialogService);\r\n\r\n home: MenuItem | undefined = { icon: 'pi pi-home', routerLink: '/' };\r\n @Input() data: T[] = [];\r\n formFields_: FormlyFieldConfig[] = [];\r\n @Input() formFields: FormlyFieldConfig[] = [];\r\n @Input() columnFormFields: FormlyFieldConfig[] = [];\r\n @Input() columns: FormlyFieldConfig[] = [];\r\n @Input() dialogMaxWidth = '40rem'; // unset , fit-content\r\n @Input() isViewMode = false;\r\n @Input() displayMode:\r\n | 'drawer' | 'dialog' | 'route' | 'inline'\r\n | Partial<Record<'add' | 'edit' | 'view', 'drawer' | 'dialog' | 'route' | 'inline'>>\r\n = 'drawer';\r\n @Input() useConfirmOnSave = false;\r\n @Input() isEditMode = false;\r\n @Input() drawerVisible = false;\r\n @Input() dialogVisible = false;\r\n form = new UntypedFormGroup({});\r\n @Input() model: any;\r\n model_: any = {};\r\n @Input() loading = false;\r\n @Input() errorMsg = '';\r\n @Input() errorMessage: string|any = '';\r\n\r\noptions: FormlyFormOptions = {};\r\n\r\n @Input() actions: ActionDef<T>[] = [];\r\n /** تحدد طريقة العرض: 'buttons' أو 'menu' */\r\n @Input() actionsMode: ActionsMode = 'buttons';\r\n @Output() action = new EventEmitter<{ name: string; row: T }>();\r\n @Output() bulkAction = new EventEmitter<{ name: string; items: T[] }>();\r\n @Output() singleAction = new EventEmitter<{ name: string; item: T }>();\r\n @Input() beforeSaveTransform?: (record: any, isEdit: boolean) => any; // ⚡ دوال مخصصة قبل الحفظ\r\n\r\n\r\n @Output() afterSave = new EventEmitter<{ record: T; isEdit: boolean; response?: any }>();\r\n @Output() afterDelete = new EventEmitter<{ record: T; response?: any }>();\r\n @Output() beforeSave = new EventEmitter<{ record: T; isEdit: boolean }>();\r\n @Output() beforeDelete = new EventEmitter<{ record: T }>();\r\n @Output() formCancel = new EventEmitter<void>();\r\n @Output() formInit = new EventEmitter<{ form: UntypedFormGroup; model: any }>();\r\n @Output() dataLoaded = new EventEmitter<{ data: T[]; total: number }>();\r\n @Output() selectionChange = new EventEmitter<{ selected: T[]; selectedCount: number }>();\r\n @Output() error = new EventEmitter<{ error: any; context: string }>();\r\n\r\n // البحث\r\n// Search\r\n @Input() filters: any;\r\n @Input() filterModel: any = {};\r\n @Output() search = new EventEmitter<{ field: string; global: string }>();\r\n\r\n/** للتحكم بإظهار/إخفاء قسم البحث */\r\n @Input() showSearch = true;\r\n\r\n /** Pagination Inputs */\r\n @Input() first = 0;\r\n @Input() rows = 10;\r\n @Input() totalRecords = 0;\r\n @Output() pageChange = new EventEmitter<PageChangePayload>();\r\n @Output() onSearch = new EventEmitter<any>();\r\n\r\n@Output() visibleChange: EventEmitter<boolean> = new EventEmitter<boolean>();;\r\n\r\n// @Output() visibleChange = new EventEmitter<boolean>();\r\n /** لجعل الجدول قابل لتعديل الصفوف (افتراضي false) */\r\n @Input() rowEditable = false;\r\n// @Output() visibleChange = new EventEmitter<boolean>();\r\n /** لجعل الجدول قابل لاختيار الصفوف (افتراضي false) */\r\n @Input() rowSelectable = false;\r\n /** حدث يخرج الصف المحدّد */\r\n @Output() rowSelect = new EventEmitter<T>();\r\n\r\n selection: T | null = null;\r\n\r\n // الفرز\r\n sortField?: string;\r\n sortOrder: 1 | -1 = 1;\r\n\r\n@Input() scrollHeight = '400px';\r\n\r\n @Input() paginator = true;\r\n\r\n@Input() service: BaseService = inject(BaseService);\r\n@Input() apiName = '';\r\n@Input() moduleName = '';\r\n@Input() idField = 'id';\r\n\r\n @Input() showRowSelectionCheckbox = false;\r\n\r\n @Input() showAddButton = true;\r\n @Input() showPrintButton = true;\r\n\r\n@Input() PermissionName?:string;\r\nmergedButtonConfigs: ButtonConfig[] = [];\r\n\r\n @Input() addButtonConfigs: ButtonConfig[] = [];\r\n\r\nbuildButtons(): void {\r\n const fixedButtons: ButtonConfig[] = [\r\n {\r\n icon: 'pi pi-plus',\r\n label: 'ADD',\r\n variant: 'raised',\r\n severity: 'primary',\r\n size: 'small',\r\n actionName: 'add',\r\n visible: this.showAddButton,\r\n permission: `${this.PermissionName}:AD`,\r\n },\r\n {\r\n icon: 'pi pi-print',\r\n label: 'PRINT',\r\n variant: 'raised',\r\n severity: 'secondary',\r\n size: 'small',\r\n actionName: 'print',\r\n visible: this.showPrintButton,\r\n permission: `${this.PermissionName}:PR`,\r\n action: async () => {\r\n this.openReportDialog();\r\n },\r\n },\r\n ];\r\n\r\n this.mergedButtonConfigs = [\r\n ...fixedButtons,\r\n ...(this.addButtonConfigs || []),\r\n ];\r\n}\r\n\r\n @Input() createEditActions: ButtonConfig[] = [\r\n {\r\n icon: 'pi pi-check',\r\n label: 'SAVE',\r\n variant: 'raised',\r\n severity: 'primary',\r\n size: 'small',\r\n actionName: 'save',\r\n type: 'submit',\r\n splitActions: [\r\n {\r\n label: this.translate.instant('SAVE_AND_ADD'),\r\n icon: 'pi pi-save',\r\n actionName: 'saveAndAdd'\r\n }\r\n ]\r\n },\r\n {\r\n icon: 'pi pi-times',\r\n label: 'CANCEL',\r\n variant: 'raised',\r\n severity: 'danger',\r\n size: 'small',\r\n actionName: 'cancel',\r\n type: 'button',\r\n },\r\n];\r\n\r\n @Input() supportSubPage: boolean = true;\r\n\r\n @Input() tabs: DetailTab[] = [];\r\n @Input() bulkActionButtons: ButtonConfig[] = [];\r\n @Input() singleActionButtons: ButtonConfig[] = [];\r\n\r\n _selectedRows: T[] = [];\r\n\r\nget isSingleItemSelected(): boolean {\r\n return this._selectedRows.length === 1;\r\n}\r\n\r\nget isMultipleItemSelected(): boolean {\r\n return this._selectedRows.length > 1;\r\n}\r\n\r\nget selectedItems(): T[] {\r\n return this._selectedRows;\r\n}\r\n\r\n\r\n\r\n\r\n\r\n@Input() breadcrumb: MenuItem[] | undefined;\r\n\r\n\r\nget breadcrumb_(): MenuItem[] | undefined {\r\n return this.breadcrumb?.map(v => ({\r\n ...v,\r\n label: this.translate.instant(v.label ?? '')\r\n }));\r\n}\r\nget rtl(): boolean {\r\n try {\r\n return document?.documentElement?.dir === 'rtl';\r\n } catch (error) {\r\n return true;\r\n }\r\n}\r\n\r\n /**\r\n * Modes to control what parts of the component are visible\r\n * - 'full': Table + CRUD operations (default)\r\n * - 'form-only': Only show form (for create/edit/view)\r\n * - 'table-only': Only show table (read-only mode)\r\n */\r\n @Input() mode: 'full' | 'form-only' | 'table-only' | 'detail' = 'full';\r\n\r\n /** Force the component to show specific state */\r\n @Input() forceState: 'create' | 'edit' | 'view' | null = null;\r\n\r\n /** Hide table completely when in form-only mode */\r\n @Input() get hideTable(): boolean {\r\n return (this.mode === 'form-only' || this.mode === 'detail' || (this.forceState && this.mode !== 'table-only') )?? false;\r\n }\r\n\r\n /** Auto-show form when in form-only mode with forceState */\r\n @Input() get autoShowForm(): boolean {\r\n return this.mode === 'form-only' && !!this.forceState;\r\n }\r\n//لتغيير لون صف معيّن\r\n @Input() rowStyleFn?: (row: T) => any;\r\n\r\n // ✅ لتعيين كلاس CSS أو Tailwind على الصف\r\n @Input() rowClassFn?: (row: T) => string | string[] | Set<string>;\r\n\r\n //آخر لتجميد / تعطيل checkbox الاختيار\r\n @Input() disableRowCheckboxFn?: (row: T) => boolean;\r\n tableClass = 'h-full flex-1 flex flex-col overflow-y-auto border border-surface rounded-2xl xs:rounded-2xl p-4 bg-white';\r\n\r\n // 🟢 Inputs الجديدة\r\n @Input() showAdvancedFilter = false; // متغير للتحكم في ظهور الزر\r\n @Input() advancedFilterIcon = 'pi pi-filter-fill'; // أيقونة اختيارية\r\n // 🟢 الحالة الخاصة بالفلتر المتقدم\r\n\r\n // أضف هذا الـ Input\r\n@Input() searchTabs: FormlyFieldConfig[] = []; // مصفوفة التبويبات\r\n\r\n// 🟢 ميزة تبديل العرض\r\n@Input() showViewMode = false;\r\n@Input() viewMode: 'table' | 'grid' = 'table';\r\n@Output() viewModeChange = new EventEmitter<'table' | 'grid'>();\r\n\r\n// 🟢 Outputs\r\n @Output() templateSelected = new EventEmitter<any>();\r\n @Input() templateDrawerVisible: boolean = false;\r\n @Output() templateDrawerVisibleChange = new EventEmitter<boolean>();\r\n @Input() category = '';\r\n @Input() feature = '';\r\n\r\nonViewModeChange(mode: 'table' | 'grid') {\r\n this.viewMode = mode;\r\n this.viewModeChange.emit(mode);\r\n // هنا يمكنك إضافة منطق إضافي إذا أردت تغيير طريقة عرض البيانات فوراً\r\n}\r\n\r\n private route = inject(ActivatedRoute);\r\nprivate router = inject(Router);\r\ncurrentId?: string | number;\r\n\r\n ngOnInit() {\r\n if (this.moduleName) {\r\n this.service.moduleName = this.moduleName;\r\n }\r\n\r\n if(this.apiName && this.apiName != ''){\r\n this.service.apiName = this.apiName ;\r\n }\r\n\r\n if(this.tabs.length == 0){\r\n this.formFields_ = this.formFields;\r\n this.tabs.push({ header: 'التفاصيل',icon:'pi pi-info-circle', fields: this.formFields_, model: this.model });\r\n }\r\n if (this.supportSubPage) {\r\n this.route.paramMap.subscribe(params => {\r\n const id = params.get(this.idField);\r\n if (id && id !== 'new' && id !== 'create' && id !== 'add') {\r\n this.currentId = id;\r\n this.mode = 'detail';\r\n this.loadDetail(id);\r\n } else if (id == 'new' || id == 'create' || id == 'add') {\r\n this.mode = 'detail';\r\n } else {\r\n this.currentId = undefined;\r\n }\r\n });\r\n}\r\n this.buildButtons();\r\n }\r\n\r\n // 3. Handle Header's Paginate Change Event\r\n onHeaderPaginateChange(event: { first: number; rows: number }) {\r\n this.first = event.first; // Update the 'first' index\r\n this.rows = event.rows;\r\n\r\n\r\n const lazyLoadEvent: TableLazyLoadEvent = {\r\n first: this.first,\r\n rows: this.rows,\r\n // You'd typically include current sorting and filtering state here\r\n sortField: this.sortField,\r\n sortOrder: 1,\r\n filters: this.filters ,\r\n globalFilter: null, // or your current global filter value\r\n };\r\n this.onLazyLoad(lazyLoadEvent);\r\n }\r\n\r\n loadDetail(id: string | number) {\r\n this.currentId = id;\r\n\r\n const model = cloneDeep(this.model) ?? {};\r\n\r\n // Create advancedFilters if missing\r\n if (!Array.isArray(model.advancedFilters)) {\r\n model.advancedFilters = [\r\n {\r\n logicalOperator: 'and',\r\n conditions: []\r\n }\r\n ];\r\n }\r\n\r\n // Ensure first group exists\r\n if (!model.advancedFilters.length) {\r\n model.advancedFilters.push({\r\n logicalOperator: 'and',\r\n conditions: []\r\n });\r\n }\r\n\r\n // Inject ID condition into first filter group\r\n model.advancedFilters[0].conditions.push({\r\n field: this.idField, // or 'id'\r\n operator: 'eq',\r\n value: id\r\n });\r\n\r\n // Build query\r\n const odataParams = this.queryBuilder.buildODataFromQueryModel(\r\n model,\r\n this.formFields_\r\n );\r\n\r\n const queryString = this.queryBuilder.toODataQueryString(odataParams);\r\n\r\n const filters = {\r\n query: queryString,\r\n maxResultCount: 1,\r\n skipCount: 0\r\n };\r\n\r\n this.service.getList(filters).subscribe({\r\n next: (res: PaginatedResult<any>) => {\r\n this.model = res.items?.[0] ?? null;\r\n },\r\n error: err => {\r\n console.error('Error loading detail', err);\r\n }\r\n });\r\n}\r\n// loadDetail(id: string | number) {\r\n// this.service.get(id as any).subscribe({\r\n// next: res => {\r\n// this.model = res;\r\n// }\r\n// });\r\n// }\r\n\r\n// Helper method to open form programmatically\r\nopenForm(mode: 'create' | 'edit' | 'view', model?: any) {\r\n this.dialog.openForm(mode,model);\r\n}\r\n\r\n\r\n// private destroy$ = new Subject<void>();\r\n /** الآن يتلقّى pagination + sort في حدث واحد */\r\nonLazyLoad(event: TableLazyLoadEvent) {\r\n // this.model_= this.model ?? {};\r\n\r\n this.model= this.model ?? {};\r\n\r\n this.formFields_ = this.formFields;\r\n const first = event.first ?? this.first;\r\n const rows = event.rows ?? this.rows;\r\n const sortField = typeof event.sortField === 'string'\r\n ? event.sortField\r\n : this.sortField;\r\n const sortOrder = event.sortOrder === -1 ? -1 : 1;\r\n\r\n\r\n const filters: Record<string, any> = {};\r\n if (event.filters) {\r\n Object.entries(event.filters).forEach(([field, meta]) => {\r\n const value = (meta as any).value;\r\n if (value != null && value !== '') {\r\n filters[field] = value;\r\n }\r\n });\r\n }\r\n\r\n var queryString = '';\r\n // Default query\r\n if(!filters['query']){\r\n // Use the new QueryBuilderService methods\r\n const odataParams = this.queryBuilder.buildODataFromQueryModel(this.filterModel, this.formFields_);\r\n // this.odataSearch.emit(odataParams);\r\n\r\n // Generate query string using the unified method\r\n queryString = this.queryBuilder.toODataQueryString(odataParams);\r\n // console.log('OData Query String:', queryString);\r\n\r\n\r\n }\r\n\r\n this.first = first;\r\n this.rows = rows;\r\n this.sortField = sortField;\r\n this.sortOrder = sortOrder as 1| -1;\r\nconst dir = sortOrder === 1 ? 'asc' : 'desc';\r\n const sort = sortField ? `${sortField} ${dir}` : undefined;\r\n\r\n // this.pageChange.emit({ first, rows ,sort, filters });\r\n this.applySearch(\r\n {\r\n filter:this.model['filter'],\r\n query:queryString,\r\n sorting:sort,\r\n skipCount:first,\r\n maxResultCount:rows,\r\n\r\n }\r\n );\r\n\r\n\r\n // يبني النص وإرساله\r\n\r\n}\r\n\r\n\r\n /** تصيير البيانات حسب الصفحة */\r\n get pagedData(): T[] {\r\n // return this.data ? this.data.slice(this.first, this.first + this.rows) : [];\r\n\r\n return this.data;\r\n }\r\n\r\n\r\n\r\nget globalFilterFields(): string[] {\r\n return this.columns.map(c => String(c.key));\r\n}\r\n\r\n\r\n\r\n\r\n\r\n /** أرسل إلى الأب لأتمتة شكل البحث إذا يحتاج */\r\n// from generic-crud-table.component.ts\r\n/** بدّل applySearch لتبث pageChange مباشرةً */\r\nresetPage(filters: any) {\r\n // this.genericTable.applyFilter(global);\r\n this.first = 0;\r\n this.rows = 10;\r\n }\r\n/** بدّل applySearch لتبث pageChange مباشرةً */\r\n applySearch(filters: any) {\r\n // this.genericTable.applyFilter(global);\r\n this.onSearch.emit(filters);\r\n }\r\n\r\n\r\n /** دالة تنفّذ عند النقر على صف */\r\n onRowClick(row: T) {\r\n if (this.rowSelectable) {\r\n this.rowSelect.emit(row);\r\n }\r\n }\r\n\r\n\r\n\r\nonSubmit() {\r\n if (this.mode != 'form-only') {\r\n\r\n this.applySearch('');\r\n }\r\n}\r\n\r\n trackByIdx(index: number, item: any): number {\r\n return index;\r\n }\r\n\r\nonSingleItemAction(btn: ButtonConfig): void {\r\n if (!this.isSingleItemSelected) return;\r\n\r\n const selectedItem = this._selectedRows[0];\r\n this.singleAction.emit({\r\n name: btn.actionName ?? 'singleAction',\r\n item: selectedItem\r\n });\r\n}\r\n\r\nonInternalBulkAction(btn: ButtonConfig): void {\r\n if (!this.isMultipleItemSelected) return;\r\n\r\n this.bulkAction.emit({\r\n name: btn.actionName ?? 'bulkAction',\r\n items: [...this._selectedRows] // نرسل نسخة من المصفوفة\r\n });\r\n}\r\n\r\n\r\n openReportDialog() {\r\n const ref = this.dialogService.open(GenericReportComponent, {\r\n header: this.translate.instant('REPORT'),\r\n showHeader:false,\r\n width: '90%',\r\n height: 'auto',\r\n modal: true,\r\n focusOnShow:false,\r\n data: {\r\n apiName:this.apiName,\r\n moduleName:this.moduleName,\r\n filterFields: this.filters,\r\n filterModel: { /* status: 'Active' */},\r\n defaultFileName:this.translate.instant('REPORT') + ' ' + this.translate.instant(this.breadcrumb?.length ? this.breadcrumb[this.breadcrumb.length - 1].label ??'': '')\r\n\r\n }\r\n });\r\n\r\n ref?.onClose.subscribe((exportConfig: any) => {\r\n if (exportConfig) {\r\n console.log('Export configuration:', exportConfig);\r\n // Handle the export - call your API service here\r\n this.handleExport(exportConfig);\r\n }\r\n });\r\n }\r\n\r\n private handleExport(config: any) {\r\n // Your export logic here\r\n // if (config.exportType === 'EXCEL') {\r\n // this.exportToExcel(config);\r\n // } else if (config.exportType === 'PDF') {\r\n // this.exportToPdf(config);\r\n // }\r\n // etc.\r\n }\r\n\r\n\r\nonTableSelectionChange(selection: T | T[] | null): void {\r\n this._selectedRows = Array.isArray(selection)\r\n ? [...selection]\r\n : selection\r\n ? [selection]\r\n : [];\r\n\r\n this.selectionChange.emit({\r\n selected: [...this._selectedRows],\r\n selectedCount: this._selectedRows.length,\r\n });\r\n}\r\n\r\n }\r\n","<div\r\n [class]=\"mode !== 'form-only' && mode !== 'detail' ? tableClass : ''\"\r\n>\r\n <app-generic-crud-header\r\n [mode]=\"mode\"\r\n [breadcrumb]=\"breadcrumb_\"\r\n [isSingleItemSelected]=\"isSingleItemSelected\"\r\n [selectedItems]=\"_selectedRows\"\r\n [singleActionButtons]=\"singleActionButtons\"\r\n [bulkActionButtons]=\"bulkActionButtons\"\r\n [addButtonConfigs]=\"addButtonConfigs\"\r\n [mergedButtonConfigs]=\"mergedButtonConfigs\"\r\n [apiName]=\"service.apiName\"\r\n [moduleName]=\"service.moduleName\"\r\n [filters]=\"filters\"\r\n [filterModel]=\"filterModel\"\r\n [showSearch]=\"showSearch\"\r\n (singleItemAction)=\"onSingleItemAction($event)\"\r\n (bulkAction)=\"onInternalBulkAction($event)\"\r\n (action)=\"action.emit($event)\"\r\n (search)=\"resetPage($event);applySearch($event);\"\r\n (resetSearch)=\"resetPage($event);applySearch('');\"\r\n (paginateChange)=\"onHeaderPaginateChange($event)\"\r\n [first]=\"first\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalRecords\"\r\n [searchTabs]=\"searchTabs\"\r\n [showAdvancedFilter]=\"showAdvancedFilter\"\r\n [advancedFilterIcon]=\"advancedFilterIcon\"\r\n [showViewMode]=\"showViewMode\"\r\n [viewMode]=\"viewMode\"\r\n (viewModeChange)=\"onViewModeChange($event)\"\r\n/>\r\n\r\n @if (!hideTable) {\r\n <lib-generic-table\r\n [data]=\"data\"\r\n [columns]=\"columns\"\r\n [columnFormFields]=\"columnFormFields\"\r\n [paginator]=\"paginator\"\r\n [loading]=\"loading\"\r\n [actions]=\"actions\"\r\n [actionsMode]=\"actionsMode\"\r\n [first]=\"first\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalRecords\"\r\n [sortField]=\"sortField\"\r\n [sortOrder]=\"sortOrder\"\r\n [addButtonConfigs]=\"addButtonConfigs\"\r\n [globalFilterFields]=\"globalFilterFields\"\r\n [scrollHeight]=\"scrollHeight\"\r\n [showRowSelectionCheckbox]=\"showRowSelectionCheckbox\"\r\n (action)=\"action.emit($event)\"\r\n (onAddNew)=\"action.emit($event)\"\r\n (pageChange)=\"onLazyLoad($event)\"\r\n [rowSelectable]=\"rowSelectable\"\r\n [rowEditable]=\"rowEditable\"\r\n (rowSelect)=\"onRowClick($event)\"\r\n [(selection)]=\"_selectedRows\"\r\n (selectionChange)=\"onTableSelectionChange($event)\"\r\n #genericTable\r\n ></lib-generic-table>\r\n }\r\n\r\n <app-generic-dialog\r\n #dialog\r\n [service]=\"service\"\r\n [formFields]=\"formFields\"\r\n [model]=\"model\"\r\n [apiName]=\"service.apiName\"\r\n [moduleName]=\"service.moduleName\"\r\n [idField]=\"idField\"\r\n [dialogMaxWidth]=\"dialogMaxWidth\"\r\n [displayMode]=\"displayMode\"\r\n [mode]=\"mode\"\r\n [forceState]=\"forceState\"\r\n [drawerVisible]=\"drawerVisible\"\r\n [dialogVisible]=\"dialogVisible\"\r\n [isViewMode]=\"isViewMode\"\r\n [isEditMode]=\"isEditMode\"\r\n [useConfirmOnSave]=\"useConfirmOnSave\"\r\n [loading]=\"loading\"\r\n [errorMsg]=\"errorMsg\"\r\n [errorMessage]=\"errorMessage\"\r\n [beforeSaveTransform]=\"beforeSaveTransform\"\r\n (action)=\"action.emit($event)\"\r\n (afterSave)=\"afterSave.emit($event);onSubmit();\"\r\n (afterDelete)=\"afterDelete.emit($event)\"\r\n (beforeSave)=\"beforeSave.emit($event)\"\r\n (beforeDelete)=\"beforeDelete.emit($event)\"\r\n (formCancel)=\"formCancel.emit()\"\r\n (formInit)=\"formInit.emit($event)\"\r\n (dataLoaded)=\"dataLoaded.emit($event)\"\r\n (selectionChange)=\"selectionChange.emit($event)\"\r\n (error)=\"error.emit($event)\"\r\n (visibleChange)=\"visibleChange.emit($event)\"\r\n >\r\n </app-generic-dialog>\r\n\r\n <app-detail-view\r\n [displayMode]=\"displayMode\"\r\n [mode]=\"mode\"\r\n [title]=\"breadcrumb_?.[0]?.label || 'Detail'\"\r\n [service]=\"service\"\r\n [apiName]=\"service.apiName\"\r\n [moduleName]=\"service.moduleName\"\r\n [idField]=\"idField\"\r\n [actions]=\"actions\"\r\n [formFields]=\"formFields\"\r\n [model]=\"model\"\r\n [tabs]=\"tabs\"\r\n [loading]=\"loading\"\r\n [breadcrumb]=\"breadcrumb_\"\r\n [createEditActions]=\"createEditActions\"\r\n (action)=\"action.emit($event)\"\r\n >\r\n </app-detail-view>\r\n\r\n <!-- 🟢 مكون درج القوالب المحفوظة -->\r\n<!-- <saved-report-templates-drawer\r\n [(visible)]=\"templateDrawerVisible\"\r\n (visibleChange)=\"templateDrawerVisibleChange.emit($event)\"\r\n [filterFields]=\"filters\"\r\n [service]=\"service.moduleName\"\r\n [category]=\"category\"\r\n [feature]=\"feature\"\r\n (templateSelected)=\"templateSelected.emit($event)\">\r\n</saved-report-templates-drawer> -->\r\n\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -231,7 +231,7 @@ class GenericDialogComponent {
231
231
  this.action.emit({ name: 'cancel', row: null });
232
232
  }
233
233
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
234
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: GenericDialogComponent, isStandalone: true, selector: "app-generic-dialog", inputs: { form: "form", service: "service", formFields: "formFields", model: "model", apiName: "apiName", moduleName: "moduleName", idField: "idField", dialogMaxWidth: "dialogMaxWidth", displayMode: "displayMode", mode: "mode", forceState: "forceState", drawerVisible: "drawerVisible", dialogVisible: "dialogVisible", isViewMode: "isViewMode", isEditMode: "isEditMode", useConfirmOnSave: "useConfirmOnSave", loading: "loading", errorMsg: "errorMsg", errorMessage: "errorMessage", beforeSaveTransform: "beforeSaveTransform", hideTable: "hideTable", autoShowForm: "autoShowForm" }, outputs: { action: "action", afterSave: "afterSave", afterDelete: "afterDelete", beforeSave: "beforeSave", beforeDelete: "beforeDelete", formCancel: "formCancel", formInit: "formInit", dataLoaded: "dataLoaded", selectionChange: "selectionChange", error: "error", visibleChange: "visibleChange" }, providers: [MessageService], usesOnChanges: true, ngImport: i0, template: "<!-- Drawer -->\n@if (((typeof displayMode === 'string' ? displayMode : isEditMode ?\n displayMode['edit'] : isViewMode === false ? displayMode['add'] :\n displayMode['view']) === 'drawer') && (drawerVisible || (autoShowForm &&\n displayMode === 'drawer'))) {\n <p-drawer\n [(visible)]=\"drawerVisible\"\n [closable]=\"true\"\n [dismissible]=\"false\"\n [closeOnEscape]=\"true\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [styleClass]=\"mode === 'form-only' && forceState === 'view' ? '!w-full md:!w-80 lg:!w-[40rem] !h-full' : '!w-full md:!w-80 lg:!w-[40rem]'\"\n [modal]=\"mode !== 'form-only'\"\n [blockScroll]=\"mode !== 'form-only'\"\n >\n <ng-template pTemplate=\"header\">\n <span class=\"font-bold text-lg\">\n {{ isEditMode ? ('UPDATE' | translate): isViewMode === false ? ('ADD' |\n translate): ('VIEW' | translate) }}\n </span>\n </ng-template>\n <!-- (ngSubmit)=\"onSubmit()\" -->\n @if (form) {\n <form [formGroup]=\"form\" class=\"p-4\">\n <formly-form\n [form]=\"form\"\n [fields]=\"formFields_\"\n [model]=\"model\"\n [options]=\"options\"\n ></formly-form>\n </form>\n }\n\n @if (!isViewMode) {\n <ng-template pTemplate=\"footer\">\n <div class=\"flex justify-end gap-2\">\n <button\n pButton\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\n type=\"button\"\n (click)=\"onSubmit()\"\n [disabled]=\"loading || form.invalid\"\n [loading]=\"loading\"\n ></button>\n <button\n pButton\n label=\"{{ 'CANCEL' | translate }}\"\n severity=\"danger\"\n (click)=\"visibleChange.emit(false);closeForm();\"\n ></button>\n </div>\n </ng-template>\n }\n </p-drawer>\n}\n<!-- Dialog -->\n@if (((typeof displayMode === 'string' ? displayMode : isEditMode ?\n displayMode['edit'] : isViewMode === false ? displayMode['add'] :\n displayMode['view']) === 'dialog') && (dialogVisible || (autoShowForm &&\n displayMode === 'dialog'))) {\n <p-dialog\n [(visible)]=\"dialogVisible\"\n [closeOnEscape]=\"true\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [header]=\"isEditMode ? ('UPDATE' | translate) : isViewMode === false ? ('ADD'| translate) : ('VIEW'| translate)\"\n [modal]=\"mode !== 'form-only'\"\n [style]=\"mode === 'form-only' && forceState === 'view' ? { width: '100vw', height: '100vh', maxWidth: 'none' } : { width: '95vw', maxWidth: dialogMaxWidth }\"\n [closable]=\"mode !== 'form-only'\"\n [dismissableMask]=\"mode !== 'form-only'\"\n >\n <!-- [breakpoints]=\"{ '1200px': '50vw', '768px': '70vw', '560px': '95vw' }\" -->\n <div class=\"relative\">\n @if (isViewMode) {\n <div\n class=\"absolute inset-0 z-10 bg-white/50 pointer-events-auto rounded-md\"\n ></div>\n }\n @if (form) {\n <form [formGroup]=\"form\" class=\"p-4\">\n <formly-form\n [form]=\"form\"\n [fields]=\"formFields_\"\n [model]=\"model\"\n [options]=\"options\"\n ></formly-form>\n </form>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"flex justify-end gap-2\">\n @if (!isViewMode) {\n <button\n pButton\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\n type=\"button\"\n [disabled]=\"loading || form.invalid\"\n [loading]=\"loading\"\n (click)=\"onSubmit()\"\n ></button>\n }\n <button\n pButton\n label=\"{{ isViewMode ? ('CLOSE' | translate) : ('CANCEL' | translate) }}\"\n severity=\"secondary\"\n (click)=\"visibleChange.emit(false);closeForm();\"\n ></button>\n </div>\n </ng-template>\n </p-dialog>\n}\n\n<!-- Inline Form for form-only mode -->\n@if (mode === 'form-only' && displayMode === 'inline'){\n <div class=\"w-full\">\n @if (form) {\n <form [formGroup]=\"form\">\n <formly-form\n [form]=\"form\"\n [fields]=\"formFields_\"\n [model]=\"model\"\n [options]=\"options\"\n ></formly-form>\n </form>\n }\n </div>\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i4.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: "ngmodule", type: DialogModule }, { kind: "component", type: i5.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
234
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: GenericDialogComponent, isStandalone: true, selector: "app-generic-dialog", inputs: { form: "form", service: "service", formFields: "formFields", model: "model", apiName: "apiName", moduleName: "moduleName", idField: "idField", dialogMaxWidth: "dialogMaxWidth", displayMode: "displayMode", mode: "mode", forceState: "forceState", drawerVisible: "drawerVisible", dialogVisible: "dialogVisible", isViewMode: "isViewMode", isEditMode: "isEditMode", useConfirmOnSave: "useConfirmOnSave", loading: "loading", errorMsg: "errorMsg", errorMessage: "errorMessage", beforeSaveTransform: "beforeSaveTransform", hideTable: "hideTable", autoShowForm: "autoShowForm" }, outputs: { action: "action", afterSave: "afterSave", afterDelete: "afterDelete", beforeSave: "beforeSave", beforeDelete: "beforeDelete", formCancel: "formCancel", formInit: "formInit", dataLoaded: "dataLoaded", selectionChange: "selectionChange", error: "error", visibleChange: "visibleChange" }, providers: [MessageService], usesOnChanges: true, ngImport: i0, template: "<!-- Drawer -->\r\n@if (((typeof displayMode === 'string' ? displayMode : isEditMode ?\r\n displayMode['edit'] : isViewMode === false ? displayMode['add'] :\r\n displayMode['view']) === 'drawer') && (drawerVisible || (autoShowForm &&\r\n displayMode === 'drawer'))) {\r\n <p-drawer\r\n [(visible)]=\"drawerVisible\"\r\n [closable]=\"true\"\r\n [dismissible]=\"false\"\r\n [closeOnEscape]=\"true\"\r\n (visibleChange)=\"visibleChange.emit($event)\"\r\n [styleClass]=\"mode === 'form-only' && forceState === 'view' ? '!w-full md:!w-80 lg:!w-[40rem] !h-full' : '!w-full md:!w-80 lg:!w-[40rem]'\"\r\n [modal]=\"mode !== 'form-only'\"\r\n [blockScroll]=\"mode !== 'form-only'\"\r\n >\r\n <ng-template pTemplate=\"header\">\r\n <span class=\"font-bold text-lg\">\r\n {{ isEditMode ? ('UPDATE' | translate): isViewMode === false ? ('ADD' |\r\n translate): ('VIEW' | translate) }}\r\n </span>\r\n </ng-template>\r\n <!-- (ngSubmit)=\"onSubmit()\" -->\r\n @if (form) {\r\n <form [formGroup]=\"form\" class=\"p-4\">\r\n <formly-form\r\n [form]=\"form\"\r\n [fields]=\"formFields_\"\r\n [model]=\"model\"\r\n [options]=\"options\"\r\n ></formly-form>\r\n </form>\r\n }\r\n\r\n @if (!isViewMode) {\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end gap-2\">\r\n <button\r\n pButton\r\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\r\n type=\"button\"\r\n (click)=\"onSubmit()\"\r\n [disabled]=\"loading || form.invalid\"\r\n [loading]=\"loading\"\r\n ></button>\r\n <button\r\n pButton\r\n label=\"{{ 'CANCEL' | translate }}\"\r\n severity=\"danger\"\r\n (click)=\"visibleChange.emit(false);closeForm();\"\r\n ></button>\r\n </div>\r\n </ng-template>\r\n }\r\n </p-drawer>\r\n}\r\n<!-- Dialog -->\r\n@if (((typeof displayMode === 'string' ? displayMode : isEditMode ?\r\n displayMode['edit'] : isViewMode === false ? displayMode['add'] :\r\n displayMode['view']) === 'dialog') && (dialogVisible || (autoShowForm &&\r\n displayMode === 'dialog'))) {\r\n <p-dialog\r\n [(visible)]=\"dialogVisible\"\r\n [closeOnEscape]=\"true\"\r\n (visibleChange)=\"visibleChange.emit($event)\"\r\n [header]=\"isEditMode ? ('UPDATE' | translate) : isViewMode === false ? ('ADD'| translate) : ('VIEW'| translate)\"\r\n [modal]=\"mode !== 'form-only'\"\r\n [style]=\"mode === 'form-only' && forceState === 'view' ? { width: '100vw', height: '100vh', maxWidth: 'none' } : { width: '95vw', maxWidth: dialogMaxWidth }\"\r\n [closable]=\"mode !== 'form-only'\"\r\n [dismissableMask]=\"mode !== 'form-only'\"\r\n >\r\n <!-- [breakpoints]=\"{ '1200px': '50vw', '768px': '70vw', '560px': '95vw' }\" -->\r\n <div class=\"relative\">\r\n @if (isViewMode) {\r\n <div\r\n class=\"absolute inset-0 z-10 bg-white/50 pointer-events-auto rounded-md\"\r\n ></div>\r\n }\r\n @if (form) {\r\n <form [formGroup]=\"form\" class=\"p-4\">\r\n <formly-form\r\n [form]=\"form\"\r\n [fields]=\"formFields_\"\r\n [model]=\"model\"\r\n [options]=\"options\"\r\n ></formly-form>\r\n </form>\r\n }\r\n </div>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end gap-2\">\r\n @if (!isViewMode) {\r\n <button\r\n pButton\r\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\r\n type=\"button\"\r\n [disabled]=\"loading || form.invalid\"\r\n [loading]=\"loading\"\r\n (click)=\"onSubmit()\"\r\n ></button>\r\n }\r\n <button\r\n pButton\r\n label=\"{{ isViewMode ? ('CLOSE' | translate) : ('CANCEL' | translate) }}\"\r\n severity=\"secondary\"\r\n (click)=\"visibleChange.emit(false);closeForm();\"\r\n ></button>\r\n </div>\r\n </ng-template>\r\n </p-dialog>\r\n}\r\n\r\n<!-- Inline Form for form-only mode -->\r\n@if (mode === 'form-only' && displayMode === 'inline'){\r\n <div class=\"w-full\">\r\n @if (form) {\r\n <form [formGroup]=\"form\">\r\n <formly-form\r\n [form]=\"form\"\r\n [fields]=\"formFields_\"\r\n [model]=\"model\"\r\n [options]=\"options\"\r\n ></formly-form>\r\n </form>\r\n }\r\n </div>\r\n}\r\n", styles: [""], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i1.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i4.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: "ngmodule", type: DialogModule }, { kind: "component", type: i5.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
235
235
  }
236
236
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericDialogComponent, decorators: [{
237
237
  type: Component,
@@ -244,7 +244,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
244
244
  TranslatePipe,
245
245
  Drawer,
246
246
  DialogModule
247
- ], providers: [MessageService], template: "<!-- Drawer -->\n@if (((typeof displayMode === 'string' ? displayMode : isEditMode ?\n displayMode['edit'] : isViewMode === false ? displayMode['add'] :\n displayMode['view']) === 'drawer') && (drawerVisible || (autoShowForm &&\n displayMode === 'drawer'))) {\n <p-drawer\n [(visible)]=\"drawerVisible\"\n [closable]=\"true\"\n [dismissible]=\"false\"\n [closeOnEscape]=\"true\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [styleClass]=\"mode === 'form-only' && forceState === 'view' ? '!w-full md:!w-80 lg:!w-[40rem] !h-full' : '!w-full md:!w-80 lg:!w-[40rem]'\"\n [modal]=\"mode !== 'form-only'\"\n [blockScroll]=\"mode !== 'form-only'\"\n >\n <ng-template pTemplate=\"header\">\n <span class=\"font-bold text-lg\">\n {{ isEditMode ? ('UPDATE' | translate): isViewMode === false ? ('ADD' |\n translate): ('VIEW' | translate) }}\n </span>\n </ng-template>\n <!-- (ngSubmit)=\"onSubmit()\" -->\n @if (form) {\n <form [formGroup]=\"form\" class=\"p-4\">\n <formly-form\n [form]=\"form\"\n [fields]=\"formFields_\"\n [model]=\"model\"\n [options]=\"options\"\n ></formly-form>\n </form>\n }\n\n @if (!isViewMode) {\n <ng-template pTemplate=\"footer\">\n <div class=\"flex justify-end gap-2\">\n <button\n pButton\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\n type=\"button\"\n (click)=\"onSubmit()\"\n [disabled]=\"loading || form.invalid\"\n [loading]=\"loading\"\n ></button>\n <button\n pButton\n label=\"{{ 'CANCEL' | translate }}\"\n severity=\"danger\"\n (click)=\"visibleChange.emit(false);closeForm();\"\n ></button>\n </div>\n </ng-template>\n }\n </p-drawer>\n}\n<!-- Dialog -->\n@if (((typeof displayMode === 'string' ? displayMode : isEditMode ?\n displayMode['edit'] : isViewMode === false ? displayMode['add'] :\n displayMode['view']) === 'dialog') && (dialogVisible || (autoShowForm &&\n displayMode === 'dialog'))) {\n <p-dialog\n [(visible)]=\"dialogVisible\"\n [closeOnEscape]=\"true\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [header]=\"isEditMode ? ('UPDATE' | translate) : isViewMode === false ? ('ADD'| translate) : ('VIEW'| translate)\"\n [modal]=\"mode !== 'form-only'\"\n [style]=\"mode === 'form-only' && forceState === 'view' ? { width: '100vw', height: '100vh', maxWidth: 'none' } : { width: '95vw', maxWidth: dialogMaxWidth }\"\n [closable]=\"mode !== 'form-only'\"\n [dismissableMask]=\"mode !== 'form-only'\"\n >\n <!-- [breakpoints]=\"{ '1200px': '50vw', '768px': '70vw', '560px': '95vw' }\" -->\n <div class=\"relative\">\n @if (isViewMode) {\n <div\n class=\"absolute inset-0 z-10 bg-white/50 pointer-events-auto rounded-md\"\n ></div>\n }\n @if (form) {\n <form [formGroup]=\"form\" class=\"p-4\">\n <formly-form\n [form]=\"form\"\n [fields]=\"formFields_\"\n [model]=\"model\"\n [options]=\"options\"\n ></formly-form>\n </form>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"flex justify-end gap-2\">\n @if (!isViewMode) {\n <button\n pButton\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\n type=\"button\"\n [disabled]=\"loading || form.invalid\"\n [loading]=\"loading\"\n (click)=\"onSubmit()\"\n ></button>\n }\n <button\n pButton\n label=\"{{ isViewMode ? ('CLOSE' | translate) : ('CANCEL' | translate) }}\"\n severity=\"secondary\"\n (click)=\"visibleChange.emit(false);closeForm();\"\n ></button>\n </div>\n </ng-template>\n </p-dialog>\n}\n\n<!-- Inline Form for form-only mode -->\n@if (mode === 'form-only' && displayMode === 'inline'){\n <div class=\"w-full\">\n @if (form) {\n <form [formGroup]=\"form\">\n <formly-form\n [form]=\"form\"\n [fields]=\"formFields_\"\n [model]=\"model\"\n [options]=\"options\"\n ></formly-form>\n </form>\n }\n </div>\n}\n" }]
247
+ ], providers: [MessageService], template: "<!-- Drawer -->\r\n@if (((typeof displayMode === 'string' ? displayMode : isEditMode ?\r\n displayMode['edit'] : isViewMode === false ? displayMode['add'] :\r\n displayMode['view']) === 'drawer') && (drawerVisible || (autoShowForm &&\r\n displayMode === 'drawer'))) {\r\n <p-drawer\r\n [(visible)]=\"drawerVisible\"\r\n [closable]=\"true\"\r\n [dismissible]=\"false\"\r\n [closeOnEscape]=\"true\"\r\n (visibleChange)=\"visibleChange.emit($event)\"\r\n [styleClass]=\"mode === 'form-only' && forceState === 'view' ? '!w-full md:!w-80 lg:!w-[40rem] !h-full' : '!w-full md:!w-80 lg:!w-[40rem]'\"\r\n [modal]=\"mode !== 'form-only'\"\r\n [blockScroll]=\"mode !== 'form-only'\"\r\n >\r\n <ng-template pTemplate=\"header\">\r\n <span class=\"font-bold text-lg\">\r\n {{ isEditMode ? ('UPDATE' | translate): isViewMode === false ? ('ADD' |\r\n translate): ('VIEW' | translate) }}\r\n </span>\r\n </ng-template>\r\n <!-- (ngSubmit)=\"onSubmit()\" -->\r\n @if (form) {\r\n <form [formGroup]=\"form\" class=\"p-4\">\r\n <formly-form\r\n [form]=\"form\"\r\n [fields]=\"formFields_\"\r\n [model]=\"model\"\r\n [options]=\"options\"\r\n ></formly-form>\r\n </form>\r\n }\r\n\r\n @if (!isViewMode) {\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end gap-2\">\r\n <button\r\n pButton\r\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\r\n type=\"button\"\r\n (click)=\"onSubmit()\"\r\n [disabled]=\"loading || form.invalid\"\r\n [loading]=\"loading\"\r\n ></button>\r\n <button\r\n pButton\r\n label=\"{{ 'CANCEL' | translate }}\"\r\n severity=\"danger\"\r\n (click)=\"visibleChange.emit(false);closeForm();\"\r\n ></button>\r\n </div>\r\n </ng-template>\r\n }\r\n </p-drawer>\r\n}\r\n<!-- Dialog -->\r\n@if (((typeof displayMode === 'string' ? displayMode : isEditMode ?\r\n displayMode['edit'] : isViewMode === false ? displayMode['add'] :\r\n displayMode['view']) === 'dialog') && (dialogVisible || (autoShowForm &&\r\n displayMode === 'dialog'))) {\r\n <p-dialog\r\n [(visible)]=\"dialogVisible\"\r\n [closeOnEscape]=\"true\"\r\n (visibleChange)=\"visibleChange.emit($event)\"\r\n [header]=\"isEditMode ? ('UPDATE' | translate) : isViewMode === false ? ('ADD'| translate) : ('VIEW'| translate)\"\r\n [modal]=\"mode !== 'form-only'\"\r\n [style]=\"mode === 'form-only' && forceState === 'view' ? { width: '100vw', height: '100vh', maxWidth: 'none' } : { width: '95vw', maxWidth: dialogMaxWidth }\"\r\n [closable]=\"mode !== 'form-only'\"\r\n [dismissableMask]=\"mode !== 'form-only'\"\r\n >\r\n <!-- [breakpoints]=\"{ '1200px': '50vw', '768px': '70vw', '560px': '95vw' }\" -->\r\n <div class=\"relative\">\r\n @if (isViewMode) {\r\n <div\r\n class=\"absolute inset-0 z-10 bg-white/50 pointer-events-auto rounded-md\"\r\n ></div>\r\n }\r\n @if (form) {\r\n <form [formGroup]=\"form\" class=\"p-4\">\r\n <formly-form\r\n [form]=\"form\"\r\n [fields]=\"formFields_\"\r\n [model]=\"model\"\r\n [options]=\"options\"\r\n ></formly-form>\r\n </form>\r\n }\r\n </div>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end gap-2\">\r\n @if (!isViewMode) {\r\n <button\r\n pButton\r\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\r\n type=\"button\"\r\n [disabled]=\"loading || form.invalid\"\r\n [loading]=\"loading\"\r\n (click)=\"onSubmit()\"\r\n ></button>\r\n }\r\n <button\r\n pButton\r\n label=\"{{ isViewMode ? ('CLOSE' | translate) : ('CANCEL' | translate) }}\"\r\n severity=\"secondary\"\r\n (click)=\"visibleChange.emit(false);closeForm();\"\r\n ></button>\r\n </div>\r\n </ng-template>\r\n </p-dialog>\r\n}\r\n\r\n<!-- Inline Form for form-only mode -->\r\n@if (mode === 'form-only' && displayMode === 'inline'){\r\n <div class=\"w-full\">\r\n @if (form) {\r\n <form [formGroup]=\"form\">\r\n <formly-form\r\n [form]=\"form\"\r\n [fields]=\"formFields_\"\r\n [model]=\"model\"\r\n [options]=\"options\"\r\n ></formly-form>\r\n </form>\r\n }\r\n </div>\r\n}\r\n" }]
248
248
  }], propDecorators: { form: [{
249
249
  type: Input
250
250
  }], service: [{
@@ -1 +1 @@
1
- {"version":3,"file":"es.framework-ng.ui.core-generic-dialog.mjs","sources":["../../../../libs/ng.ui.core/generic-dialog/src/lib/generic-dialog-module.ts","../../../../libs/ng.ui.core/generic-dialog/src/lib/generic-dialog.ts","../../../../libs/ng.ui.core/generic-dialog/src/lib/generic-dialog.html","../../../../libs/ng.ui.core/generic-dialog/src/es.framework-ng.ui.core-generic-dialog.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class GenericDialogModule {}\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n Output,\r\n OnChanges,\r\n SimpleChanges,\r\n inject,\r\n} from '@angular/core';\r\n\r\nimport { ButtonModule } from 'primeng/button';\r\nimport {\r\n FormsModule,\r\n ReactiveFormsModule,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\nimport {\r\n FormlyFieldConfig,\r\n FormlyForm,\r\n FormlyFormOptions,\r\n} from '@ngx-formly/core';\r\nimport { MessageService } from 'primeng/api';\r\nimport { DrawerModule, Drawer } from 'primeng/drawer';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { BaseService, IdParserService, LocalizationService, SwalService } from '@es.framework/ng.core/services';\r\nimport { DialogModule } from 'primeng/dialog';\r\n\r\n@Component({\r\n standalone: true,\r\n selector: 'app-generic-dialog',\r\n imports: [\r\n ButtonModule,\r\n FormlyForm,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n DrawerModule,\r\n TranslatePipe,\r\n Drawer,\r\n DialogModule\r\n],\r\n providers: [MessageService],\r\n templateUrl: './generic-dialog.html',\r\n styleUrls: ['./generic-dialog.css'],\r\n})\r\nexport class GenericDialogComponent implements OnInit, OnChanges {\r\n private idParser= inject(IdParserService);\r\n // الخدمات المحقونة\r\n translate: LocalizationService = inject(LocalizationService);\r\n private swalService = inject(SwalService);\r\n\r\n // الحالة الداخلية للفورم\r\n @Input() form = new UntypedFormGroup({});\r\n options: FormlyFormOptions = {};\r\n formFields_: FormlyFieldConfig[] = [];\r\n model_: any = {};\r\n\r\n // المدخلات (Inputs)\r\n @Input() service: BaseService = inject(BaseService);\r\n @Input() formFields: FormlyFieldConfig[] = [];\r\n @Input() model: any;\r\n @Input() apiName = '';\r\n @Input() moduleName = '';\r\n @Input() idField = 'id';\r\n @Input() dialogMaxWidth = '40rem'; // أقصى عرض للدايلوج\r\n @Input() displayMode:\r\n | 'drawer'\r\n | 'dialog'\r\n | 'route'\r\n | 'inline'\r\n | Partial<\r\n Record<\r\n 'add' | 'edit' | 'view',\r\n 'drawer' | 'dialog' | 'route' | 'inline'\r\n >\r\n > = 'drawer';\r\n @Input() mode: 'full' | 'form-only' | 'table-only' | 'detail' = 'full'; // وضع العرض\r\n @Input() forceState: 'create' | 'edit' | 'view' | null = null; // إجبار حالة معينة\r\n @Input() drawerVisible = false; // ظهور الـ drawer\r\n @Input() dialogVisible = false; // ظهور الـ dialog\r\n @Input() isViewMode = false; // وضع المشاهدة فقط\r\n @Input() isEditMode = false; // وضع التعديل\r\n @Input() useConfirmOnSave = false; // استخدام تأكيد عند الحفظ\r\n @Input() loading = false; // حالة التحميل\r\n @Input() errorMsg = ''; // رسالة خطأ مختصرة\r\n @Input() errorMessage: string | any = ''; // رسالة خطأ تفصيلية\r\n @Input() beforeSaveTransform?: (record: any, isEdit: boolean) => any; // ⚡ دوال مخصصة قبل الحفظ\r\n\r\n // المدخلات المحسوبة\r\n @Input() get hideTable(): boolean {\r\n return (\r\n (this.mode === 'form-only' ||\r\n (this.forceState && this.mode !== 'table-only')) ??\r\n false\r\n );\r\n }\r\n\r\n @Input() get autoShowForm(): boolean {\r\n return this.mode === 'form-only' && !!this.forceState;\r\n }\r\n\r\n // المخرجات (Outputs)\r\n @Output() action = new EventEmitter<{ name: string; row: any }>();\r\n @Output() afterSave = new EventEmitter<{\r\n record: any;\r\n isEdit: boolean;\r\n response?: any;\r\n }>();\r\n @Output() afterDelete = new EventEmitter<{ record: any; response?: any }>();\r\n @Output() beforeSave = new EventEmitter<{ record: any; isEdit: boolean }>();\r\n @Output() beforeDelete = new EventEmitter<{ record: any }>();\r\n @Output() formCancel = new EventEmitter<void>();\r\n @Output() formInit = new EventEmitter<{\r\n form: UntypedFormGroup;\r\n model: any;\r\n }>();\r\n @Output() dataLoaded = new EventEmitter<{ data: any[]; total: number }>();\r\n @Output() selectionChange = new EventEmitter<{\r\n selected: any[];\r\n selectedCount: number;\r\n }>();\r\n @Output() error = new EventEmitter<{ error: any; context: string }>();\r\n @Output() visibleChange: EventEmitter<boolean> = new EventEmitter<boolean>();\r\n\r\n ngOnInit() {\r\n if (this.apiName && this.apiName != '') {\r\n this.service.apiName = this.apiName;\r\n this.service.moduleName = this.moduleName;\r\n }\r\n // Auto-show form when in form-only mode with forceState\r\n this.formFields_ = this.formFields;\r\n if (this.autoShowForm) {\r\n this.initializeFormState();\r\n }\r\n }\r\n ngOnChanges(changes: SimpleChanges) { }\r\n // Helper method to open form programmatically\r\n openForm(mode: 'create' | 'edit' | 'view', model?: any) {\r\n this.forceState = mode;\r\n this.formFields_ = this.formFields;\r\n if (model) {\r\n this.model = model;\r\n }\r\n else{\r\n this.model = {};\r\n }\r\n\r\n\r\n switch (mode) {\r\n case 'create':\r\n this.isEditMode = false;\r\n this.isViewMode = false;\r\n this.model = {};\r\n break;\r\n case 'edit':\r\n this.isEditMode = true;\r\n this.isViewMode = false;\r\n break;\r\n case 'view':\r\n this.isEditMode = false;\r\n this.isViewMode = true;\r\n break;\r\n }\r\n\r\n const modeConfig = typeof this.displayMode === 'string'\r\n ? this.displayMode\r\n : (this.displayMode as any)[mode] ?? 'drawer';\r\n\r\n // Trigger form opening based on displayMode\r\n if (modeConfig === 'drawer') {\r\n this.drawerVisible = true;\r\n } else if (modeConfig === 'dialog') {\r\n this.dialogVisible = true;\r\n }\r\n }\r\n\r\n\r\n // Method to close form programmatically\r\n closeForm() {\r\n this.drawerVisible = false;\r\n this.dialogVisible = false;\r\n this.forceState = null;\r\n }\r\n\r\n private initializeFormState() {\r\n if (this.forceState && this.mode === 'form-only') {\r\n this.formFields_ = this.formFields;\r\n switch (this.forceState) {\r\n case 'create':\r\n this.isEditMode = false;\r\n this.isViewMode = false;\r\n this.model = {};\r\n break;\r\n case 'edit':\r\n this.isEditMode = true;\r\n this.isViewMode = false;\r\n break;\r\n case 'view':\r\n this.isEditMode = false;\r\n this.isViewMode = true;\r\n break;\r\n }\r\n\r\n // Auto-show the form\r\n const modeConfig = typeof this.displayMode === 'string'\r\n ? this.displayMode\r\n : (this.displayMode as any)[this.forceState] ?? 'drawer';\r\n\r\n // Trigger form opening based on displayMode\r\n if (modeConfig === 'drawer') {\r\n this.drawerVisible = true;\r\n } else if (modeConfig === 'dialog') {\r\n this.dialogVisible = true;\r\n }\r\n }\r\n }\r\n\r\n onSubmit() {\r\n if (this.form.invalid) return;\r\n\r\n const save = () => {\r\n this.loading = true;\r\n this.errorMessage = null;\r\n\r\n // const id = this.isEditMode ? (this.model as any)[this.idField] : null;\r\n const id = this.isEditMode\r\n ? this.idParser.parseIds(this.model, this.idField)\r\n : null;\r\n\r\n // Emit beforeSave event\r\n const beforeSaveData = {\r\n record: { ...this.model },\r\n isEdit: this.isEditMode,\r\n };\r\n this.beforeSave.emit(beforeSaveData);\r\n\r\n // Allow parent to modify data before save\r\n let recordToSave = this.beforeSaveTransform\r\n ? this.beforeSaveTransform(beforeSaveData.record, this.isEditMode)\r\n : beforeSaveData.record;\r\n\r\n const operation$ = this.isEditMode\r\n ? this.service.update(id, recordToSave)\r\n : this.service.create(recordToSave);\r\n\r\n operation$.subscribe({\r\n next: (response: any) => {\r\n this.loading = false;\r\n\r\n // ✅ رسالة نجاح\r\n this.swalService.success(\r\n this.isEditMode ? 'تم التعديل بنجاح' : 'تم الحفظ بنجاح'\r\n );\r\n\r\n // Emit afterSave event\r\n this.afterSave.emit({\r\n record: recordToSave,\r\n isEdit: this.isEditMode,\r\n response: response,\r\n });\r\n this.visibleChange.emit(false);\r\n this.closeForm();\r\n if (this.mode != 'form-only') {\r\n }\r\n },\r\n error: (error: any) => {\r\n // ❌ ما نعرض رسالة خطأ هنا لأن الـ interceptor يتكفل فيها\r\n this.loading = false;\r\n this.error.emit({ error: error, context: 'save' });\r\n },\r\n });\r\n };\r\n\r\n if (this.useConfirmOnSave) {\r\n this.swalService\r\n .confirm(\r\n this.isEditMode ? 'تأكيد التعديل' : 'تأكيد الحفظ',\r\n this.isEditMode\r\n ? 'هل تريد حفظ التعديلات على هذا السجل؟'\r\n : 'هل تريد حفظ هذا السجل؟',\r\n 'نعم',\r\n 'إلغاء'\r\n )\r\n .then((result) => {\r\n if (result.isConfirmed) {\r\n save();\r\n }\r\n });\r\n } else {\r\n save();\r\n }\r\n }\r\n\r\n /** New cancel method for form-only mode */\r\n onCancel() {\r\n this.visibleChange.emit(false);\r\n // Emit cancel event for parent component to handle navigation\r\n this.action.emit({ name: 'cancel', row: null! });\r\n }\r\n}\r\n","<!-- Drawer -->\n@if (((typeof displayMode === 'string' ? displayMode : isEditMode ?\n displayMode['edit'] : isViewMode === false ? displayMode['add'] :\n displayMode['view']) === 'drawer') && (drawerVisible || (autoShowForm &&\n displayMode === 'drawer'))) {\n <p-drawer\n [(visible)]=\"drawerVisible\"\n [closable]=\"true\"\n [dismissible]=\"false\"\n [closeOnEscape]=\"true\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [styleClass]=\"mode === 'form-only' && forceState === 'view' ? '!w-full md:!w-80 lg:!w-[40rem] !h-full' : '!w-full md:!w-80 lg:!w-[40rem]'\"\n [modal]=\"mode !== 'form-only'\"\n [blockScroll]=\"mode !== 'form-only'\"\n >\n <ng-template pTemplate=\"header\">\n <span class=\"font-bold text-lg\">\n {{ isEditMode ? ('UPDATE' | translate): isViewMode === false ? ('ADD' |\n translate): ('VIEW' | translate) }}\n </span>\n </ng-template>\n <!-- (ngSubmit)=\"onSubmit()\" -->\n @if (form) {\n <form [formGroup]=\"form\" class=\"p-4\">\n <formly-form\n [form]=\"form\"\n [fields]=\"formFields_\"\n [model]=\"model\"\n [options]=\"options\"\n ></formly-form>\n </form>\n }\n\n @if (!isViewMode) {\n <ng-template pTemplate=\"footer\">\n <div class=\"flex justify-end gap-2\">\n <button\n pButton\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\n type=\"button\"\n (click)=\"onSubmit()\"\n [disabled]=\"loading || form.invalid\"\n [loading]=\"loading\"\n ></button>\n <button\n pButton\n label=\"{{ 'CANCEL' | translate }}\"\n severity=\"danger\"\n (click)=\"visibleChange.emit(false);closeForm();\"\n ></button>\n </div>\n </ng-template>\n }\n </p-drawer>\n}\n<!-- Dialog -->\n@if (((typeof displayMode === 'string' ? displayMode : isEditMode ?\n displayMode['edit'] : isViewMode === false ? displayMode['add'] :\n displayMode['view']) === 'dialog') && (dialogVisible || (autoShowForm &&\n displayMode === 'dialog'))) {\n <p-dialog\n [(visible)]=\"dialogVisible\"\n [closeOnEscape]=\"true\"\n (visibleChange)=\"visibleChange.emit($event)\"\n [header]=\"isEditMode ? ('UPDATE' | translate) : isViewMode === false ? ('ADD'| translate) : ('VIEW'| translate)\"\n [modal]=\"mode !== 'form-only'\"\n [style]=\"mode === 'form-only' && forceState === 'view' ? { width: '100vw', height: '100vh', maxWidth: 'none' } : { width: '95vw', maxWidth: dialogMaxWidth }\"\n [closable]=\"mode !== 'form-only'\"\n [dismissableMask]=\"mode !== 'form-only'\"\n >\n <!-- [breakpoints]=\"{ '1200px': '50vw', '768px': '70vw', '560px': '95vw' }\" -->\n <div class=\"relative\">\n @if (isViewMode) {\n <div\n class=\"absolute inset-0 z-10 bg-white/50 pointer-events-auto rounded-md\"\n ></div>\n }\n @if (form) {\n <form [formGroup]=\"form\" class=\"p-4\">\n <formly-form\n [form]=\"form\"\n [fields]=\"formFields_\"\n [model]=\"model\"\n [options]=\"options\"\n ></formly-form>\n </form>\n }\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"flex justify-end gap-2\">\n @if (!isViewMode) {\n <button\n pButton\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\n type=\"button\"\n [disabled]=\"loading || form.invalid\"\n [loading]=\"loading\"\n (click)=\"onSubmit()\"\n ></button>\n }\n <button\n pButton\n label=\"{{ isViewMode ? ('CLOSE' | translate) : ('CANCEL' | translate) }}\"\n severity=\"secondary\"\n (click)=\"visibleChange.emit(false);closeForm();\"\n ></button>\n </div>\n </ng-template>\n </p-dialog>\n}\n\n<!-- Inline Form for form-only mode -->\n@if (mode === 'form-only' && displayMode === 'inline'){\n <div class=\"w-full\">\n @if (form) {\n <form [formGroup]=\"form\">\n <formly-form\n [form]=\"form\"\n [fields]=\"formFields_\"\n [model]=\"model\"\n [options]=\"options\"\n ></formly-form>\n </form>\n }\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"es.framework-ng.ui.core-generic-dialog.mjs","sources":["../../../../libs/ng.ui.core/generic-dialog/src/lib/generic-dialog-module.ts","../../../../libs/ng.ui.core/generic-dialog/src/lib/generic-dialog.ts","../../../../libs/ng.ui.core/generic-dialog/src/lib/generic-dialog.html","../../../../libs/ng.ui.core/generic-dialog/src/es.framework-ng.ui.core-generic-dialog.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\n\r\n@NgModule({\r\n imports: [CommonModule],\r\n})\r\nexport class GenericDialogModule {}\r\n","import {\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n Output,\r\n OnChanges,\r\n SimpleChanges,\r\n inject,\r\n} from '@angular/core';\r\n\r\nimport { ButtonModule } from 'primeng/button';\r\nimport {\r\n FormsModule,\r\n ReactiveFormsModule,\r\n UntypedFormGroup,\r\n} from '@angular/forms';\r\nimport {\r\n FormlyFieldConfig,\r\n FormlyForm,\r\n FormlyFormOptions,\r\n} from '@ngx-formly/core';\r\nimport { MessageService } from 'primeng/api';\r\nimport { DrawerModule, Drawer } from 'primeng/drawer';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { BaseService, IdParserService, LocalizationService, SwalService } from '@es.framework/ng.core/services';\r\nimport { DialogModule } from 'primeng/dialog';\r\n\r\n@Component({\r\n standalone: true,\r\n selector: 'app-generic-dialog',\r\n imports: [\r\n ButtonModule,\r\n FormlyForm,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n DrawerModule,\r\n TranslatePipe,\r\n Drawer,\r\n DialogModule\r\n],\r\n providers: [MessageService],\r\n templateUrl: './generic-dialog.html',\r\n styleUrls: ['./generic-dialog.css'],\r\n})\r\nexport class GenericDialogComponent implements OnInit, OnChanges {\r\n private idParser= inject(IdParserService);\r\n // الخدمات المحقونة\r\n translate: LocalizationService = inject(LocalizationService);\r\n private swalService = inject(SwalService);\r\n\r\n // الحالة الداخلية للفورم\r\n @Input() form = new UntypedFormGroup({});\r\n options: FormlyFormOptions = {};\r\n formFields_: FormlyFieldConfig[] = [];\r\n model_: any = {};\r\n\r\n // المدخلات (Inputs)\r\n @Input() service: BaseService = inject(BaseService);\r\n @Input() formFields: FormlyFieldConfig[] = [];\r\n @Input() model: any;\r\n @Input() apiName = '';\r\n @Input() moduleName = '';\r\n @Input() idField = 'id';\r\n @Input() dialogMaxWidth = '40rem'; // أقصى عرض للدايلوج\r\n @Input() displayMode:\r\n | 'drawer'\r\n | 'dialog'\r\n | 'route'\r\n | 'inline'\r\n | Partial<\r\n Record<\r\n 'add' | 'edit' | 'view',\r\n 'drawer' | 'dialog' | 'route' | 'inline'\r\n >\r\n > = 'drawer';\r\n @Input() mode: 'full' | 'form-only' | 'table-only' | 'detail' = 'full'; // وضع العرض\r\n @Input() forceState: 'create' | 'edit' | 'view' | null = null; // إجبار حالة معينة\r\n @Input() drawerVisible = false; // ظهور الـ drawer\r\n @Input() dialogVisible = false; // ظهور الـ dialog\r\n @Input() isViewMode = false; // وضع المشاهدة فقط\r\n @Input() isEditMode = false; // وضع التعديل\r\n @Input() useConfirmOnSave = false; // استخدام تأكيد عند الحفظ\r\n @Input() loading = false; // حالة التحميل\r\n @Input() errorMsg = ''; // رسالة خطأ مختصرة\r\n @Input() errorMessage: string | any = ''; // رسالة خطأ تفصيلية\r\n @Input() beforeSaveTransform?: (record: any, isEdit: boolean) => any; // ⚡ دوال مخصصة قبل الحفظ\r\n\r\n // المدخلات المحسوبة\r\n @Input() get hideTable(): boolean {\r\n return (\r\n (this.mode === 'form-only' ||\r\n (this.forceState && this.mode !== 'table-only')) ??\r\n false\r\n );\r\n }\r\n\r\n @Input() get autoShowForm(): boolean {\r\n return this.mode === 'form-only' && !!this.forceState;\r\n }\r\n\r\n // المخرجات (Outputs)\r\n @Output() action = new EventEmitter<{ name: string; row: any }>();\r\n @Output() afterSave = new EventEmitter<{\r\n record: any;\r\n isEdit: boolean;\r\n response?: any;\r\n }>();\r\n @Output() afterDelete = new EventEmitter<{ record: any; response?: any }>();\r\n @Output() beforeSave = new EventEmitter<{ record: any; isEdit: boolean }>();\r\n @Output() beforeDelete = new EventEmitter<{ record: any }>();\r\n @Output() formCancel = new EventEmitter<void>();\r\n @Output() formInit = new EventEmitter<{\r\n form: UntypedFormGroup;\r\n model: any;\r\n }>();\r\n @Output() dataLoaded = new EventEmitter<{ data: any[]; total: number }>();\r\n @Output() selectionChange = new EventEmitter<{\r\n selected: any[];\r\n selectedCount: number;\r\n }>();\r\n @Output() error = new EventEmitter<{ error: any; context: string }>();\r\n @Output() visibleChange: EventEmitter<boolean> = new EventEmitter<boolean>();\r\n\r\n ngOnInit() {\r\n if (this.apiName && this.apiName != '') {\r\n this.service.apiName = this.apiName;\r\n this.service.moduleName = this.moduleName;\r\n }\r\n // Auto-show form when in form-only mode with forceState\r\n this.formFields_ = this.formFields;\r\n if (this.autoShowForm) {\r\n this.initializeFormState();\r\n }\r\n }\r\n ngOnChanges(changes: SimpleChanges) { }\r\n // Helper method to open form programmatically\r\n openForm(mode: 'create' | 'edit' | 'view', model?: any) {\r\n this.forceState = mode;\r\n this.formFields_ = this.formFields;\r\n if (model) {\r\n this.model = model;\r\n }\r\n else{\r\n this.model = {};\r\n }\r\n\r\n\r\n switch (mode) {\r\n case 'create':\r\n this.isEditMode = false;\r\n this.isViewMode = false;\r\n this.model = {};\r\n break;\r\n case 'edit':\r\n this.isEditMode = true;\r\n this.isViewMode = false;\r\n break;\r\n case 'view':\r\n this.isEditMode = false;\r\n this.isViewMode = true;\r\n break;\r\n }\r\n\r\n const modeConfig = typeof this.displayMode === 'string'\r\n ? this.displayMode\r\n : (this.displayMode as any)[mode] ?? 'drawer';\r\n\r\n // Trigger form opening based on displayMode\r\n if (modeConfig === 'drawer') {\r\n this.drawerVisible = true;\r\n } else if (modeConfig === 'dialog') {\r\n this.dialogVisible = true;\r\n }\r\n }\r\n\r\n\r\n // Method to close form programmatically\r\n closeForm() {\r\n this.drawerVisible = false;\r\n this.dialogVisible = false;\r\n this.forceState = null;\r\n }\r\n\r\n private initializeFormState() {\r\n if (this.forceState && this.mode === 'form-only') {\r\n this.formFields_ = this.formFields;\r\n switch (this.forceState) {\r\n case 'create':\r\n this.isEditMode = false;\r\n this.isViewMode = false;\r\n this.model = {};\r\n break;\r\n case 'edit':\r\n this.isEditMode = true;\r\n this.isViewMode = false;\r\n break;\r\n case 'view':\r\n this.isEditMode = false;\r\n this.isViewMode = true;\r\n break;\r\n }\r\n\r\n // Auto-show the form\r\n const modeConfig = typeof this.displayMode === 'string'\r\n ? this.displayMode\r\n : (this.displayMode as any)[this.forceState] ?? 'drawer';\r\n\r\n // Trigger form opening based on displayMode\r\n if (modeConfig === 'drawer') {\r\n this.drawerVisible = true;\r\n } else if (modeConfig === 'dialog') {\r\n this.dialogVisible = true;\r\n }\r\n }\r\n }\r\n\r\n onSubmit() {\r\n if (this.form.invalid) return;\r\n\r\n const save = () => {\r\n this.loading = true;\r\n this.errorMessage = null;\r\n\r\n // const id = this.isEditMode ? (this.model as any)[this.idField] : null;\r\n const id = this.isEditMode\r\n ? this.idParser.parseIds(this.model, this.idField)\r\n : null;\r\n\r\n // Emit beforeSave event\r\n const beforeSaveData = {\r\n record: { ...this.model },\r\n isEdit: this.isEditMode,\r\n };\r\n this.beforeSave.emit(beforeSaveData);\r\n\r\n // Allow parent to modify data before save\r\n let recordToSave = this.beforeSaveTransform\r\n ? this.beforeSaveTransform(beforeSaveData.record, this.isEditMode)\r\n : beforeSaveData.record;\r\n\r\n const operation$ = this.isEditMode\r\n ? this.service.update(id, recordToSave)\r\n : this.service.create(recordToSave);\r\n\r\n operation$.subscribe({\r\n next: (response: any) => {\r\n this.loading = false;\r\n\r\n // ✅ رسالة نجاح\r\n this.swalService.success(\r\n this.isEditMode ? 'تم التعديل بنجاح' : 'تم الحفظ بنجاح'\r\n );\r\n\r\n // Emit afterSave event\r\n this.afterSave.emit({\r\n record: recordToSave,\r\n isEdit: this.isEditMode,\r\n response: response,\r\n });\r\n this.visibleChange.emit(false);\r\n this.closeForm();\r\n if (this.mode != 'form-only') {\r\n }\r\n },\r\n error: (error: any) => {\r\n // ❌ ما نعرض رسالة خطأ هنا لأن الـ interceptor يتكفل فيها\r\n this.loading = false;\r\n this.error.emit({ error: error, context: 'save' });\r\n },\r\n });\r\n };\r\n\r\n if (this.useConfirmOnSave) {\r\n this.swalService\r\n .confirm(\r\n this.isEditMode ? 'تأكيد التعديل' : 'تأكيد الحفظ',\r\n this.isEditMode\r\n ? 'هل تريد حفظ التعديلات على هذا السجل؟'\r\n : 'هل تريد حفظ هذا السجل؟',\r\n 'نعم',\r\n 'إلغاء'\r\n )\r\n .then((result) => {\r\n if (result.isConfirmed) {\r\n save();\r\n }\r\n });\r\n } else {\r\n save();\r\n }\r\n }\r\n\r\n /** New cancel method for form-only mode */\r\n onCancel() {\r\n this.visibleChange.emit(false);\r\n // Emit cancel event for parent component to handle navigation\r\n this.action.emit({ name: 'cancel', row: null! });\r\n }\r\n}\r\n","<!-- Drawer -->\r\n@if (((typeof displayMode === 'string' ? displayMode : isEditMode ?\r\n displayMode['edit'] : isViewMode === false ? displayMode['add'] :\r\n displayMode['view']) === 'drawer') && (drawerVisible || (autoShowForm &&\r\n displayMode === 'drawer'))) {\r\n <p-drawer\r\n [(visible)]=\"drawerVisible\"\r\n [closable]=\"true\"\r\n [dismissible]=\"false\"\r\n [closeOnEscape]=\"true\"\r\n (visibleChange)=\"visibleChange.emit($event)\"\r\n [styleClass]=\"mode === 'form-only' && forceState === 'view' ? '!w-full md:!w-80 lg:!w-[40rem] !h-full' : '!w-full md:!w-80 lg:!w-[40rem]'\"\r\n [modal]=\"mode !== 'form-only'\"\r\n [blockScroll]=\"mode !== 'form-only'\"\r\n >\r\n <ng-template pTemplate=\"header\">\r\n <span class=\"font-bold text-lg\">\r\n {{ isEditMode ? ('UPDATE' | translate): isViewMode === false ? ('ADD' |\r\n translate): ('VIEW' | translate) }}\r\n </span>\r\n </ng-template>\r\n <!-- (ngSubmit)=\"onSubmit()\" -->\r\n @if (form) {\r\n <form [formGroup]=\"form\" class=\"p-4\">\r\n <formly-form\r\n [form]=\"form\"\r\n [fields]=\"formFields_\"\r\n [model]=\"model\"\r\n [options]=\"options\"\r\n ></formly-form>\r\n </form>\r\n }\r\n\r\n @if (!isViewMode) {\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end gap-2\">\r\n <button\r\n pButton\r\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\r\n type=\"button\"\r\n (click)=\"onSubmit()\"\r\n [disabled]=\"loading || form.invalid\"\r\n [loading]=\"loading\"\r\n ></button>\r\n <button\r\n pButton\r\n label=\"{{ 'CANCEL' | translate }}\"\r\n severity=\"danger\"\r\n (click)=\"visibleChange.emit(false);closeForm();\"\r\n ></button>\r\n </div>\r\n </ng-template>\r\n }\r\n </p-drawer>\r\n}\r\n<!-- Dialog -->\r\n@if (((typeof displayMode === 'string' ? displayMode : isEditMode ?\r\n displayMode['edit'] : isViewMode === false ? displayMode['add'] :\r\n displayMode['view']) === 'dialog') && (dialogVisible || (autoShowForm &&\r\n displayMode === 'dialog'))) {\r\n <p-dialog\r\n [(visible)]=\"dialogVisible\"\r\n [closeOnEscape]=\"true\"\r\n (visibleChange)=\"visibleChange.emit($event)\"\r\n [header]=\"isEditMode ? ('UPDATE' | translate) : isViewMode === false ? ('ADD'| translate) : ('VIEW'| translate)\"\r\n [modal]=\"mode !== 'form-only'\"\r\n [style]=\"mode === 'form-only' && forceState === 'view' ? { width: '100vw', height: '100vh', maxWidth: 'none' } : { width: '95vw', maxWidth: dialogMaxWidth }\"\r\n [closable]=\"mode !== 'form-only'\"\r\n [dismissableMask]=\"mode !== 'form-only'\"\r\n >\r\n <!-- [breakpoints]=\"{ '1200px': '50vw', '768px': '70vw', '560px': '95vw' }\" -->\r\n <div class=\"relative\">\r\n @if (isViewMode) {\r\n <div\r\n class=\"absolute inset-0 z-10 bg-white/50 pointer-events-auto rounded-md\"\r\n ></div>\r\n }\r\n @if (form) {\r\n <form [formGroup]=\"form\" class=\"p-4\">\r\n <formly-form\r\n [form]=\"form\"\r\n [fields]=\"formFields_\"\r\n [model]=\"model\"\r\n [options]=\"options\"\r\n ></formly-form>\r\n </form>\r\n }\r\n </div>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end gap-2\">\r\n @if (!isViewMode) {\r\n <button\r\n pButton\r\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\r\n type=\"button\"\r\n [disabled]=\"loading || form.invalid\"\r\n [loading]=\"loading\"\r\n (click)=\"onSubmit()\"\r\n ></button>\r\n }\r\n <button\r\n pButton\r\n label=\"{{ isViewMode ? ('CLOSE' | translate) : ('CANCEL' | translate) }}\"\r\n severity=\"secondary\"\r\n (click)=\"visibleChange.emit(false);closeForm();\"\r\n ></button>\r\n </div>\r\n </ng-template>\r\n </p-dialog>\r\n}\r\n\r\n<!-- Inline Form for form-only mode -->\r\n@if (mode === 'form-only' && displayMode === 'inline'){\r\n <div class=\"w-full\">\r\n @if (form) {\r\n <form [formGroup]=\"form\">\r\n <formly-form\r\n [form]=\"form\"\r\n [fields]=\"formFields_\"\r\n [model]=\"model\"\r\n [options]=\"options\"\r\n ></formly-form>\r\n </form>\r\n }\r\n </div>\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}