@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-search-advanced.mjs","sources":["../../../../libs/ng.ui.core/generic-search-advanced/src/lib/generic-search-advanced-module.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/query-builder.service.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/generic-search-advanced.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/generic-search-advanced.html","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/sort-builder.component.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/query-builder.component.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/query-builder.component.html","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/tab-type.component.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/columns-builder.component.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/group-builder.component.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/group.component.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/formly-config.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/es.framework-ng.ui.core-generic-search-advanced.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class GenericSearchAdvancedModule {}\n","// query-builder.service.ts\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { FormlyFieldConfig } from '@ngx-formly/core';\r\nimport { QueryBuilderField, SortBuilderField, GroupByField, SelectField } from './interfaces';\r\nimport { LocalizationService } from '@es.framework/ng.core/services';\r\nimport { FilterCondition, QueryParameters, QueryParser } from '@es.framework/ng.core/services';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class QueryBuilderService {\r\n translate: LocalizationService = inject(LocalizationService);\r\n\r\n // Field type configuration that matches QueryBuilderComponent\r\n private fieldTypeConfig = {\r\n 'input': { defaultOperator: 'contains', defaultValue: '', operators: ['eq', 'ne', 'contains', 'startswith', 'endswith'] },\r\n 'number': { defaultOperator: 'eq', defaultValue: null, operators: ['eq', 'ne', 'gt', 'ge', 'lt', 'le'] },\r\n 'datepicker': { defaultOperator: 'eq', defaultValue: null, operators: ['eq', 'ne', 'gt', 'ge', 'lt', 'le'] },\r\n 'select': { defaultOperator: 'eq', defaultValue: '', operators: ['eq', 'ne', 'in', 'notin'] },\r\n 'checkbox': { defaultOperator: 'eq', defaultValue: null, operators: ['eq', 'ne'] },\r\n 'generic-selector': { defaultOperator: 'eq', defaultValue: null, operators: ['eq', 'ne', 'in', 'notin'] },\r\n 'switch': { defaultOperator: 'eq', defaultValue: null, operators: ['eq', 'ne'] },\r\n 'radio': { defaultOperator: 'eq', defaultValue: '', operators: ['eq', 'ne'] },\r\n 'textarea': { defaultOperator: 'contains', defaultValue: '', operators: ['eq', 'ne', 'contains', 'startswith', 'endswith'] }\r\n };\r\n\r\n buildQueryUIFields(fields: FormlyFieldConfig[],enableSelect:boolean,enableGroup:boolean): FormlyFieldConfig[] {\r\n return [\r\n {\r\n type: 'tab-type',\r\n props: {\r\n tabViewClass: 'advanced-query-tabs',\r\n scrollable: false,\r\n lazy: true,\r\n activeIndex: 0\r\n },\r\n fieldGroup: this.getQueryTabs(fields,enableSelect,enableGroup)\r\n }\r\n ];\r\n }\r\n\r\n private getQueryTabs(fields: FormlyFieldConfig[],enableSelect:boolean,enableGroup:boolean): FormlyFieldConfig[] {\r\n const tabs: (FormlyFieldConfig | false)[] = [\r\n {\r\n type: 'group',\r\n props: {\r\n tabLabel: 'FILTERS',\r\n // label: 'FILTERS',\r\n leftIcon: 'pi pi-filter',\r\n badge: (field: FormlyFieldConfig) => {\r\n const fieldGroup = (field?.fieldGroup ?? [])[0] as any;\r\n return (fieldGroup?.model?.advancedFilters ?? [])[0]?.conditions?.length || 0;\r\n },\r\n },\r\n fieldGroup: this.getFilterTabFields(fields)\r\n },\r\n {\r\n type: 'group',\r\n props: {\r\n tabLabel: 'SORTING',\r\n // label: 'SORTING',\r\n leftIcon: 'pi pi-sort-alt',\r\n badge: (field: FormlyFieldConfig) => {\r\n const fieldGroup = (field?.fieldGroup ?? [])[0] as any;\r\n return (fieldGroup?.model?.sorting ?? [])?.length || 0;\r\n },\r\n },\r\n fieldGroup: this.getSortingTabFields(fields)\r\n },\r\n enableGroup && {\r\n type: 'group',\r\n props: {\r\n tabLabel: 'GROUPING',\r\n // label: 'GROUPING',\r\n leftIcon: 'pi pi-table',\r\n badge: (field: FormlyFieldConfig) => {\r\n const fieldGroup = (field?.fieldGroup ?? [])[0] as any;\r\n return (fieldGroup?.model?.grouping ?? [])?.length || 0;\r\n },\r\n },\r\n fieldGroup: this.getGroupingTabFields(fields)\r\n },\r\n enableSelect && {\r\n type: 'group',\r\n props: {\r\n tabLabel: 'COLUMNS',\r\n // label: 'COLUMNS',\r\n leftIcon: 'pi pi-list',\r\n badge: (field: FormlyFieldConfig) => {\r\n const fieldGroup = (field?.fieldGroup ?? [])[0] as any;\r\n const columns = fieldGroup?.model?.columns;\r\n\r\n // Handle both array and object formats for columns\r\n if (Array.isArray(columns)) {\r\n return columns.filter((col: any) => col?.isVisible)?.length || 0;\r\n } else if (columns && typeof columns === 'object') {\r\n // If columns is an object, count the visible ones\r\n return Object.values(columns).filter((col: any) => col?.isVisible)?.length || 0;\r\n }\r\n\r\n return 0;\r\n },\r\n },\r\n fieldGroup: this.getColumnsTabFields(fields)\r\n },\r\n {\r\n type: 'group',\r\n props: {\r\n tabLabel: 'PAGINATION',\r\n // label: 'PAGINATION',\r\n leftIcon: 'pi pi-cog',\r\n badge: (field: FormlyFieldConfig) => {\r\n return field?.model?.pagination && field?.model?.pagination?.top ? 1 : 0;\r\n },\r\n },\r\n fieldGroup: this.getPaginationTabFields()\r\n }\r\n ];\r\n return tabs.filter(Boolean) as FormlyFieldConfig[];\r\n }\r\n\r\n private getFilterTabFields(fields: FormlyFieldConfig[]): FormlyFieldConfig[] {\r\n return [\r\n {\r\n key: 'advancedFilters',\r\n type: 'query-builder',\r\n props: {\r\n label: 'فلاتر متقدمة',\r\n description: 'أنشئ فلاتر معقدة باستخدام مشغلين منطقيين',\r\n fields: this.extractFilterableFields(fields)\r\n }\r\n }\r\n ];\r\n }\r\n\r\n private getSortingTabFields(fields: FormlyFieldConfig[]): FormlyFieldConfig[] {\r\n return [\r\n {\r\n key: 'sorting',\r\n type: 'sort-builder',\r\n props: {\r\n label: 'ترتيب النتائج',\r\n description: 'حدد أولوية وعرض ترتيب البيانات',\r\n fields: this.extractSortableFields(fields)\r\n }\r\n }\r\n ];\r\n }\r\n\r\n private getGroupingTabFields(fields: FormlyFieldConfig[]): FormlyFieldConfig[] {\r\n return [\r\n {\r\n key: 'grouping',\r\n type: 'group-builder',\r\n props: {\r\n label: 'تجميع البيانات',\r\n description: 'قم بتجميع البيانات حسب الحقول المطلوبة',\r\n fields: this.extractGroupableFields(fields),\r\n maxGroups: 3\r\n }\r\n }\r\n ];\r\n }\r\n\r\n private getColumnsTabFields(fields: FormlyFieldConfig[]): FormlyFieldConfig[] {\r\n return [\r\n {\r\n key: 'columns',\r\n type: 'columns-builder',\r\n props: {\r\n label: 'إدارة الأعمدة',\r\n description: 'اختر الحقول المراد عرضها وتخصيص التجميع',\r\n fields: this.extractSelectableFields(fields)\r\n }\r\n }\r\n ];\r\n }\r\n\r\n private getPaginationTabFields(): FormlyFieldConfig[] {\r\n return [\r\n {\r\n key: 'pagination',\r\n type: 'group',\r\n props: {\r\n label: '',\r\n description: '',\r\n collapsible: false,\r\n showFieldCount: true,\r\n variant: 'card'\r\n },\r\n fieldGroup: [\r\n {\r\n key: 'top',\r\n type: 'input',\r\n props: {\r\n type: 'number',\r\n label: 'الحد الأقصى للسجلات',\r\n min: 1,\r\n max: 1000,\r\n description: 'أقصى عدد للسجلات المراد عرضها'\r\n }\r\n },\r\n {\r\n key: 'skip',\r\n type: 'input',\r\n props: {\r\n type: 'number',\r\n label: 'تخطي السجلات',\r\n min: 0,\r\n description: 'عدد السجلات التي سيتم تخطيها'\r\n }\r\n },\r\n {\r\n key: 'includeCount',\r\n type: 'checkbox',\r\n props: {\r\n label: 'تضمين العدد الإجمالي',\r\n description: 'تضمين عدد السجلات الإجمالي في الاستجابة'\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n\r\n private extractFilterableFields(fields: FormlyFieldConfig[]): QueryBuilderField[] {\r\n const filterableFields: QueryBuilderField[] = [];\r\n\r\n this.traverseFields(fields, (field) => {\r\n if (field.key && field.props && ((field.props['filter'] && field.props['filter'].hidden == false) || !field.props['filter']) && !field.props?.hidden) {\r\n const fieldType = this.mapFieldType(field.type as string);\r\n const fieldConfig = this.fieldTypeConfig[fieldType as keyof typeof this.fieldTypeConfig] || this.fieldTypeConfig.input;\r\n\r\n filterableFields.push({\r\n key: field.props['entityKey'] ? field.props['entityKey'] as string : field.key as string,\r\n label: this.translate.instant(field.props.label || (field.key as string)),\r\n type: fieldType,\r\n props: { ...field.props },\r\n operators: fieldConfig.operators,\r\n defaultOperator: fieldConfig.defaultOperator,\r\n defaultValue: fieldConfig.defaultValue\r\n });\r\n }\r\n });\r\n\r\n return filterableFields;\r\n }\r\n\r\n\r\n private extractSortableFields(fields: FormlyFieldConfig[]): SortBuilderField[] {\r\n const sortableFields: SortBuilderField[] = [];\r\n\r\n this.traverseFields(fields, (field) => {\r\n if (field.key && field.props && ((field.props['sort'] && field.props['sort'].hidden == false) || !field.props['sort'])&& !field.props?.hidden) {\r\n sortableFields.push({\r\n key: field.props['entityKey'] ? field.props['entityKey'] as string : field.key as string,\r\n label: this.translate.instant(field.props.label || field.key as string)\r\n });\r\n }\r\n });\r\n\r\n return sortableFields;\r\n }\r\n\r\n private extractGroupableFields(fields: FormlyFieldConfig[]): GroupByField[] {\r\n const groupableFields: GroupByField[] = [];\r\n\r\n this.traverseFields(fields, (field) => {\r\n if (field.key && field.props && ((field.props['group'] && field.props['group'].hidden == false) || !field.props['group']) && !field.props?.hidden) {\r\n groupableFields.push({\r\n key: field.props['entityKey'] ? field.props['entityKey'] as string : field.key as string,\r\n label: this.translate.instant(field.props.label || field.key as string),\r\n dataType: this.getDataType(field.type as string)\r\n });\r\n }\r\n });\r\n\r\n return groupableFields;\r\n }\r\n\r\nprivate extractSelectableFields(fields: FormlyFieldConfig[]): SelectField[] {\r\n const tempFields: (SelectField & { order: number })[] = [];\r\n\r\n this.traverseFields(fields, (field) => {\r\n if (\r\n field.key &&\r\n field.props &&\r\n // ((field.props['select'] && field.props['select'].hidden === false) || !field.props['select']) &&\r\n ((field.props['report'] && field.props['report'].hidden === false) || !field.props['report']) &&\r\n !field.props?.hidden\r\n ) {\r\n const isNumeric = ['number', 'currency'].includes(field.type as string);\r\n\r\n const tableConfig = field.props['table'] ?? {};\r\n const mergedProps = { ...field.props, ...(tableConfig.props ?? {}) };\r\n const order: number =\r\n (tableConfig.order as number | undefined) ??\r\n (tableConfig.props?.order as number | undefined) ??\r\n (mergedProps['order'] as number | undefined) ??\r\n Number.MAX_SAFE_INTEGER;\r\n\r\n tempFields.push({\r\n key: field.props['entityKey'] ? (field.props['entityKey'] as string) : (field.key as string),\r\n label: this.translate.instant(field.props.label || (field.key as string)),\r\n dataType: this.getDataType(field.type as string),\r\n isNumeric,\r\n defaultVisible: field.props['defaultVisible'] !== false,\r\n aggregatable: isNumeric && field.props['aggregatable'] !== false,\r\n order\r\n });\r\n }\r\n });\r\n\r\n return tempFields\r\n .sort((a, b) => a.order - b.order)\r\n .map(({ order, ...rest }) => rest as SelectField); // remove order after sorting\r\n}\r\n\r\n private traverseFields(fields: FormlyFieldConfig[], callback: (field: FormlyFieldConfig) => void): void {\r\n fields.forEach(field => {\r\n callback(field);\r\n if (field.fieldGroup) {\r\n this.traverseFields(field.fieldGroup, callback);\r\n }\r\n });\r\n }\r\ngetAppliedFiltersCount(model: any): { total: number; breakdown: any } {\r\n const breakdown = {\r\n filters: 0,\r\n sorting: 0,\r\n grouping: 0,\r\n columns: 0,\r\n pagination: 0,\r\n expand: 0\r\n };\r\n\r\n // Advanced filters\r\n if (model?.advancedFilters && Array.isArray(model.advancedFilters)) {\r\n model.advancedFilters.forEach((filterGroup: any) => {\r\n if (filterGroup.conditions && Array.isArray(filterGroup.conditions)) {\r\n breakdown.filters += filterGroup.conditions.length;\r\n }\r\n });\r\n }\r\n\r\n // Sorting\r\n if (model?.sorting && Array.isArray(model.sorting)) {\r\n breakdown.sorting = model.sorting.length;\r\n }\r\n\r\n // Grouping\r\n if (model?.grouping && Array.isArray(model.grouping)) {\r\n breakdown.grouping = model.grouping.length;\r\n }\r\n\r\n // Columns\r\n if (model?.columns) {\r\n if (Array.isArray(model.columns)) {\r\n breakdown.columns = model.columns.filter((col: any) => col.isVisible).length;\r\n } else if (typeof model.columns === 'object') {\r\n breakdown.columns = Object.values(model.columns).filter((col: any) => col?.isVisible).length;\r\n }\r\n }\r\n\r\n // Pagination\r\n if (model?.pagination) {\r\n if (model.pagination.top) breakdown.pagination += 1;\r\n if (model.pagination.skip) breakdown.pagination += 1;\r\n if (model.pagination.includeCount) breakdown.pagination += 1;\r\n }\r\n\r\n // Expand\r\n if (model?.expand && Array.isArray(model.expand)) {\r\n breakdown.expand = model.expand.length;\r\n }\r\n\r\n return {\r\n total: Object.values(breakdown).reduce((sum, count) => sum + count, 0),\r\n breakdown\r\n };\r\n}\r\n private mapFieldType(type?: string): string {\r\n const typeMap: { [key: string]: string } = {\r\n 'input': 'input',\r\n 'number': 'number',\r\n 'datepicker': 'datepicker',\r\n 'select': 'select',\r\n 'checkbox': 'checkbox',\r\n 'generic-selector': 'generic-selector',\r\n 'switch': 'switch',\r\n 'radio': 'radio',\r\n 'textarea': 'textarea',\r\n 'currency': 'number'\r\n };\r\n\r\n return typeMap[type || 'input'] || 'input';\r\n }\r\n\r\n private getDataType(type?: string): string {\r\n const dataTypeMap: { [key: string]: string } = {\r\n 'input': 'string',\r\n 'number': 'number',\r\n 'datepicker': 'date',\r\n 'select': 'string',\r\n 'checkbox': 'boolean',\r\n 'generic-selector': 'string',\r\n 'switch': 'boolean',\r\n 'radio': 'string',\r\n 'textarea': 'string',\r\n 'currency': 'number'\r\n };\r\n\r\n return dataTypeMap[type || 'input'] || 'string';\r\n }\r\n\r\nprivate getOperatorsForType(type?: string): string[] {\r\n const fieldType = this.mapFieldType(type);\r\n const config = this.fieldTypeConfig[fieldType as keyof typeof this.fieldTypeConfig];\r\n return config ? config.operators : ['eq', 'ne'];\r\n }\r\n\r\n // Enhanced OData methods with GroupBy and Select support\r\n buildODataFromQueryModel(model: any, originalFields: FormlyFieldConfig[]): QueryParameters {\r\n\r\n const params: QueryParameters = {\r\n filters: [],\r\n orderBy: [],\r\n groupBy: [],\r\n select: [],\r\n aggregates: [],\r\n expand: model.expand || [],\r\n includeCount: model.pagination?.includeCount || false\r\n };\r\n\r\n // Quick search\r\n if (model.filter) {\r\n const searchableFields = this.extractSelectableFields(originalFields); // TODO get all strings filters\r\n const quickSearchConditions: FilterCondition[] = searchableFields.map(field => ({\r\n field: field.key,\r\n operator: 'contains',\r\n value: model.filter\r\n }));\r\n\r\n if (quickSearchConditions.length > 0) {\r\n params.filters.push({\r\n logicalOperator: 'or',\r\n conditions: quickSearchConditions\r\n });\r\n }\r\n }\r\n\r\n // Advanced filters\r\n if (model.advancedFilters && Array.isArray(model.advancedFilters)) {\r\n params.filters.push(...model.advancedFilters);\r\n }\r\n\r\n // Sorting\r\n if (model.sorting && Array.isArray(model.sorting)) {\r\n params.orderBy = model.sorting\r\n .filter((sort: any) => sort.field && sort.direction)\r\n .map((sort: any) => ({\r\n field: sort.field,\r\n direction: sort.direction\r\n }));\r\n }\r\n\r\n // Grouping\r\n if (model.grouping && Array.isArray(model.grouping)) {\r\n params.groupBy = model.grouping\r\n .filter((group: any) => group.field)\r\n .map((group: any, index: number) => ({\r\n propertyName: group.field,\r\n displayName: group.displayName || group.field,\r\n showTotal: group.showTotal !== false,\r\n order: index\r\n }));\r\n }\r\n\r\n\r\n // Columns/Select - Handle both array and object formats\r\n // extractSelectableFields\r\nif (model.columns) {\r\n let visibleColumns: any[] = [];\r\n\r\n // Handle array format: [{field: 'name', isVisible: true, ...}, ...]\r\n if (Array.isArray(model.columns)) {\r\n visibleColumns = model.columns.filter((col: any) => col.isVisible);\r\n }\r\n // Handle object format: {field1: {isVisible: true, displayName: 'Name', ...}, field2: {...}}\r\n else if (typeof model.columns === 'object') {\r\n visibleColumns = Object.entries(model.columns)\r\n .filter(([key, col]: [string, any]) => col.isVisible)\r\n .map(([key, col]: [string, any]) => ({\r\n field: key, // Use the object key as field name\r\n ...col // Spread the column properties\r\n }));\r\n }\r\n\r\n // Process visible columns for select and aggregates\r\n if (visibleColumns.length > 0) {\r\n params.select = visibleColumns.map((col: any, index: number) => ({\r\n propertyName: col.field || col.key, // Support both 'field' and 'key' properties\r\n displayName: col.displayName || col.field || col.key || col.label,\r\n aggregateFunction: col.aggregateFunction,\r\n isVisible: true,\r\n order: index\r\n }));\r\n\r\n // Extract aggregates from columns with aggregate functions\r\n const aggregateColumns = visibleColumns.filter((col: any) => col.aggregateFunction);\r\n params.aggregates = aggregateColumns.map((col: any) => ({\r\n propertyName: col.field || col.key,\r\n aggregateFunction: col.aggregateFunction,\r\n alias: `${col.aggregateFunction}_${col.field || col.key}`\r\n }));\r\n }\r\n}\r\nelse{\r\n // Fallback: auto-generate from formly fields\r\n const selectableFields = this.extractSelectableFields(originalFields);\r\n // Ensure a column for the ID field exists\r\n// if (!selectableFields.some(f => f.key === this.idField)) {\r\n// selectableFields.unshift({\r\n// key: this.idField,\r\n// label: this.translate.instant(this.idField),\r\n// dataType: 'number', // or the correct type\r\n// isNumeric: false,\r\n// defaultVisible: true,\r\n// aggregatable: false\r\n// });\r\n// }\r\n\r\n params.select = selectableFields.map((f, i) => ({\r\n propertyName: f.key,\r\n displayName: f.label,\r\n isVisible: f.defaultVisible,\r\n order: i\r\n }));\r\n\r\n params.aggregates = selectableFields\r\n .filter(f => f.aggregatable)\r\n .map(f => ({\r\n propertyName: f.key,\r\n aggregateFunction: 'sum',\r\n alias: `sum_${f.key}`\r\n }));\r\n}\r\n\r\n // Pagination\r\n if (model.pagination) {\r\n if (model.pagination.top) {\r\n params.top = Number(model.pagination.top);\r\n }\r\n if (model.pagination.skip) {\r\n params.skip = Number(model.pagination.skip);\r\n }\r\n if (model.pagination.includeCount !== undefined) {\r\n params.includeCount = model.pagination.includeCount;\r\n }\r\n }\r\n\r\n return params;\r\n }\r\n\r\n toODataQueryString(params: QueryParameters): string {\r\n return QueryParser.toString(params);\r\n }\r\n\r\n parseODataQuery(queryString: string): QueryParameters {\r\n return QueryParser.parse(queryString);\r\n }\r\n\r\n\r\n // Helper method to get field configuration\r\n getFieldConfig(fieldKey: string, fields: any[]): any {\r\n return fields.find(f => f.key === fieldKey);\r\n }\r\n\r\n // Helper to get available aggregate functions for numeric fields\r\n getAggregateFunctions(): { label: string; value: string; }[] {\r\n return [\r\n { label: 'مجموع', value: 'sum' },\r\n { label: 'متوسط', value: 'avg' },\r\n { label: 'عدد', value: 'count' },\r\n { label: 'الحد الأدنى', value: 'min' },\r\n { label: 'الحد الأقصى', value: 'max' }\r\n ];\r\n }\r\n\r\n\r\n queryParamsToFormModel(params: QueryParameters): any {\r\n const model: any = {\r\n advancedFilters: [],\r\n sorting: [],\r\n grouping: [],\r\n columns: [],\r\n pagination: {},\r\n expand: [],\r\n filter: ''\r\n };\r\n\r\n // Extract quick search from filters\r\n const orFilterGroup = params.filters.find(fg =>\r\n fg.logicalOperator === 'or' &&\r\n fg.conditions?.every(c => c.operator === 'contains' && c.value === fg.conditions[0]?.value)\r\n );\r\n\r\n if (orFilterGroup?.conditions?.length) {\r\n model.filter = orFilterGroup.conditions[0].value;\r\n // Remove the quick search from advanced filters\r\n params.filters = params.filters.filter(fg => fg !== orFilterGroup);\r\n }\r\n\r\n // Advanced filters\r\n if (params.filters.length > 0) {\r\n model.advancedFilters = params.filters;\r\n }\r\n\r\n // Sorting\r\n if (params.orderBy && params.orderBy.length > 0) {\r\n model.sorting = params.orderBy.map(ob => ({\r\n field: ob.field,\r\n direction: ob.direction\r\n }));\r\n }\r\n\r\n // Grouping\r\n if (params.groupBy && params.groupBy.length > 0) {\r\n model.grouping = params.groupBy.map(gb => ({\r\n field: gb.propertyName,\r\n displayName: gb.displayName,\r\n showTotal: gb.showTotal,\r\n order: gb.order\r\n }));\r\n }\r\n\r\n // Columns/Select - Convert to array format\r\n if (params.select && params.select.length > 0) {\r\n model.columns = params.select.map(sc => {\r\n const col: any = {\r\n field: sc.propertyName,\r\n isVisible: sc.isVisible !== false,\r\n displayName: sc.displayName || sc.propertyName,\r\n order: sc.order || 0\r\n };\r\n\r\n // Add aggregate function if this column has an aggregate\r\n if (params.aggregates) {\r\n const aggregate = params.aggregates.find(agg => agg.propertyName === sc.propertyName);\r\n if (aggregate) {\r\n col.aggregateFunction = aggregate.aggregateFunction;\r\n }\r\n }\r\n\r\n return col;\r\n });\r\n\r\n // Sort columns by order\r\n model.columns.sort((a: any, b: any) => (a.order || 0) - (b.order || 0));\r\n }\r\n\r\n // Aggregates (if not already handled via columns)\r\n if (params.aggregates && params.aggregates.length > 0) {\r\n // Ensure aggregates are linked to columns\r\n if (!model.columns) {\r\n model.columns = [];\r\n }\r\n\r\n params.aggregates.forEach(agg => {\r\n const existingColumn = model.columns.find((c: any) => c.field === agg.propertyName);\r\n if (!existingColumn) {\r\n model.columns.push({\r\n field: agg.propertyName,\r\n isVisible: false, // Aggregate-only columns are typically not visible in select\r\n displayName: agg.propertyName,\r\n aggregateFunction: agg.aggregateFunction\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Pagination\r\n if (params.top !== undefined || params.skip !== undefined || params.includeCount !== undefined) {\r\n model.pagination = {\r\n top: params.top,\r\n skip: params.skip,\r\n includeCount: params.includeCount\r\n };\r\n }\r\n\r\n // Expand\r\n if (params.expand && params.expand.length > 0) {\r\n model.expand = params.expand;\r\n }\r\n\r\n return model;\r\n}\r\n}\r\n","// generic-search.component.ts\nimport { Component, EventEmitter, Input, OnInit, Output, ViewChild, inject } from '@angular/core';\n\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FormlyFieldConfig, FormlyForm, FormlyFormOptions } from '@ngx-formly/core';\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\nimport { ToolbarModule } from 'primeng/toolbar';\nimport { ButtonModule } from 'primeng/button';\nimport { InputIconModule } from 'primeng/inputicon';\nimport { IconFieldModule } from 'primeng/iconfield';\nimport { InputTextModule } from 'primeng/inputtext';\nimport { DrawerModule } from 'primeng/drawer';\nimport { QueryBuilderService } from './query-builder.service';\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\nimport { InputGroupModule } from 'primeng/inputgroup';\nimport { LocalizationService, QueryParameters } from '@es.framework/ng.core/services';\nimport { BadgeModule } from 'primeng/badge';\n\n@Component({\n selector: 'lib-generic-search-advanced',\n standalone: true,\n imports: [\n FormlyForm,\n TranslatePipe,\n ToolbarModule,\n ButtonModule,\n ReactiveFormsModule,\n FormsModule,\n InputIconModule,\n IconFieldModule,\n InputTextModule,\n DrawerModule,\n InputGroupModule,\n InputGroupAddonModule,\n BadgeModule\n],\n templateUrl: './generic-search-advanced.html',\n})\nexport class GenericSearchAdvanced implements OnInit {\n translate = inject(LocalizationService);\n private queryBuilder = inject(QueryBuilderService);\n\n drawerVisible = false;\n\n @Output() search = new EventEmitter<any>();\n @Output() paginationChange = new EventEmitter<any>();\n @Output() odataSearch = new EventEmitter<QueryParameters>();\n\n form = new FormGroup({});\n @Input() model: any = {};\n options: FormlyFormOptions = {};\n @Input() fields: FormlyFieldConfig[] = [];\n fields_: FormlyFieldConfig[] = [];\n\n @Input() enableSelect: boolean = false;\n @Input() enableGroup: boolean = false;\n @Input() odataConfig: any = {};\n\n ngOnInit() {\n this.buildQueryUIFields();\n }\n\n get filterCount(){\n const filters = ((this.model?.advancedFilters ?? [])[0]?.conditions?.length || 0) +\n ((this.model?.sorting ?? [])?.length || 0) +\n (this.model?.pagination && this.model?.pagination?.top ? 1 : 0);\n return filters;\n }\n private buildQueryUIFields() {\n this.fields_ = this.queryBuilder.buildQueryUIFields(this.fields,this.enableSelect,this.enableGroup);\n\n }\n\n onSubmit() {\n // Use the new QueryBuilderService methods\n const odataParams = this.queryBuilder.buildODataFromQueryModel(this.model, this.fields);\n // Generate query string using the unified method\n const queryString = this.queryBuilder.toODataQueryString(odataParams);\n if(this.model?.pagination && this.model?.pagination?.top){\n this.paginationChange.emit({\n top:this.model?.pagination?.top,\n // skip:,\n });\n }\n this.search.emit(\n {\n filter:this.model['filter'],\n query:queryString,\n // sorting:,\n // top:,\n // skip:,\n\n }\n );\n\n }\n\n onReset() {\n this.model = {};\n this.form.reset();\n // this.paginationChange.emit({\n // top:10,\n // // skip:,\n // });\n // this.search.emit(this.model);\n const odataParams = this.queryBuilder.buildODataFromQueryModel(this.model, this.fields);\n // this.odataSearch.emit(odataParams);\n\n // Generate query string using the unified method\n const queryString = this.queryBuilder.toODataQueryString(odataParams);\n this.search.emit(\n {\n filter:this.model['filter'],\n query:queryString,\n // sorting:,\n top:10,\n // skip:,\n\n }\n );\n\n }\n\n\n\n // Toggle drawer visibility\n toggleDrawer() {\n this.drawerVisible = !this.drawerVisible;\n }\n\n // Close drawer\n closeDrawer() {\n this.drawerVisible = false;\n }\n\n\n}\n","<div class=\"flex flex-wrap items-center gap-3 w-full\">\n <!-- Search Input with Icon -->\n <p-inputgroup class=\"w-full\">\n <input\n pInputText\n type=\"text\"\n [(ngModel)]=\"model['filter']\"\n placeholder=\"{{ 'SEARCH' | translate }}\"\n (keyup.enter)=\"onSubmit()\"\n />\n\n\n <p-inputgroup-addon>\n <p-button\n icon=\"pi pi-search\"\n severity=\"secondary\"\n (click)=\"onSubmit()\"\n ></p-button>\n </p-inputgroup-addon>\n <p-inputgroup-addon>\n <div class=\"relative inline-flex\">\n <p-button\n icon=\"pi pi-filter\"\n severity=\"secondary\"\n (onClick)=\"drawerVisible = true\">\n </p-button>\n\n @if (filterCount > 0) {\n <p-badge\n [value]=\"filterCount\"\n severity=\"warn\"\n size=\"small\"\n class=\"absolute -top-0 -right-0\">\n </p-badge>\n }\n </div>\n </p-inputgroup-addon>\n\n @if (model['filter'] || filterCount > 0) {\n <p-inputgroup-addon>\n <p-button\n icon=\"pi pi-times\"\n severity=\"danger\"\n (click)=\"model['filter']=''; onReset()\"\n ></p-button>\n </p-inputgroup-addon>\n }\n </p-inputgroup>\n\n\n </div>\n\n <!-- Drawer for Advanced Multi-field Search -->\n @if(drawerVisible){\n <p-drawer\n [(visible)]=\"drawerVisible\"\n position=\"right\"\n [styleClass]=\"'!w-full md:!w-80 lg:!w-[40rem] !h-full' \"\n [modal]=\"true\"\n [dismissible]=\"true\"\n styleClass=\"p-4 w-full max-w-md max-h-[90vh] flex flex-col\"\n >\n <!-- Entire form wrapper -->\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit(); drawerVisible=false\" class=\"flex flex-col flex-1\">\n <!-- Scrollable Form -->\n <div class=\"flex-1 overflow-auto\">\n <formly-form\n [form]=\"form\"\n [fields]=\"fields_\"\n [model]=\"model\"\n [options]=\"options\"\n >\n </formly-form>\n </div>\n\n </form>\n <!-- Action Buttons -->\n <ng-template pTemplate=\"footer\">\n <div class=\"flex justify-end mt-2 space-x-2 flex-none\">\n <button\n type=\"submit\"\n pButton size=\"small\"\n (click)=\" onSubmit(); drawerVisible=false\"\n label=\"{{ 'SEARCH' | translate }}\">\n </button>\n <button\n type=\"button\"\n pButton\n size=\"small\"\n class=\"p-button-text\"\n (click)=\"onReset(); drawerVisible=false\"\n >\n {{ 'CLEAR' | translate }}\n </button>\n </div>\n </ng-template>\n </p-drawer>\n\n }\n","// sort-builder.component.ts\nimport { Component } from '@angular/core';\nimport { FieldType, FieldTypeConfig } from '@ngx-formly/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { SelectModule } from 'primeng/select';\nimport { ButtonModule } from 'primeng/button';\nimport { DragDropModule } from 'primeng/dragdrop';\nimport { TooltipModule } from 'primeng/tooltip';\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\n\n@Component({\n selector: 'formly-sort-builder',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n SelectModule,\n ButtonModule,\n DragDropModule,\n TooltipModule,\n TranslatePipe\n ],\n styleUrls:['./sort-builder.component.css'],\n template: `<div class=\"sort-builder p-3 border-round border-1 surface-border\">\n <div class=\"mb-6\">\n <h5 class=\"text-lg font-semibold text-gray-900 mb-2\">{{ props.label || ('SORTING' | translate) }}</h5>\n <p class=\"text-gray-600 text-sm\">{{ ('PRIORITY_HINT' | translate) }}</p>\n </div>\n \n <!-- Sort List -->\n @if (sorts.length > 0) {\n <div class=\"sort-list space-y-2 mb-3\">\n @for (sort of sorts; track sort; let i = $index; let isFirst = $first; let isLast = $last) {\n <div\n class=\"sort-row p-2 border-round surface-card\"\n pDraggable\n pDroppable\n (onDragStart)=\"onDragStart(i)\"\n (onDrop)=\"onDrop($event, i)\"\n [ngClass]=\"{'border-left-3 border-primary': isFirst, 'border-left-3 border-200': !isFirst}\">\n <div class=\"grid grid-cols-4 align-items-center gap-2\">\n <!-- Drag Handle -->\n <div class=\"col-span-2 flex\">\n <button\n pButton\n icon=\"pi pi-bars\"\n type=\"button\"\n class=\"p-button-text p-button-plain cursor-move\"\n [pTooltip]=\"'DRAG_TOOLTIP' | translate\"\n tooltipPosition=\"top\">\n </button>\n <p-select\n [options]=\"getAvailableFields(sort.field)\"\n optionLabel=\"label\"\n optionValue=\"key\"\n [(ngModel)]=\"sort.field\"\n (onChange)=\"updateValue()\"\n [placeholder]=\"'SELECT_FIELD_SORT' | translate\"\n [showClear]=\"true\"\n appendTo=\"body\"\n styleClass=\"w-full\">\n </p-select>\n </div>\n <!-- Direction Selector -->\n <div class=\"col-fixed\">\n <p-select\n [options]=\"directionOptions\"\n [(ngModel)]=\"sort.direction\"\n (onChange)=\"updateValue()\"\n [placeholder]=\"'DIRECTION' | translate\"\n appendTo=\"body\"\n styleClass=\"w-full\">\n </p-select>\n </div>\n <!-- Actions -->\n <div class=\"col-fixed flex gap-2\" style=\"justify-content: flex-end;\">\n <!-- Move Up -->\n @if (!isFirst) {\n <button\n outlined\n style=\"width: var(--p-button-icon-only-width);\"\n pButton\n icon=\"pi pi-arrow-up\"\n type=\"button\"\n class=\"p-button-sm p-button-success\"\n (click)=\"moveSort(i, i - 1)\"\n [pTooltip]=\"'MOVE_UP' | translate\"\n tooltipPosition=\"top\">\n </button>\n }\n <!-- Move Down -->\n @if (!isLast) {\n <button\n outlined\n style=\"width: var(--p-button-icon-only-width);\"\n pButton\n icon=\"pi pi-arrow-down\"\n type=\"button\"\n class=\"p-button-sm p-button-success\"\n (click)=\"moveSort(i, i + 1)\"\n [pTooltip]=\"'MOVE_DOWN' | translate\"\n tooltipPosition=\"top\">\n </button>\n }\n <!-- Remove -->\n <button\n style=\"width: var(--p-button-icon-only-width);\"\n pButton\n icon=\"pi pi-times\"\n type=\"button\"\n class=\"p-button-sm p-button-danger\"\n (click)=\"removeSort(i)\"\n [pTooltip]=\"'REMOVE_SORT' | translate\"\n tooltipPosition=\"top\">\n </button>\n </div>\n </div>\n </div>\n }\n </div>\n }\n \n <!-- Empty State -->\n @if (sorts.length === 0) {\n <div class=\"empty-state text-center p-4 border-round surface-section\">\n <i class=\"pi pi-sort-alt text-4xl text-500 mb-3\"></i>\n <p class=\"text-500 mb-3\">{{ 'NO_SORT_RULES' | translate }}</p>\n <p class=\"text-400 text-sm mb-3\">{{ 'DEFAULT_ORDER' | translate }}</p>\n </div>\n }\n \n <!-- Actions -->\n <div class=\"flex gap-2\">\n <button\n pButton\n icon=\"pi pi-sort-alt\"\n [label]=\"'ADD_SORT' | translate\"\n type=\"button\"\n class=\"p-button-outlined flex-1\"\n (click)=\"addSort()\">\n </button>\n \n @if (sorts.length > 1) {\n <button\n pButton\n icon=\"pi pi-random\"\n [label]=\"'REVERSE_ORDER' | translate\"\n type=\"button\"\n class=\"p-button-outlined\"\n (click)=\"reverseSorts()\"\n [pTooltip]=\"'REVERSE_TOOLTIP' | translate\"\n tooltipPosition=\"top\">\n </button>\n }\n \n @if (sorts.length > 0) {\n <button\n pButton\n icon=\"pi pi-trash\"\n type=\"button\"\n class=\"p-button-outlined p-button-danger\"\n (click)=\"clearAll()\"\n [pTooltip]=\"'CLEAR_ALL_TOOLTIP' | translate\"\n tooltipPosition=\"top\">\n </button>\n }\n </div>\n \n <!-- Summary -->\n @if (sorts.length > 0) {\n <div class=\"sort-summary mt-3 p-2 border-round surface-ground\">\n <h5 class=\"mt-0 mb-2 text-sm\">{{ 'SORT_SUMMARY' | translate }}:</h5>\n <div class=\"text-sm text-500\">\n @for (sort of sorts; track sort; let i = $index) {\n <span class=\"sort-step\">\n <span class=\"font-semibold\">{{ getFieldLabel(sort.field) }}</span>\n <span class=\"direction-badge\" [ngClass]=\"sort.direction === 'asc' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800'\">\n {{ sort.direction === 'asc' ? '▲' : '▼' }}\n </span>\n @if (!isLast) {\n <span> {{ 'THEN' | translate }} </span>\n }\n </span>\n }\n </div>\n </div>\n }\n </div>`\n})\nexport class SortBuilderComponent extends FieldType<FieldTypeConfig> {\n sorts: any[] = [];\n directionOptions = [\n { label: 'تصاعدي (أ → ي)', value: 'asc' },\n { label: 'تنازلي (ي → أ)', value: 'desc' }\n ];\n\n private dragStartIndex: number = -1;\n\n ngOnInit() {\n if (this.formControl.value && Array.isArray(this.formControl.value)) {\n this.sorts = this.formControl.value.map((sort: any) => ({\n field: sort.field || '',\n direction: sort.direction || 'asc'\n }));\n }\n }\n\n addSort() {\n this.sorts.push({ field: '', direction: 'asc' });\n this.updateValue();\n }\n\n removeSort(index: number) {\n this.sorts.splice(index, 1);\n this.updateValue();\n }\n\n moveSort(fromIndex: number, toIndex: number) {\n if (toIndex >= 0 && toIndex < this.sorts.length) {\n const movedItem = this.sorts.splice(fromIndex, 1)[0];\n this.sorts.splice(toIndex, 0, movedItem);\n this.updateValue();\n }\n }\n\n onDragStart(index: number) {\n this.dragStartIndex = index;\n }\n\n onDrop(event: any, dropIndex: number) {\n if (this.dragStartIndex !== -1 && this.dragStartIndex !== dropIndex) {\n this.moveSort(this.dragStartIndex, dropIndex);\n }\n this.dragStartIndex = -1;\n }\n\n reverseSorts() {\n this.sorts.forEach(sort => {\n sort.direction = sort.direction === 'asc' ? 'desc' : 'asc';\n });\n this.updateValue();\n }\n\n clearAll() {\n this.sorts = [];\n this.updateValue();\n }\n\n getAvailableFields(currentField: string) {\n const usedFields = this.sorts.map(s => s.field).filter(f => f && f !== currentField);\n return this.props['fields'].filter((field: any) =>\n !usedFields.includes(field.key) || field.key === currentField\n );\n }\n\n getFieldLabel(fieldKey: string): string {\n const field = this.props['fields'].find((f: any) => f.key === fieldKey);\n return field?.label || fieldKey;\n }\n\n getDirectionIcon(direction: string): string {\n return direction === 'asc' ? 'pi pi-sort-up' : 'pi pi-sort-down';\n }\n\n getDirectionColor(direction: string): string {\n return direction === 'asc' ? 'text-green-500' : 'text-red-500';\n }\n\n updateValue() {\n // Filter out empty sorts and update value\n const validSorts = this.sorts.filter(sort => sort.field && sort.direction);\n this.formControl.setValue(validSorts);\n }\n\n // Helper to check if it's the last item\n get isLast(): boolean {\n return false; // This is used in template context\n }\n\n // Method to get current sort configuration\n getSortConfiguration(): any[] {\n return this.sorts.filter(sort => sort.field && sort.direction);\n }\n\n // Method to load sort configuration\n loadSortConfiguration(sortConfig: any[]) {\n if (sortConfig && Array.isArray(sortConfig)) {\n this.sorts = sortConfig.map(sort => ({\n field: sort.field || '',\n direction: sort.direction || 'asc'\n }));\n this.updateValue();\n }\n }\n\n // Method to check if a field is already used in sorting\n isFieldUsed(fieldKey: string): boolean {\n return this.sorts.some(sort => sort.field === fieldKey);\n }\n\n // Get the next available field\n getNextAvailableField(): string {\n const availableFields = this.props['fields'].filter((field: any) =>\n !this.isFieldUsed(field.key)\n );\n return availableFields.length > 0 ? availableFields[0].key : '';\n }\n}\n","// query-builder.component.ts\r\nimport { ListboxModule } from 'primeng/listbox';\r\nimport { ChangeDetectorRef, Component, inject, OnInit, } from '@angular/core';\r\nimport { FieldType, FieldTypeConfig, FormlyFieldConfig, FormlyForm } from '@ngx-formly/core';\r\n\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { DatePickerModule } from 'primeng/datepicker';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { QueryBuilderService } from './query-builder.service';\r\nimport { MenuModule } from 'primeng/menu';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\r\nimport { InputGroupModule } from 'primeng/inputgroup';\r\nimport { PopoverModule } from 'primeng/popover';\r\nimport { LocalizationService } from '@es.framework/ng.core/services';\r\n\r\n@Component({\r\n selector: 'formly-query-builder',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n SelectModule,\r\n InputTextModule,\r\n ButtonModule,\r\n DatePickerModule,\r\n CheckboxModule,\r\n RadioButtonModule,\r\n FormlyForm,\r\n TooltipModule,\r\n MenuModule,\r\n TranslatePipe,\r\n InputGroupModule,\r\n InputGroupAddonModule,\r\n PopoverModule,\r\n ListboxModule\r\n],\r\n templateUrl: './query-builder.component.html',\r\n styleUrls: ['./query-builder.component.css']\r\n})\r\nexport class QueryBuilderComponent extends FieldType<FieldTypeConfig> implements OnInit {\r\n private queryBuilderService = inject(QueryBuilderService);\r\n private cdr = inject(ChangeDetectorRef);\r\n private translate = inject(LocalizationService);\r\n\r\n groups: any[] = [];\r\n\r\n logicalOperators = [\r\n { label: this.translate.instant('and'), value: 'and' },\r\n { label: this.translate.instant('or'), value: 'or' }\r\n ];\r\n\r\n showAppliedFilters = false;\r\n\r\n ngOnInit() {\r\n // Initialize with existing value or default group with conditions\r\n if (this.formControl.value && (Array.isArray(this.formControl.value) && this.formControl.value.length > 0)) {\r\n\r\n this.initializeAppliedConditionsWithFieldConfigs();\r\n this.initializeDefaultConditions();\r\n } else {\r\n // Start with default conditions for important fields\r\n this.initializeDefaultConditions();\r\n }\r\n }\r\n\r\n private initializeAppliedConditionsWithFieldConfigs() {\r\n this.groups = this.formControl.value.map((group: any, groupIndex: number) => ({\r\n logicalOperator: group.logicalOperator || 'and',\r\n groupLogicalOperator: group.groupLogicalOperator || 'and',\r\n conditions: this.initializeConditionsWithFieldConfigs(group.conditions || [], groupIndex)\r\n }));\r\n }\r\nprivate initializeConditionsWithFieldConfigs(conditions: any[], groupIndex: number): any[] {\r\n return conditions.map((condition, conditionIndex) => ({\r\n ...condition,\r\n operatorsForField : this.getOperatorsForField(condition.field),\r\n valueFieldConfig: condition.field ?\r\n this.generateValueFieldConfig(condition, groupIndex, conditionIndex) :\r\n null\r\n }));\r\n }\r\n private initializeDefaultConditions(): void {\r\n // Get default fields using the service logic\r\n const defaultFields = this.getDefaultFields();\r\n\r\n const defaultConditions = [];\r\n for (let i = 0; i < defaultFields.length; i++) {\r\n const field = defaultFields[i];\r\n defaultConditions.push(this.createDefaultCondition(field, 0, i,field.props?.operator));\r\n }\r\n\r\n // this.groups = [{\r\n // logicalOperator: 'and',\r\n // groupLogicalOperator: 'and',\r\n // conditions: defaultConditions\r\n // }];\r\n this.groups = [{\r\n logicalOperator: 'and',\r\n groupLogicalOperator: 'and',\r\n conditions: defaultConditions.filter(dc =>\r\n !this.groups?.some(g =>\r\n g.conditions?.some((c:any) =>\r\n c.field === dc.field &&\r\n c.operator === dc.operator\r\n )\r\n )\r\n )\r\n}];\r\n\r\n\r\n this.updateValue();\r\n }\r\n toggleAppliedFilters() {\r\n if (this.showAppliedFilters == true) {\r\n this.initializeAppliedConditionsWithFieldConfigs();\r\n this.initializeDefaultConditions();\r\n }\r\n else {\r\n this.initializeAppliedConditionsWithFieldConfigs();\r\n }\r\n this.showAppliedFilters = !this.showAppliedFilters;\r\n }\r\nonAndClick(group: any, event: any): void {\r\n group.logicalOperator = 'and';\r\n this.updateValue();\r\n}\r\n\r\nonOrClick(group: any, event: any): void {\r\n group.logicalOperator = 'or';\r\n this.updateValue();\r\n}\r\n\r\n\r\n getLogicalOperatorText(operator: string): string {\r\n const operatorMap: { [key: string]: string } = {\r\n 'and': this.translate.instant('and'),\r\n 'or': this.translate.instant('or'),\r\n 'not': this.translate.instant('not')\r\n};\r\n return operatorMap[operator] || operator;\r\n }\r\n\r\n\r\n\r\n\r\n private getDefaultFields(): any[] {\r\n // Get all filterable fields\r\n const filterableFields = this.props['fields'].filter((field: any) =>\r\n field.filterable !== false && field.key && this.isSupportedFieldType(field.type)\r\n );\r\n\r\n // If no filterable fields, return empty array\r\n if (filterableFields.length === 0) {\r\n return [];\r\n }\r\n\r\n const selectedFields = filterableFields;\r\n return selectedFields;\r\n }\r\n\r\n private isSupportedFieldType(fieldType: string): boolean {\r\n // Only include field types that make sense for filtering\r\n const supportedTypes = ['input', 'number', 'datepicker','custom-datepicker', 'select', 'checkbox', 'generic-selector', 'switch', 'radio', 'textarea'];\r\n return supportedTypes.includes(fieldType);\r\n }\r\ngetFieldLabel(key: string): string {\r\n const f = this.props['fields']?.find((x: any) => x.key === key);\r\n return f ? f.label : '';\r\n}\r\n private createDefaultCondition(field: any, groupIndex: number, conditionIndex: number,operator?:string): any {\r\n const defaultCondition = {\r\n field: field.key,\r\n operator:operator ?operator : this.getDefaultOperator(field.type),\r\n value: this.getDefaultValue(field.type),\r\n valueFieldConfig: null,\r\n operatorsForField : this.getOperatorsForField(field),\r\n };\r\n\r\n // Generate field config for this condition\r\n defaultCondition.valueFieldConfig = this.generateValueFieldConfig(\r\n defaultCondition,\r\n groupIndex,\r\n conditionIndex\r\n ) as any;\r\n\r\n return defaultCondition;\r\n }\r\n\r\nget filterCount(){\r\n const filters = ((this.model?.advancedFilters ?? [])[0]?.conditions?.length || 0) +\r\n ((this.model?.sorting ?? [])?.length || 0) +\r\n (this.model?.pagination && this.model?.pagination?.top ? 1 : 0);\r\n return filters;\r\n }\r\n // Field type and operator methods that use QueryBuilderService logic\r\n getFieldType(fieldKey: string): string {\r\n const field = this.props['fields'].find((f: any) => f.key === fieldKey);\r\n return field?.type || 'input';\r\n }\r\n\r\n getOperatorsForField(field: any): any[] {\r\n if (!field) return [];\r\n\r\n let fieldKey: string;\r\n\r\n if (typeof field === 'object' && field !== null) {\r\n fieldKey = field['key'];\r\n } else {\r\n fieldKey = field;\r\n }\r\n const field_ = this.props['fields'].find((f: any) => f.key === fieldKey);\r\n // Use operators from the field configuration\r\n const operators = field_?.operators || this.queryBuilderService['getOperatorsForType'](field_?.type);\r\n\r\n return operators.map((op: string) => ({\r\n label: this.getOperatorLabel(op).label,\r\n icon: this.getOperatorLabel(op).icon,\r\n value: op\r\n }));\r\n }\r\n\r\n\r\ngetOperatorLabel(operator: string): { label: string; icon: string } {\r\n const map: { [key: string]: { label: string; icon: string } } = {\r\n eq: { label: this.translate.instant('eq'), icon: 'pi pi-equals' },\r\n ne: { label: this.translate.instant('ne'), icon: 'pi pi-hashtag' },\r\n contains: { label: this.translate.instant('contains'), icon: 'pi pi-search' },\r\n startswith: { label: this.translate.instant('startswith'), icon: 'pi pi-arrow-right' },\r\n endswith: { label: this.translate.instant('endswith'), icon: 'pi pi-arrow-left' },\r\n gt: { label: this.translate.instant('gt'), icon: 'pi pi-chevron-right' },\r\n ge: { label: this.translate.instant('ge'), icon: 'pi pi-angle-double-right' },\r\n lt: { label: this.translate.instant('lt'), icon: 'pi pi-chevron-left' },\r\n le: { label: this.translate.instant('le'), icon: 'pi pi-angle-double-left' },\r\n in: { label: this.translate.instant('in'), icon: 'pi pi-list' },\r\n notin: { label: this.translate.instant('notin'), icon: 'pi pi-ban' },\r\n };\r\n\r\n return map[operator] || { label: operator, icon: 'pi pi-question' };\r\n}\r\n\r\n\r\n\r\n getDefaultOperator(fieldType: string): string {\r\n // Use service's field type config\r\n const fieldConfig = this.queryBuilderService['fieldTypeConfig'][fieldType as keyof typeof this.queryBuilderService['fieldTypeConfig']];\r\n return fieldConfig ? fieldConfig.defaultOperator : 'contains';\r\n }\r\n\r\n getDefaultValue(fieldType: string): any {\r\n // Use service's field type config\r\n const fieldConfig = this.queryBuilderService['fieldTypeConfig'][fieldType as keyof typeof this.queryBuilderService['fieldTypeConfig']];\r\n return fieldConfig ? fieldConfig.defaultValue : '';\r\n }\r\n\r\n\r\n\r\n getFieldProps(fieldKey: string): any {\r\n const field = this.props['fields'].find((f: any) => f.key === fieldKey);\r\n // Return props without label to avoid duplication\r\n const props = { ...field?.props };\r\n delete props.label;\r\n delete props.loadDefault;\r\n return props;\r\n }\r\n\r\n private generateValueFieldConfig(condition: any, groupIndex: number, conditionIndex: number): FormlyFieldConfig {\r\n const fieldType = this.getFieldType(condition.field);\r\n const fieldProps = this.getFieldProps(condition.field);\r\n const fieldKey = this.getConditionValueKey(groupIndex, conditionIndex);\r\n\r\n return {\r\n key: fieldKey,\r\n type: fieldType,\r\n wrappers:[],\r\n props: {\r\n ...fieldProps, // Include all other props from the original field\r\n placeholder:'',\r\n loadDefault:false,\r\n change: (field: FormlyFieldConfig, event?: any) => {\r\n this.updateValue();\r\n }\r\n },\r\n hooks: {\r\n onInit: (field: FormlyFieldConfig) => {\r\n if (field.formControl && condition.value !== undefined) {\r\n field.formControl.setValue(condition.value, { emitEvent: false });\r\n }\r\n }\r\n },\r\n modelOptions: {\r\n updateOn: 'change'\r\n }\r\n };\r\n }\r\n\r\n getConditionValueKey(groupIndex: number, conditionIndex: number): string {\r\n return `condition_${groupIndex}_${conditionIndex}_value`;\r\n }\r\n\r\n // Group Management\r\n addGroup() {\r\n this.groups.push({\r\n logicalOperator: 'and',\r\n groupLogicalOperator: 'and',\r\n conditions: []\r\n });\r\n this.updateValue();\r\n }\r\n\r\n // removeGroup(groupIndex: number) {\r\n // this.groups.splice(groupIndex, 1);\r\n // this.updateValue();\r\n // }\r\nremoveGroup(groupIndex: number) {\r\n if (this.groups[groupIndex]) {\r\n // Get all field keys for this group before deleting\r\n const fieldKeysToRemove: string[] = [];\r\n\r\n // Collect all condition field keys in this group\r\n if (this.groups[groupIndex].conditions) {\r\n for (let c = 0; c < this.groups[groupIndex].conditions.length; c++) {\r\n const fieldKey = this.getConditionValueKey(groupIndex, c);\r\n fieldKeysToRemove.push(fieldKey);\r\n }\r\n }\r\n\r\n // Remove the group\r\n this.groups.splice(groupIndex, 1);\r\n\r\n // Remove all associated fields from model\r\n this.removeMultipleFromModel(fieldKeysToRemove);\r\n\r\n this.updateValue();\r\n }\r\n}\r\n\r\n// Remove multiple fields from formly model\r\nremoveMultipleFromModel(fieldKeys: string[]) {\r\n fieldKeys.forEach(fieldKey => {\r\n this.removeFromModel(fieldKey);\r\n });\r\n}\r\n // Condition Management\r\n addCondition(groupIndex: number = 0) {\r\n if (!this.groups[groupIndex]) {\r\n this.addGroup();\r\n }\r\n\r\n const newCondition = {\r\n field: '',\r\n operator: 'eq',\r\n value: '',\r\n valueFieldConfig: {}\r\n };\r\n\r\n const conditionIndex = this.groups[groupIndex].conditions.length;\r\n newCondition.valueFieldConfig = this.generateValueFieldConfig(newCondition, groupIndex, conditionIndex);\r\n\r\n this.groups[groupIndex].conditions.push(newCondition);\r\n this.updateValue();\r\n }\r\n\r\n onFieldChange(condition: any, groupIndex: number, conditionIndex: number) {\r\n condition.operator = this.getDefaultOperator(this.getFieldType(condition.field));\r\n condition.value = this.getDefaultValue(this.getFieldType(condition.field));\r\n\r\n // Generate and store the field config when field changes\r\n condition.valueFieldConfig = this.generateValueFieldConfig(condition, groupIndex, conditionIndex);\r\n condition.operatorsForField = this.getOperatorsForField(condition.field);\r\n\r\n this.updateValue();\r\n }\r\n\r\n addConditionToLastGroup() {\r\n const lastGroupIndex = this.groups.length - 1;\r\n if (lastGroupIndex >= 0) {\r\n this.addCondition(lastGroupIndex);\r\n } else {\r\n this.addGroup();\r\n this.addCondition(0);\r\n }\r\n }\r\n\r\n removeCondition(groupIndex: number, conditionIndex: number) {\r\n if (this.groups[groupIndex]) {\r\n\r\n // Get the field key before deleting so we can remove from model\r\n const fieldKey = this.getConditionValueKey(groupIndex, conditionIndex);\r\n\r\n // Using delete operator (sets to undefined, then we filter)\r\n delete this.groups[groupIndex].conditions[conditionIndex];\r\n\r\n // Remove the undefined entries from conditions array\r\n this.groups[groupIndex].conditions = this.groups[groupIndex].conditions.filter((condition: any) => condition !== undefined);\r\n\r\n // Remove empty groups\r\n if (this.groups[groupIndex].conditions.length === 0 && this.groups.length > 1) {\r\n delete this.groups[groupIndex];\r\n // Remove undefined groups from array\r\n this.groups = this.groups.filter(group => group !== undefined);\r\n }\r\n\r\n // Remove from formly model\r\n this.removeFromModel(fieldKey);\r\n\r\n this.updateValue();\r\n }\r\n}\r\n\r\n// Remove the field from formly model\r\nremoveFromModel(fieldKey: string) {\r\n if (this.model && this.model.hasOwnProperty(fieldKey)) {\r\n delete this.model[fieldKey];\r\n }\r\n\r\n // Also update the form control to ensure sync\r\n if (this.formControl.value && this.formControl.value.hasOwnProperty(fieldKey)) {\r\n const updatedValue = { ...this.formControl.value };\r\n delete updatedValue[fieldKey];\r\n this.formControl.setValue(updatedValue);\r\n }\r\n}\r\n\r\n // Value Management\r\n updateValue() {\r\n // Sync condition values from form model with safe access\r\n for (let g = 0; g < this.groups.length; g++) {\r\n const group = this.groups[g];\r\n for (let c = 0; c < group.conditions.length; c++) {\r\n const condition = group.conditions[c];\r\n const fieldKey = this.getConditionValueKey(g, c);\r\n\r\n try {\r\n const modelValue = this.model?.[fieldKey];\r\n\r\n if (modelValue !== undefined) {\r\n condition.value = modelValue;\r\n }\r\n } catch (error) {\r\n\r\n }\r\n }\r\n }\r\n\r\n const filteredGroups = [];\r\n for (let g = 0; g < this.groups.length; g++) {\r\n const group = this.groups[g];\r\n const validConditions = [];\r\n\r\n for (let c = 0; c < group.conditions.length; c++) {\r\n const condition = group.conditions[c];\r\n if (\r\n condition.field &&\r\n condition.operator &&\r\n condition.value !== undefined &&\r\n condition.value !== null &&\r\n condition.value !== ''\r\n ) {\r\n validConditions.push(condition);\r\n }\r\n }\r\n\r\n if (validConditions.length > 0) {\r\n filteredGroups.push({ ...group, conditions: validConditions });\r\n }\r\n }\r\n\r\n this.formControl.setValue(filteredGroups);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n clearAll() {\r\n this.groups = [];\r\n\r\n // Completely reset the form and model\r\n this.form.reset();\r\n\r\n // Manually set model to empty object\r\n Object.keys(this.model).forEach(key => {\r\n delete this.model[key];\r\n });\r\n this.addGroup();\r\n}\r\n\r\n // Helper methods\r\n getQueryStructure(): any {\r\n return this.groups;\r\n }\r\n\r\n loadQueryStructure(queryStructure: any[]) {\r\n if (queryStructure && Array.isArray(queryStructure)) {\r\n this.groups = queryStructure.map((group, groupIndex) => ({\r\n logicalOperator: group.logicalOperator || 'and',\r\n groupLogicalOperator: group.groupLogicalOperator || 'and',\r\n conditions: this.initializeConditionsWithFieldConfigs(group.conditions || [], groupIndex)\r\n }));\r\n this.updateValue();\r\n }\r\n }\r\n}\r\n","<div>\n\n <!-- Groups Container with Connecting Lines -->\n <div class=\"groups-container\" #groupsContainer>\n @for (group of groups; track group; let groupIndex = $index) {\n <div\n class=\"group-wrapper relative\"\n #groupElement>\n <!-- Vertical Connector Line from Previous Group -->\n @if (groupIndex > 0) {\n <div class=\"vertical-connector\">\n <div class=\"vertical-line\"></div>\n <!-- Operator Button -->\n <button\n type=\"button\"\n class=\"group-logical-operator-box\"\n [class.and]=\"group.groupLogicalOperator === 'and'\"\n [class.or]=\"group.groupLogicalOperator === 'or'\"\n (click)=\"opPopover.toggle($event)\">\n <span class=\"operator-text\">\n {{ getLogicalOperatorText(group.groupLogicalOperator || 'and') }}\n </span>\n <div class=\"connector-arrow\"></div>\n </button>\n <!-- Popover -->\n <p-popover #opPopover appendTo=\"body\">\n <div class=\"w-12rem\">\n <p-listbox\n [options]=\"logicalOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"group.groupLogicalOperator\"\n (onChange)=\" opPopover.toggle($event)\"\n [style]=\"{ width: '100%' }\">\n </p-listbox>\n </div>\n </p-popover>\n </div>\n }\n <div class=\"group-container mb-6 p-1 bg-white rounded-lg border-l-4 border-t-1 border-b-1 border-r-1 shadow-sm transition-all duration-300 relative\"\n [class.border-blue-500]=\"group.logicalOperator === 'and'\"\n [class.border-or-500]=\"group.logicalOperator === 'or'\"\n [class.pulse]=\"groupIndex === 0\">\n <!-- Rounded Button for \"ربط الشروط\" on left border -->\n <div\n class=\"absolute -left-4 top-1/2 transform -translate-y-1/2 z-10 transition-all duration-300\"\n >\n <!-- Logical Operator Popover Button -->\n <p-button\n [severity]=\"group.logicalOperator === 'and' ? 'success' : 'info'\"\n [styleClass]=\"group.logicalOperator === 'and'\r\n ? 'p-button-icon-only p-button-rounded p-button-sm logical-and'\r\n : 'p-button-icon-only p-button-rounded p-button-sm logical-or'\"\r\n (click)=\"opPopover.toggle($event)\">\n {{group.logicalOperator === 'and' ? ('and' | translate) : ('or' | translate)}}\n </p-button>\n <!-- Popover for Operator Selection -->\n <p-popover #opPopover appendTo=\"body\">\n <div class=\"w-10rem\">\n <p-listbox\n [options]=\"[\r\n { label: 'and' | translate, value: 'and' },\r\n { label: 'or' | translate, value: 'or' }\r\n ]\"\r\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"group.logicalOperator\"\n (onChange)=\"updateValue(); opPopover.toggle($event)\"\n [style]=\"{ width: '100%' }\">\n <ng-template let-item pTemplate=\"item\">\n {{ item.label }}\n </ng-template>\n </p-listbox>\n </div>\n </p-popover>\n </div>\n <!-- Group Header -->\n <div class=\"group-header-wrapper mb-4 pl-8\">\n <div class=\"group-header flex justify-between items-center\">\n <div class=\"flex gap-1\">\n <button\n pButton\n icon=\"pi pi-plus\"\n type=\"button\"\n class=\"p-button-success p-button p-button-sm !p-1.5 rounded-md transition-colors\"\n (click)=\"addCondition(groupIndex)\"\n pTooltip=\"{{ 'ADD_CONDITION' | translate }}\"\n tooltipPosition=\"top\">\n </button>\n <!-- @if (filterCount > 0) {\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-filter\"\n class=\"p-button-outlined p-button-sm\"\n (click)=\"toggleAppliedFilters()\">\n {{ (showAppliedFilters ? 'SHOW_ALL' : 'SHOW_APPLIED') | translate }}\n </button>\n } -->\n @if (groups.length > 1) {\n <button\n pButton\n icon=\"pi pi-times\"\n type=\"button\"\n class=\"p-button-danger p-button p-button-sm !p-1.5 rounded-md transition-colors\"\n (click)=\"removeGroup(groupIndex)\"\n pTooltip=\"{{ 'DELETE_GROUP' | translate }}\"\n tooltipPosition=\"top\">\n </button>\n }\n </div>\n </div>\n </div>\n <!-- Conditions in this group -->\n @for (condition of group.conditions; track condition; let conditionIndex = $index) {\n <div\n class=\"p-1 bg-gray-50 \">\n <div class=\"grid grid-cols-1 gap-1 items-center\">\n <!-- Field Selector -->\n <div class=\"md:col-span-2\">\n <div class=\"flex w-full rounded-md overflow-hidden border border-gray-300 bg-white shadow-sm\">\n <!-- Field Selector Button -->\n <div style=\"align-items: center;display: flex; min-width: 130px;max-width: 130px;\" class=\"flex-shrink-0 \">\n <button\n type=\"button\"\n style=\"height: -webkit-fill-available;\"\n class=\"flex items-center justify-between w-full px-3 py-2 text-sm bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:z-10\"\n (click)=\"overlay.toggle($event)\">\n <span style=\"\r\n display: inline-block;\r\n max-width: 100px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n \">{{ getFieldLabel(condition.field) || ('SELECT_FIELD' | translate) }}</span>\r\n <i class=\"pi pi-chevron-down mr-2 ml-2 text-xs\"></i>\n </button>\n <!-- Overlay Content -->\n <p-popover #overlay appendTo=\"body\">\n <div class=\"w-60\">\n <p-listbox\n tabindex=\"0\"\n [options]=\"props['fields']\"\n optionLabel=\"label\"\n optionValue=\"key\"\n [(ngModel)]=\"condition.field\"\n (onChange)=\"onFieldChange(condition, groupIndex, conditionIndex); overlay.toggle($event)\"\n [style]=\"{ width: '100%' }\">\n </p-listbox>\n </div>\n </p-popover>\n </div>\n <!-- Operator Button -->\n <div style=\"align-items: center;display: flex;\" class=\"flex-shrink-0 border-l border-r border-gray-300\">\n <button\n type=\"button\"\n class=\"flex items-center justify-center w-full px-3 py-2 text-sm bg-gray-50 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:z-10\"\n style=\"height: -webkit-fill-available;\"\n pTooltip=\"{{ getOperatorLabel(condition.operator).label }}\"\n (click)=\"opPopover.toggle($event)\">\n <i [class]=\"getOperatorLabel(condition.operator).icon\"></i>\n </button>\n <p-popover #opPopover appendTo=\"body\">\n <div class=\"w-60\">\n <p-listbox\n [options]=\"condition.operatorsForField\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"condition.operator\"\n (onChange)=\"updateValue();opPopover.toggle($event)\"\n [style]=\"{ width: '100%' }\">\n </p-listbox>\n </div>\n </p-popover>\n </div>\n <!-- Form Field -->\n <div style=\"background: #f9fafb\" class=\"flex-grow p-1\">\n <formly-form\n [form]=\"form\"\n [fields]=\"[condition.valueFieldConfig]\"\n [model]=\"model\">\n </formly-form>\n </div>\n <!-- Delete Button -->\n <div style=\"align-items: center;display: flex;\" class=\"flex-shrink-0\">\n <button\n style=\"height: -webkit-fill-available;\"\n class=\"flex items-center justify-center w-full px-3 py-2 text-sm bg-red-50 text-red-600 hover:bg-red-100 focus:outline-none focus:ring-2 focus:ring-red-500 focus:z-10\"\n type=\"button\"\n (click)=\"removeCondition(groupIndex, conditionIndex)\"\n pTooltip=\"حذف الشرط\"\n tooltipPosition=\"top\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Group Footer -->\n <div class=\"group-footer flex justify-between items-center mt-3 pt-3 border-t border-gray-200 \">\n <small class=\"text-gray-500\">\n {{ group.conditions.length }} شرط في هذه المجموعة\n </small>\n <small class=\"text-gray-500\">\n @if (groupIndex > 0) {\n <span>\n مرتبط مع السابقة بـ <strong [class.text-blue-600]=\"group.groupLogicalOperator === 'and'\"\n [class.text-amber-600]=\"group.groupLogicalOperator === 'or'\">\n {{ group.groupLogicalOperator === 'and' ? 'و' : 'أو' }}\n </strong>\n </span>\n }\n </small>\n </div>\n </div>\n </div>\n }\n</div>\n\n<!-- Actions -->\n<div class=\"flex flex-wrap gap-3 mt-6\">\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n [label]=\"'GROUP' | translate\"\n class=\"p-button-outlined p-button-sm !bg-white !border !border-blue-500 !text-blue-600 hover:!bg-blue-50 transition-colors flex items-center gap-2\"\n (click)=\"addGroup();\">\n </button>\n\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n [label]=\"'CONDITION' | translate\"\n class=\"p-button-outlined p-button-sm !bg-white !border !border-blue-500 !text-blue-600 hover:!bg-blue-50 transition-colors flex items-center gap-2\"\n (click)=\"addConditionToLastGroup()\">\n </button>\n\n @if (groups.length > 0) {\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-trash\"\n [label]=\"'CLEAR' | translate\"\n class=\"p-button-danger p-button-outlined p-button-sm !bg-white !border !border-red-500 !text-red-600 hover:!bg-red-50 transition-colors flex items-center gap-2\"\n (click)=\"clearAll()\">\n </button>\n }\n</div>\n\n<!-- Empty State -->\n@if (groups.length === 0) {\n <div class=\"empty-state text-center p-6 border-2 border-dashed border-gray-300 rounded-xl bg-gray-50\">\n <i class=\"pi pi-search text-4xl text-gray-400 mb-3\"></i>\n <p class=\"text-gray-500 mb-4\">{{ 'NO_SEARCH_CONDITIONS' | translate }}</p>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n [label]=\"'ADD_SEARCH_CONDITION' | translate\"\n class=\"p-button-outlined !px-4 !py-2\"\n (click)=\"addGroup()\">\n </button>\n </div>\n}\n</div>\n","// tab-type.component.ts\nimport { Component } from '@angular/core';\nimport { FieldType, FormlyField, FormlyFieldConfig } from '@ngx-formly/core';\n\nimport { TabsModule } from 'primeng/tabs';\nimport { BadgeModule } from 'primeng/badge';\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\n\n@Component({\n selector: 'formly-tab-type',\n template: `\n <p-tabs\n [value]=\"activeTabValue\"\n [scrollable]=\"props['scrollable'] !== false\"\n [lazy]=\"props['lazy'] !== false\"\n (valueChange)=\"onTabChange($event)\">\n \n <p-tablist>\n @for (tab of field.fieldGroup; track tab; let i = $index) {\n <p-tab\n [value]=\"i.toString()\"\n [disabled]=\"tab.props?.disabled\">\n @if(tab.props){\n <div class=\"flex align-items-center gap-2\">\n <!-- Left Icon -->\n @if (tab.props['leftIcon']) {\n <i [class]=\"tab.props['leftIcon']\" class=\"text-sm\"></i>\n }\n <!-- Label -->\n <span>{{ (tab.props['tabLabel'] ?? '') | translate }}</span>\n <!-- Badge -->\n @if (resolveBadge(tab) !== null) {\n <p-badge\n [value]=\"resolveBadge(tab)\"\n size=\"small\">\n </p-badge>\n }\n <!-- Right Icon -->\n @if (tab.props['rightIcon']) {\n <i [class]=\"tab.props['rightIcon']\" class=\"text-sm\"></i>\n }\n </div>\n }\n </p-tab>\n }\n </p-tablist>\n \n <p-tabpanels style=\"padding: 0;\">\n @for (tab of field.fieldGroup; track tab; let i = $index) {\n <p-tabpanel\n [value]=\"i.toString()\">\n <div class=\"p-3\">\n <formly-field [field]=\"tab\"></formly-field>\n <!-- Empty state -->\n @if (!tab.fieldGroup || tab.fieldGroup.length === 0) {\n <div\n class=\"empty-tab text-center p-4 text-500\">\n <i class=\"pi pi-inbox text-2xl mb-2\"></i>\n <p>لا توجد حقول في هذه التبويبة</p>\n </div>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n </p-tabs>\n `,\n standalone: true,\n imports: [TabsModule, BadgeModule, FormlyField, TranslatePipe]\n})\nexport class TabTypeComponent extends FieldType<FormlyFieldConfig> {\n activeTabValue: string = '0';\n\n ngOnInit() {\n if (this.props['activeIndex'] !== undefined) {\n this.activeTabValue = this.props['activeIndex'].toString();\n }\n }\n resolveBadge(tab: FormlyFieldConfig): any {\n const badge = tab.props?.['badge'];\n if (typeof badge === 'function') {\n const result = badge(tab);\n return result == 0 ? null : result;\n }\n return badge ?? null;\n }\n onTabChange(newValue: any) {\n this.activeTabValue = newValue;\n\n if (this.props['onTabChange']) {\n this.props['onTabChange']({\n activeIndex: parseInt(newValue),\n tab: this.field.fieldGroup?.[parseInt(newValue)]\n });\n }\n }\n}\n","// columns-builder.component.ts\r\nimport { Component, OnInit } from '@angular/core';\r\nimport { FieldType, FieldTypeConfig, FormlyForm } from '@ngx-formly/core';\r\nimport { FormGroup, FormArray, FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { SelectField } from './interfaces';\r\n\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { DatePickerModule } from 'primeng/datepicker';\r\nimport { InputGroupModule } from 'primeng/inputgroup';\r\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { ListboxModule } from 'primeng/listbox';\r\nimport { MenuModule } from 'primeng/menu';\r\nimport { PopoverModule } from 'primeng/popover';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\n@Component({\r\n selector: 'formly-columns-builder',\r\n template: `\r\n <div>\r\n <!-- Header -->\r\n <div class=\"mb-6\">\r\n <h5 class=\"text-lg font-semibold text-gray-900 mb-2\">{{ props.label || ('COLUMNS_MANAGEMENT' | translate) }}</h5>\r\n <p class=\"text-gray-600 text-sm\">{{ props.description || ('COLUMNS_DESCRIPTION' | translate) }}</p>\r\n </div>\r\n \r\n <!-- Quick Actions -->\r\n <div class=\"flex flex-wrap gap-2 mb-6\">\r\n <button\r\n type=\"button\"\r\n (click)=\"toggleAll(true)\"\r\n class=\"inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\r\n >\r\n <i class=\"pi pi-eye\"></i>\r\n {{ 'SHOW_ALL' | translate }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n (click)=\"toggleAll(false)\"\r\n class=\"inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\r\n >\r\n <i class=\"pi pi-eye-slash\"></i>\r\n {{ 'HIDE_ALL' | translate }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n (click)=\"resetToDefault()\"\r\n class=\"inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\r\n >\r\n <i class=\"pi pi-refresh\"></i>\r\n {{ 'RESET_TO_DEFAULT' | translate }}\r\n </button>\r\n </div>\r\n \r\n <!-- Drag Info -->\r\n <div class=\"mb-4 p-2 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700\">\r\n <i class=\"pi pi-info-circle mr-2\"></i>\r\n {{ 'DRAG_COLUMNS_INFO' | translate }}\r\n </div>\r\n \r\n <!-- Columns List -->\r\n <div class=\"space-y-3\">\r\n @if (columns.length === 0) {\r\n <div class=\"text-center py-8 px-4 border-2 border-dashed border-gray-300 rounded-lg bg-gray-50\">\r\n <i class=\"pi pi-table text-4xl text-gray-400 mb-3\"></i>\r\n <p class=\"text-gray-500\">{{ 'NO_COLUMNS_AVAILABLE' | translate }}</p>\r\n </div>\r\n }\r\n \r\n @for (column of columns; track column; let i = $index) {\r\n <div\r\n class=\"bg-gray-50 rounded-lg border border-gray-200 p-1 transition-colors hover:bg-gray-100\"\r\n draggable=\"true\"\r\n (dragstart)=\"onDragStart($event, i)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event, i)\"\r\n (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\">\r\n <div class=\"grid grid-cols-12 gap-4 items-center\">\r\n <!-- Drag Handle -->\r\n <div class=\"col-span-1 flex justify-center cursor-move text-gray-400 hover:text-gray-600\"\r\n draggable=\"true\"\r\n (dragstart)=\"onDragStart($event, i)\">\r\n <i class=\"pi pi-bars\"></i>\r\n </div>\r\n <!-- Visibility Toggle -->\r\n <div class=\"col-span-1 flex justify-center\">\r\n <p-checkbox\r\n [binary]=\"true\"\r\n [formControl]=\"getColumnControl(column.key, 'isVisible')\"\r\n [inputId]=\"'visible_' + column.key\"\r\n styleClass=\"[&>div]:border-gray-300 [&>div]:hover:border-gray-400\"\r\n (onChange)=\"onFormChange()\"\r\n >\r\n </p-checkbox>\r\n </div>\r\n <!-- Column Info -->\r\n <div class=\"col-span-12 md:col-span-4\">\r\n <label [for]=\"'visible_' + column.key\" class=\"block font-medium text-gray-900 cursor-pointer hover:text-blue-600\">\r\n {{ column.label }}\r\n </label>\r\n <p class=\"text-xs text-gray-500 mt-1\">{{ column.key }}</p>\r\n </div>\r\n <!-- Display Name -->\r\n <div class=\"col-span-12 md:col-span-3\">\r\n @if (isColumnVisible(column.key)) {\r\n <input\r\n type=\"text\"\r\n [formControl]=\"getColumnControl(column.key, 'displayName')\"\r\n [placeholder]=\"column.label\"\r\n class=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm\"\r\n (blur)=\"onFormChange()\"\r\n >\r\n }\r\n </div>\r\n <!-- Aggregate Function -->\r\n <!-- <div class=\"col-span-12 md:col-span-3\">\r\n <div *ngIf=\"column.aggregatable && isColumnVisible(column.key)\">\r\n <p-select\r\n [options]=\"aggregateFunctions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [formControl]=\"getColumnControl(column.key, 'aggregateFunction')\"\r\n [placeholder]=\"'SELECT_AGGREGATE' | translate\"\r\n [showClear]=\"true\"\r\n styleClass=\"w-full\"\r\n (onChange)=\"onFormChange()\"\r\n >\r\n </p-select>\r\n </div>\r\n <span *ngIf=\"!column.aggregatable && isColumnVisible(column.key)\" class=\"text-xs text-gray-500\">\r\n {{ 'NO_AGGREGATES_AVAILABLE' | translate }}\r\n </span>\r\n </div> -->\r\n </div>\r\n <!-- Aggregate Info -->\r\n @if (hasAggregateFunction(column.key) && isColumnVisible(column.key)) {\r\n <div\r\n class=\"mt-3 p-3 bg-blue-50 border border-blue-200 rounded-lg\">\r\n <div class=\"flex items-center gap-2\">\r\n <i class=\"pi pi-info-circle text-blue-500 text-sm\"></i>\r\n <span class=\"text-sm text-blue-800\">\r\n <!-- :{function: getAggregateLabel(getAggregateFunctionValue(column.key))} -->\r\n {{ 'AGGREGATE_INFO' | translate }}\r\n </span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n \r\n <!-- Summary -->\r\n <div class=\"flex flex-col sm:flex-row justify-between items-center gap-4 mt-6 pt-4 border-t border-gray-200\">\r\n <span class=\"text-sm text-gray-600\">\r\n <!-- :{visible: visibleColumnsCount, total: columns.length} -->\r\n {{ 'COLUMNS_VISIBLE_COUNT' | translate }}\r\n </span>\r\n <!-- <div class=\"flex gap-4 text-sm\">\r\n <span class=\"inline-flex items-center gap-1 text-green-600\">\r\n <i class=\"pi pi-chart-line\"></i>\r\n {{ numericColumnsCount }} {{ 'NUMERIC' | translate }}\r\n </span>\r\n <span class=\"inline-flex items-center gap-1 text-blue-600\">\r\n <i class=\"pi pi-calculator\"></i>\r\n {{ aggregatedColumnsCount }} {{ 'AGGREGATED' | translate }}\r\n </span>\r\n </div> -->\r\n </div>\r\n </div>\r\n `,\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n SelectModule,\r\n InputTextModule,\r\n ButtonModule,\r\n DatePickerModule,\r\n CheckboxModule,\r\n RadioButtonModule,\r\n FormlyForm,\r\n TooltipModule,\r\n MenuModule,\r\n TranslatePipe,\r\n InputGroupModule,\r\n InputGroupAddonModule,\r\n PopoverModule,\r\n ListboxModule\r\n]\r\n})\r\nexport class ColumnsBuilderComponent extends FieldType<FieldTypeConfig> implements OnInit {\r\n dragStartIndex: number = -1;\r\n private _columnsForm!: FormGroup;\r\n\r\n aggregateFunctions = [\r\n { label: 'Sum', value: 'sum' },\r\n { label: 'Average', value: 'avg' },\r\n { label: 'Count', value: 'count' },\r\n { label: 'Minimum', value: 'min' },\r\n { label: 'Maximum', value: 'max' }\r\n ];\r\n\r\n get columns(): SelectField[] {\r\n return this.props['fields'] || [];\r\n }\r\n\r\n get columnsForm(): FormGroup {\r\n return this._columnsForm;\r\n }\r\n\r\n get visibleColumnsCount(): number {\r\n return this.columns.filter(col =>\r\n this.isColumnVisible(col.key)\r\n ).length;\r\n }\r\n\r\n get numericColumnsCount(): number {\r\n return this.columns.filter(col => col.isNumeric).length;\r\n }\r\n\r\n get aggregatedColumnsCount(): number {\r\n return this.columns.filter(col =>\r\n this.hasAggregateFunction(col.key)\r\n ).length;\r\n }\r\n\r\n ngOnInit() {\r\n this.initializeForm();\r\n this.setupValueChanges();\r\n }\r\n\r\n // Form Methods\r\n initializeForm() {\r\n const parentForm = this.form as FormGroup;\r\n const fieldKey = this.field.key as string;\r\n\r\n if (!fieldKey) return;\r\n\r\n // Get or create the FormGroup in the parent form\r\n let formGroup = parentForm.get(fieldKey) as FormGroup;\r\n\r\n if (!formGroup || !(formGroup instanceof FormGroup)) {\r\n // Create new FormGroup\r\n formGroup = new FormGroup({});\r\n parentForm.setControl(fieldKey, formGroup);\r\n\r\n // Initialize with existing model data\r\n const initialModel = this.model[fieldKey] || {};\r\n\r\n this.columns.forEach(column => {\r\n const columnConfig = initialModel[column.key] || {};\r\n const columnGroup = new FormGroup({\r\n isVisible: new FormControl(columnConfig.isVisible ?? column.defaultVisible),\r\n displayName: new FormControl(columnConfig.displayName ?? column.label),\r\n aggregateFunction: new FormControl(columnConfig.aggregateFunction ?? ''),\r\n order: new FormControl(columnConfig.order ?? 0)\r\n });\r\n formGroup.addControl(column.key, columnGroup);\r\n });\r\n }\r\n\r\n // Store the FormGroup reference\r\n this._columnsForm = formGroup;\r\n\r\n // Initialize the model with current form values\r\n this.updateModel();\r\n }\r\n\r\n private setupValueChanges() {\r\n // Listen to form changes and update the model\r\n this.columnsForm.valueChanges.subscribe(() => {\r\n this.updateModel();\r\n });\r\n }\r\n\r\n private updateModel() {\r\n const fieldKey = this.field.key as string;\r\n if (fieldKey) {\r\n // Update the model with current form values\r\n this.model[fieldKey] = this.columnsForm.value;\r\n\r\n // Trigger form control update to notify Formly\r\n this.formControl.setValue(this.columnsForm.value);\r\n }\r\n }\r\n\r\n // Called when form controls change\r\n onFormChange() {\r\n this.updateModel();\r\n }\r\n\r\n // Drag & Drop Methods\r\n onDragStart(event: DragEvent, index: number) {\r\n this.dragStartIndex = index;\r\n event.dataTransfer?.setData('text/plain', index.toString());\r\n }\r\n\r\n onDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n }\r\n\r\n onDrop(event: DragEvent, dropIndex: number) {\r\n event.preventDefault();\r\n const dragIndex = this.dragStartIndex;\r\n\r\n if (dragIndex !== -1 && dragIndex !== dropIndex) {\r\n // Reorder the columns array\r\n const movedItem = this.columns[dragIndex];\r\n const newColumns = [...this.columns];\r\n newColumns.splice(dragIndex, 1);\r\n newColumns.splice(dropIndex, 0, movedItem);\r\n\r\n // Update the props to trigger change detection\r\n this.props['fields'] = newColumns;\r\n\r\n // Update order in form controls\r\n this.updateColumnOrders();\r\n\r\n // Update model after reordering\r\n this.updateModel();\r\n }\r\n\r\n this.removeDragStyles(event);\r\n }\r\n\r\n onDragEnter(event: DragEvent) {\r\n (event.currentTarget as HTMLElement).classList.add('border-blue-500', 'bg-blue-50');\r\n }\r\n\r\n onDragLeave(event: DragEvent) {\r\n this.removeDragStyles(event);\r\n }\r\n\r\n private removeDragStyles(event: DragEvent) {\r\n (event.currentTarget as HTMLElement).classList.remove('border-blue-500', 'bg-blue-50');\r\n }\r\n\r\n private updateColumnOrders() {\r\n // Store the order in form controls\r\n this.columns.forEach((column, index) => {\r\n const orderControl = this.getColumnControl(column.key, 'order');\r\n if (!orderControl) {\r\n const columnGroup = this.columnsForm.get(column.key) as FormGroup;\r\n if (columnGroup && !columnGroup.get('order')) {\r\n columnGroup.addControl('order', new FormControl(index));\r\n }\r\n } else {\r\n orderControl.setValue(index);\r\n }\r\n });\r\n }\r\n\r\n getColumnControl(columnKey: string, controlName: string): FormControl {\r\n const columnGroup = this.columnsForm.get(columnKey) as FormGroup;\r\n if (!columnGroup) {\r\n const fallbackControl = new FormControl(this.getDefaultValue(controlName));\r\n return fallbackControl;\r\n }\r\n\r\n const control = columnGroup.get(controlName) as FormControl;\r\n if (!control) {\r\n const fallbackControl = new FormControl(this.getDefaultValue(controlName));\r\n columnGroup.addControl(controlName, fallbackControl);\r\n return fallbackControl;\r\n }\r\n\r\n return control;\r\n }\r\n\r\n private getDefaultValue(controlName: string): any {\r\n switch (controlName) {\r\n case 'isVisible': return true;\r\n case 'displayName': return '';\r\n case 'aggregateFunction': return '';\r\n case 'order': return 0;\r\n default: return null;\r\n }\r\n }\r\n\r\n isColumnVisible(columnKey: string): boolean {\r\n const control = this.getColumnControl(columnKey, 'isVisible');\r\n return control?.value === true;\r\n }\r\n\r\n hasAggregateFunction(columnKey: string): boolean {\r\n const control = this.getColumnControl(columnKey, 'aggregateFunction');\r\n return !!control?.value;\r\n }\r\n\r\n getAggregateFunctionValue(columnKey: string): string {\r\n const control = this.getColumnControl(columnKey, 'aggregateFunction');\r\n return control?.value || '';\r\n }\r\n\r\n toggleAll(visible: boolean) {\r\n this.columns.forEach(column => {\r\n const visibleControl = this.getColumnControl(column.key, 'isVisible');\r\n if (visibleControl) {\r\n visibleControl.setValue(visible);\r\n }\r\n });\r\n this.updateModel();\r\n }\r\n\r\n resetToDefault() {\r\n this.columns.forEach((column, index) => {\r\n const columnGroup = this.columnsForm.get(column.key) as FormGroup;\r\n if (columnGroup) {\r\n columnGroup.get('isVisible')?.setValue(column.defaultVisible);\r\n columnGroup.get('displayName')?.setValue(column.label);\r\n columnGroup.get('aggregateFunction')?.setValue('');\r\n columnGroup.get('order')?.setValue(index);\r\n }\r\n });\r\n this.updateModel();\r\n }\r\n\r\n getAggregateLabel(functionName: string): string {\r\n const func = this.aggregateFunctions.find(f => f.value === functionName);\r\n return func ? func.label : functionName;\r\n }\r\n}\r\n","// group-builder.component.ts\r\nimport { Component, OnInit } from '@angular/core';\r\nimport { FieldType, FieldTypeConfig, FormlyForm } from '@ngx-formly/core';\r\nimport { FormGroup, FormArray, FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { GroupByField } from './interfaces';\r\n\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { DatePickerModule } from 'primeng/datepicker';\r\nimport { InputGroupModule } from 'primeng/inputgroup';\r\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { ListboxModule } from 'primeng/listbox';\r\nimport { MenuModule } from 'primeng/menu';\r\nimport { PopoverModule } from 'primeng/popover';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\n@Component({\r\n selector: 'formly-group-builder',\r\n template: `<div>\r\n <!-- Header -->\r\n <div class=\"mb-6\">\r\n <h5 class=\"text-lg font-semibold text-gray-900 mb-2\">{{ props.label || ('DATA_GROUPING' | translate) }}</h5>\r\n <p class=\"text-gray-600 text-sm\">{{ props.description || ('GROUP_DESCRIPTION' | translate) }}</p>\r\n </div>\r\n \r\n <!-- Group Configuration -->\r\n <div class=\"space-y-4\">\r\n <div class=\"flex items-center justify-between\">\r\n <span class=\"font-medium text-gray-700\">{{ 'GROUP_LEVELS' | translate }}</span>\r\n @if (canAddMoreGroups()) {\r\n <button\r\n type=\"button\"\r\n (click)=\"addGroup()\"\r\n [disabled]=\"!canAddMoreGroups()\"\r\n class=\"inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-blue-700 bg-blue-50 rounded-lg hover:bg-blue-100 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n >\r\n <i class=\"pi pi-plus\"></i>\r\n {{ 'ADD_GROUP_LEVEL' | translate }}\r\n </button>\r\n }\r\n </div>\r\n \r\n <!-- Drag Info -->\r\n @if (groups.length > 1) {\r\n <div class=\"mb-4 p-2 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700\">\r\n <i class=\"pi pi-info-circle mr-2\"></i>\r\n {{ 'DRAG_INFO' | translate }}\r\n </div>\r\n }\r\n \r\n <!-- Empty State -->\r\n @if (groups.length === 0) {\r\n <div class=\"text-center py-8 px-4 border-2 border-dashed border-gray-300 rounded-lg bg-gray-50\">\r\n <i class=\"pi pi-layer-group text-4xl text-gray-400 mb-3\"></i>\r\n <p class=\"text-gray-500 mb-4\">{{ 'NO_GROUPING_LEVELS' | translate }}</p>\r\n <button\r\n type=\"button\"\r\n (click)=\"addGroup()\"\r\n class=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 transition-colors\"\r\n >\r\n <i class=\"pi pi-plus\"></i>\r\n {{ 'ADD_FIRST_GROUP_LEVEL' | translate }}\r\n </button>\r\n </div>\r\n }\r\n \r\n <!-- Groups List with Drag & Drop -->\r\n <div class=\"space-y-3\">\r\n @for (group of groups.controls; track group; let i = $index) {\r\n <div\r\n class=\"bg-gray-50 rounded-lg border border-gray-200 p-4 transition-colors hover:bg-gray-100\"\r\n draggable=\"true\"\r\n (dragstart)=\"onDragStart($event, i)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event, i)\"\r\n (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (dragend)=\"onDragEnd($event)\">\r\n <div class=\"grid grid-cols-12 gap-4 items-start\">\r\n <!-- Drag Handle -->\r\n @if (groups.length > 1) {\r\n <div\r\n class=\"col-span-1 flex justify-center cursor-move text-gray-400 hover:text-gray-600 pt-2\"\r\n draggable=\"true\"\r\n (dragstart)=\"onDragStart($event, i)\">\r\n <i class=\"pi pi-bars\"></i>\r\n </div>\r\n }\r\n <!-- Group Content -->\r\n <div class=\"col-span-11\">\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <div class=\"flex items-center gap-2\">\r\n <i class=\"pi pi-sort-alt text-gray-500\"></i>\r\n <span class=\"font-medium text-gray-700\">{{ 'GROUP_LEVEL' | translate }} {{ i + 1 }}</span>\r\n </div>\r\n <div class=\"flex items-center gap-1\">\r\n <button\r\n type=\"button\"\r\n (click)=\"removeGroup(i)\"\r\n class=\"p-1 text-red-500 hover:text-red-700 hover:bg-red-50 rounded transition-colors\"\r\n [pTooltip]=\"'REMOVE' | translate\"\r\n >\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <!-- Field Selection -->\r\n <div>\r\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">{{ 'FIELD' | translate }}</label>\r\n <p-select\r\n [options]=\"availableFields\"\r\n optionLabel=\"label\"\r\n optionValue=\"key\"\r\n [formControl]=\"getGroupControl(i, 'field')\"\r\n [placeholder]=\"'SELECT_FIELD' | translate\"\r\n [showClear]=\"true\"\r\n (onChange)=\"onFieldChange(i, $event.value)\"\r\n styleClass=\"w-full\"\r\n >\r\n <ng-template pTemplate=\"selectedItem\">\r\n @if (getGroupControl(i, 'field').value) {\r\n <span class=\"text-gray-900\">\r\n {{ getFieldLabel(getGroupControl(i, 'field').value) }}\r\n </span>\r\n }\r\n @if (!getGroupControl(i, 'field').value) {\r\n <span class=\"text-gray-500\">{{ 'SELECT_FIELD' | translate }}</span>\r\n }\r\n </ng-template>\r\n </p-select>\r\n </div>\r\n <!-- Display Name -->\r\n <div>\r\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">{{ 'DISPLAY_NAME' | translate }}</label>\r\n <input\r\n type=\"text\"\r\n pInputText\r\n [formControl]=\"getGroupControl(i, 'displayName')\"\r\n [placeholder]=\"'DISPLAY_NAME_PLACEHOLDER' | translate\"\r\n class=\"w-full text-gray-900\"\r\n (blur)=\"onFormChange()\"\r\n >\r\n </div>\r\n </div>\r\n <!-- Show Total Toggle -->\r\n <div class=\"flex items-center gap-2 mt-3\">\r\n <p-checkbox\r\n [binary]=\"true\"\r\n [formControl]=\"getGroupControl(i, 'showTotal')\"\r\n [inputId]=\"'showTotal' + i\"\r\n styleClass=\"[&>div]:border-gray-300 [&>div]:hover:border-gray-400\"\r\n (onChange)=\"onFormChange()\"\r\n >\r\n </p-checkbox>\r\n <label [for]=\"'showTotal' + i\" class=\"text-sm text-gray-700 cursor-pointer hover:text-gray-900\">\r\n {{ 'SHOW_TOTAL' | translate }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n \r\n <!-- Grouping Tips -->\r\n @if (groups.length > 0) {\r\n <div class=\"mt-4 p-4 bg-blue-50 border border-blue-200 rounded-lg\">\r\n <div class=\"flex items-center gap-3\">\r\n <i class=\"pi pi-info-circle text-blue-500\"></i>\r\n <div>\r\n <p class=\"text-sm text-blue-800\">\r\n <!-- :{count: groups.length} -->\r\n {{ 'GROUPING_TIPS' | translate }}\r\n {{ groups.length }} {{ 'LEVELS_DEFINED' | translate }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>`,\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n SelectModule,\r\n InputTextModule,\r\n ButtonModule,\r\n DatePickerModule,\r\n CheckboxModule,\r\n RadioButtonModule,\r\n FormlyForm,\r\n TooltipModule,\r\n MenuModule,\r\n TranslatePipe,\r\n InputGroupModule,\r\n InputGroupAddonModule,\r\n PopoverModule,\r\n ListboxModule\r\n]\r\n})\r\nexport class GroupBuilderComponent extends FieldType<FieldTypeConfig> implements OnInit {\r\n private _groups!: FormArray;\r\n dragStartIndex: number = -1;\r\n\r\n get groups(): FormArray {\r\n return this._groups;\r\n }\r\n\r\n get availableFields(): GroupByField[] {\r\n return this.props['fields'] || [];\r\n }\r\n\r\n get maxGroups(): number {\r\n return this.props['maxGroups'] || 3;\r\n }\r\n\r\n ngOnInit() {\r\n this.initializeFormArray();\r\n this.setupValueChanges();\r\n }\r\n\r\n private initializeFormArray() {\r\n const parentForm = this.form as FormGroup;\r\n const fieldKey = this.field.key as string;\r\n\r\n if (!fieldKey) return;\r\n\r\n // Get or create the FormArray in the parent form\r\n let formArray = parentForm.get(fieldKey) as FormArray;\r\n\r\n if (!formArray || !(formArray instanceof FormArray)) {\r\n // Create new FormArray\r\n formArray = new FormArray<any>([]);\r\n parentForm.setControl(fieldKey, formArray);\r\n\r\n // Initialize with existing model data\r\n const initialValue = this.model[fieldKey];\r\n if (Array.isArray(initialValue)) {\r\n initialValue.forEach(group => {\r\n formArray.push(this.createGroupControl(group));\r\n });\r\n }\r\n }\r\n\r\n // Store the FormArray reference\r\n this._groups = formArray;\r\n }\r\n\r\n private setupValueChanges() {\r\n // Listen to form array changes and update the model\r\n this.groups.valueChanges.subscribe(() => {\r\n this.updateModel();\r\n });\r\n }\r\n\r\n private updateModel() {\r\n const fieldKey = this.field.key as string;\r\n if (fieldKey) {\r\n // Update the model with current form values\r\n this.model[fieldKey] = this.groups.value;\r\n\r\n // Trigger form control update to notify Formly\r\n this.formControl.setValue(this.groups.value);\r\n\r\n // Mark form control as touched/dirty if needed\r\n this.formControl.markAsTouched();\r\n this.formControl.markAsDirty();\r\n }\r\n }\r\n\r\n // Called when form controls change\r\n onFormChange() {\r\n this.updateModel();\r\n }\r\n\r\n private createGroupControl(group?: any): FormGroup {\r\n return new FormGroup({\r\n field: new FormControl(group?.field || ''),\r\n displayName: new FormControl(group?.displayName || ''),\r\n showTotal: new FormControl(group?.showTotal !== false)\r\n });\r\n }\r\n\r\n addGroup() {\r\n if (this.canAddMoreGroups()) {\r\n this.groups.push(this.createGroupControl());\r\n this.updateModel();\r\n }\r\n }\r\n\r\n removeGroup(index: number) {\r\n this.groups.removeAt(index);\r\n this.updateModel();\r\n }\r\n\r\n // Drag & Drop Methods\r\n onDragStart(event: DragEvent, index: number) {\r\n this.dragStartIndex = index;\r\n event.dataTransfer?.setData('text/plain', index.toString());\r\n (event.currentTarget as HTMLElement).classList.add('opacity-50', 'border-blue-300');\r\n }\r\n\r\n onDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n }\r\n\r\n onDrop(event: DragEvent, dropIndex: number) {\r\n event.preventDefault();\r\n const dragIndex = this.dragStartIndex;\r\n\r\n if (dragIndex !== -1 && dragIndex !== dropIndex) {\r\n this.moveGroup(dragIndex, dropIndex);\r\n }\r\n\r\n this.removeDragStyles(event);\r\n }\r\n\r\n onDragEnter(event: DragEvent) {\r\n (event.currentTarget as HTMLElement).classList.add('border-blue-500', 'bg-blue-50', 'border-2');\r\n }\r\n\r\n onDragLeave(event: DragEvent) {\r\n this.removeDragStyles(event);\r\n }\r\n\r\n onDragEnd(event: DragEvent) {\r\n this.removeDragStyles(event);\r\n this.dragStartIndex = -1;\r\n }\r\n\r\n private removeDragStyles(event: DragEvent) {\r\n const element = event.currentTarget as HTMLElement;\r\n element.classList.remove('border-blue-500', 'bg-blue-50', 'opacity-50', 'border-blue-300', 'border-2');\r\n }\r\n\r\n moveGroup(fromIndex: number, toIndex: number) {\r\n const movedGroup = this.groups.at(fromIndex);\r\n this.groups.removeAt(fromIndex);\r\n this.groups.insert(toIndex, movedGroup);\r\n this.updateModel();\r\n }\r\n\r\n getGroupControl(index: number, controlName: string): FormControl {\r\n const group = this.groups.at(index) as FormGroup;\r\n return group.get(controlName) as FormControl;\r\n }\r\n\r\n onFieldChange(index: number, fieldKey: string) {\r\n const displayNameControl = this.getGroupControl(index, 'displayName');\r\n if (!displayNameControl.value && fieldKey) {\r\n const field = this.availableFields.find(f => f.key === fieldKey);\r\n if (field) {\r\n displayNameControl.setValue(field.label);\r\n }\r\n }\r\n this.updateModel();\r\n }\r\n\r\n getFieldLabel(fieldKey: string): string {\r\n const field = this.availableFields.find(f => f.key === fieldKey);\r\n return field ? field.label : fieldKey;\r\n }\r\n\r\n canAddMoreGroups(): boolean {\r\n return this.groups.length < this.maxGroups;\r\n }\r\n}\r\n","// group-type.component.ts\r\nimport { Component } from '@angular/core';\r\nimport { FieldType, FormlyFieldConfig, FormlyField } from '@ngx-formly/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { BadgeModule } from 'primeng/badge';\r\n\r\nexport interface GroupTypeProps {\r\n label?: string;\r\n description?: string;\r\n collapsible?: boolean;\r\n collapsedByDefault?: boolean;\r\n showFieldCount?: boolean;\r\n showDescription?: boolean;\r\n showSummary?: boolean;\r\n showValidation?: boolean;\r\n compact?: boolean;\r\n variant?: 'default' | 'card' | 'bordered' | 'transparent';\r\n columns?: number;\r\n gap?: 'none' | 'small' | 'normal' | 'large';\r\n actions?: {\r\n icon: string;\r\n tooltip: string;\r\n styleClass?: string;\r\n handler?: (field: FormlyFieldConfig, form: any, component: any) => void;\r\n }[];\r\n}\r\n\r\n@Component({\r\n selector: 'formly-group-type',\r\n standalone: true,\r\n imports: [CommonModule, FormlyField, ButtonModule, TooltipModule, BadgeModule],\r\n template: `\n <div [class]=\"groupClass\">\n @if (props.label || props.collapsible) {\n <div class=\"flex justify-between items-center p-2\"\n (click)=\"props.collapsible && toggle()\">\n <div class=\"flex items-center gap-2\">\n @if (props.collapsible) {\n <i [class]=\"collapsed ? 'pi pi-chevron-down' : 'pi pi-chevron-up'\"></i>\n }\n @if (props.label) {\n <label class=\"font-semibold\">{{ props.label }}</label>\n }\n @if (isRequired()) {\n <i class=\"pi pi-asterisk text-red-500 text-xs\" pTooltip=\"حقل مطلوب\"></i>\n }\n </div>\n <div class=\"flex gap-2\">\n @if (props.description && !collapsed) {\n <i class=\"pi pi-info-circle text-500\"\n pTooltip=\"{{ props.description }}\"></i>\n }\n @if (showValidation) {\n <i [class]=\"validationIcon\" [pTooltip]=\"validationText\"></i>\n }\n @for (a of props.actions || []; track a) {\n <button pButton type=\"button\" class=\"p-button-text p-button-sm\"\n [icon]=\"a.icon\" [pTooltip]=\"a.tooltip\" [ngClass]=\"a.styleClass\"\n (click)=\"a.handler?.(field, form, this); $event.stopPropagation()\"></button>\n }\n </div>\n </div>\n }\n \n @if (!collapsed) {\n <div class=\"p-3 pt-0\" [ngClass]=\"props.compact ? 'compact-layout' : ''\">\n @if (props.description && props.showDescription) {\n <p class=\"text-500 text-sm mb-2\">{{ props.description }}</p>\n }\n <div [ngClass]=\"gridClass\">\n @for (f of field.fieldGroup; track f) {\n <formly-field [field]=\"f\"></formly-field>\n @if (f.props?.description) {\n <small\n class=\"block text-500 text-xs mt-1 ml-1\">\n {{ f.props?.description }}\n </small>\n }\n }\n </div>\n @if (!field.fieldGroup?.length) {\n <div class=\"text-center p-4 surface-section border-round\">\n <i class=\"pi pi-inbox text-4xl text-500 mb-2\"></i>\n <p class=\"text-500\">لا توجد حقول</p>\n </div>\n }\n </div>\n }\n </div>\n `\r\n})\r\nexport class GroupTypeComponent extends FieldType<FormlyFieldConfig<GroupTypeProps>> {\r\n collapsed = this.props.collapsedByDefault ?? false;\r\n\r\n\r\n get showValidation() {\r\n return this.props.showValidation !== false &&\r\n this.formControl.invalid && (this.formControl.dirty || this.formControl.touched);\r\n }\r\n\r\n get validationIcon() {\r\n if (this.formControl.valid) return 'pi pi-check-circle text-green-500';\r\n if (this.formControl.invalid) return 'pi pi-exclamation-circle text-red-500';\r\n return 'pi pi-circle text-500';\r\n }\r\n\r\n get validationText() {\r\n return this.formControl.valid ? 'جميع الحقول صالحة' : 'هناك أخطاء في بعض الحقول';\r\n }\r\n\r\n get groupClass() {\r\n const v = this.props.variant || 'default';\r\n const map: any = {\r\n default: 'border-round border-1 border-200 bg-white mb-3',\r\n card: 'border-round surface-card shadow-sm mb-3',\r\n bordered: 'border-round border-1 border-300 surface-section mb-3',\r\n transparent: 'border-0 bg-transparent mb-3'\r\n };\r\n return map[v];\r\n }\r\n\r\n get gridClass() {\r\n const cols = this.props.columns || 1;\r\n const gap = this.props.gap || 'normal';\r\n const gaps: any = { none: 'gap-0', small: 'gap-2', normal: 'gap-3', large: 'gap-4' };\r\n return `grid grid-cols-1 ${cols > 1 ? 'md:grid-cols-' + cols : ''} ${gaps[gap]}`;\r\n }\r\n\r\n toggle() {\r\n this.collapsed = !this.collapsed;\r\n }\r\n\r\n isRequired() {\r\n return this.field.fieldGroup?.some(f => f.props?.required || f.validators?.['required']) ?? false;\r\n }\r\n}\r\n","import { provideFormlyConfig } from '@ngx-formly/core';\r\nimport { QueryBuilderComponent } from './query-builder.component';\r\nimport { SortBuilderComponent } from './sort-builder.component';\r\nimport { GroupTypeComponent } from './group.component';\r\nimport { TabTypeComponent } from './tab-type.component';\r\nimport { GroupBuilderComponent } from './group-builder.component';\r\nimport { ColumnsBuilderComponent } from './columns-builder.component';\r\n\r\nexport const formlyConfig = provideFormlyConfig({\r\n types: [\r\n\r\n {\r\n name: 'tab-type',\r\n component: TabTypeComponent\r\n },\r\n {\r\n name: 'query-builder',\r\n component: QueryBuilderComponent\r\n },\r\n {\r\n name: 'sort-builder',\r\n component: SortBuilderComponent\r\n },\r\n {\r\n name: 'group-builder',\r\n component: GroupBuilderComponent\r\n },\r\n {\r\n name: 'columns-builder',\r\n component: ColumnsBuilderComponent\r\n },\r\n { name: 'group', component: GroupTypeComponent },\r\n\r\n\r\n ],\r\n\r\n},\r\n\r\n);\r\n\r\n\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i3","i1","i2","i4","i5","i6"],"mappings":"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"}
1
+ {"version":3,"file":"es.framework-ng.ui.core-generic-search-advanced.mjs","sources":["../../../../libs/ng.ui.core/generic-search-advanced/src/lib/generic-search-advanced-module.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/query-builder.service.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/generic-search-advanced.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/generic-search-advanced.html","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/sort-builder.component.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/query-builder.component.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/query-builder.component.html","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/tab-type.component.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/columns-builder.component.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/group-builder.component.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/group.component.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/lib/formly-config.ts","../../../../libs/ng.ui.core/generic-search-advanced/src/es.framework-ng.ui.core-generic-search-advanced.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 GenericSearchAdvancedModule {}\r\n","// query-builder.service.ts\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { FormlyFieldConfig } from '@ngx-formly/core';\r\nimport { QueryBuilderField, SortBuilderField, GroupByField, SelectField } from './interfaces';\r\nimport { LocalizationService } from '@es.framework/ng.core/services';\r\nimport { FilterCondition, QueryParameters, QueryParser } from '@es.framework/ng.core/services';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class QueryBuilderService {\r\n translate: LocalizationService = inject(LocalizationService);\r\n\r\n // Field type configuration that matches QueryBuilderComponent\r\n private fieldTypeConfig = {\r\n 'input': { defaultOperator: 'contains', defaultValue: '', operators: ['eq', 'ne', 'contains', 'startswith', 'endswith'] },\r\n 'number': { defaultOperator: 'eq', defaultValue: null, operators: ['eq', 'ne', 'gt', 'ge', 'lt', 'le'] },\r\n 'datepicker': { defaultOperator: 'eq', defaultValue: null, operators: ['eq', 'ne', 'gt', 'ge', 'lt', 'le'] },\r\n 'select': { defaultOperator: 'eq', defaultValue: '', operators: ['eq', 'ne', 'in', 'notin'] },\r\n 'checkbox': { defaultOperator: 'eq', defaultValue: null, operators: ['eq', 'ne'] },\r\n 'generic-selector': { defaultOperator: 'eq', defaultValue: null, operators: ['eq', 'ne', 'in', 'notin'] },\r\n 'switch': { defaultOperator: 'eq', defaultValue: null, operators: ['eq', 'ne'] },\r\n 'radio': { defaultOperator: 'eq', defaultValue: '', operators: ['eq', 'ne'] },\r\n 'textarea': { defaultOperator: 'contains', defaultValue: '', operators: ['eq', 'ne', 'contains', 'startswith', 'endswith'] }\r\n };\r\n\r\n buildQueryUIFields(fields: FormlyFieldConfig[],enableSelect:boolean,enableGroup:boolean): FormlyFieldConfig[] {\r\n return [\r\n {\r\n type: 'tab-type',\r\n props: {\r\n tabViewClass: 'advanced-query-tabs',\r\n scrollable: false,\r\n lazy: true,\r\n activeIndex: 0\r\n },\r\n fieldGroup: this.getQueryTabs(fields,enableSelect,enableGroup)\r\n }\r\n ];\r\n }\r\n\r\n private getQueryTabs(fields: FormlyFieldConfig[],enableSelect:boolean,enableGroup:boolean): FormlyFieldConfig[] {\r\n const tabs: (FormlyFieldConfig | false)[] = [\r\n {\r\n type: 'group',\r\n props: {\r\n tabLabel: 'FILTERS',\r\n // label: 'FILTERS',\r\n leftIcon: 'pi pi-filter',\r\n badge: (field: FormlyFieldConfig) => {\r\n const fieldGroup = (field?.fieldGroup ?? [])[0] as any;\r\n return (fieldGroup?.model?.advancedFilters ?? [])[0]?.conditions?.length || 0;\r\n },\r\n },\r\n fieldGroup: this.getFilterTabFields(fields)\r\n },\r\n {\r\n type: 'group',\r\n props: {\r\n tabLabel: 'SORTING',\r\n // label: 'SORTING',\r\n leftIcon: 'pi pi-sort-alt',\r\n badge: (field: FormlyFieldConfig) => {\r\n const fieldGroup = (field?.fieldGroup ?? [])[0] as any;\r\n return (fieldGroup?.model?.sorting ?? [])?.length || 0;\r\n },\r\n },\r\n fieldGroup: this.getSortingTabFields(fields)\r\n },\r\n enableGroup && {\r\n type: 'group',\r\n props: {\r\n tabLabel: 'GROUPING',\r\n // label: 'GROUPING',\r\n leftIcon: 'pi pi-table',\r\n badge: (field: FormlyFieldConfig) => {\r\n const fieldGroup = (field?.fieldGroup ?? [])[0] as any;\r\n return (fieldGroup?.model?.grouping ?? [])?.length || 0;\r\n },\r\n },\r\n fieldGroup: this.getGroupingTabFields(fields)\r\n },\r\n enableSelect && {\r\n type: 'group',\r\n props: {\r\n tabLabel: 'COLUMNS',\r\n // label: 'COLUMNS',\r\n leftIcon: 'pi pi-list',\r\n badge: (field: FormlyFieldConfig) => {\r\n const fieldGroup = (field?.fieldGroup ?? [])[0] as any;\r\n const columns = fieldGroup?.model?.columns;\r\n\r\n // Handle both array and object formats for columns\r\n if (Array.isArray(columns)) {\r\n return columns.filter((col: any) => col?.isVisible)?.length || 0;\r\n } else if (columns && typeof columns === 'object') {\r\n // If columns is an object, count the visible ones\r\n return Object.values(columns).filter((col: any) => col?.isVisible)?.length || 0;\r\n }\r\n\r\n return 0;\r\n },\r\n },\r\n fieldGroup: this.getColumnsTabFields(fields)\r\n },\r\n {\r\n type: 'group',\r\n props: {\r\n tabLabel: 'PAGINATION',\r\n // label: 'PAGINATION',\r\n leftIcon: 'pi pi-cog',\r\n badge: (field: FormlyFieldConfig) => {\r\n return field?.model?.pagination && field?.model?.pagination?.top ? 1 : 0;\r\n },\r\n },\r\n fieldGroup: this.getPaginationTabFields()\r\n }\r\n ];\r\n return tabs.filter(Boolean) as FormlyFieldConfig[];\r\n }\r\n\r\n private getFilterTabFields(fields: FormlyFieldConfig[]): FormlyFieldConfig[] {\r\n return [\r\n {\r\n key: 'advancedFilters',\r\n type: 'query-builder',\r\n props: {\r\n label: 'فلاتر متقدمة',\r\n description: 'أنشئ فلاتر معقدة باستخدام مشغلين منطقيين',\r\n fields: this.extractFilterableFields(fields)\r\n }\r\n }\r\n ];\r\n }\r\n\r\n private getSortingTabFields(fields: FormlyFieldConfig[]): FormlyFieldConfig[] {\r\n return [\r\n {\r\n key: 'sorting',\r\n type: 'sort-builder',\r\n props: {\r\n label: 'ترتيب النتائج',\r\n description: 'حدد أولوية وعرض ترتيب البيانات',\r\n fields: this.extractSortableFields(fields)\r\n }\r\n }\r\n ];\r\n }\r\n\r\n private getGroupingTabFields(fields: FormlyFieldConfig[]): FormlyFieldConfig[] {\r\n return [\r\n {\r\n key: 'grouping',\r\n type: 'group-builder',\r\n props: {\r\n label: 'تجميع البيانات',\r\n description: 'قم بتجميع البيانات حسب الحقول المطلوبة',\r\n fields: this.extractGroupableFields(fields),\r\n maxGroups: 3\r\n }\r\n }\r\n ];\r\n }\r\n\r\n private getColumnsTabFields(fields: FormlyFieldConfig[]): FormlyFieldConfig[] {\r\n return [\r\n {\r\n key: 'columns',\r\n type: 'columns-builder',\r\n props: {\r\n label: 'إدارة الأعمدة',\r\n description: 'اختر الحقول المراد عرضها وتخصيص التجميع',\r\n fields: this.extractSelectableFields(fields)\r\n }\r\n }\r\n ];\r\n }\r\n\r\n private getPaginationTabFields(): FormlyFieldConfig[] {\r\n return [\r\n {\r\n key: 'pagination',\r\n type: 'group',\r\n props: {\r\n label: '',\r\n description: '',\r\n collapsible: false,\r\n showFieldCount: true,\r\n variant: 'card'\r\n },\r\n fieldGroup: [\r\n {\r\n key: 'top',\r\n type: 'input',\r\n props: {\r\n type: 'number',\r\n label: 'الحد الأقصى للسجلات',\r\n min: 1,\r\n max: 1000,\r\n description: 'أقصى عدد للسجلات المراد عرضها'\r\n }\r\n },\r\n {\r\n key: 'skip',\r\n type: 'input',\r\n props: {\r\n type: 'number',\r\n label: 'تخطي السجلات',\r\n min: 0,\r\n description: 'عدد السجلات التي سيتم تخطيها'\r\n }\r\n },\r\n {\r\n key: 'includeCount',\r\n type: 'checkbox',\r\n props: {\r\n label: 'تضمين العدد الإجمالي',\r\n description: 'تضمين عدد السجلات الإجمالي في الاستجابة'\r\n }\r\n }\r\n ]\r\n }\r\n ];\r\n }\r\n\r\n private extractFilterableFields(fields: FormlyFieldConfig[]): QueryBuilderField[] {\r\n const filterableFields: QueryBuilderField[] = [];\r\n\r\n this.traverseFields(fields, (field) => {\r\n if (field.key && field.props && ((field.props['filter'] && field.props['filter'].hidden == false) || !field.props['filter']) && !field.props?.hidden) {\r\n const fieldType = this.mapFieldType(field.type as string);\r\n const fieldConfig = this.fieldTypeConfig[fieldType as keyof typeof this.fieldTypeConfig] || this.fieldTypeConfig.input;\r\n\r\n filterableFields.push({\r\n key: field.props['entityKey'] ? field.props['entityKey'] as string : field.key as string,\r\n label: this.translate.instant(field.props.label || (field.key as string)),\r\n type: fieldType,\r\n props: { ...field.props },\r\n operators: fieldConfig.operators,\r\n defaultOperator: fieldConfig.defaultOperator,\r\n defaultValue: fieldConfig.defaultValue\r\n });\r\n }\r\n });\r\n\r\n return filterableFields;\r\n }\r\n\r\n\r\n private extractSortableFields(fields: FormlyFieldConfig[]): SortBuilderField[] {\r\n const sortableFields: SortBuilderField[] = [];\r\n\r\n this.traverseFields(fields, (field) => {\r\n if (field.key && field.props && ((field.props['sort'] && field.props['sort'].hidden == false) || !field.props['sort'])&& !field.props?.hidden) {\r\n sortableFields.push({\r\n key: field.props['entityKey'] ? field.props['entityKey'] as string : field.key as string,\r\n label: this.translate.instant(field.props.label || field.key as string)\r\n });\r\n }\r\n });\r\n\r\n return sortableFields;\r\n }\r\n\r\n private extractGroupableFields(fields: FormlyFieldConfig[]): GroupByField[] {\r\n const groupableFields: GroupByField[] = [];\r\n\r\n this.traverseFields(fields, (field) => {\r\n if (field.key && field.props && ((field.props['group'] && field.props['group'].hidden == false) || !field.props['group']) && !field.props?.hidden) {\r\n groupableFields.push({\r\n key: field.props['entityKey'] ? field.props['entityKey'] as string : field.key as string,\r\n label: this.translate.instant(field.props.label || field.key as string),\r\n dataType: this.getDataType(field.type as string)\r\n });\r\n }\r\n });\r\n\r\n return groupableFields;\r\n }\r\n\r\nprivate extractSelectableFields(fields: FormlyFieldConfig[]): SelectField[] {\r\n const tempFields: (SelectField & { order: number })[] = [];\r\n\r\n this.traverseFields(fields, (field) => {\r\n if (\r\n field.key &&\r\n field.props &&\r\n // ((field.props['select'] && field.props['select'].hidden === false) || !field.props['select']) &&\r\n ((field.props['report'] && field.props['report'].hidden === false) || !field.props['report']) &&\r\n !field.props?.hidden\r\n ) {\r\n const isNumeric = ['number', 'currency'].includes(field.type as string);\r\n\r\n const tableConfig = field.props['table'] ?? {};\r\n const mergedProps = { ...field.props, ...(tableConfig.props ?? {}) };\r\n const order: number =\r\n (tableConfig.order as number | undefined) ??\r\n (tableConfig.props?.order as number | undefined) ??\r\n (mergedProps['order'] as number | undefined) ??\r\n Number.MAX_SAFE_INTEGER;\r\n\r\n tempFields.push({\r\n key: field.props['entityKey'] ? (field.props['entityKey'] as string) : (field.key as string),\r\n label: this.translate.instant(field.props.label || (field.key as string)),\r\n dataType: this.getDataType(field.type as string),\r\n isNumeric,\r\n defaultVisible: field.props['defaultVisible'] !== false,\r\n aggregatable: isNumeric && field.props['aggregatable'] !== false,\r\n order\r\n });\r\n }\r\n });\r\n\r\n return tempFields\r\n .sort((a, b) => a.order - b.order)\r\n .map(({ order, ...rest }) => rest as SelectField); // remove order after sorting\r\n}\r\n\r\n private traverseFields(fields: FormlyFieldConfig[], callback: (field: FormlyFieldConfig) => void): void {\r\n fields.forEach(field => {\r\n callback(field);\r\n if (field.fieldGroup) {\r\n this.traverseFields(field.fieldGroup, callback);\r\n }\r\n });\r\n }\r\ngetAppliedFiltersCount(model: any): { total: number; breakdown: any } {\r\n const breakdown = {\r\n filters: 0,\r\n sorting: 0,\r\n grouping: 0,\r\n columns: 0,\r\n pagination: 0,\r\n expand: 0\r\n };\r\n\r\n // Advanced filters\r\n if (model?.advancedFilters && Array.isArray(model.advancedFilters)) {\r\n model.advancedFilters.forEach((filterGroup: any) => {\r\n if (filterGroup.conditions && Array.isArray(filterGroup.conditions)) {\r\n breakdown.filters += filterGroup.conditions.length;\r\n }\r\n });\r\n }\r\n\r\n // Sorting\r\n if (model?.sorting && Array.isArray(model.sorting)) {\r\n breakdown.sorting = model.sorting.length;\r\n }\r\n\r\n // Grouping\r\n if (model?.grouping && Array.isArray(model.grouping)) {\r\n breakdown.grouping = model.grouping.length;\r\n }\r\n\r\n // Columns\r\n if (model?.columns) {\r\n if (Array.isArray(model.columns)) {\r\n breakdown.columns = model.columns.filter((col: any) => col.isVisible).length;\r\n } else if (typeof model.columns === 'object') {\r\n breakdown.columns = Object.values(model.columns).filter((col: any) => col?.isVisible).length;\r\n }\r\n }\r\n\r\n // Pagination\r\n if (model?.pagination) {\r\n if (model.pagination.top) breakdown.pagination += 1;\r\n if (model.pagination.skip) breakdown.pagination += 1;\r\n if (model.pagination.includeCount) breakdown.pagination += 1;\r\n }\r\n\r\n // Expand\r\n if (model?.expand && Array.isArray(model.expand)) {\r\n breakdown.expand = model.expand.length;\r\n }\r\n\r\n return {\r\n total: Object.values(breakdown).reduce((sum, count) => sum + count, 0),\r\n breakdown\r\n };\r\n}\r\n private mapFieldType(type?: string): string {\r\n const typeMap: { [key: string]: string } = {\r\n 'input': 'input',\r\n 'number': 'number',\r\n 'datepicker': 'datepicker',\r\n 'select': 'select',\r\n 'checkbox': 'checkbox',\r\n 'generic-selector': 'generic-selector',\r\n 'switch': 'switch',\r\n 'radio': 'radio',\r\n 'textarea': 'textarea',\r\n 'currency': 'number'\r\n };\r\n\r\n return typeMap[type || 'input'] || 'input';\r\n }\r\n\r\n private getDataType(type?: string): string {\r\n const dataTypeMap: { [key: string]: string } = {\r\n 'input': 'string',\r\n 'number': 'number',\r\n 'datepicker': 'date',\r\n 'select': 'string',\r\n 'checkbox': 'boolean',\r\n 'generic-selector': 'string',\r\n 'switch': 'boolean',\r\n 'radio': 'string',\r\n 'textarea': 'string',\r\n 'currency': 'number'\r\n };\r\n\r\n return dataTypeMap[type || 'input'] || 'string';\r\n }\r\n\r\nprivate getOperatorsForType(type?: string): string[] {\r\n const fieldType = this.mapFieldType(type);\r\n const config = this.fieldTypeConfig[fieldType as keyof typeof this.fieldTypeConfig];\r\n return config ? config.operators : ['eq', 'ne'];\r\n }\r\n\r\n // Enhanced OData methods with GroupBy and Select support\r\n buildODataFromQueryModel(model: any, originalFields: FormlyFieldConfig[]): QueryParameters {\r\n\r\n const params: QueryParameters = {\r\n filters: [],\r\n orderBy: [],\r\n groupBy: [],\r\n select: [],\r\n aggregates: [],\r\n expand: model.expand || [],\r\n includeCount: model.pagination?.includeCount || false\r\n };\r\n\r\n // Quick search\r\n if (model.filter) {\r\n const searchableFields = this.extractSelectableFields(originalFields); // TODO get all strings filters\r\n const quickSearchConditions: FilterCondition[] = searchableFields.map(field => ({\r\n field: field.key,\r\n operator: 'contains',\r\n value: model.filter\r\n }));\r\n\r\n if (quickSearchConditions.length > 0) {\r\n params.filters.push({\r\n logicalOperator: 'or',\r\n conditions: quickSearchConditions\r\n });\r\n }\r\n }\r\n\r\n // Advanced filters\r\n if (model.advancedFilters && Array.isArray(model.advancedFilters)) {\r\n params.filters.push(...model.advancedFilters);\r\n }\r\n\r\n // Sorting\r\n if (model.sorting && Array.isArray(model.sorting)) {\r\n params.orderBy = model.sorting\r\n .filter((sort: any) => sort.field && sort.direction)\r\n .map((sort: any) => ({\r\n field: sort.field,\r\n direction: sort.direction\r\n }));\r\n }\r\n\r\n // Grouping\r\n if (model.grouping && Array.isArray(model.grouping)) {\r\n params.groupBy = model.grouping\r\n .filter((group: any) => group.field)\r\n .map((group: any, index: number) => ({\r\n propertyName: group.field,\r\n displayName: group.displayName || group.field,\r\n showTotal: group.showTotal !== false,\r\n order: index\r\n }));\r\n }\r\n\r\n\r\n // Columns/Select - Handle both array and object formats\r\n // extractSelectableFields\r\nif (model.columns) {\r\n let visibleColumns: any[] = [];\r\n\r\n // Handle array format: [{field: 'name', isVisible: true, ...}, ...]\r\n if (Array.isArray(model.columns)) {\r\n visibleColumns = model.columns.filter((col: any) => col.isVisible);\r\n }\r\n // Handle object format: {field1: {isVisible: true, displayName: 'Name', ...}, field2: {...}}\r\n else if (typeof model.columns === 'object') {\r\n visibleColumns = Object.entries(model.columns)\r\n .filter(([key, col]: [string, any]) => col.isVisible)\r\n .map(([key, col]: [string, any]) => ({\r\n field: key, // Use the object key as field name\r\n ...col // Spread the column properties\r\n }));\r\n }\r\n\r\n // Process visible columns for select and aggregates\r\n if (visibleColumns.length > 0) {\r\n params.select = visibleColumns.map((col: any, index: number) => ({\r\n propertyName: col.field || col.key, // Support both 'field' and 'key' properties\r\n displayName: col.displayName || col.field || col.key || col.label,\r\n aggregateFunction: col.aggregateFunction,\r\n isVisible: true,\r\n order: index\r\n }));\r\n\r\n // Extract aggregates from columns with aggregate functions\r\n const aggregateColumns = visibleColumns.filter((col: any) => col.aggregateFunction);\r\n params.aggregates = aggregateColumns.map((col: any) => ({\r\n propertyName: col.field || col.key,\r\n aggregateFunction: col.aggregateFunction,\r\n alias: `${col.aggregateFunction}_${col.field || col.key}`\r\n }));\r\n }\r\n}\r\nelse{\r\n // Fallback: auto-generate from formly fields\r\n const selectableFields = this.extractSelectableFields(originalFields);\r\n // Ensure a column for the ID field exists\r\n// if (!selectableFields.some(f => f.key === this.idField)) {\r\n// selectableFields.unshift({\r\n// key: this.idField,\r\n// label: this.translate.instant(this.idField),\r\n// dataType: 'number', // or the correct type\r\n// isNumeric: false,\r\n// defaultVisible: true,\r\n// aggregatable: false\r\n// });\r\n// }\r\n\r\n params.select = selectableFields.map((f, i) => ({\r\n propertyName: f.key,\r\n displayName: f.label,\r\n isVisible: f.defaultVisible,\r\n order: i\r\n }));\r\n\r\n params.aggregates = selectableFields\r\n .filter(f => f.aggregatable)\r\n .map(f => ({\r\n propertyName: f.key,\r\n aggregateFunction: 'sum',\r\n alias: `sum_${f.key}`\r\n }));\r\n}\r\n\r\n // Pagination\r\n if (model.pagination) {\r\n if (model.pagination.top) {\r\n params.top = Number(model.pagination.top);\r\n }\r\n if (model.pagination.skip) {\r\n params.skip = Number(model.pagination.skip);\r\n }\r\n if (model.pagination.includeCount !== undefined) {\r\n params.includeCount = model.pagination.includeCount;\r\n }\r\n }\r\n\r\n return params;\r\n }\r\n\r\n toODataQueryString(params: QueryParameters): string {\r\n return QueryParser.toString(params);\r\n }\r\n\r\n parseODataQuery(queryString: string): QueryParameters {\r\n return QueryParser.parse(queryString);\r\n }\r\n\r\n\r\n // Helper method to get field configuration\r\n getFieldConfig(fieldKey: string, fields: any[]): any {\r\n return fields.find(f => f.key === fieldKey);\r\n }\r\n\r\n // Helper to get available aggregate functions for numeric fields\r\n getAggregateFunctions(): { label: string; value: string; }[] {\r\n return [\r\n { label: 'مجموع', value: 'sum' },\r\n { label: 'متوسط', value: 'avg' },\r\n { label: 'عدد', value: 'count' },\r\n { label: 'الحد الأدنى', value: 'min' },\r\n { label: 'الحد الأقصى', value: 'max' }\r\n ];\r\n }\r\n\r\n\r\n queryParamsToFormModel(params: QueryParameters): any {\r\n const model: any = {\r\n advancedFilters: [],\r\n sorting: [],\r\n grouping: [],\r\n columns: [],\r\n pagination: {},\r\n expand: [],\r\n filter: ''\r\n };\r\n\r\n // Extract quick search from filters\r\n const orFilterGroup = params.filters.find(fg =>\r\n fg.logicalOperator === 'or' &&\r\n fg.conditions?.every(c => c.operator === 'contains' && c.value === fg.conditions[0]?.value)\r\n );\r\n\r\n if (orFilterGroup?.conditions?.length) {\r\n model.filter = orFilterGroup.conditions[0].value;\r\n // Remove the quick search from advanced filters\r\n params.filters = params.filters.filter(fg => fg !== orFilterGroup);\r\n }\r\n\r\n // Advanced filters\r\n if (params.filters.length > 0) {\r\n model.advancedFilters = params.filters;\r\n }\r\n\r\n // Sorting\r\n if (params.orderBy && params.orderBy.length > 0) {\r\n model.sorting = params.orderBy.map(ob => ({\r\n field: ob.field,\r\n direction: ob.direction\r\n }));\r\n }\r\n\r\n // Grouping\r\n if (params.groupBy && params.groupBy.length > 0) {\r\n model.grouping = params.groupBy.map(gb => ({\r\n field: gb.propertyName,\r\n displayName: gb.displayName,\r\n showTotal: gb.showTotal,\r\n order: gb.order\r\n }));\r\n }\r\n\r\n // Columns/Select - Convert to array format\r\n if (params.select && params.select.length > 0) {\r\n model.columns = params.select.map(sc => {\r\n const col: any = {\r\n field: sc.propertyName,\r\n isVisible: sc.isVisible !== false,\r\n displayName: sc.displayName || sc.propertyName,\r\n order: sc.order || 0\r\n };\r\n\r\n // Add aggregate function if this column has an aggregate\r\n if (params.aggregates) {\r\n const aggregate = params.aggregates.find(agg => agg.propertyName === sc.propertyName);\r\n if (aggregate) {\r\n col.aggregateFunction = aggregate.aggregateFunction;\r\n }\r\n }\r\n\r\n return col;\r\n });\r\n\r\n // Sort columns by order\r\n model.columns.sort((a: any, b: any) => (a.order || 0) - (b.order || 0));\r\n }\r\n\r\n // Aggregates (if not already handled via columns)\r\n if (params.aggregates && params.aggregates.length > 0) {\r\n // Ensure aggregates are linked to columns\r\n if (!model.columns) {\r\n model.columns = [];\r\n }\r\n\r\n params.aggregates.forEach(agg => {\r\n const existingColumn = model.columns.find((c: any) => c.field === agg.propertyName);\r\n if (!existingColumn) {\r\n model.columns.push({\r\n field: agg.propertyName,\r\n isVisible: false, // Aggregate-only columns are typically not visible in select\r\n displayName: agg.propertyName,\r\n aggregateFunction: agg.aggregateFunction\r\n });\r\n }\r\n });\r\n }\r\n\r\n // Pagination\r\n if (params.top !== undefined || params.skip !== undefined || params.includeCount !== undefined) {\r\n model.pagination = {\r\n top: params.top,\r\n skip: params.skip,\r\n includeCount: params.includeCount\r\n };\r\n }\r\n\r\n // Expand\r\n if (params.expand && params.expand.length > 0) {\r\n model.expand = params.expand;\r\n }\r\n\r\n return model;\r\n}\r\n}\r\n","// generic-search.component.ts\r\nimport { Component, EventEmitter, Input, OnInit, Output, ViewChild, inject } from '@angular/core';\r\n\r\nimport { FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { FormlyFieldConfig, FormlyForm, FormlyFormOptions } from '@ngx-formly/core';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { ToolbarModule } from 'primeng/toolbar';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { InputIconModule } from 'primeng/inputicon';\r\nimport { IconFieldModule } from 'primeng/iconfield';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { DrawerModule } from 'primeng/drawer';\r\nimport { QueryBuilderService } from './query-builder.service';\r\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\r\nimport { InputGroupModule } from 'primeng/inputgroup';\r\nimport { LocalizationService, QueryParameters } from '@es.framework/ng.core/services';\r\nimport { BadgeModule } from 'primeng/badge';\r\n\r\n@Component({\r\n selector: 'lib-generic-search-advanced',\r\n standalone: true,\r\n imports: [\r\n FormlyForm,\r\n TranslatePipe,\r\n ToolbarModule,\r\n ButtonModule,\r\n ReactiveFormsModule,\r\n FormsModule,\r\n InputIconModule,\r\n IconFieldModule,\r\n InputTextModule,\r\n DrawerModule,\r\n InputGroupModule,\r\n InputGroupAddonModule,\r\n BadgeModule\r\n],\r\n templateUrl: './generic-search-advanced.html',\r\n})\r\nexport class GenericSearchAdvanced implements OnInit {\r\n translate = inject(LocalizationService);\r\n private queryBuilder = inject(QueryBuilderService);\r\n\r\n drawerVisible = false;\r\n\r\n @Output() search = new EventEmitter<any>();\r\n @Output() paginationChange = new EventEmitter<any>();\r\n @Output() odataSearch = new EventEmitter<QueryParameters>();\r\n\r\n form = new FormGroup({});\r\n @Input() model: any = {};\r\n options: FormlyFormOptions = {};\r\n @Input() fields: FormlyFieldConfig[] = [];\r\n fields_: FormlyFieldConfig[] = [];\r\n\r\n @Input() enableSelect: boolean = false;\r\n @Input() enableGroup: boolean = false;\r\n @Input() odataConfig: any = {};\r\n\r\n ngOnInit() {\r\n this.buildQueryUIFields();\r\n }\r\n\r\n get filterCount(){\r\n const filters = ((this.model?.advancedFilters ?? [])[0]?.conditions?.length || 0) +\r\n ((this.model?.sorting ?? [])?.length || 0) +\r\n (this.model?.pagination && this.model?.pagination?.top ? 1 : 0);\r\n return filters;\r\n }\r\n private buildQueryUIFields() {\r\n this.fields_ = this.queryBuilder.buildQueryUIFields(this.fields,this.enableSelect,this.enableGroup);\r\n\r\n }\r\n\r\n onSubmit() {\r\n // Use the new QueryBuilderService methods\r\n const odataParams = this.queryBuilder.buildODataFromQueryModel(this.model, this.fields);\r\n // Generate query string using the unified method\r\n const queryString = this.queryBuilder.toODataQueryString(odataParams);\r\n if(this.model?.pagination && this.model?.pagination?.top){\r\n this.paginationChange.emit({\r\n top:this.model?.pagination?.top,\r\n // skip:,\r\n });\r\n }\r\n this.search.emit(\r\n {\r\n filter:this.model['filter'],\r\n query:queryString,\r\n // sorting:,\r\n // top:,\r\n // skip:,\r\n\r\n }\r\n );\r\n\r\n }\r\n\r\n onReset() {\r\n this.model = {};\r\n this.form.reset();\r\n // this.paginationChange.emit({\r\n // top:10,\r\n // // skip:,\r\n // });\r\n // this.search.emit(this.model);\r\n const odataParams = this.queryBuilder.buildODataFromQueryModel(this.model, this.fields);\r\n // this.odataSearch.emit(odataParams);\r\n\r\n // Generate query string using the unified method\r\n const queryString = this.queryBuilder.toODataQueryString(odataParams);\r\n this.search.emit(\r\n {\r\n filter:this.model['filter'],\r\n query:queryString,\r\n // sorting:,\r\n top:10,\r\n // skip:,\r\n\r\n }\r\n );\r\n\r\n }\r\n\r\n\r\n\r\n // Toggle drawer visibility\r\n toggleDrawer() {\r\n this.drawerVisible = !this.drawerVisible;\r\n }\r\n\r\n // Close drawer\r\n closeDrawer() {\r\n this.drawerVisible = false;\r\n }\r\n\r\n\r\n}\r\n","<div class=\"flex flex-wrap items-center gap-3 w-full\">\r\n <!-- Search Input with Icon -->\r\n <p-inputgroup class=\"w-full\">\r\n <input\r\n pInputText\r\n type=\"text\"\r\n [(ngModel)]=\"model['filter']\"\r\n placeholder=\"{{ 'SEARCH' | translate }}\"\r\n (keyup.enter)=\"onSubmit()\"\r\n />\r\n\r\n\r\n <p-inputgroup-addon>\r\n <p-button\r\n icon=\"pi pi-search\"\r\n severity=\"secondary\"\r\n (click)=\"onSubmit()\"\r\n ></p-button>\r\n </p-inputgroup-addon>\r\n <p-inputgroup-addon>\r\n <div class=\"relative inline-flex\">\r\n <p-button\r\n icon=\"pi pi-filter\"\r\n severity=\"secondary\"\r\n (onClick)=\"drawerVisible = true\">\r\n </p-button>\r\n\r\n @if (filterCount > 0) {\r\n <p-badge\r\n [value]=\"filterCount\"\r\n severity=\"warn\"\r\n size=\"small\"\r\n class=\"absolute -top-0 -right-0\">\r\n </p-badge>\r\n }\r\n </div>\r\n </p-inputgroup-addon>\r\n\r\n @if (model['filter'] || filterCount > 0) {\r\n <p-inputgroup-addon>\r\n <p-button\r\n icon=\"pi pi-times\"\r\n severity=\"danger\"\r\n (click)=\"model['filter']=''; onReset()\"\r\n ></p-button>\r\n </p-inputgroup-addon>\r\n }\r\n </p-inputgroup>\r\n\r\n\r\n </div>\r\n\r\n <!-- Drawer for Advanced Multi-field Search -->\r\n @if(drawerVisible){\r\n <p-drawer\r\n [(visible)]=\"drawerVisible\"\r\n position=\"right\"\r\n [styleClass]=\"'!w-full md:!w-80 lg:!w-[40rem] !h-full' \"\r\n [modal]=\"true\"\r\n [dismissible]=\"true\"\r\n styleClass=\"p-4 w-full max-w-md max-h-[90vh] flex flex-col\"\r\n >\r\n <!-- Entire form wrapper -->\r\n <form [formGroup]=\"form\" (ngSubmit)=\"onSubmit(); drawerVisible=false\" class=\"flex flex-col flex-1\">\r\n <!-- Scrollable Form -->\r\n <div class=\"flex-1 overflow-auto\">\r\n <formly-form\r\n [form]=\"form\"\r\n [fields]=\"fields_\"\r\n [model]=\"model\"\r\n [options]=\"options\"\r\n >\r\n </formly-form>\r\n </div>\r\n\r\n </form>\r\n <!-- Action Buttons -->\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end mt-2 space-x-2 flex-none\">\r\n <button\r\n type=\"submit\"\r\n pButton size=\"small\"\r\n (click)=\" onSubmit(); drawerVisible=false\"\r\n label=\"{{ 'SEARCH' | translate }}\">\r\n </button>\r\n <button\r\n type=\"button\"\r\n pButton\r\n size=\"small\"\r\n class=\"p-button-text\"\r\n (click)=\"onReset(); drawerVisible=false\"\r\n >\r\n {{ 'CLEAR' | translate }}\r\n </button>\r\n </div>\r\n </ng-template>\r\n </p-drawer>\r\n\r\n }\r\n","// sort-builder.component.ts\r\nimport { Component } from '@angular/core';\r\nimport { FieldType, FieldTypeConfig } from '@ngx-formly/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { DragDropModule } from 'primeng/dragdrop';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\n\r\n@Component({\r\n selector: 'formly-sort-builder',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n SelectModule,\r\n ButtonModule,\r\n DragDropModule,\r\n TooltipModule,\r\n TranslatePipe\r\n ],\r\n styleUrls:['./sort-builder.component.css'],\r\n template: `<div class=\"sort-builder p-3 border-round border-1 surface-border\">\r\n <div class=\"mb-6\">\r\n <h5 class=\"text-lg font-semibold text-gray-900 mb-2\">{{ props.label || ('SORTING' | translate) }}</h5>\r\n <p class=\"text-gray-600 text-sm\">{{ ('PRIORITY_HINT' | translate) }}</p>\r\n </div>\r\n \r\n <!-- Sort List -->\r\n @if (sorts.length > 0) {\r\n <div class=\"sort-list space-y-2 mb-3\">\r\n @for (sort of sorts; track sort; let i = $index; let isFirst = $first; let isLast = $last) {\r\n <div\r\n class=\"sort-row p-2 border-round surface-card\"\r\n pDraggable\r\n pDroppable\r\n (onDragStart)=\"onDragStart(i)\"\r\n (onDrop)=\"onDrop($event, i)\"\r\n [ngClass]=\"{'border-left-3 border-primary': isFirst, 'border-left-3 border-200': !isFirst}\">\r\n <div class=\"grid grid-cols-4 align-items-center gap-2\">\r\n <!-- Drag Handle -->\r\n <div class=\"col-span-2 flex\">\r\n <button\r\n pButton\r\n icon=\"pi pi-bars\"\r\n type=\"button\"\r\n class=\"p-button-text p-button-plain cursor-move\"\r\n [pTooltip]=\"'DRAG_TOOLTIP' | translate\"\r\n tooltipPosition=\"top\">\r\n </button>\r\n <p-select\r\n [options]=\"getAvailableFields(sort.field)\"\r\n optionLabel=\"label\"\r\n optionValue=\"key\"\r\n [(ngModel)]=\"sort.field\"\r\n (onChange)=\"updateValue()\"\r\n [placeholder]=\"'SELECT_FIELD_SORT' | translate\"\r\n [showClear]=\"true\"\r\n appendTo=\"body\"\r\n styleClass=\"w-full\">\r\n </p-select>\r\n </div>\r\n <!-- Direction Selector -->\r\n <div class=\"col-fixed\">\r\n <p-select\r\n [options]=\"directionOptions\"\r\n [(ngModel)]=\"sort.direction\"\r\n (onChange)=\"updateValue()\"\r\n [placeholder]=\"'DIRECTION' | translate\"\r\n appendTo=\"body\"\r\n styleClass=\"w-full\">\r\n </p-select>\r\n </div>\r\n <!-- Actions -->\r\n <div class=\"col-fixed flex gap-2\" style=\"justify-content: flex-end;\">\r\n <!-- Move Up -->\r\n @if (!isFirst) {\r\n <button\r\n outlined\r\n style=\"width: var(--p-button-icon-only-width);\"\r\n pButton\r\n icon=\"pi pi-arrow-up\"\r\n type=\"button\"\r\n class=\"p-button-sm p-button-success\"\r\n (click)=\"moveSort(i, i - 1)\"\r\n [pTooltip]=\"'MOVE_UP' | translate\"\r\n tooltipPosition=\"top\">\r\n </button>\r\n }\r\n <!-- Move Down -->\r\n @if (!isLast) {\r\n <button\r\n outlined\r\n style=\"width: var(--p-button-icon-only-width);\"\r\n pButton\r\n icon=\"pi pi-arrow-down\"\r\n type=\"button\"\r\n class=\"p-button-sm p-button-success\"\r\n (click)=\"moveSort(i, i + 1)\"\r\n [pTooltip]=\"'MOVE_DOWN' | translate\"\r\n tooltipPosition=\"top\">\r\n </button>\r\n }\r\n <!-- Remove -->\r\n <button\r\n style=\"width: var(--p-button-icon-only-width);\"\r\n pButton\r\n icon=\"pi pi-times\"\r\n type=\"button\"\r\n class=\"p-button-sm p-button-danger\"\r\n (click)=\"removeSort(i)\"\r\n [pTooltip]=\"'REMOVE_SORT' | translate\"\r\n tooltipPosition=\"top\">\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n \r\n <!-- Empty State -->\r\n @if (sorts.length === 0) {\r\n <div class=\"empty-state text-center p-4 border-round surface-section\">\r\n <i class=\"pi pi-sort-alt text-4xl text-500 mb-3\"></i>\r\n <p class=\"text-500 mb-3\">{{ 'NO_SORT_RULES' | translate }}</p>\r\n <p class=\"text-400 text-sm mb-3\">{{ 'DEFAULT_ORDER' | translate }}</p>\r\n </div>\r\n }\r\n \r\n <!-- Actions -->\r\n <div class=\"flex gap-2\">\r\n <button\r\n pButton\r\n icon=\"pi pi-sort-alt\"\r\n [label]=\"'ADD_SORT' | translate\"\r\n type=\"button\"\r\n class=\"p-button-outlined flex-1\"\r\n (click)=\"addSort()\">\r\n </button>\r\n \r\n @if (sorts.length > 1) {\r\n <button\r\n pButton\r\n icon=\"pi pi-random\"\r\n [label]=\"'REVERSE_ORDER' | translate\"\r\n type=\"button\"\r\n class=\"p-button-outlined\"\r\n (click)=\"reverseSorts()\"\r\n [pTooltip]=\"'REVERSE_TOOLTIP' | translate\"\r\n tooltipPosition=\"top\">\r\n </button>\r\n }\r\n \r\n @if (sorts.length > 0) {\r\n <button\r\n pButton\r\n icon=\"pi pi-trash\"\r\n type=\"button\"\r\n class=\"p-button-outlined p-button-danger\"\r\n (click)=\"clearAll()\"\r\n [pTooltip]=\"'CLEAR_ALL_TOOLTIP' | translate\"\r\n tooltipPosition=\"top\">\r\n </button>\r\n }\r\n </div>\r\n \r\n <!-- Summary -->\r\n @if (sorts.length > 0) {\r\n <div class=\"sort-summary mt-3 p-2 border-round surface-ground\">\r\n <h5 class=\"mt-0 mb-2 text-sm\">{{ 'SORT_SUMMARY' | translate }}:</h5>\r\n <div class=\"text-sm text-500\">\r\n @for (sort of sorts; track sort; let i = $index) {\r\n <span class=\"sort-step\">\r\n <span class=\"font-semibold\">{{ getFieldLabel(sort.field) }}</span>\r\n <span class=\"direction-badge\" [ngClass]=\"sort.direction === 'asc' ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800'\">\r\n {{ sort.direction === 'asc' ? '▲' : '▼' }}\r\n </span>\r\n @if (!isLast) {\r\n <span> {{ 'THEN' | translate }} </span>\r\n }\r\n </span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n </div>`\r\n})\r\nexport class SortBuilderComponent extends FieldType<FieldTypeConfig> {\r\n sorts: any[] = [];\r\n directionOptions = [\r\n { label: 'تصاعدي (أ → ي)', value: 'asc' },\r\n { label: 'تنازلي (ي → أ)', value: 'desc' }\r\n ];\r\n\r\n private dragStartIndex: number = -1;\r\n\r\n ngOnInit() {\r\n if (this.formControl.value && Array.isArray(this.formControl.value)) {\r\n this.sorts = this.formControl.value.map((sort: any) => ({\r\n field: sort.field || '',\r\n direction: sort.direction || 'asc'\r\n }));\r\n }\r\n }\r\n\r\n addSort() {\r\n this.sorts.push({ field: '', direction: 'asc' });\r\n this.updateValue();\r\n }\r\n\r\n removeSort(index: number) {\r\n this.sorts.splice(index, 1);\r\n this.updateValue();\r\n }\r\n\r\n moveSort(fromIndex: number, toIndex: number) {\r\n if (toIndex >= 0 && toIndex < this.sorts.length) {\r\n const movedItem = this.sorts.splice(fromIndex, 1)[0];\r\n this.sorts.splice(toIndex, 0, movedItem);\r\n this.updateValue();\r\n }\r\n }\r\n\r\n onDragStart(index: number) {\r\n this.dragStartIndex = index;\r\n }\r\n\r\n onDrop(event: any, dropIndex: number) {\r\n if (this.dragStartIndex !== -1 && this.dragStartIndex !== dropIndex) {\r\n this.moveSort(this.dragStartIndex, dropIndex);\r\n }\r\n this.dragStartIndex = -1;\r\n }\r\n\r\n reverseSorts() {\r\n this.sorts.forEach(sort => {\r\n sort.direction = sort.direction === 'asc' ? 'desc' : 'asc';\r\n });\r\n this.updateValue();\r\n }\r\n\r\n clearAll() {\r\n this.sorts = [];\r\n this.updateValue();\r\n }\r\n\r\n getAvailableFields(currentField: string) {\r\n const usedFields = this.sorts.map(s => s.field).filter(f => f && f !== currentField);\r\n return this.props['fields'].filter((field: any) =>\r\n !usedFields.includes(field.key) || field.key === currentField\r\n );\r\n }\r\n\r\n getFieldLabel(fieldKey: string): string {\r\n const field = this.props['fields'].find((f: any) => f.key === fieldKey);\r\n return field?.label || fieldKey;\r\n }\r\n\r\n getDirectionIcon(direction: string): string {\r\n return direction === 'asc' ? 'pi pi-sort-up' : 'pi pi-sort-down';\r\n }\r\n\r\n getDirectionColor(direction: string): string {\r\n return direction === 'asc' ? 'text-green-500' : 'text-red-500';\r\n }\r\n\r\n updateValue() {\r\n // Filter out empty sorts and update value\r\n const validSorts = this.sorts.filter(sort => sort.field && sort.direction);\r\n this.formControl.setValue(validSorts);\r\n }\r\n\r\n // Helper to check if it's the last item\r\n get isLast(): boolean {\r\n return false; // This is used in template context\r\n }\r\n\r\n // Method to get current sort configuration\r\n getSortConfiguration(): any[] {\r\n return this.sorts.filter(sort => sort.field && sort.direction);\r\n }\r\n\r\n // Method to load sort configuration\r\n loadSortConfiguration(sortConfig: any[]) {\r\n if (sortConfig && Array.isArray(sortConfig)) {\r\n this.sorts = sortConfig.map(sort => ({\r\n field: sort.field || '',\r\n direction: sort.direction || 'asc'\r\n }));\r\n this.updateValue();\r\n }\r\n }\r\n\r\n // Method to check if a field is already used in sorting\r\n isFieldUsed(fieldKey: string): boolean {\r\n return this.sorts.some(sort => sort.field === fieldKey);\r\n }\r\n\r\n // Get the next available field\r\n getNextAvailableField(): string {\r\n const availableFields = this.props['fields'].filter((field: any) =>\r\n !this.isFieldUsed(field.key)\r\n );\r\n return availableFields.length > 0 ? availableFields[0].key : '';\r\n }\r\n}\r\n","// query-builder.component.ts\r\nimport { ListboxModule } from 'primeng/listbox';\r\nimport { ChangeDetectorRef, Component, inject, OnInit, } from '@angular/core';\r\nimport { FieldType, FieldTypeConfig, FormlyFieldConfig, FormlyForm } from '@ngx-formly/core';\r\n\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { DatePickerModule } from 'primeng/datepicker';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { QueryBuilderService } from './query-builder.service';\r\nimport { MenuModule } from 'primeng/menu';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\r\nimport { InputGroupModule } from 'primeng/inputgroup';\r\nimport { PopoverModule } from 'primeng/popover';\r\nimport { LocalizationService } from '@es.framework/ng.core/services';\r\n\r\n@Component({\r\n selector: 'formly-query-builder',\r\n standalone: true,\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n SelectModule,\r\n InputTextModule,\r\n ButtonModule,\r\n DatePickerModule,\r\n CheckboxModule,\r\n RadioButtonModule,\r\n FormlyForm,\r\n TooltipModule,\r\n MenuModule,\r\n TranslatePipe,\r\n InputGroupModule,\r\n InputGroupAddonModule,\r\n PopoverModule,\r\n ListboxModule\r\n],\r\n templateUrl: './query-builder.component.html',\r\n styleUrls: ['./query-builder.component.css']\r\n})\r\nexport class QueryBuilderComponent extends FieldType<FieldTypeConfig> implements OnInit {\r\n private queryBuilderService = inject(QueryBuilderService);\r\n private cdr = inject(ChangeDetectorRef);\r\n private translate = inject(LocalizationService);\r\n\r\n groups: any[] = [];\r\n\r\n logicalOperators = [\r\n { label: this.translate.instant('and'), value: 'and' },\r\n { label: this.translate.instant('or'), value: 'or' }\r\n ];\r\n\r\n showAppliedFilters = false;\r\n\r\n ngOnInit() {\r\n // Initialize with existing value or default group with conditions\r\n if (this.formControl.value && (Array.isArray(this.formControl.value) && this.formControl.value.length > 0)) {\r\n\r\n this.initializeAppliedConditionsWithFieldConfigs();\r\n this.initializeDefaultConditions();\r\n } else {\r\n // Start with default conditions for important fields\r\n this.initializeDefaultConditions();\r\n }\r\n }\r\n\r\n private initializeAppliedConditionsWithFieldConfigs() {\r\n this.groups = this.formControl.value.map((group: any, groupIndex: number) => ({\r\n logicalOperator: group.logicalOperator || 'and',\r\n groupLogicalOperator: group.groupLogicalOperator || 'and',\r\n conditions: this.initializeConditionsWithFieldConfigs(group.conditions || [], groupIndex)\r\n }));\r\n }\r\nprivate initializeConditionsWithFieldConfigs(conditions: any[], groupIndex: number): any[] {\r\n return conditions.map((condition, conditionIndex) => ({\r\n ...condition,\r\n operatorsForField : this.getOperatorsForField(condition.field),\r\n valueFieldConfig: condition.field ?\r\n this.generateValueFieldConfig(condition, groupIndex, conditionIndex) :\r\n null\r\n }));\r\n }\r\n private initializeDefaultConditions(): void {\r\n // Get default fields using the service logic\r\n const defaultFields = this.getDefaultFields();\r\n\r\n const defaultConditions = [];\r\n for (let i = 0; i < defaultFields.length; i++) {\r\n const field = defaultFields[i];\r\n defaultConditions.push(this.createDefaultCondition(field, 0, i,field.props?.operator));\r\n }\r\n\r\n // this.groups = [{\r\n // logicalOperator: 'and',\r\n // groupLogicalOperator: 'and',\r\n // conditions: defaultConditions\r\n // }];\r\n this.groups = [{\r\n logicalOperator: 'and',\r\n groupLogicalOperator: 'and',\r\n conditions: defaultConditions.filter(dc =>\r\n !this.groups?.some(g =>\r\n g.conditions?.some((c:any) =>\r\n c.field === dc.field &&\r\n c.operator === dc.operator\r\n )\r\n )\r\n )\r\n}];\r\n\r\n\r\n this.updateValue();\r\n }\r\n toggleAppliedFilters() {\r\n if (this.showAppliedFilters == true) {\r\n this.initializeAppliedConditionsWithFieldConfigs();\r\n this.initializeDefaultConditions();\r\n }\r\n else {\r\n this.initializeAppliedConditionsWithFieldConfigs();\r\n }\r\n this.showAppliedFilters = !this.showAppliedFilters;\r\n }\r\nonAndClick(group: any, event: any): void {\r\n group.logicalOperator = 'and';\r\n this.updateValue();\r\n}\r\n\r\nonOrClick(group: any, event: any): void {\r\n group.logicalOperator = 'or';\r\n this.updateValue();\r\n}\r\n\r\n\r\n getLogicalOperatorText(operator: string): string {\r\n const operatorMap: { [key: string]: string } = {\r\n 'and': this.translate.instant('and'),\r\n 'or': this.translate.instant('or'),\r\n 'not': this.translate.instant('not')\r\n};\r\n return operatorMap[operator] || operator;\r\n }\r\n\r\n\r\n\r\n\r\n private getDefaultFields(): any[] {\r\n // Get all filterable fields\r\n const filterableFields = this.props['fields'].filter((field: any) =>\r\n field.filterable !== false && field.key && this.isSupportedFieldType(field.type)\r\n );\r\n\r\n // If no filterable fields, return empty array\r\n if (filterableFields.length === 0) {\r\n return [];\r\n }\r\n\r\n const selectedFields = filterableFields;\r\n return selectedFields;\r\n }\r\n\r\n private isSupportedFieldType(fieldType: string): boolean {\r\n // Only include field types that make sense for filtering\r\n const supportedTypes = ['input', 'number', 'datepicker','custom-datepicker', 'select', 'checkbox', 'generic-selector', 'switch', 'radio', 'textarea'];\r\n return supportedTypes.includes(fieldType);\r\n }\r\ngetFieldLabel(key: string): string {\r\n const f = this.props['fields']?.find((x: any) => x.key === key);\r\n return f ? f.label : '';\r\n}\r\n private createDefaultCondition(field: any, groupIndex: number, conditionIndex: number,operator?:string): any {\r\n const defaultCondition = {\r\n field: field.key,\r\n operator:operator ?operator : this.getDefaultOperator(field.type),\r\n value: this.getDefaultValue(field.type),\r\n valueFieldConfig: null,\r\n operatorsForField : this.getOperatorsForField(field),\r\n };\r\n\r\n // Generate field config for this condition\r\n defaultCondition.valueFieldConfig = this.generateValueFieldConfig(\r\n defaultCondition,\r\n groupIndex,\r\n conditionIndex\r\n ) as any;\r\n\r\n return defaultCondition;\r\n }\r\n\r\nget filterCount(){\r\n const filters = ((this.model?.advancedFilters ?? [])[0]?.conditions?.length || 0) +\r\n ((this.model?.sorting ?? [])?.length || 0) +\r\n (this.model?.pagination && this.model?.pagination?.top ? 1 : 0);\r\n return filters;\r\n }\r\n // Field type and operator methods that use QueryBuilderService logic\r\n getFieldType(fieldKey: string): string {\r\n const field = this.props['fields'].find((f: any) => f.key === fieldKey);\r\n return field?.type || 'input';\r\n }\r\n\r\n getOperatorsForField(field: any): any[] {\r\n if (!field) return [];\r\n\r\n let fieldKey: string;\r\n\r\n if (typeof field === 'object' && field !== null) {\r\n fieldKey = field['key'];\r\n } else {\r\n fieldKey = field;\r\n }\r\n const field_ = this.props['fields'].find((f: any) => f.key === fieldKey);\r\n // Use operators from the field configuration\r\n const operators = field_?.operators || this.queryBuilderService['getOperatorsForType'](field_?.type);\r\n\r\n return operators.map((op: string) => ({\r\n label: this.getOperatorLabel(op).label,\r\n icon: this.getOperatorLabel(op).icon,\r\n value: op\r\n }));\r\n }\r\n\r\n\r\ngetOperatorLabel(operator: string): { label: string; icon: string } {\r\n const map: { [key: string]: { label: string; icon: string } } = {\r\n eq: { label: this.translate.instant('eq'), icon: 'pi pi-equals' },\r\n ne: { label: this.translate.instant('ne'), icon: 'pi pi-hashtag' },\r\n contains: { label: this.translate.instant('contains'), icon: 'pi pi-search' },\r\n startswith: { label: this.translate.instant('startswith'), icon: 'pi pi-arrow-right' },\r\n endswith: { label: this.translate.instant('endswith'), icon: 'pi pi-arrow-left' },\r\n gt: { label: this.translate.instant('gt'), icon: 'pi pi-chevron-right' },\r\n ge: { label: this.translate.instant('ge'), icon: 'pi pi-angle-double-right' },\r\n lt: { label: this.translate.instant('lt'), icon: 'pi pi-chevron-left' },\r\n le: { label: this.translate.instant('le'), icon: 'pi pi-angle-double-left' },\r\n in: { label: this.translate.instant('in'), icon: 'pi pi-list' },\r\n notin: { label: this.translate.instant('notin'), icon: 'pi pi-ban' },\r\n };\r\n\r\n return map[operator] || { label: operator, icon: 'pi pi-question' };\r\n}\r\n\r\n\r\n\r\n getDefaultOperator(fieldType: string): string {\r\n // Use service's field type config\r\n const fieldConfig = this.queryBuilderService['fieldTypeConfig'][fieldType as keyof typeof this.queryBuilderService['fieldTypeConfig']];\r\n return fieldConfig ? fieldConfig.defaultOperator : 'contains';\r\n }\r\n\r\n getDefaultValue(fieldType: string): any {\r\n // Use service's field type config\r\n const fieldConfig = this.queryBuilderService['fieldTypeConfig'][fieldType as keyof typeof this.queryBuilderService['fieldTypeConfig']];\r\n return fieldConfig ? fieldConfig.defaultValue : '';\r\n }\r\n\r\n\r\n\r\n getFieldProps(fieldKey: string): any {\r\n const field = this.props['fields'].find((f: any) => f.key === fieldKey);\r\n // Return props without label to avoid duplication\r\n const props = { ...field?.props };\r\n delete props.label;\r\n delete props.loadDefault;\r\n return props;\r\n }\r\n\r\n private generateValueFieldConfig(condition: any, groupIndex: number, conditionIndex: number): FormlyFieldConfig {\r\n const fieldType = this.getFieldType(condition.field);\r\n const fieldProps = this.getFieldProps(condition.field);\r\n const fieldKey = this.getConditionValueKey(groupIndex, conditionIndex);\r\n\r\n return {\r\n key: fieldKey,\r\n type: fieldType,\r\n wrappers:[],\r\n props: {\r\n ...fieldProps, // Include all other props from the original field\r\n placeholder:'',\r\n loadDefault:false,\r\n change: (field: FormlyFieldConfig, event?: any) => {\r\n this.updateValue();\r\n }\r\n },\r\n hooks: {\r\n onInit: (field: FormlyFieldConfig) => {\r\n if (field.formControl && condition.value !== undefined) {\r\n field.formControl.setValue(condition.value, { emitEvent: false });\r\n }\r\n }\r\n },\r\n modelOptions: {\r\n updateOn: 'change'\r\n }\r\n };\r\n }\r\n\r\n getConditionValueKey(groupIndex: number, conditionIndex: number): string {\r\n return `condition_${groupIndex}_${conditionIndex}_value`;\r\n }\r\n\r\n // Group Management\r\n addGroup() {\r\n this.groups.push({\r\n logicalOperator: 'and',\r\n groupLogicalOperator: 'and',\r\n conditions: []\r\n });\r\n this.updateValue();\r\n }\r\n\r\n // removeGroup(groupIndex: number) {\r\n // this.groups.splice(groupIndex, 1);\r\n // this.updateValue();\r\n // }\r\nremoveGroup(groupIndex: number) {\r\n if (this.groups[groupIndex]) {\r\n // Get all field keys for this group before deleting\r\n const fieldKeysToRemove: string[] = [];\r\n\r\n // Collect all condition field keys in this group\r\n if (this.groups[groupIndex].conditions) {\r\n for (let c = 0; c < this.groups[groupIndex].conditions.length; c++) {\r\n const fieldKey = this.getConditionValueKey(groupIndex, c);\r\n fieldKeysToRemove.push(fieldKey);\r\n }\r\n }\r\n\r\n // Remove the group\r\n this.groups.splice(groupIndex, 1);\r\n\r\n // Remove all associated fields from model\r\n this.removeMultipleFromModel(fieldKeysToRemove);\r\n\r\n this.updateValue();\r\n }\r\n}\r\n\r\n// Remove multiple fields from formly model\r\nremoveMultipleFromModel(fieldKeys: string[]) {\r\n fieldKeys.forEach(fieldKey => {\r\n this.removeFromModel(fieldKey);\r\n });\r\n}\r\n // Condition Management\r\n addCondition(groupIndex: number = 0) {\r\n if (!this.groups[groupIndex]) {\r\n this.addGroup();\r\n }\r\n\r\n const newCondition = {\r\n field: '',\r\n operator: 'eq',\r\n value: '',\r\n valueFieldConfig: {}\r\n };\r\n\r\n const conditionIndex = this.groups[groupIndex].conditions.length;\r\n newCondition.valueFieldConfig = this.generateValueFieldConfig(newCondition, groupIndex, conditionIndex);\r\n\r\n this.groups[groupIndex].conditions.push(newCondition);\r\n this.updateValue();\r\n }\r\n\r\n onFieldChange(condition: any, groupIndex: number, conditionIndex: number) {\r\n condition.operator = this.getDefaultOperator(this.getFieldType(condition.field));\r\n condition.value = this.getDefaultValue(this.getFieldType(condition.field));\r\n\r\n // Generate and store the field config when field changes\r\n condition.valueFieldConfig = this.generateValueFieldConfig(condition, groupIndex, conditionIndex);\r\n condition.operatorsForField = this.getOperatorsForField(condition.field);\r\n\r\n this.updateValue();\r\n }\r\n\r\n addConditionToLastGroup() {\r\n const lastGroupIndex = this.groups.length - 1;\r\n if (lastGroupIndex >= 0) {\r\n this.addCondition(lastGroupIndex);\r\n } else {\r\n this.addGroup();\r\n this.addCondition(0);\r\n }\r\n }\r\n\r\n removeCondition(groupIndex: number, conditionIndex: number) {\r\n if (this.groups[groupIndex]) {\r\n\r\n // Get the field key before deleting so we can remove from model\r\n const fieldKey = this.getConditionValueKey(groupIndex, conditionIndex);\r\n\r\n // Using delete operator (sets to undefined, then we filter)\r\n delete this.groups[groupIndex].conditions[conditionIndex];\r\n\r\n // Remove the undefined entries from conditions array\r\n this.groups[groupIndex].conditions = this.groups[groupIndex].conditions.filter((condition: any) => condition !== undefined);\r\n\r\n // Remove empty groups\r\n if (this.groups[groupIndex].conditions.length === 0 && this.groups.length > 1) {\r\n delete this.groups[groupIndex];\r\n // Remove undefined groups from array\r\n this.groups = this.groups.filter(group => group !== undefined);\r\n }\r\n\r\n // Remove from formly model\r\n this.removeFromModel(fieldKey);\r\n\r\n this.updateValue();\r\n }\r\n}\r\n\r\n// Remove the field from formly model\r\nremoveFromModel(fieldKey: string) {\r\n if (this.model && this.model.hasOwnProperty(fieldKey)) {\r\n delete this.model[fieldKey];\r\n }\r\n\r\n // Also update the form control to ensure sync\r\n if (this.formControl.value && this.formControl.value.hasOwnProperty(fieldKey)) {\r\n const updatedValue = { ...this.formControl.value };\r\n delete updatedValue[fieldKey];\r\n this.formControl.setValue(updatedValue);\r\n }\r\n}\r\n\r\n // Value Management\r\n updateValue() {\r\n // Sync condition values from form model with safe access\r\n for (let g = 0; g < this.groups.length; g++) {\r\n const group = this.groups[g];\r\n for (let c = 0; c < group.conditions.length; c++) {\r\n const condition = group.conditions[c];\r\n const fieldKey = this.getConditionValueKey(g, c);\r\n\r\n try {\r\n const modelValue = this.model?.[fieldKey];\r\n\r\n if (modelValue !== undefined) {\r\n condition.value = modelValue;\r\n }\r\n } catch (error) {\r\n\r\n }\r\n }\r\n }\r\n\r\n const filteredGroups = [];\r\n for (let g = 0; g < this.groups.length; g++) {\r\n const group = this.groups[g];\r\n const validConditions = [];\r\n\r\n for (let c = 0; c < group.conditions.length; c++) {\r\n const condition = group.conditions[c];\r\n if (\r\n condition.field &&\r\n condition.operator &&\r\n condition.value !== undefined &&\r\n condition.value !== null &&\r\n condition.value !== ''\r\n ) {\r\n validConditions.push(condition);\r\n }\r\n }\r\n\r\n if (validConditions.length > 0) {\r\n filteredGroups.push({ ...group, conditions: validConditions });\r\n }\r\n }\r\n\r\n this.formControl.setValue(filteredGroups);\r\n this.cdr.detectChanges();\r\n }\r\n\r\n clearAll() {\r\n this.groups = [];\r\n\r\n // Completely reset the form and model\r\n this.form.reset();\r\n\r\n // Manually set model to empty object\r\n Object.keys(this.model).forEach(key => {\r\n delete this.model[key];\r\n });\r\n this.addGroup();\r\n}\r\n\r\n // Helper methods\r\n getQueryStructure(): any {\r\n return this.groups;\r\n }\r\n\r\n loadQueryStructure(queryStructure: any[]) {\r\n if (queryStructure && Array.isArray(queryStructure)) {\r\n this.groups = queryStructure.map((group, groupIndex) => ({\r\n logicalOperator: group.logicalOperator || 'and',\r\n groupLogicalOperator: group.groupLogicalOperator || 'and',\r\n conditions: this.initializeConditionsWithFieldConfigs(group.conditions || [], groupIndex)\r\n }));\r\n this.updateValue();\r\n }\r\n }\r\n}\r\n","<div>\n\n <!-- Groups Container with Connecting Lines -->\n <div class=\"groups-container\" #groupsContainer>\n @for (group of groups; track group; let groupIndex = $index) {\n <div\n class=\"group-wrapper relative\"\n #groupElement>\n <!-- Vertical Connector Line from Previous Group -->\n @if (groupIndex > 0) {\n <div class=\"vertical-connector\">\n <div class=\"vertical-line\"></div>\n <!-- Operator Button -->\n <button\n type=\"button\"\n class=\"group-logical-operator-box\"\n [class.and]=\"group.groupLogicalOperator === 'and'\"\n [class.or]=\"group.groupLogicalOperator === 'or'\"\n (click)=\"opPopover.toggle($event)\">\n <span class=\"operator-text\">\n {{ getLogicalOperatorText(group.groupLogicalOperator || 'and') }}\n </span>\n <div class=\"connector-arrow\"></div>\n </button>\n <!-- Popover -->\n <p-popover #opPopover appendTo=\"body\">\n <div class=\"w-12rem\">\n <p-listbox\n [options]=\"logicalOperators\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"group.groupLogicalOperator\"\n (onChange)=\" opPopover.toggle($event)\"\n [style]=\"{ width: '100%' }\">\n </p-listbox>\n </div>\n </p-popover>\n </div>\n }\n <div class=\"group-container mb-6 p-1 bg-white rounded-lg border-l-4 border-t-1 border-b-1 border-r-1 shadow-sm transition-all duration-300 relative\"\n [class.border-blue-500]=\"group.logicalOperator === 'and'\"\n [class.border-or-500]=\"group.logicalOperator === 'or'\"\n [class.pulse]=\"groupIndex === 0\">\n <!-- Rounded Button for \"ربط الشروط\" on left border -->\n <div\n class=\"absolute -left-4 top-1/2 transform -translate-y-1/2 z-10 transition-all duration-300\"\n >\n <!-- Logical Operator Popover Button -->\n <p-button\n [severity]=\"group.logicalOperator === 'and' ? 'success' : 'info'\"\n [styleClass]=\"group.logicalOperator === 'and'\r\n ? 'p-button-icon-only p-button-rounded p-button-sm logical-and'\r\n : 'p-button-icon-only p-button-rounded p-button-sm logical-or'\"\r\n (click)=\"opPopover.toggle($event)\">\n {{group.logicalOperator === 'and' ? ('and' | translate) : ('or' | translate)}}\n </p-button>\n <!-- Popover for Operator Selection -->\n <p-popover #opPopover appendTo=\"body\">\n <div class=\"w-10rem\">\n <p-listbox\n [options]=\"[\r\n { label: 'and' | translate, value: 'and' },\r\n { label: 'or' | translate, value: 'or' }\r\n ]\"\r\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"group.logicalOperator\"\n (onChange)=\"updateValue(); opPopover.toggle($event)\"\n [style]=\"{ width: '100%' }\">\n <ng-template let-item pTemplate=\"item\">\n {{ item.label }}\n </ng-template>\n </p-listbox>\n </div>\n </p-popover>\n </div>\n <!-- Group Header -->\n <div class=\"group-header-wrapper mb-4 pl-8\">\n <div class=\"group-header flex justify-between items-center\">\n <div class=\"flex gap-1\">\n <button\n pButton\n icon=\"pi pi-plus\"\n type=\"button\"\n class=\"p-button-success p-button p-button-sm !p-1.5 rounded-md transition-colors\"\n (click)=\"addCondition(groupIndex)\"\n pTooltip=\"{{ 'ADD_CONDITION' | translate }}\"\n tooltipPosition=\"top\">\n </button>\n <!-- @if (filterCount > 0) {\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-filter\"\n class=\"p-button-outlined p-button-sm\"\n (click)=\"toggleAppliedFilters()\">\n {{ (showAppliedFilters ? 'SHOW_ALL' : 'SHOW_APPLIED') | translate }}\n </button>\n } -->\n @if (groups.length > 1) {\n <button\n pButton\n icon=\"pi pi-times\"\n type=\"button\"\n class=\"p-button-danger p-button p-button-sm !p-1.5 rounded-md transition-colors\"\n (click)=\"removeGroup(groupIndex)\"\n pTooltip=\"{{ 'DELETE_GROUP' | translate }}\"\n tooltipPosition=\"top\">\n </button>\n }\n </div>\n </div>\n </div>\n <!-- Conditions in this group -->\n @for (condition of group.conditions; track condition; let conditionIndex = $index) {\n <div\n class=\"p-1 bg-gray-50 \">\n <div class=\"grid grid-cols-1 gap-1 items-center\">\n <!-- Field Selector -->\n <div class=\"md:col-span-2\">\n <div class=\"flex w-full rounded-md overflow-hidden border border-gray-300 bg-white shadow-sm\">\n <!-- Field Selector Button -->\n <div style=\"align-items: center;display: flex; min-width: 130px;max-width: 130px;\" class=\"flex-shrink-0 \">\n <button\n type=\"button\"\n style=\"height: -webkit-fill-available;\"\n class=\"flex items-center justify-between w-full px-3 py-2 text-sm bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:z-10\"\n (click)=\"overlay.toggle($event)\">\n <span style=\"\r\n display: inline-block;\r\n max-width: 100px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n \">{{ getFieldLabel(condition.field) || ('SELECT_FIELD' | translate) }}</span>\r\n <i class=\"pi pi-chevron-down mr-2 ml-2 text-xs\"></i>\n </button>\n <!-- Overlay Content -->\n <p-popover #overlay appendTo=\"body\">\n <div class=\"w-60\">\n <p-listbox\n tabindex=\"0\"\n [options]=\"props['fields']\"\n optionLabel=\"label\"\n optionValue=\"key\"\n [(ngModel)]=\"condition.field\"\n (onChange)=\"onFieldChange(condition, groupIndex, conditionIndex); overlay.toggle($event)\"\n [style]=\"{ width: '100%' }\">\n </p-listbox>\n </div>\n </p-popover>\n </div>\n <!-- Operator Button -->\n <div style=\"align-items: center;display: flex;\" class=\"flex-shrink-0 border-l border-r border-gray-300\">\n <button\n type=\"button\"\n class=\"flex items-center justify-center w-full px-3 py-2 text-sm bg-gray-50 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:z-10\"\n style=\"height: -webkit-fill-available;\"\n pTooltip=\"{{ getOperatorLabel(condition.operator).label }}\"\n (click)=\"opPopover.toggle($event)\">\n <i [class]=\"getOperatorLabel(condition.operator).icon\"></i>\n </button>\n <p-popover #opPopover appendTo=\"body\">\n <div class=\"w-60\">\n <p-listbox\n [options]=\"condition.operatorsForField\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [(ngModel)]=\"condition.operator\"\n (onChange)=\"updateValue();opPopover.toggle($event)\"\n [style]=\"{ width: '100%' }\">\n </p-listbox>\n </div>\n </p-popover>\n </div>\n <!-- Form Field -->\n <div style=\"background: #f9fafb\" class=\"flex-grow p-1\">\n <formly-form\n [form]=\"form\"\n [fields]=\"[condition.valueFieldConfig]\"\n [model]=\"model\">\n </formly-form>\n </div>\n <!-- Delete Button -->\n <div style=\"align-items: center;display: flex;\" class=\"flex-shrink-0\">\n <button\n style=\"height: -webkit-fill-available;\"\n class=\"flex items-center justify-center w-full px-3 py-2 text-sm bg-red-50 text-red-600 hover:bg-red-100 focus:outline-none focus:ring-2 focus:ring-red-500 focus:z-10\"\n type=\"button\"\n (click)=\"removeCondition(groupIndex, conditionIndex)\"\n pTooltip=\"حذف الشرط\"\n tooltipPosition=\"top\">\n <i class=\"pi pi-times\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n <!-- Group Footer -->\n <div class=\"group-footer flex justify-between items-center mt-3 pt-3 border-t border-gray-200 \">\n <small class=\"text-gray-500\">\n {{ group.conditions.length }} شرط في هذه المجموعة\n </small>\n <small class=\"text-gray-500\">\n @if (groupIndex > 0) {\n <span>\n مرتبط مع السابقة بـ <strong [class.text-blue-600]=\"group.groupLogicalOperator === 'and'\"\n [class.text-amber-600]=\"group.groupLogicalOperator === 'or'\">\n {{ group.groupLogicalOperator === 'and' ? 'و' : 'أو' }}\n </strong>\n </span>\n }\n </small>\n </div>\n </div>\n </div>\n }\n</div>\n\n<!-- Actions -->\n<div class=\"flex flex-wrap gap-3 mt-6\">\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n [label]=\"'GROUP' | translate\"\n class=\"p-button-outlined p-button-sm !bg-white !border !border-blue-500 !text-blue-600 hover:!bg-blue-50 transition-colors flex items-center gap-2\"\n (click)=\"addGroup();\">\n </button>\n\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n [label]=\"'CONDITION' | translate\"\n class=\"p-button-outlined p-button-sm !bg-white !border !border-blue-500 !text-blue-600 hover:!bg-blue-50 transition-colors flex items-center gap-2\"\n (click)=\"addConditionToLastGroup()\">\n </button>\n\n @if (groups.length > 0) {\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-trash\"\n [label]=\"'CLEAR' | translate\"\n class=\"p-button-danger p-button-outlined p-button-sm !bg-white !border !border-red-500 !text-red-600 hover:!bg-red-50 transition-colors flex items-center gap-2\"\n (click)=\"clearAll()\">\n </button>\n }\n</div>\n\n<!-- Empty State -->\n@if (groups.length === 0) {\n <div class=\"empty-state text-center p-6 border-2 border-dashed border-gray-300 rounded-xl bg-gray-50\">\n <i class=\"pi pi-search text-4xl text-gray-400 mb-3\"></i>\n <p class=\"text-gray-500 mb-4\">{{ 'NO_SEARCH_CONDITIONS' | translate }}</p>\n <button\n pButton\n type=\"button\"\n icon=\"pi pi-plus\"\n [label]=\"'ADD_SEARCH_CONDITION' | translate\"\n class=\"p-button-outlined !px-4 !py-2\"\n (click)=\"addGroup()\">\n </button>\n </div>\n}\n</div>\n","// tab-type.component.ts\r\nimport { Component } from '@angular/core';\r\nimport { FieldType, FormlyField, FormlyFieldConfig } from '@ngx-formly/core';\r\n\r\nimport { TabsModule } from 'primeng/tabs';\r\nimport { BadgeModule } from 'primeng/badge';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\n\r\n@Component({\r\n selector: 'formly-tab-type',\r\n template: `\r\n <p-tabs\r\n [value]=\"activeTabValue\"\r\n [scrollable]=\"props['scrollable'] !== false\"\r\n [lazy]=\"props['lazy'] !== false\"\r\n (valueChange)=\"onTabChange($event)\">\r\n \r\n <p-tablist>\r\n @for (tab of field.fieldGroup; track tab; let i = $index) {\r\n <p-tab\r\n [value]=\"i.toString()\"\r\n [disabled]=\"tab.props?.disabled\">\r\n @if(tab.props){\r\n <div class=\"flex align-items-center gap-2\">\r\n <!-- Left Icon -->\r\n @if (tab.props['leftIcon']) {\r\n <i [class]=\"tab.props['leftIcon']\" class=\"text-sm\"></i>\r\n }\r\n <!-- Label -->\r\n <span>{{ (tab.props['tabLabel'] ?? '') | translate }}</span>\r\n <!-- Badge -->\r\n @if (resolveBadge(tab) !== null) {\r\n <p-badge\r\n [value]=\"resolveBadge(tab)\"\r\n size=\"small\">\r\n </p-badge>\r\n }\r\n <!-- Right Icon -->\r\n @if (tab.props['rightIcon']) {\r\n <i [class]=\"tab.props['rightIcon']\" class=\"text-sm\"></i>\r\n }\r\n </div>\r\n }\r\n </p-tab>\r\n }\r\n </p-tablist>\r\n \r\n <p-tabpanels style=\"padding: 0;\">\r\n @for (tab of field.fieldGroup; track tab; let i = $index) {\r\n <p-tabpanel\r\n [value]=\"i.toString()\">\r\n <div class=\"p-3\">\r\n <formly-field [field]=\"tab\"></formly-field>\r\n <!-- Empty state -->\r\n @if (!tab.fieldGroup || tab.fieldGroup.length === 0) {\r\n <div\r\n class=\"empty-tab text-center p-4 text-500\">\r\n <i class=\"pi pi-inbox text-2xl mb-2\"></i>\r\n <p>لا توجد حقول في هذه التبويبة</p>\r\n </div>\r\n }\r\n </div>\r\n </p-tabpanel>\r\n }\r\n </p-tabpanels>\r\n </p-tabs>\r\n `,\r\n standalone: true,\r\n imports: [TabsModule, BadgeModule, FormlyField, TranslatePipe]\r\n})\r\nexport class TabTypeComponent extends FieldType<FormlyFieldConfig> {\r\n activeTabValue: string = '0';\r\n\r\n ngOnInit() {\r\n if (this.props['activeIndex'] !== undefined) {\r\n this.activeTabValue = this.props['activeIndex'].toString();\r\n }\r\n }\r\n resolveBadge(tab: FormlyFieldConfig): any {\r\n const badge = tab.props?.['badge'];\r\n if (typeof badge === 'function') {\r\n const result = badge(tab);\r\n return result == 0 ? null : result;\r\n }\r\n return badge ?? null;\r\n }\r\n onTabChange(newValue: any) {\r\n this.activeTabValue = newValue;\r\n\r\n if (this.props['onTabChange']) {\r\n this.props['onTabChange']({\r\n activeIndex: parseInt(newValue),\r\n tab: this.field.fieldGroup?.[parseInt(newValue)]\r\n });\r\n }\r\n }\r\n}\r\n","// columns-builder.component.ts\r\nimport { Component, OnInit } from '@angular/core';\r\nimport { FieldType, FieldTypeConfig, FormlyForm } from '@ngx-formly/core';\r\nimport { FormGroup, FormArray, FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { SelectField } from './interfaces';\r\n\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { DatePickerModule } from 'primeng/datepicker';\r\nimport { InputGroupModule } from 'primeng/inputgroup';\r\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { ListboxModule } from 'primeng/listbox';\r\nimport { MenuModule } from 'primeng/menu';\r\nimport { PopoverModule } from 'primeng/popover';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\n@Component({\r\n selector: 'formly-columns-builder',\r\n template: `\r\n <div>\r\n <!-- Header -->\r\n <div class=\"mb-6\">\r\n <h5 class=\"text-lg font-semibold text-gray-900 mb-2\">{{ props.label || ('COLUMNS_MANAGEMENT' | translate) }}</h5>\r\n <p class=\"text-gray-600 text-sm\">{{ props.description || ('COLUMNS_DESCRIPTION' | translate) }}</p>\r\n </div>\r\n \r\n <!-- Quick Actions -->\r\n <div class=\"flex flex-wrap gap-2 mb-6\">\r\n <button\r\n type=\"button\"\r\n (click)=\"toggleAll(true)\"\r\n class=\"inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\r\n >\r\n <i class=\"pi pi-eye\"></i>\r\n {{ 'SHOW_ALL' | translate }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n (click)=\"toggleAll(false)\"\r\n class=\"inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\r\n >\r\n <i class=\"pi pi-eye-slash\"></i>\r\n {{ 'HIDE_ALL' | translate }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n (click)=\"resetToDefault()\"\r\n class=\"inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors\"\r\n >\r\n <i class=\"pi pi-refresh\"></i>\r\n {{ 'RESET_TO_DEFAULT' | translate }}\r\n </button>\r\n </div>\r\n \r\n <!-- Drag Info -->\r\n <div class=\"mb-4 p-2 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700\">\r\n <i class=\"pi pi-info-circle mr-2\"></i>\r\n {{ 'DRAG_COLUMNS_INFO' | translate }}\r\n </div>\r\n \r\n <!-- Columns List -->\r\n <div class=\"space-y-3\">\r\n @if (columns.length === 0) {\r\n <div class=\"text-center py-8 px-4 border-2 border-dashed border-gray-300 rounded-lg bg-gray-50\">\r\n <i class=\"pi pi-table text-4xl text-gray-400 mb-3\"></i>\r\n <p class=\"text-gray-500\">{{ 'NO_COLUMNS_AVAILABLE' | translate }}</p>\r\n </div>\r\n }\r\n \r\n @for (column of columns; track column; let i = $index) {\r\n <div\r\n class=\"bg-gray-50 rounded-lg border border-gray-200 p-1 transition-colors hover:bg-gray-100\"\r\n draggable=\"true\"\r\n (dragstart)=\"onDragStart($event, i)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event, i)\"\r\n (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\">\r\n <div class=\"grid grid-cols-12 gap-4 items-center\">\r\n <!-- Drag Handle -->\r\n <div class=\"col-span-1 flex justify-center cursor-move text-gray-400 hover:text-gray-600\"\r\n draggable=\"true\"\r\n (dragstart)=\"onDragStart($event, i)\">\r\n <i class=\"pi pi-bars\"></i>\r\n </div>\r\n <!-- Visibility Toggle -->\r\n <div class=\"col-span-1 flex justify-center\">\r\n <p-checkbox\r\n [binary]=\"true\"\r\n [formControl]=\"getColumnControl(column.key, 'isVisible')\"\r\n [inputId]=\"'visible_' + column.key\"\r\n styleClass=\"[&>div]:border-gray-300 [&>div]:hover:border-gray-400\"\r\n (onChange)=\"onFormChange()\"\r\n >\r\n </p-checkbox>\r\n </div>\r\n <!-- Column Info -->\r\n <div class=\"col-span-12 md:col-span-4\">\r\n <label [for]=\"'visible_' + column.key\" class=\"block font-medium text-gray-900 cursor-pointer hover:text-blue-600\">\r\n {{ column.label }}\r\n </label>\r\n <p class=\"text-xs text-gray-500 mt-1\">{{ column.key }}</p>\r\n </div>\r\n <!-- Display Name -->\r\n <div class=\"col-span-12 md:col-span-3\">\r\n @if (isColumnVisible(column.key)) {\r\n <input\r\n type=\"text\"\r\n [formControl]=\"getColumnControl(column.key, 'displayName')\"\r\n [placeholder]=\"column.label\"\r\n class=\"w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 text-sm\"\r\n (blur)=\"onFormChange()\"\r\n >\r\n }\r\n </div>\r\n <!-- Aggregate Function -->\r\n <!-- <div class=\"col-span-12 md:col-span-3\">\r\n <div *ngIf=\"column.aggregatable && isColumnVisible(column.key)\">\r\n <p-select\r\n [options]=\"aggregateFunctions\"\r\n optionLabel=\"label\"\r\n optionValue=\"value\"\r\n [formControl]=\"getColumnControl(column.key, 'aggregateFunction')\"\r\n [placeholder]=\"'SELECT_AGGREGATE' | translate\"\r\n [showClear]=\"true\"\r\n styleClass=\"w-full\"\r\n (onChange)=\"onFormChange()\"\r\n >\r\n </p-select>\r\n </div>\r\n <span *ngIf=\"!column.aggregatable && isColumnVisible(column.key)\" class=\"text-xs text-gray-500\">\r\n {{ 'NO_AGGREGATES_AVAILABLE' | translate }}\r\n </span>\r\n </div> -->\r\n </div>\r\n <!-- Aggregate Info -->\r\n @if (hasAggregateFunction(column.key) && isColumnVisible(column.key)) {\r\n <div\r\n class=\"mt-3 p-3 bg-blue-50 border border-blue-200 rounded-lg\">\r\n <div class=\"flex items-center gap-2\">\r\n <i class=\"pi pi-info-circle text-blue-500 text-sm\"></i>\r\n <span class=\"text-sm text-blue-800\">\r\n <!-- :{function: getAggregateLabel(getAggregateFunctionValue(column.key))} -->\r\n {{ 'AGGREGATE_INFO' | translate }}\r\n </span>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n \r\n <!-- Summary -->\r\n <div class=\"flex flex-col sm:flex-row justify-between items-center gap-4 mt-6 pt-4 border-t border-gray-200\">\r\n <span class=\"text-sm text-gray-600\">\r\n <!-- :{visible: visibleColumnsCount, total: columns.length} -->\r\n {{ 'COLUMNS_VISIBLE_COUNT' | translate }}\r\n </span>\r\n <!-- <div class=\"flex gap-4 text-sm\">\r\n <span class=\"inline-flex items-center gap-1 text-green-600\">\r\n <i class=\"pi pi-chart-line\"></i>\r\n {{ numericColumnsCount }} {{ 'NUMERIC' | translate }}\r\n </span>\r\n <span class=\"inline-flex items-center gap-1 text-blue-600\">\r\n <i class=\"pi pi-calculator\"></i>\r\n {{ aggregatedColumnsCount }} {{ 'AGGREGATED' | translate }}\r\n </span>\r\n </div> -->\r\n </div>\r\n </div>\r\n `,\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n SelectModule,\r\n InputTextModule,\r\n ButtonModule,\r\n DatePickerModule,\r\n CheckboxModule,\r\n RadioButtonModule,\r\n FormlyForm,\r\n TooltipModule,\r\n MenuModule,\r\n TranslatePipe,\r\n InputGroupModule,\r\n InputGroupAddonModule,\r\n PopoverModule,\r\n ListboxModule\r\n]\r\n})\r\nexport class ColumnsBuilderComponent extends FieldType<FieldTypeConfig> implements OnInit {\r\n dragStartIndex: number = -1;\r\n private _columnsForm!: FormGroup;\r\n\r\n aggregateFunctions = [\r\n { label: 'Sum', value: 'sum' },\r\n { label: 'Average', value: 'avg' },\r\n { label: 'Count', value: 'count' },\r\n { label: 'Minimum', value: 'min' },\r\n { label: 'Maximum', value: 'max' }\r\n ];\r\n\r\n get columns(): SelectField[] {\r\n return this.props['fields'] || [];\r\n }\r\n\r\n get columnsForm(): FormGroup {\r\n return this._columnsForm;\r\n }\r\n\r\n get visibleColumnsCount(): number {\r\n return this.columns.filter(col =>\r\n this.isColumnVisible(col.key)\r\n ).length;\r\n }\r\n\r\n get numericColumnsCount(): number {\r\n return this.columns.filter(col => col.isNumeric).length;\r\n }\r\n\r\n get aggregatedColumnsCount(): number {\r\n return this.columns.filter(col =>\r\n this.hasAggregateFunction(col.key)\r\n ).length;\r\n }\r\n\r\n ngOnInit() {\r\n this.initializeForm();\r\n this.setupValueChanges();\r\n }\r\n\r\n // Form Methods\r\n initializeForm() {\r\n const parentForm = this.form as FormGroup;\r\n const fieldKey = this.field.key as string;\r\n\r\n if (!fieldKey) return;\r\n\r\n // Get or create the FormGroup in the parent form\r\n let formGroup = parentForm.get(fieldKey) as FormGroup;\r\n\r\n if (!formGroup || !(formGroup instanceof FormGroup)) {\r\n // Create new FormGroup\r\n formGroup = new FormGroup({});\r\n parentForm.setControl(fieldKey, formGroup);\r\n\r\n // Initialize with existing model data\r\n const initialModel = this.model[fieldKey] || {};\r\n\r\n this.columns.forEach(column => {\r\n const columnConfig = initialModel[column.key] || {};\r\n const columnGroup = new FormGroup({\r\n isVisible: new FormControl(columnConfig.isVisible ?? column.defaultVisible),\r\n displayName: new FormControl(columnConfig.displayName ?? column.label),\r\n aggregateFunction: new FormControl(columnConfig.aggregateFunction ?? ''),\r\n order: new FormControl(columnConfig.order ?? 0)\r\n });\r\n formGroup.addControl(column.key, columnGroup);\r\n });\r\n }\r\n\r\n // Store the FormGroup reference\r\n this._columnsForm = formGroup;\r\n\r\n // Initialize the model with current form values\r\n this.updateModel();\r\n }\r\n\r\n private setupValueChanges() {\r\n // Listen to form changes and update the model\r\n this.columnsForm.valueChanges.subscribe(() => {\r\n this.updateModel();\r\n });\r\n }\r\n\r\n private updateModel() {\r\n const fieldKey = this.field.key as string;\r\n if (fieldKey) {\r\n // Update the model with current form values\r\n this.model[fieldKey] = this.columnsForm.value;\r\n\r\n // Trigger form control update to notify Formly\r\n this.formControl.setValue(this.columnsForm.value);\r\n }\r\n }\r\n\r\n // Called when form controls change\r\n onFormChange() {\r\n this.updateModel();\r\n }\r\n\r\n // Drag & Drop Methods\r\n onDragStart(event: DragEvent, index: number) {\r\n this.dragStartIndex = index;\r\n event.dataTransfer?.setData('text/plain', index.toString());\r\n }\r\n\r\n onDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n }\r\n\r\n onDrop(event: DragEvent, dropIndex: number) {\r\n event.preventDefault();\r\n const dragIndex = this.dragStartIndex;\r\n\r\n if (dragIndex !== -1 && dragIndex !== dropIndex) {\r\n // Reorder the columns array\r\n const movedItem = this.columns[dragIndex];\r\n const newColumns = [...this.columns];\r\n newColumns.splice(dragIndex, 1);\r\n newColumns.splice(dropIndex, 0, movedItem);\r\n\r\n // Update the props to trigger change detection\r\n this.props['fields'] = newColumns;\r\n\r\n // Update order in form controls\r\n this.updateColumnOrders();\r\n\r\n // Update model after reordering\r\n this.updateModel();\r\n }\r\n\r\n this.removeDragStyles(event);\r\n }\r\n\r\n onDragEnter(event: DragEvent) {\r\n (event.currentTarget as HTMLElement).classList.add('border-blue-500', 'bg-blue-50');\r\n }\r\n\r\n onDragLeave(event: DragEvent) {\r\n this.removeDragStyles(event);\r\n }\r\n\r\n private removeDragStyles(event: DragEvent) {\r\n (event.currentTarget as HTMLElement).classList.remove('border-blue-500', 'bg-blue-50');\r\n }\r\n\r\n private updateColumnOrders() {\r\n // Store the order in form controls\r\n this.columns.forEach((column, index) => {\r\n const orderControl = this.getColumnControl(column.key, 'order');\r\n if (!orderControl) {\r\n const columnGroup = this.columnsForm.get(column.key) as FormGroup;\r\n if (columnGroup && !columnGroup.get('order')) {\r\n columnGroup.addControl('order', new FormControl(index));\r\n }\r\n } else {\r\n orderControl.setValue(index);\r\n }\r\n });\r\n }\r\n\r\n getColumnControl(columnKey: string, controlName: string): FormControl {\r\n const columnGroup = this.columnsForm.get(columnKey) as FormGroup;\r\n if (!columnGroup) {\r\n const fallbackControl = new FormControl(this.getDefaultValue(controlName));\r\n return fallbackControl;\r\n }\r\n\r\n const control = columnGroup.get(controlName) as FormControl;\r\n if (!control) {\r\n const fallbackControl = new FormControl(this.getDefaultValue(controlName));\r\n columnGroup.addControl(controlName, fallbackControl);\r\n return fallbackControl;\r\n }\r\n\r\n return control;\r\n }\r\n\r\n private getDefaultValue(controlName: string): any {\r\n switch (controlName) {\r\n case 'isVisible': return true;\r\n case 'displayName': return '';\r\n case 'aggregateFunction': return '';\r\n case 'order': return 0;\r\n default: return null;\r\n }\r\n }\r\n\r\n isColumnVisible(columnKey: string): boolean {\r\n const control = this.getColumnControl(columnKey, 'isVisible');\r\n return control?.value === true;\r\n }\r\n\r\n hasAggregateFunction(columnKey: string): boolean {\r\n const control = this.getColumnControl(columnKey, 'aggregateFunction');\r\n return !!control?.value;\r\n }\r\n\r\n getAggregateFunctionValue(columnKey: string): string {\r\n const control = this.getColumnControl(columnKey, 'aggregateFunction');\r\n return control?.value || '';\r\n }\r\n\r\n toggleAll(visible: boolean) {\r\n this.columns.forEach(column => {\r\n const visibleControl = this.getColumnControl(column.key, 'isVisible');\r\n if (visibleControl) {\r\n visibleControl.setValue(visible);\r\n }\r\n });\r\n this.updateModel();\r\n }\r\n\r\n resetToDefault() {\r\n this.columns.forEach((column, index) => {\r\n const columnGroup = this.columnsForm.get(column.key) as FormGroup;\r\n if (columnGroup) {\r\n columnGroup.get('isVisible')?.setValue(column.defaultVisible);\r\n columnGroup.get('displayName')?.setValue(column.label);\r\n columnGroup.get('aggregateFunction')?.setValue('');\r\n columnGroup.get('order')?.setValue(index);\r\n }\r\n });\r\n this.updateModel();\r\n }\r\n\r\n getAggregateLabel(functionName: string): string {\r\n const func = this.aggregateFunctions.find(f => f.value === functionName);\r\n return func ? func.label : functionName;\r\n }\r\n}\r\n","// group-builder.component.ts\r\nimport { Component, OnInit } from '@angular/core';\r\nimport { FieldType, FieldTypeConfig, FormlyForm } from '@ngx-formly/core';\r\nimport { FormGroup, FormArray, FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\r\nimport { GroupByField } from './interfaces';\r\n\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { CheckboxModule } from 'primeng/checkbox';\r\nimport { DatePickerModule } from 'primeng/datepicker';\r\nimport { InputGroupModule } from 'primeng/inputgroup';\r\nimport { InputGroupAddonModule } from 'primeng/inputgroupaddon';\r\nimport { InputTextModule } from 'primeng/inputtext';\r\nimport { ListboxModule } from 'primeng/listbox';\r\nimport { MenuModule } from 'primeng/menu';\r\nimport { PopoverModule } from 'primeng/popover';\r\nimport { RadioButtonModule } from 'primeng/radiobutton';\r\nimport { SelectModule } from 'primeng/select';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\n\r\n@Component({\r\n selector: 'formly-group-builder',\r\n template: `<div>\r\n <!-- Header -->\r\n <div class=\"mb-6\">\r\n <h5 class=\"text-lg font-semibold text-gray-900 mb-2\">{{ props.label || ('DATA_GROUPING' | translate) }}</h5>\r\n <p class=\"text-gray-600 text-sm\">{{ props.description || ('GROUP_DESCRIPTION' | translate) }}</p>\r\n </div>\r\n \r\n <!-- Group Configuration -->\r\n <div class=\"space-y-4\">\r\n <div class=\"flex items-center justify-between\">\r\n <span class=\"font-medium text-gray-700\">{{ 'GROUP_LEVELS' | translate }}</span>\r\n @if (canAddMoreGroups()) {\r\n <button\r\n type=\"button\"\r\n (click)=\"addGroup()\"\r\n [disabled]=\"!canAddMoreGroups()\"\r\n class=\"inline-flex items-center gap-2 px-3 py-2 text-sm font-medium text-blue-700 bg-blue-50 rounded-lg hover:bg-blue-100 disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\r\n >\r\n <i class=\"pi pi-plus\"></i>\r\n {{ 'ADD_GROUP_LEVEL' | translate }}\r\n </button>\r\n }\r\n </div>\r\n \r\n <!-- Drag Info -->\r\n @if (groups.length > 1) {\r\n <div class=\"mb-4 p-2 bg-blue-50 border border-blue-200 rounded text-sm text-blue-700\">\r\n <i class=\"pi pi-info-circle mr-2\"></i>\r\n {{ 'DRAG_INFO' | translate }}\r\n </div>\r\n }\r\n \r\n <!-- Empty State -->\r\n @if (groups.length === 0) {\r\n <div class=\"text-center py-8 px-4 border-2 border-dashed border-gray-300 rounded-lg bg-gray-50\">\r\n <i class=\"pi pi-layer-group text-4xl text-gray-400 mb-3\"></i>\r\n <p class=\"text-gray-500 mb-4\">{{ 'NO_GROUPING_LEVELS' | translate }}</p>\r\n <button\r\n type=\"button\"\r\n (click)=\"addGroup()\"\r\n class=\"inline-flex items-center gap-2 px-4 py-2 text-sm font-medium text-white bg-blue-600 rounded-lg hover:bg-blue-700 transition-colors\"\r\n >\r\n <i class=\"pi pi-plus\"></i>\r\n {{ 'ADD_FIRST_GROUP_LEVEL' | translate }}\r\n </button>\r\n </div>\r\n }\r\n \r\n <!-- Groups List with Drag & Drop -->\r\n <div class=\"space-y-3\">\r\n @for (group of groups.controls; track group; let i = $index) {\r\n <div\r\n class=\"bg-gray-50 rounded-lg border border-gray-200 p-4 transition-colors hover:bg-gray-100\"\r\n draggable=\"true\"\r\n (dragstart)=\"onDragStart($event, i)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (drop)=\"onDrop($event, i)\"\r\n (dragenter)=\"onDragEnter($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (dragend)=\"onDragEnd($event)\">\r\n <div class=\"grid grid-cols-12 gap-4 items-start\">\r\n <!-- Drag Handle -->\r\n @if (groups.length > 1) {\r\n <div\r\n class=\"col-span-1 flex justify-center cursor-move text-gray-400 hover:text-gray-600 pt-2\"\r\n draggable=\"true\"\r\n (dragstart)=\"onDragStart($event, i)\">\r\n <i class=\"pi pi-bars\"></i>\r\n </div>\r\n }\r\n <!-- Group Content -->\r\n <div class=\"col-span-11\">\r\n <div class=\"flex items-center justify-between mb-3\">\r\n <div class=\"flex items-center gap-2\">\r\n <i class=\"pi pi-sort-alt text-gray-500\"></i>\r\n <span class=\"font-medium text-gray-700\">{{ 'GROUP_LEVEL' | translate }} {{ i + 1 }}</span>\r\n </div>\r\n <div class=\"flex items-center gap-1\">\r\n <button\r\n type=\"button\"\r\n (click)=\"removeGroup(i)\"\r\n class=\"p-1 text-red-500 hover:text-red-700 hover:bg-red-50 rounded transition-colors\"\r\n [pTooltip]=\"'REMOVE' | translate\"\r\n >\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n <div class=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\r\n <!-- Field Selection -->\r\n <div>\r\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">{{ 'FIELD' | translate }}</label>\r\n <p-select\r\n [options]=\"availableFields\"\r\n optionLabel=\"label\"\r\n optionValue=\"key\"\r\n [formControl]=\"getGroupControl(i, 'field')\"\r\n [placeholder]=\"'SELECT_FIELD' | translate\"\r\n [showClear]=\"true\"\r\n (onChange)=\"onFieldChange(i, $event.value)\"\r\n styleClass=\"w-full\"\r\n >\r\n <ng-template pTemplate=\"selectedItem\">\r\n @if (getGroupControl(i, 'field').value) {\r\n <span class=\"text-gray-900\">\r\n {{ getFieldLabel(getGroupControl(i, 'field').value) }}\r\n </span>\r\n }\r\n @if (!getGroupControl(i, 'field').value) {\r\n <span class=\"text-gray-500\">{{ 'SELECT_FIELD' | translate }}</span>\r\n }\r\n </ng-template>\r\n </p-select>\r\n </div>\r\n <!-- Display Name -->\r\n <div>\r\n <label class=\"block text-sm font-medium text-gray-700 mb-2\">{{ 'DISPLAY_NAME' | translate }}</label>\r\n <input\r\n type=\"text\"\r\n pInputText\r\n [formControl]=\"getGroupControl(i, 'displayName')\"\r\n [placeholder]=\"'DISPLAY_NAME_PLACEHOLDER' | translate\"\r\n class=\"w-full text-gray-900\"\r\n (blur)=\"onFormChange()\"\r\n >\r\n </div>\r\n </div>\r\n <!-- Show Total Toggle -->\r\n <div class=\"flex items-center gap-2 mt-3\">\r\n <p-checkbox\r\n [binary]=\"true\"\r\n [formControl]=\"getGroupControl(i, 'showTotal')\"\r\n [inputId]=\"'showTotal' + i\"\r\n styleClass=\"[&>div]:border-gray-300 [&>div]:hover:border-gray-400\"\r\n (onChange)=\"onFormChange()\"\r\n >\r\n </p-checkbox>\r\n <label [for]=\"'showTotal' + i\" class=\"text-sm text-gray-700 cursor-pointer hover:text-gray-900\">\r\n {{ 'SHOW_TOTAL' | translate }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n \r\n <!-- Grouping Tips -->\r\n @if (groups.length > 0) {\r\n <div class=\"mt-4 p-4 bg-blue-50 border border-blue-200 rounded-lg\">\r\n <div class=\"flex items-center gap-3\">\r\n <i class=\"pi pi-info-circle text-blue-500\"></i>\r\n <div>\r\n <p class=\"text-sm text-blue-800\">\r\n <!-- :{count: groups.length} -->\r\n {{ 'GROUPING_TIPS' | translate }}\r\n {{ groups.length }} {{ 'LEVELS_DEFINED' | translate }}\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>`,\r\n imports: [\r\n FormsModule,\r\n ReactiveFormsModule,\r\n SelectModule,\r\n InputTextModule,\r\n ButtonModule,\r\n DatePickerModule,\r\n CheckboxModule,\r\n RadioButtonModule,\r\n FormlyForm,\r\n TooltipModule,\r\n MenuModule,\r\n TranslatePipe,\r\n InputGroupModule,\r\n InputGroupAddonModule,\r\n PopoverModule,\r\n ListboxModule\r\n]\r\n})\r\nexport class GroupBuilderComponent extends FieldType<FieldTypeConfig> implements OnInit {\r\n private _groups!: FormArray;\r\n dragStartIndex: number = -1;\r\n\r\n get groups(): FormArray {\r\n return this._groups;\r\n }\r\n\r\n get availableFields(): GroupByField[] {\r\n return this.props['fields'] || [];\r\n }\r\n\r\n get maxGroups(): number {\r\n return this.props['maxGroups'] || 3;\r\n }\r\n\r\n ngOnInit() {\r\n this.initializeFormArray();\r\n this.setupValueChanges();\r\n }\r\n\r\n private initializeFormArray() {\r\n const parentForm = this.form as FormGroup;\r\n const fieldKey = this.field.key as string;\r\n\r\n if (!fieldKey) return;\r\n\r\n // Get or create the FormArray in the parent form\r\n let formArray = parentForm.get(fieldKey) as FormArray;\r\n\r\n if (!formArray || !(formArray instanceof FormArray)) {\r\n // Create new FormArray\r\n formArray = new FormArray<any>([]);\r\n parentForm.setControl(fieldKey, formArray);\r\n\r\n // Initialize with existing model data\r\n const initialValue = this.model[fieldKey];\r\n if (Array.isArray(initialValue)) {\r\n initialValue.forEach(group => {\r\n formArray.push(this.createGroupControl(group));\r\n });\r\n }\r\n }\r\n\r\n // Store the FormArray reference\r\n this._groups = formArray;\r\n }\r\n\r\n private setupValueChanges() {\r\n // Listen to form array changes and update the model\r\n this.groups.valueChanges.subscribe(() => {\r\n this.updateModel();\r\n });\r\n }\r\n\r\n private updateModel() {\r\n const fieldKey = this.field.key as string;\r\n if (fieldKey) {\r\n // Update the model with current form values\r\n this.model[fieldKey] = this.groups.value;\r\n\r\n // Trigger form control update to notify Formly\r\n this.formControl.setValue(this.groups.value);\r\n\r\n // Mark form control as touched/dirty if needed\r\n this.formControl.markAsTouched();\r\n this.formControl.markAsDirty();\r\n }\r\n }\r\n\r\n // Called when form controls change\r\n onFormChange() {\r\n this.updateModel();\r\n }\r\n\r\n private createGroupControl(group?: any): FormGroup {\r\n return new FormGroup({\r\n field: new FormControl(group?.field || ''),\r\n displayName: new FormControl(group?.displayName || ''),\r\n showTotal: new FormControl(group?.showTotal !== false)\r\n });\r\n }\r\n\r\n addGroup() {\r\n if (this.canAddMoreGroups()) {\r\n this.groups.push(this.createGroupControl());\r\n this.updateModel();\r\n }\r\n }\r\n\r\n removeGroup(index: number) {\r\n this.groups.removeAt(index);\r\n this.updateModel();\r\n }\r\n\r\n // Drag & Drop Methods\r\n onDragStart(event: DragEvent, index: number) {\r\n this.dragStartIndex = index;\r\n event.dataTransfer?.setData('text/plain', index.toString());\r\n (event.currentTarget as HTMLElement).classList.add('opacity-50', 'border-blue-300');\r\n }\r\n\r\n onDragOver(event: DragEvent) {\r\n event.preventDefault();\r\n }\r\n\r\n onDrop(event: DragEvent, dropIndex: number) {\r\n event.preventDefault();\r\n const dragIndex = this.dragStartIndex;\r\n\r\n if (dragIndex !== -1 && dragIndex !== dropIndex) {\r\n this.moveGroup(dragIndex, dropIndex);\r\n }\r\n\r\n this.removeDragStyles(event);\r\n }\r\n\r\n onDragEnter(event: DragEvent) {\r\n (event.currentTarget as HTMLElement).classList.add('border-blue-500', 'bg-blue-50', 'border-2');\r\n }\r\n\r\n onDragLeave(event: DragEvent) {\r\n this.removeDragStyles(event);\r\n }\r\n\r\n onDragEnd(event: DragEvent) {\r\n this.removeDragStyles(event);\r\n this.dragStartIndex = -1;\r\n }\r\n\r\n private removeDragStyles(event: DragEvent) {\r\n const element = event.currentTarget as HTMLElement;\r\n element.classList.remove('border-blue-500', 'bg-blue-50', 'opacity-50', 'border-blue-300', 'border-2');\r\n }\r\n\r\n moveGroup(fromIndex: number, toIndex: number) {\r\n const movedGroup = this.groups.at(fromIndex);\r\n this.groups.removeAt(fromIndex);\r\n this.groups.insert(toIndex, movedGroup);\r\n this.updateModel();\r\n }\r\n\r\n getGroupControl(index: number, controlName: string): FormControl {\r\n const group = this.groups.at(index) as FormGroup;\r\n return group.get(controlName) as FormControl;\r\n }\r\n\r\n onFieldChange(index: number, fieldKey: string) {\r\n const displayNameControl = this.getGroupControl(index, 'displayName');\r\n if (!displayNameControl.value && fieldKey) {\r\n const field = this.availableFields.find(f => f.key === fieldKey);\r\n if (field) {\r\n displayNameControl.setValue(field.label);\r\n }\r\n }\r\n this.updateModel();\r\n }\r\n\r\n getFieldLabel(fieldKey: string): string {\r\n const field = this.availableFields.find(f => f.key === fieldKey);\r\n return field ? field.label : fieldKey;\r\n }\r\n\r\n canAddMoreGroups(): boolean {\r\n return this.groups.length < this.maxGroups;\r\n }\r\n}\r\n","// group-type.component.ts\r\nimport { Component } from '@angular/core';\r\nimport { FieldType, FormlyFieldConfig, FormlyField } from '@ngx-formly/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { BadgeModule } from 'primeng/badge';\r\n\r\nexport interface GroupTypeProps {\r\n label?: string;\r\n description?: string;\r\n collapsible?: boolean;\r\n collapsedByDefault?: boolean;\r\n showFieldCount?: boolean;\r\n showDescription?: boolean;\r\n showSummary?: boolean;\r\n showValidation?: boolean;\r\n compact?: boolean;\r\n variant?: 'default' | 'card' | 'bordered' | 'transparent';\r\n columns?: number;\r\n gap?: 'none' | 'small' | 'normal' | 'large';\r\n actions?: {\r\n icon: string;\r\n tooltip: string;\r\n styleClass?: string;\r\n handler?: (field: FormlyFieldConfig, form: any, component: any) => void;\r\n }[];\r\n}\r\n\r\n@Component({\r\n selector: 'formly-group-type',\r\n standalone: true,\r\n imports: [CommonModule, FormlyField, ButtonModule, TooltipModule, BadgeModule],\r\n template: `\n <div [class]=\"groupClass\">\n @if (props.label || props.collapsible) {\n <div class=\"flex justify-between items-center p-2\"\n (click)=\"props.collapsible && toggle()\">\n <div class=\"flex items-center gap-2\">\n @if (props.collapsible) {\n <i [class]=\"collapsed ? 'pi pi-chevron-down' : 'pi pi-chevron-up'\"></i>\n }\n @if (props.label) {\n <label class=\"font-semibold\">{{ props.label }}</label>\n }\n @if (isRequired()) {\n <i class=\"pi pi-asterisk text-red-500 text-xs\" pTooltip=\"حقل مطلوب\"></i>\n }\n </div>\n <div class=\"flex gap-2\">\n @if (props.description && !collapsed) {\n <i class=\"pi pi-info-circle text-500\"\n pTooltip=\"{{ props.description }}\"></i>\n }\n @if (showValidation) {\n <i [class]=\"validationIcon\" [pTooltip]=\"validationText\"></i>\n }\n @for (a of props.actions || []; track a) {\n <button pButton type=\"button\" class=\"p-button-text p-button-sm\"\n [icon]=\"a.icon\" [pTooltip]=\"a.tooltip\" [ngClass]=\"a.styleClass\"\n (click)=\"a.handler?.(field, form, this); $event.stopPropagation()\"></button>\n }\n </div>\n </div>\n }\n \n @if (!collapsed) {\n <div class=\"p-3 pt-0\" [ngClass]=\"props.compact ? 'compact-layout' : ''\">\n @if (props.description && props.showDescription) {\n <p class=\"text-500 text-sm mb-2\">{{ props.description }}</p>\n }\n <div [ngClass]=\"gridClass\">\n @for (f of field.fieldGroup; track f) {\n <formly-field [field]=\"f\"></formly-field>\n @if (f.props?.description) {\n <small\n class=\"block text-500 text-xs mt-1 ml-1\">\n {{ f.props?.description }}\n </small>\n }\n }\n </div>\n @if (!field.fieldGroup?.length) {\n <div class=\"text-center p-4 surface-section border-round\">\n <i class=\"pi pi-inbox text-4xl text-500 mb-2\"></i>\n <p class=\"text-500\">لا توجد حقول</p>\n </div>\n }\n </div>\n }\n </div>\n `\r\n})\r\nexport class GroupTypeComponent extends FieldType<FormlyFieldConfig<GroupTypeProps>> {\r\n collapsed = this.props.collapsedByDefault ?? false;\r\n\r\n\r\n get showValidation() {\r\n return this.props.showValidation !== false &&\r\n this.formControl.invalid && (this.formControl.dirty || this.formControl.touched);\r\n }\r\n\r\n get validationIcon() {\r\n if (this.formControl.valid) return 'pi pi-check-circle text-green-500';\r\n if (this.formControl.invalid) return 'pi pi-exclamation-circle text-red-500';\r\n return 'pi pi-circle text-500';\r\n }\r\n\r\n get validationText() {\r\n return this.formControl.valid ? 'جميع الحقول صالحة' : 'هناك أخطاء في بعض الحقول';\r\n }\r\n\r\n get groupClass() {\r\n const v = this.props.variant || 'default';\r\n const map: any = {\r\n default: 'border-round border-1 border-200 bg-white mb-3',\r\n card: 'border-round surface-card shadow-sm mb-3',\r\n bordered: 'border-round border-1 border-300 surface-section mb-3',\r\n transparent: 'border-0 bg-transparent mb-3'\r\n };\r\n return map[v];\r\n }\r\n\r\n get gridClass() {\r\n const cols = this.props.columns || 1;\r\n const gap = this.props.gap || 'normal';\r\n const gaps: any = { none: 'gap-0', small: 'gap-2', normal: 'gap-3', large: 'gap-4' };\r\n return `grid grid-cols-1 ${cols > 1 ? 'md:grid-cols-' + cols : ''} ${gaps[gap]}`;\r\n }\r\n\r\n toggle() {\r\n this.collapsed = !this.collapsed;\r\n }\r\n\r\n isRequired() {\r\n return this.field.fieldGroup?.some(f => f.props?.required || f.validators?.['required']) ?? false;\r\n }\r\n}\r\n","import { provideFormlyConfig } from '@ngx-formly/core';\r\nimport { QueryBuilderComponent } from './query-builder.component';\r\nimport { SortBuilderComponent } from './sort-builder.component';\r\nimport { GroupTypeComponent } from './group.component';\r\nimport { TabTypeComponent } from './tab-type.component';\r\nimport { GroupBuilderComponent } from './group-builder.component';\r\nimport { ColumnsBuilderComponent } from './columns-builder.component';\r\n\r\nexport const formlyConfig = provideFormlyConfig({\r\n types: [\r\n\r\n {\r\n name: 'tab-type',\r\n component: TabTypeComponent\r\n },\r\n {\r\n name: 'query-builder',\r\n component: QueryBuilderComponent\r\n },\r\n {\r\n name: 'sort-builder',\r\n component: SortBuilderComponent\r\n },\r\n {\r\n name: 'group-builder',\r\n component: GroupBuilderComponent\r\n },\r\n {\r\n name: 'columns-builder',\r\n component: ColumnsBuilderComponent\r\n },\r\n { name: 'group', component: GroupTypeComponent },\r\n\r\n\r\n ],\r\n\r\n},\r\n\r\n);\r\n\r\n\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i3","i1","i2","i4","i5","i6"],"mappings":"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"}