@es.framework/ng.ui.core 2.0.58

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 (246) hide show
  1. package/README.md +3 -0
  2. package/attachments/README.md +3 -0
  3. package/base-crud/README.md +3 -0
  4. package/breadcrumb/README.md +3 -0
  5. package/checkbox/README.md +3 -0
  6. package/collapsible/README.md +3 -0
  7. package/color-picker/README.md +3 -0
  8. package/column-settings-popover/README.md +3 -0
  9. package/custom-switch/README.md +3 -0
  10. package/datepicker/README.md +3 -0
  11. package/deactivation-reason/README.md +3 -0
  12. package/excel-import/README.md +3 -0
  13. package/fesm2022/es.framework-ng.ui.core-attachments.mjs +217 -0
  14. package/fesm2022/es.framework-ng.ui.core-attachments.mjs.map +1 -0
  15. package/fesm2022/es.framework-ng.ui.core-base-crud.mjs +370 -0
  16. package/fesm2022/es.framework-ng.ui.core-base-crud.mjs.map +1 -0
  17. package/fesm2022/es.framework-ng.ui.core-breadcrumb.mjs +145 -0
  18. package/fesm2022/es.framework-ng.ui.core-breadcrumb.mjs.map +1 -0
  19. package/fesm2022/es.framework-ng.ui.core-checkbox.mjs +131 -0
  20. package/fesm2022/es.framework-ng.ui.core-checkbox.mjs.map +1 -0
  21. package/fesm2022/es.framework-ng.ui.core-collapsible.mjs +90 -0
  22. package/fesm2022/es.framework-ng.ui.core-collapsible.mjs.map +1 -0
  23. package/fesm2022/es.framework-ng.ui.core-color-picker.mjs +87 -0
  24. package/fesm2022/es.framework-ng.ui.core-color-picker.mjs.map +1 -0
  25. package/fesm2022/es.framework-ng.ui.core-column-settings-popover.mjs +183 -0
  26. package/fesm2022/es.framework-ng.ui.core-column-settings-popover.mjs.map +1 -0
  27. package/fesm2022/es.framework-ng.ui.core-custom-switch.mjs +119 -0
  28. package/fesm2022/es.framework-ng.ui.core-custom-switch.mjs.map +1 -0
  29. package/fesm2022/es.framework-ng.ui.core-datepicker.mjs +519 -0
  30. package/fesm2022/es.framework-ng.ui.core-datepicker.mjs.map +1 -0
  31. package/fesm2022/es.framework-ng.ui.core-deactivation-reason.mjs +144 -0
  32. package/fesm2022/es.framework-ng.ui.core-deactivation-reason.mjs.map +1 -0
  33. package/fesm2022/es.framework-ng.ui.core-excel-import.mjs +566 -0
  34. package/fesm2022/es.framework-ng.ui.core-excel-import.mjs.map +1 -0
  35. package/fesm2022/es.framework-ng.ui.core-filter-templates.mjs +386 -0
  36. package/fesm2022/es.framework-ng.ui.core-filter-templates.mjs.map +1 -0
  37. package/fesm2022/es.framework-ng.ui.core-form-button.mjs +62 -0
  38. package/fesm2022/es.framework-ng.ui.core-form-button.mjs.map +1 -0
  39. package/fesm2022/es.framework-ng.ui.core-form-field.mjs +155 -0
  40. package/fesm2022/es.framework-ng.ui.core-form-field.mjs.map +1 -0
  41. package/fesm2022/es.framework-ng.ui.core-form-template.mjs +37 -0
  42. package/fesm2022/es.framework-ng.ui.core-form-template.mjs.map +1 -0
  43. package/fesm2022/es.framework-ng.ui.core-formly-avatar-image.mjs +132 -0
  44. package/fesm2022/es.framework-ng.ui.core-formly-avatar-image.mjs.map +1 -0
  45. package/fesm2022/es.framework-ng.ui.core-formly-avatar-label.mjs +89 -0
  46. package/fesm2022/es.framework-ng.ui.core-formly-avatar-label.mjs.map +1 -0
  47. package/fesm2022/es.framework-ng.ui.core-formly-button-selector.mjs +195 -0
  48. package/fesm2022/es.framework-ng.ui.core-formly-button-selector.mjs.map +1 -0
  49. package/fesm2022/es.framework-ng.ui.core-formly-button.mjs +73 -0
  50. package/fesm2022/es.framework-ng.ui.core-formly-button.mjs.map +1 -0
  51. package/fesm2022/es.framework-ng.ui.core-formly-presets.mjs +201 -0
  52. package/fesm2022/es.framework-ng.ui.core-formly-presets.mjs.map +1 -0
  53. package/fesm2022/es.framework-ng.ui.core-formly-prime-icon-picker.mjs +542 -0
  54. package/fesm2022/es.framework-ng.ui.core-formly-prime-icon-picker.mjs.map +1 -0
  55. package/fesm2022/es.framework-ng.ui.core-formly-split-button.mjs +62 -0
  56. package/fesm2022/es.framework-ng.ui.core-formly-split-button.mjs.map +1 -0
  57. package/fesm2022/es.framework-ng.ui.core-formly-ui-all.mjs +422 -0
  58. package/fesm2022/es.framework-ng.ui.core-formly-ui-all.mjs.map +1 -0
  59. package/fesm2022/es.framework-ng.ui.core-formly-ui.mjs +48 -0
  60. package/fesm2022/es.framework-ng.ui.core-formly-ui.mjs.map +1 -0
  61. package/fesm2022/es.framework-ng.ui.core-formly-username-with-domain.mjs +85 -0
  62. package/fesm2022/es.framework-ng.ui.core-formly-username-with-domain.mjs.map +1 -0
  63. package/fesm2022/es.framework-ng.ui.core-generic-assets.mjs +22 -0
  64. package/fesm2022/es.framework-ng.ui.core-generic-assets.mjs.map +1 -0
  65. package/fesm2022/es.framework-ng.ui.core-generic-autocomplete.mjs +173 -0
  66. package/fesm2022/es.framework-ng.ui.core-generic-autocomplete.mjs.map +1 -0
  67. package/fesm2022/es.framework-ng.ui.core-generic-button.mjs +150 -0
  68. package/fesm2022/es.framework-ng.ui.core-generic-button.mjs.map +1 -0
  69. package/fesm2022/es.framework-ng.ui.core-generic-card.mjs +218 -0
  70. package/fesm2022/es.framework-ng.ui.core-generic-card.mjs.map +1 -0
  71. package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs +929 -0
  72. package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs.map +1 -0
  73. package/fesm2022/es.framework-ng.ui.core-generic-dialog.mjs +321 -0
  74. package/fesm2022/es.framework-ng.ui.core-generic-dialog.mjs.map +1 -0
  75. package/fesm2022/es.framework-ng.ui.core-generic-errormessage.mjs +35 -0
  76. package/fesm2022/es.framework-ng.ui.core-generic-errormessage.mjs.map +1 -0
  77. package/fesm2022/es.framework-ng.ui.core-generic-formly-fields.mjs +63 -0
  78. package/fesm2022/es.framework-ng.ui.core-generic-formly-fields.mjs.map +1 -0
  79. package/fesm2022/es.framework-ng.ui.core-generic-loadingspinner.mjs +34 -0
  80. package/fesm2022/es.framework-ng.ui.core-generic-loadingspinner.mjs.map +1 -0
  81. package/fesm2022/es.framework-ng.ui.core-generic-report-tabs.mjs +196 -0
  82. package/fesm2022/es.framework-ng.ui.core-generic-report-tabs.mjs.map +1 -0
  83. package/fesm2022/es.framework-ng.ui.core-generic-report.mjs +556 -0
  84. package/fesm2022/es.framework-ng.ui.core-generic-report.mjs.map +1 -0
  85. package/fesm2022/es.framework-ng.ui.core-generic-search-advanced.mjs +2995 -0
  86. package/fesm2022/es.framework-ng.ui.core-generic-search-advanced.mjs.map +1 -0
  87. package/fesm2022/es.framework-ng.ui.core-generic-search.mjs +103 -0
  88. package/fesm2022/es.framework-ng.ui.core-generic-search.mjs.map +1 -0
  89. package/fesm2022/es.framework-ng.ui.core-generic-selector.mjs +684 -0
  90. package/fesm2022/es.framework-ng.ui.core-generic-selector.mjs.map +1 -0
  91. package/fesm2022/es.framework-ng.ui.core-generic-table.mjs +388 -0
  92. package/fesm2022/es.framework-ng.ui.core-generic-table.mjs.map +1 -0
  93. package/fesm2022/es.framework-ng.ui.core-generic-view.mjs +465 -0
  94. package/fesm2022/es.framework-ng.ui.core-generic-view.mjs.map +1 -0
  95. package/fesm2022/es.framework-ng.ui.core-header-wrapper.mjs +31 -0
  96. package/fesm2022/es.framework-ng.ui.core-header-wrapper.mjs.map +1 -0
  97. package/fesm2022/es.framework-ng.ui.core-icon-picker.mjs +205 -0
  98. package/fesm2022/es.framework-ng.ui.core-icon-picker.mjs.map +1 -0
  99. package/fesm2022/es.framework-ng.ui.core-input-switch.mjs +102 -0
  100. package/fesm2022/es.framework-ng.ui.core-input-switch.mjs.map +1 -0
  101. package/fesm2022/es.framework-ng.ui.core-input-with-icon.mjs +67 -0
  102. package/fesm2022/es.framework-ng.ui.core-input-with-icon.mjs.map +1 -0
  103. package/fesm2022/es.framework-ng.ui.core-input.mjs +250 -0
  104. package/fesm2022/es.framework-ng.ui.core-input.mjs.map +1 -0
  105. package/fesm2022/es.framework-ng.ui.core-label-type.mjs +184 -0
  106. package/fesm2022/es.framework-ng.ui.core-label-type.mjs.map +1 -0
  107. package/fesm2022/es.framework-ng.ui.core-loading-skeletons.mjs +66 -0
  108. package/fesm2022/es.framework-ng.ui.core-loading-skeletons.mjs.map +1 -0
  109. package/fesm2022/es.framework-ng.ui.core-odata-query-builder.mjs +307 -0
  110. package/fesm2022/es.framework-ng.ui.core-odata-query-builder.mjs.map +1 -0
  111. package/fesm2022/es.framework-ng.ui.core-query-type.mjs +162 -0
  112. package/fesm2022/es.framework-ng.ui.core-query-type.mjs.map +1 -0
  113. package/fesm2022/es.framework-ng.ui.core-radio.mjs +120 -0
  114. package/fesm2022/es.framework-ng.ui.core-radio.mjs.map +1 -0
  115. package/fesm2022/es.framework-ng.ui.core-repeat.mjs +290 -0
  116. package/fesm2022/es.framework-ng.ui.core-repeat.mjs.map +1 -0
  117. package/fesm2022/es.framework-ng.ui.core-select.mjs +179 -0
  118. package/fesm2022/es.framework-ng.ui.core-select.mjs.map +1 -0
  119. package/fesm2022/es.framework-ng.ui.core-sidebar-cards.mjs +52 -0
  120. package/fesm2022/es.framework-ng.ui.core-sidebar-cards.mjs.map +1 -0
  121. package/fesm2022/es.framework-ng.ui.core-sidebar-toggles.mjs +53 -0
  122. package/fesm2022/es.framework-ng.ui.core-sidebar-toggles.mjs.map +1 -0
  123. package/fesm2022/es.framework-ng.ui.core-tabs.mjs +57 -0
  124. package/fesm2022/es.framework-ng.ui.core-tabs.mjs.map +1 -0
  125. package/fesm2022/es.framework-ng.ui.core-tag-type.mjs +209 -0
  126. package/fesm2022/es.framework-ng.ui.core-tag-type.mjs.map +1 -0
  127. package/fesm2022/es.framework-ng.ui.core-text-editor.mjs +58 -0
  128. package/fesm2022/es.framework-ng.ui.core-text-editor.mjs.map +1 -0
  129. package/fesm2022/es.framework-ng.ui.core-textarea.mjs +93 -0
  130. package/fesm2022/es.framework-ng.ui.core-textarea.mjs.map +1 -0
  131. package/fesm2022/es.framework-ng.ui.core-wrappers.mjs +245 -0
  132. package/fesm2022/es.framework-ng.ui.core-wrappers.mjs.map +1 -0
  133. package/fesm2022/es.framework-ng.ui.core.mjs +20 -0
  134. package/fesm2022/es.framework-ng.ui.core.mjs.map +1 -0
  135. package/filter-templates/README.md +3 -0
  136. package/form-button/README.md +3 -0
  137. package/form-field/README.md +3 -0
  138. package/form-template/README.md +3 -0
  139. package/formly-avatar-image/README.md +3 -0
  140. package/formly-avatar-label/README.md +3 -0
  141. package/formly-button/README.md +3 -0
  142. package/formly-button-selector/README.md +3 -0
  143. package/formly-presets/README.md +3 -0
  144. package/formly-prime-icon-picker/README.md +3 -0
  145. package/formly-split-button/README.md +3 -0
  146. package/formly-ui/README.md +3 -0
  147. package/formly-ui-all/README.md +3 -0
  148. package/formly-username-with-domain/README.md +3 -0
  149. package/generic-assets/README.md +3 -0
  150. package/generic-autocomplete/README.md +3 -0
  151. package/generic-button/README.md +3 -0
  152. package/generic-card/README.md +3 -0
  153. package/generic-crud-table/README.md +3 -0
  154. package/generic-dialog/README.md +3 -0
  155. package/generic-errormessage/README.md +3 -0
  156. package/generic-formly-fields/README.md +3 -0
  157. package/generic-loadingspinner/README.md +3 -0
  158. package/generic-report/README.md +3 -0
  159. package/generic-report-tabs/README.md +0 -0
  160. package/generic-search/README.md +3 -0
  161. package/generic-search-advanced/README.md +3 -0
  162. package/generic-selector/README.md +3 -0
  163. package/generic-table/README.md +3 -0
  164. package/generic-view/README.md +3 -0
  165. package/header-wrapper/README.md +3 -0
  166. package/icon-picker/README.md +3 -0
  167. package/input/README.md +3 -0
  168. package/input-switch/README.md +3 -0
  169. package/input-with-icon/README.md +3 -0
  170. package/label-type/README.md +3 -0
  171. package/loading-skeletons/README.md +3 -0
  172. package/odata-query-builder/README.md +3 -0
  173. package/package.json +264 -0
  174. package/query-type/README.md +3 -0
  175. package/radio/README.md +3 -0
  176. package/repeat/README.md +3 -0
  177. package/select/README.md +3 -0
  178. package/sidebar-cards/README.md +3 -0
  179. package/sidebar-toggles/README.md +3 -0
  180. package/styles.css +2 -0
  181. package/tabs/README.md +3 -0
  182. package/tag-type/README.md +3 -0
  183. package/text-editor/README.md +3 -0
  184. package/textarea/README.md +3 -0
  185. package/types/es.framework-ng.ui.core-attachments.d.ts +38 -0
  186. package/types/es.framework-ng.ui.core-base-crud.d.ts +74 -0
  187. package/types/es.framework-ng.ui.core-breadcrumb.d.ts +17 -0
  188. package/types/es.framework-ng.ui.core-checkbox.d.ts +33 -0
  189. package/types/es.framework-ng.ui.core-collapsible.d.ts +18 -0
  190. package/types/es.framework-ng.ui.core-color-picker.d.ts +16 -0
  191. package/types/es.framework-ng.ui.core-column-settings-popover.d.ts +46 -0
  192. package/types/es.framework-ng.ui.core-custom-switch.d.ts +19 -0
  193. package/types/es.framework-ng.ui.core-datepicker.d.ts +23 -0
  194. package/types/es.framework-ng.ui.core-deactivation-reason.d.ts +32 -0
  195. package/types/es.framework-ng.ui.core-excel-import.d.ts +69 -0
  196. package/types/es.framework-ng.ui.core-filter-templates.d.ts +57 -0
  197. package/types/es.framework-ng.ui.core-form-button.d.ts +17 -0
  198. package/types/es.framework-ng.ui.core-form-field.d.ts +30 -0
  199. package/types/es.framework-ng.ui.core-form-template.d.ts +16 -0
  200. package/types/es.framework-ng.ui.core-formly-avatar-image.d.ts +18 -0
  201. package/types/es.framework-ng.ui.core-formly-avatar-label.d.ts +36 -0
  202. package/types/es.framework-ng.ui.core-formly-button-selector.d.ts +35 -0
  203. package/types/es.framework-ng.ui.core-formly-button.d.ts +20 -0
  204. package/types/es.framework-ng.ui.core-formly-presets.d.ts +37 -0
  205. package/types/es.framework-ng.ui.core-formly-prime-icon-picker.d.ts +45 -0
  206. package/types/es.framework-ng.ui.core-formly-split-button.d.ts +23 -0
  207. package/types/es.framework-ng.ui.core-formly-ui-all.d.ts +40 -0
  208. package/types/es.framework-ng.ui.core-formly-ui.d.ts +13 -0
  209. package/types/es.framework-ng.ui.core-formly-username-with-domain.d.ts +19 -0
  210. package/types/es.framework-ng.ui.core-generic-assets.d.ts +10 -0
  211. package/types/es.framework-ng.ui.core-generic-autocomplete.d.ts +41 -0
  212. package/types/es.framework-ng.ui.core-generic-button.d.ts +39 -0
  213. package/types/es.framework-ng.ui.core-generic-card.d.ts +93 -0
  214. package/types/es.framework-ng.ui.core-generic-crud-table.d.ts +293 -0
  215. package/types/es.framework-ng.ui.core-generic-dialog.d.ts +93 -0
  216. package/types/es.framework-ng.ui.core-generic-errormessage.d.ts +17 -0
  217. package/types/es.framework-ng.ui.core-generic-formly-fields.d.ts +26 -0
  218. package/types/es.framework-ng.ui.core-generic-loadingspinner.d.ts +16 -0
  219. package/types/es.framework-ng.ui.core-generic-report-tabs.d.ts +21 -0
  220. package/types/es.framework-ng.ui.core-generic-report.d.ts +121 -0
  221. package/types/es.framework-ng.ui.core-generic-search-advanced.d.ts +305 -0
  222. package/types/es.framework-ng.ui.core-generic-search.d.ts +36 -0
  223. package/types/es.framework-ng.ui.core-generic-selector.d.ts +99 -0
  224. package/types/es.framework-ng.ui.core-generic-table.d.ts +84 -0
  225. package/types/es.framework-ng.ui.core-generic-view.d.ts +97 -0
  226. package/types/es.framework-ng.ui.core-header-wrapper.d.ts +15 -0
  227. package/types/es.framework-ng.ui.core-icon-picker.d.ts +30 -0
  228. package/types/es.framework-ng.ui.core-input-switch.d.ts +16 -0
  229. package/types/es.framework-ng.ui.core-input-with-icon.d.ts +17 -0
  230. package/types/es.framework-ng.ui.core-input.d.ts +47 -0
  231. package/types/es.framework-ng.ui.core-label-type.d.ts +38 -0
  232. package/types/es.framework-ng.ui.core-loading-skeletons.d.ts +17 -0
  233. package/types/es.framework-ng.ui.core-odata-query-builder.d.ts +87 -0
  234. package/types/es.framework-ng.ui.core-query-type.d.ts +37 -0
  235. package/types/es.framework-ng.ui.core-radio.d.ts +38 -0
  236. package/types/es.framework-ng.ui.core-repeat.d.ts +31 -0
  237. package/types/es.framework-ng.ui.core-select.d.ts +42 -0
  238. package/types/es.framework-ng.ui.core-sidebar-cards.d.ts +25 -0
  239. package/types/es.framework-ng.ui.core-sidebar-toggles.d.ts +25 -0
  240. package/types/es.framework-ng.ui.core-tabs.d.ts +17 -0
  241. package/types/es.framework-ng.ui.core-tag-type.d.ts +34 -0
  242. package/types/es.framework-ng.ui.core-text-editor.d.ts +16 -0
  243. package/types/es.framework-ng.ui.core-textarea.d.ts +36 -0
  244. package/types/es.framework-ng.ui.core-wrappers.d.ts +36 -0
  245. package/types/es.framework-ng.ui.core.d.ts +8 -0
  246. package/wrappers/README.md +3 -0
@@ -0,0 +1,684 @@
1
+ import * as i0 from '@angular/core';
2
+ import { NgModule, inject, ViewChild, Component } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+ import { DialogService } from 'primeng/dynamicdialog';
5
+ import { forkJoin } from 'rxjs';
6
+ import { map, finalize } from 'rxjs/operators';
7
+ import * as i2 from '@angular/forms';
8
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
9
+ import * as i3 from 'primeng/autocomplete';
10
+ import { AutoCompleteModule, AutoComplete } from 'primeng/autocomplete';
11
+ import * as i5 from 'primeng/inputgroup';
12
+ import { InputGroupModule } from 'primeng/inputgroup';
13
+ import * as i6 from 'primeng/inputgroupaddon';
14
+ import { InputGroupAddonModule } from 'primeng/inputgroupaddon';
15
+ import { TranslatePipe } from '@es.framework/ng.core/pipes';
16
+ import { CheckboxModule } from 'primeng/checkbox';
17
+ import * as i7 from 'primeng/button';
18
+ import { ButtonModule } from 'primeng/button';
19
+ import * as i1 from '@es.framework/ng.core/services';
20
+ import { LocalizationService, QueryParser, BaseService } from '@es.framework/ng.core/services';
21
+ import { GenericDialogComponent } from '@es.framework/ng.ui.core/generic-dialog';
22
+ import { DomSanitizer } from '@angular/platform-browser';
23
+ import { FieldType, FormlyAttributes } from '@ngx-formly/core';
24
+ import * as i4 from 'primeng/api';
25
+
26
+ class GenericSelectorModule {
27
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericSelectorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
28
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: GenericSelectorModule, imports: [CommonModule] });
29
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericSelectorModule, imports: [CommonModule] });
30
+ }
31
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericSelectorModule, decorators: [{
32
+ type: NgModule,
33
+ args: [{
34
+ imports: [CommonModule],
35
+ }]
36
+ }] });
37
+
38
+ class GenericSelectorTypeComponent extends FieldType {
39
+ svc;
40
+ injector;
41
+ cdr;
42
+ autoComp;
43
+ dialog;
44
+ options_ = [];
45
+ selectedItem;
46
+ loading = false;
47
+ _offlineList = [];
48
+ translateService = inject(LocalizationService);
49
+ api;
50
+ valueChangeSubscription; // Add a subscription to manage the observable
51
+ get optionLabel() {
52
+ if (this.to.useMultiLang == true) {
53
+ if (this.translateService.currentLang == 'en') {
54
+ return this.to?.labelFieldEn || 'name';
55
+ }
56
+ return this.to?.labelField || 'name';
57
+ }
58
+ return this.to?.labelField || 'name';
59
+ }
60
+ isNullOrEmpty(val) {
61
+ return val === null || val === undefined || val === '';
62
+ }
63
+ getFormattedLabel(item) {
64
+ if (!item)
65
+ return '';
66
+ let value;
67
+ // Use the formatter if provided
68
+ if (this.to?.formatter) {
69
+ value = this.to.formatter(item);
70
+ }
71
+ else {
72
+ value = this.getPrimaryLabel(item);
73
+ }
74
+ // Sanitize it for safe HTML
75
+ return this.sanitizer.bypassSecurityTrustHtml(value || '');
76
+ }
77
+ getPrimaryLabel(item) {
78
+ const fields = [
79
+ this.optionLabel, // resolved field name from getter
80
+ this.to.labelField || 'name',
81
+ this.to.labelFieldEn || 'name'
82
+ ];
83
+ for (const f of fields) {
84
+ const v = item[f];
85
+ if (!this.isNullOrEmpty(v)) {
86
+ return v;
87
+ }
88
+ }
89
+ return '';
90
+ }
91
+ sanitizer = inject(DomSanitizer);
92
+ constructor(svc, injector, cdr) {
93
+ super();
94
+ this.svc = svc;
95
+ this.injector = injector;
96
+ this.cdr = cdr;
97
+ }
98
+ ngOnInit() {
99
+ this.api = this.svc;
100
+ const to = this.props;
101
+ this.api.apiName = to['serviceName'];
102
+ this.api.moduleName = to['moduleName'];
103
+ if (to['offline']) {
104
+ if (to['offlineDataFn']) {
105
+ this._offlineList = to['offlineDataFn']();
106
+ this.initOfflineSelection();
107
+ }
108
+ else if (to['offlineItems$']) {
109
+ to['offlineItems$'].subscribe((list) => {
110
+ this._offlineList = list;
111
+ this.initOfflineSelection();
112
+ });
113
+ }
114
+ else {
115
+ this._offlineList = to['offlineItems'] || [];
116
+ this.initOfflineSelection();
117
+ }
118
+ }
119
+ else {
120
+ if (this.props.loadSaved && !this.props.multiple && this.props.loadSavedField && this.props.valueField) {
121
+ const vf = this.to['valueField'] || 'id';
122
+ const lf = this.optionLabel;
123
+ this.selectedItem =
124
+ {
125
+ [vf]: this.formControl.value,
126
+ [lf]: this.model[this.props.loadSavedField],
127
+ };
128
+ if (this.props.change) {
129
+ this.props.change(this.field, { item: this.selectedItem });
130
+ this.cdr.detectChanges();
131
+ }
132
+ }
133
+ else {
134
+ this.initOnlineSelection();
135
+ }
136
+ }
137
+ // Subscribe to formControl value changes
138
+ this.valueChangeSubscription = this.formControl.valueChanges
139
+ .subscribe(() => {
140
+ // This tap operator is a good place to run side effects
141
+ // like calling your change handler after a value changes.
142
+ // this.selectedItem = this.formControl.value;
143
+ if (this.props.change) {
144
+ if (to['offline']) {
145
+ if (to['offlineDataFn']) {
146
+ this._offlineList = to['offlineDataFn']();
147
+ this.initOfflineSelection(false);
148
+ }
149
+ else if (to['offlineItems$']) {
150
+ to['offlineItems$'].subscribe((list) => {
151
+ this._offlineList = list;
152
+ this.initOfflineSelection(false);
153
+ });
154
+ }
155
+ else {
156
+ this._offlineList = to['offlineItems'] || [];
157
+ this.initOfflineSelection(false);
158
+ }
159
+ }
160
+ else {
161
+ this.initOnlineSelection(false);
162
+ }
163
+ }
164
+ });
165
+ }
166
+ // Remember to unsubscribe to prevent memory leaks!
167
+ ngOnDestroy() {
168
+ if (this.valueChangeSubscription) {
169
+ this.valueChangeSubscription.unsubscribe();
170
+ }
171
+ }
172
+ loadDefaultValue() {
173
+ this.loading = true;
174
+ const vf = this.to['valueField'] || 'id';
175
+ const fixedFilters = this.getFixedFilters();
176
+ const lf = this.to['loadDefaultField'] || 'isDefault';
177
+ const lfValue = this.to['loadDefaultValue'] || true;
178
+ const searchParams = {
179
+ [lf]: lfValue,
180
+ ...fixedFilters,
181
+ };
182
+ this.api.getList(searchParams)
183
+ .subscribe({
184
+ next: (res) => {
185
+ // Assuming the API returns a list and you want to select the first one
186
+ if (res && res.items && res.items.length > 0) {
187
+ if (this.to['multiple']) {
188
+ this.formControl.setValue(res.items.map((c) => c[vf]));
189
+ }
190
+ else {
191
+ const defaultValue = res.items[0];
192
+ this.formControl.setValue(defaultValue?.[vf]);
193
+ }
194
+ }
195
+ this.loading = false;
196
+ // this.initOnlineSelection(); // Proceed with online selection after setting the value
197
+ },
198
+ error: (err) => {
199
+ console.error("Failed to load default value from API:", err);
200
+ this.loading = false;
201
+ // this.initOnlineSelection(); // Fallback to local selection if API fails
202
+ }
203
+ });
204
+ }
205
+ // New method to handle loading the default value from the API
206
+ afterSave(event) {
207
+ this.onSelectionChange(event.record);
208
+ if (this.props.afterSave) {
209
+ this.props.afterSave(this.field, { item: event.response });
210
+ this.cdr.detectChanges();
211
+ }
212
+ }
213
+ onSelect(event) {
214
+ if (this.props.onSelect) {
215
+ this.props.onSelect(this.field, { item: event.value });
216
+ this.cdr.detectChanges();
217
+ }
218
+ }
219
+ onSelectionChange(val) {
220
+ const vf = this.to['valueField'] || 'id';
221
+ if (this.to['offline']) {
222
+ // this.selectedItem = val;
223
+ if (this.to['multiple'] && Array.isArray(val)) {
224
+ this.selectedItem = this._offlineList.filter(item => val.includes(item[vf]));
225
+ this.formControl.setValue(Array.isArray(this.selectedItem) ? this.selectedItem.map((c) => c[vf]) : []);
226
+ }
227
+ else {
228
+ this.selectedItem = this._offlineList.find(item => item[vf] === val);
229
+ this.formControl.setValue(this.selectedItem?.[vf] ?? null);
230
+ }
231
+ }
232
+ else {
233
+ this.selectedItem = val;
234
+ if (this.to['multiple']) {
235
+ this.formControl.setValue(Array.isArray(val) ? val.map((c) => c[vf]) : []);
236
+ }
237
+ else {
238
+ this.formControl.setValue(val?.[vf] ?? null);
239
+ }
240
+ }
241
+ }
242
+ initOfflineSelection(withSetValue = true) {
243
+ const val = this.formControl.value;
244
+ const vf = this.to['valueField'] || 'id';
245
+ if (val == null)
246
+ return;
247
+ if (this.to['multiple'] && Array.isArray(val)) {
248
+ this.selectedItem = this._offlineList.filter(item => val.includes(item[vf]));
249
+ }
250
+ else {
251
+ this.selectedItem = this._offlineList.find(item => item[vf] === val);
252
+ }
253
+ if (withSetValue == true) {
254
+ this.formControl.setValue(this.to['multiple']
255
+ ? this.selectedItem.map((c) => c[vf])
256
+ : this.selectedItem?.[vf]);
257
+ }
258
+ else {
259
+ if (this.props.change) {
260
+ this.props.change(this.field, { item: this.selectedItem });
261
+ this.cdr.detectChanges();
262
+ }
263
+ }
264
+ }
265
+ initOnlineSelection(withSetValue = true) {
266
+ const val = this.formControl.value;
267
+ const vf = this.to['valueField'] || 'id';
268
+ if (val == null || (Array.isArray(val) && val.length === 0)) {
269
+ this.selectedItem = this.to['multiple'] ? [] : null;
270
+ if (this.props['loadDefault'] === true) {
271
+ this.loadDefaultValue();
272
+ }
273
+ return;
274
+ }
275
+ if (this.to['multiple'] && Array.isArray(val) && val.length) {
276
+ this.loading = true;
277
+ const fixedFilters = this.getFixedFilters();
278
+ // 🔑 one getList call per id, but include fixedFilters in each
279
+ const calls = val.map((id) => this.api.getList({ ...fixedFilters, [vf]: id }).pipe(map((res) => (res?.items?.length ? res.items[0] : null))));
280
+ forkJoin(calls)
281
+ .pipe(finalize(() => (this.loading = false)))
282
+ .subscribe({
283
+ next: (items) => {
284
+ this.selectedItem = items.filter(i => i != null);
285
+ if (withSetValue) {
286
+ this.formControl.setValue(this.selectedItem.map((c) => c[vf]));
287
+ }
288
+ else if (this.props.change) {
289
+ this.props.change(this.field, { item: this.selectedItem });
290
+ }
291
+ this.cdr.detectChanges();
292
+ },
293
+ error: (err) => {
294
+ console.error('Failed to load multiple selections:', err);
295
+ this.selectedItem = [];
296
+ this.loading = false;
297
+ },
298
+ });
299
+ }
300
+ else {
301
+ this.loading = true;
302
+ const fixedFilters = this.getFixedFilters();
303
+ const searchParams = { ...fixedFilters, [vf]: val };
304
+ this.api
305
+ .getList(searchParams)
306
+ .pipe(finalize(() => (this.loading = false)))
307
+ .subscribe({
308
+ next: (res) => {
309
+ const item = res?.items?.[0] || null;
310
+ this.selectedItem = item;
311
+ if (withSetValue) {
312
+ this.formControl.setValue(item?.[vf]);
313
+ }
314
+ else if (this.props.change) {
315
+ this.props.change(this.field, { item: this.selectedItem });
316
+ }
317
+ this.cdr.detectChanges();
318
+ },
319
+ error: (err) => {
320
+ console.error('Failed to load selection:', err);
321
+ this.selectedItem = null;
322
+ this.loading = false;
323
+ },
324
+ });
325
+ }
326
+ }
327
+ getFixedFilters(query = '') {
328
+ const fixedFilters = this.to['fixedFilters'];
329
+ if (typeof fixedFilters === 'function') {
330
+ // Call with current model (and optionally field)
331
+ try {
332
+ return fixedFilters(query, this.field);
333
+ }
334
+ catch (error) {
335
+ return fixedFilters(this.model);
336
+ }
337
+ }
338
+ return fixedFilters || {};
339
+ }
340
+ onArrowDown(event) {
341
+ event.preventDefault();
342
+ // this.autoComp.show();
343
+ this.onDropdownButtonClick();
344
+ }
345
+ onEscape(event) {
346
+ this.autoComp.hide();
347
+ }
348
+ onAddNewClick() {
349
+ // your logic for adding a new item
350
+ // e.g. open dialog or emit event
351
+ console.log('Add new item clicked');
352
+ this.dialog.openForm("create");
353
+ }
354
+ onDropdownButtonClick() {
355
+ this.search({ query: '' }); // trigger your own search
356
+ setTimeout(() => this.autoComp.show(), 0); // force dropdown to open
357
+ }
358
+ // Called when dropdown button clicked
359
+ onDropdownClick(event) {
360
+ // 🚫 stop the default dropdown behavior
361
+ event.originalEvent.preventDefault();
362
+ event.originalEvent.stopPropagation();
363
+ console.log('Dropdown clicked!', event);
364
+ // ✅ your custom code here
365
+ // e.g., force trigger search for empty query
366
+ this.search({ query: '' });
367
+ }
368
+ search(event) {
369
+ const q = event.query?.toString() || '';
370
+ const lf = this.optionLabel;
371
+ const fixedFilters = this.getFixedFilters(q);
372
+ if (this.to['offline']) {
373
+ this.options_ = this.to['offlineDataFn']
374
+ ? this.to['offlineDataFn'](q)
375
+ : this._offlineList.filter(item => item[lf]?.toString().includes(q));
376
+ setTimeout(() => this.autoComp?.show(), 0);
377
+ }
378
+ else {
379
+ this.loading = true;
380
+ this.options_ = [];
381
+ // Build QueryParameters
382
+ const queryParams = {
383
+ filters: [],
384
+ orderBy: [],
385
+ groupBy: [],
386
+ expand: [],
387
+ select: [],
388
+ top: 10,
389
+ skip: 0,
390
+ };
391
+ // Handle main search and fixed filters
392
+ if (!this.to['query']) {
393
+ // Create a group for main search condition
394
+ const mainGroup = {
395
+ logicalOperator: 'and',
396
+ conditions: [
397
+ {
398
+ field: lf,
399
+ operator: 'contains',
400
+ value: q
401
+ }
402
+ ]
403
+ };
404
+ // Add fixed filters to the same group
405
+ Object.keys(fixedFilters || {}).forEach(key => {
406
+ const value = fixedFilters[key];
407
+ if (value !== null && value !== undefined) {
408
+ mainGroup.conditions.push({
409
+ field: key,
410
+ operator: 'eq',
411
+ value: value
412
+ });
413
+ }
414
+ });
415
+ if (mainGroup.conditions.length > 0) {
416
+ queryParams.filters.push(mainGroup);
417
+ }
418
+ }
419
+ else {
420
+ queryParams.skip = this.to['query'].skip ?? 0;
421
+ queryParams.top = this.to['query'].top ?? 10;
422
+ queryParams.orderBy = this.to['query'].orderBy;
423
+ queryParams.groupBy = this.to['query'].groupBy;
424
+ queryParams.expand = this.to['query'].expand;
425
+ queryParams.select = this.to['query'].select;
426
+ }
427
+ // Merge dynamic filters (function or array)
428
+ let dynamicFilters = [];
429
+ if (this.to['query'] && this.to['query']['filters']) {
430
+ const filtersProp = this.to['query']['filters'];
431
+ if (typeof filtersProp === 'function') {
432
+ dynamicFilters = filtersProp(q, this.field); // pass search text
433
+ }
434
+ else if (Array.isArray(filtersProp)) {
435
+ dynamicFilters = filtersProp;
436
+ }
437
+ }
438
+ // Add dynamic filters with proper groupLogicalOperator
439
+ dynamicFilters.forEach((filterGroup, index) => {
440
+ if (index === 0 && queryParams.filters.length === 0) {
441
+ // First filter group, no groupLogicalOperator needed
442
+ queryParams.filters.push(filterGroup);
443
+ }
444
+ else {
445
+ // Subsequent groups, ensure they have groupLogicalOperator
446
+ const groupWithOperator = {
447
+ ...filterGroup,
448
+ groupLogicalOperator: filterGroup.groupLogicalOperator || 'and'
449
+ };
450
+ queryParams.filters.push(groupWithOperator);
451
+ }
452
+ });
453
+ // Use listEndpoint if available, otherwise use default
454
+ let listEndpoint = this.props.listEndpoint;
455
+ if (typeof listEndpoint === 'function') {
456
+ listEndpoint = listEndpoint(this.model);
457
+ }
458
+ const searchParams = {
459
+ 'query': QueryParser.toString(queryParams)
460
+ };
461
+ this.api.getList(searchParams, listEndpoint)
462
+ .pipe(finalize(() => (this.loading = false)))
463
+ .subscribe({
464
+ next: (res) => {
465
+ this.options_ = res.items ?? res ?? [];
466
+ setTimeout(() => this.autoComp?.show(), 0);
467
+ },
468
+ error: () => {
469
+ this.options_ = [];
470
+ },
471
+ });
472
+ }
473
+ }
474
+ openCrud(mode) {
475
+ const payload = mode === 'add' ? null : this.selectedItem;
476
+ // Example integration:
477
+ // const ref = this.dialog.open(CrudComponent, {
478
+ // data: {
479
+ // serviceName: this.to.serviceName,
480
+ // mode,
481
+ // record: payload
482
+ // }
483
+ // });
484
+ // ref.onClose.subscribe((updated: any) => {
485
+ // if (!this.to.multiple && updated?.[this.to.valueField]) {
486
+ // this.api.get(updated[this.to.valueField])
487
+ // .subscribe(item => {
488
+ // this.selectedItem = item;
489
+ // this.formControl.setValue(item?.[this.to.valueField]);
490
+ // });
491
+ // }
492
+ // });
493
+ }
494
+ getEmptyMessage() {
495
+ if (this.loading) {
496
+ return 'LOADING_DATA_MESSAGE'; // مفتاح ترجمة لـ "جاري تحميل البيانات..."
497
+ }
498
+ else if (this.options_.length === 0) {
499
+ return 'NO_RESULTS_FOUND'; // مفتاح ترجمة لـ "لا توجد نتائج مطابقة."
500
+ }
501
+ return ''; // لا تُعرض رسالة إذا كانت هناك نتائج
502
+ }
503
+ isItemSelected(item) {
504
+ const vf = this.to['valueField'] || 'id';
505
+ return Array.isArray(this.selectedItem) &&
506
+ this.selectedItem.some((sel) => sel[vf] === item[vf]);
507
+ }
508
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericSelectorTypeComponent, deps: [{ token: i1.BaseService }, { token: i0.Injector }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
509
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: GenericSelectorTypeComponent, isStandalone: true, selector: "formly-generic-selector", providers: [DialogService, BaseService], viewQueries: [{ propertyName: "autoComp", first: true, predicate: ["autoComp"], descendants: true }, { propertyName: "dialog", first: true, predicate: ["dialog"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
510
+ <!-- [ngStyle]="{'display': props.display ? 'block': 'none'}" -->
511
+ <p-inputGroup class="w-full">
512
+ <p-autoComplete
513
+ #autoComp
514
+ [ngModel]="selectedItem"
515
+ (ngModelChange)="onSelectionChange($event)"
516
+ [formlyAttributes]="field"
517
+ [suggestions]="options_"
518
+ (completeMethod)="search($event)"
519
+ [multiple]="to['multiple']"
520
+ [optionLabel]="optionLabel"
521
+ [dropdown]="false"
522
+ [forceSelection]="true"
523
+ [placeholder]="(props['placeholder'] ?? '') | translate"
524
+ [disabled]="!!props.disabled"
525
+ dropdownMode="current"
526
+ appendTo="body"
527
+ class="w-full rounded-none"
528
+ [showEmptyMessage]="true"
529
+ (onSelect)="onSelect($event)"
530
+ emptyMessage="{{ getEmptyMessage() | translate }}"
531
+ [showTransitionOptions]="'0ms'"
532
+ [showClear]="!(props['required'] ?? false)"
533
+
534
+ (keydown.arrowdown)="onArrowDown($event)"
535
+ (keydown.escape)="onEscape($event)"
536
+ >
537
+ <ng-template let-item pTemplate="item">
538
+ <div class="flex flex-col">
539
+ <span [innerHTML]="getFormattedLabel(item)"></span>
540
+
541
+ </div>
542
+ </ng-template>
543
+ </p-autoComplete>
544
+
545
+ <p-inputGroupAddon>
546
+ <p-button
547
+ tabindex="-1"
548
+ [disabled]="!!props.disabled || loading"
549
+ [icon]="loading ? 'pi pi-spinner pi-spin' : 'pi pi-chevron-down'"
550
+ (click)="onDropdownButtonClick()"
551
+ severity="secondary" />
552
+ </p-inputGroupAddon>
553
+ <!-- Add new button -->
554
+ @if (props.canAdd && props.formFields) {
555
+ <p-inputGroupAddon>
556
+ <p-button
557
+ tabindex="-1"
558
+ [disabled]="!!props.disabled"
559
+ icon="pi pi-plus"
560
+ (click)="onAddNewClick()"
561
+ severity="primary" />
562
+ </p-inputGroupAddon>
563
+ }
564
+ </p-inputGroup>
565
+
566
+ <!-- [model]="model" -->
567
+ <app-generic-dialog
568
+ #dialog
569
+ [formFields]="props.formFields ?? []"
570
+ [apiName]="props.serviceName"
571
+ [moduleName]="props.moduleName"
572
+ [idField]="props.idField ??'id'"
573
+ [displayMode]="props.dialogDisplayMode ?? 'dialog'"
574
+ (afterSave)="afterSave($event)"
575
+ >
576
+ </app-generic-dialog>
577
+
578
+
579
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: AutoCompleteModule }, { kind: "component", type: i3.AutoComplete, selector: "p-autoComplete, p-autocomplete, p-auto-complete", inputs: ["minLength", "minQueryLength", "delay", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "addOnTab", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "typeahead", "addOnBlur", "separator", "appendTo"], outputs: ["completeMethod", "onSelect", "onUnselect", "onAdd", "onFocus", "onBlur", "onDropdownClick", "onClear", "onInputKeydown", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: InputGroupModule }, { kind: "component", type: i5.InputGroup, selector: "p-inputgroup, p-inputGroup, p-input-group", inputs: ["styleClass"] }, { kind: "ngmodule", type: InputGroupAddonModule }, { kind: "component", type: i6.InputGroupAddon, selector: "p-inputgroup-addon, p-inputGroupAddon", inputs: ["style", "styleClass"] }, { kind: "directive", type: FormlyAttributes, selector: "[formlyAttributes]", inputs: ["formlyAttributes", "id"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i7.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: GenericDialogComponent, selector: "app-generic-dialog", inputs: ["form", "service", "formFields", "model", "apiName", "moduleName", "idField", "dialogMaxWidth", "displayMode", "mode", "forceState", "drawerVisible", "dialogVisible", "isViewMode", "isEditMode", "useConfirmOnSave", "loading", "errorMsg", "errorMessage", "beforeSaveTransform", "hideTable", "autoShowForm"], outputs: ["action", "afterSave", "afterDelete", "beforeSave", "beforeDelete", "formCancel", "formInit", "dataLoaded", "selectionChange", "error", "visibleChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
580
+ }
581
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericSelectorTypeComponent, decorators: [{
582
+ type: Component,
583
+ args: [{
584
+ selector: 'formly-generic-selector',
585
+ template: `
586
+ <!-- [ngStyle]="{'display': props.display ? 'block': 'none'}" -->
587
+ <p-inputGroup class="w-full">
588
+ <p-autoComplete
589
+ #autoComp
590
+ [ngModel]="selectedItem"
591
+ (ngModelChange)="onSelectionChange($event)"
592
+ [formlyAttributes]="field"
593
+ [suggestions]="options_"
594
+ (completeMethod)="search($event)"
595
+ [multiple]="to['multiple']"
596
+ [optionLabel]="optionLabel"
597
+ [dropdown]="false"
598
+ [forceSelection]="true"
599
+ [placeholder]="(props['placeholder'] ?? '') | translate"
600
+ [disabled]="!!props.disabled"
601
+ dropdownMode="current"
602
+ appendTo="body"
603
+ class="w-full rounded-none"
604
+ [showEmptyMessage]="true"
605
+ (onSelect)="onSelect($event)"
606
+ emptyMessage="{{ getEmptyMessage() | translate }}"
607
+ [showTransitionOptions]="'0ms'"
608
+ [showClear]="!(props['required'] ?? false)"
609
+
610
+ (keydown.arrowdown)="onArrowDown($event)"
611
+ (keydown.escape)="onEscape($event)"
612
+ >
613
+ <ng-template let-item pTemplate="item">
614
+ <div class="flex flex-col">
615
+ <span [innerHTML]="getFormattedLabel(item)"></span>
616
+
617
+ </div>
618
+ </ng-template>
619
+ </p-autoComplete>
620
+
621
+ <p-inputGroupAddon>
622
+ <p-button
623
+ tabindex="-1"
624
+ [disabled]="!!props.disabled || loading"
625
+ [icon]="loading ? 'pi pi-spinner pi-spin' : 'pi pi-chevron-down'"
626
+ (click)="onDropdownButtonClick()"
627
+ severity="secondary" />
628
+ </p-inputGroupAddon>
629
+ <!-- Add new button -->
630
+ @if (props.canAdd && props.formFields) {
631
+ <p-inputGroupAddon>
632
+ <p-button
633
+ tabindex="-1"
634
+ [disabled]="!!props.disabled"
635
+ icon="pi pi-plus"
636
+ (click)="onAddNewClick()"
637
+ severity="primary" />
638
+ </p-inputGroupAddon>
639
+ }
640
+ </p-inputGroup>
641
+
642
+ <!-- [model]="model" -->
643
+ <app-generic-dialog
644
+ #dialog
645
+ [formFields]="props.formFields ?? []"
646
+ [apiName]="props.serviceName"
647
+ [moduleName]="props.moduleName"
648
+ [idField]="props.idField ??'id'"
649
+ [displayMode]="props.dialogDisplayMode ?? 'dialog'"
650
+ (afterSave)="afterSave($event)"
651
+ >
652
+ </app-generic-dialog>
653
+
654
+
655
+ `,
656
+ providers: [DialogService, BaseService],
657
+ imports: [
658
+ FormsModule,
659
+ ReactiveFormsModule,
660
+ AutoCompleteModule,
661
+ InputGroupModule,
662
+ InputGroupAddonModule,
663
+ FormlyAttributes,
664
+ TranslatePipe,
665
+ AutoComplete,
666
+ CheckboxModule,
667
+ ButtonModule,
668
+ GenericDialogComponent
669
+ ]
670
+ }]
671
+ }], ctorParameters: () => [{ type: i1.BaseService }, { type: i0.Injector }, { type: i0.ChangeDetectorRef }], propDecorators: { autoComp: [{
672
+ type: ViewChild,
673
+ args: ['autoComp']
674
+ }], dialog: [{
675
+ type: ViewChild,
676
+ args: ['dialog']
677
+ }] } });
678
+
679
+ /**
680
+ * Generated bundle index. Do not edit.
681
+ */
682
+
683
+ export { GenericSelectorModule, GenericSelectorTypeComponent };
684
+ //# sourceMappingURL=es.framework-ng.ui.core-generic-selector.mjs.map