@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,465 @@
1
+ import * as i7 from 'primeng/tooltip';
2
+ import { TooltipModule } from 'primeng/tooltip';
3
+ import * as i0 from '@angular/core';
4
+ import { inject, EventEmitter, Input, ViewChild, Output, Component, NgModule } from '@angular/core';
5
+ import * as i1 from '@angular/common';
6
+ import { Location, CommonModule } from '@angular/common';
7
+ import * as i2 from 'primeng/toolbar';
8
+ import { ToolbarModule } from 'primeng/toolbar';
9
+ import * as i4 from 'primeng/button';
10
+ import { ButtonModule } from 'primeng/button';
11
+ import { FormlyForm } from '@ngx-formly/core';
12
+ import * as i6 from '@angular/forms';
13
+ import { UntypedFormGroup, FormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms';
14
+ import * as i5 from 'primeng/tabs';
15
+ import { TabsModule } from 'primeng/tabs';
16
+ import { TranslatePipe } from '@es.framework/ng.core/pipes';
17
+ import { BreadcrumbComponent } from '@es.framework/ng.ui.core/breadcrumb';
18
+ import { BaseService, SwalService } from '@es.framework/ng.core/services';
19
+ import { ActivatedRoute, Router } from '@angular/router';
20
+ import * as i8 from 'primeng/progressspinner';
21
+ import { ProgressSpinnerModule } from 'primeng/progressspinner';
22
+ import { GenericDialogComponent } from '@es.framework/ng.ui.core/generic-dialog';
23
+ import { GenericButton } from '@es.framework/ng.ui.core/generic-button';
24
+ import * as i3 from 'primeng/api';
25
+
26
+ class GenericViewComponent {
27
+ route = inject(ActivatedRoute);
28
+ router = inject(Router);
29
+ form = new UntypedFormGroup({});
30
+ title = '';
31
+ actions = [];
32
+ createEditActions = [];
33
+ actions_ = [];
34
+ tabs = [];
35
+ viewMode = true;
36
+ breadcrumb;
37
+ service = inject(BaseService);
38
+ formFields = [];
39
+ apiName = '';
40
+ moduleName = '';
41
+ idField = 'id';
42
+ standaloneMode = false;
43
+ isViewMode = true; // وضع المشاهدة فقط
44
+ isCreateMode = false; // وضع الاضافة فقط
45
+ isEditMode = false; // وضع التعديل
46
+ model = {};
47
+ displayMode = 'drawer';
48
+ mode = 'full';
49
+ action = new EventEmitter();
50
+ afterDelete = new EventEmitter();
51
+ dialog;
52
+ inlineForm;
53
+ tabs_ = [];
54
+ model_ = {};
55
+ currentId;
56
+ list = [];
57
+ totalRecords = 0;
58
+ loading = false;
59
+ // pagination state
60
+ pageSize = 10;
61
+ pageIndex = 0;
62
+ sort = '';
63
+ currentFilters = {};
64
+ pageFilters = {};
65
+ searchGlobal = '';
66
+ swalService = inject(SwalService);
67
+ _location = inject(Location);
68
+ ngOnInit() {
69
+ this.loading = true;
70
+ if (this.apiName) {
71
+ this.service.apiName = this.apiName;
72
+ this.service.moduleName = this.moduleName;
73
+ }
74
+ this.actions_ = this.actions.filter(c => c.name != 'view');
75
+ this.route.paramMap.subscribe(params => {
76
+ const id = params.get(this.idField);
77
+ if (id) {
78
+ this.currentId = id;
79
+ if (this.standaloneMode) {
80
+ this.loadList();
81
+ }
82
+ }
83
+ this.refresh();
84
+ });
85
+ }
86
+ refresh() {
87
+ // detect mode based on route
88
+ const url = this.router.url.toLowerCase();
89
+ this.isViewMode = url.includes('/view');
90
+ this.isEditMode = url.includes('/edit');
91
+ this.isCreateMode = url.includes('/create') || url.endsWith('/new') || url.endsWith('/add');
92
+ this.tabs_ = [];
93
+ for (let i = 0; i < this.tabs.length; i++) {
94
+ const t = this.tabs[i];
95
+ this.tabs_.push({
96
+ ...t,
97
+ fields: [
98
+ {
99
+ props: { label: '' },
100
+ // fieldGroupClassName: 'grid grid-cols-1 md:grid-cols-2 gap-3', // TODO
101
+ fieldGroupClassName: '',
102
+ fieldGroup: this.isCreateMode || this.isEditMode
103
+ ? this.getCreateEditFields(i == 0 ? this.formFields : t.fields)
104
+ : this.getViewFields(i == 0 ? this.formFields : t.fields),
105
+ },
106
+ ],
107
+ });
108
+ }
109
+ this.loading = false;
110
+ }
111
+ // as form
112
+ getCreateEditFields(fields = []) {
113
+ return fields.map(f => ({
114
+ ...f,
115
+ props: { ...f.props, readonly: this.viewMode, disabled: this.viewMode },
116
+ }));
117
+ }
118
+ getViewFields(fields = []) {
119
+ const flatten = (fields) => fields.flatMap((field) => {
120
+ /* 1. GROUP / PANEL / WRAPPER */
121
+ if (field.fieldGroup?.length) {
122
+ const children = flatten(field.fieldGroup);
123
+ if (!children.length)
124
+ return [];
125
+ return [{
126
+ ...field,
127
+ wrappers: field.wrappers,
128
+ props: { ...field.props },
129
+ fieldGroupClassName: field.fieldGroupClassName,
130
+ fieldGroup: children
131
+ }];
132
+ }
133
+ /* 2. FIELD ARRAY (REPEAT / TABLE / MULTI) */
134
+ const fieldArrayConfig = typeof field.fieldArray === 'function'
135
+ ? field.fieldArray(field)
136
+ : field.fieldArray;
137
+ if (field.fieldArray) {
138
+ if (field.props?.['view']?.hidden)
139
+ return [];
140
+ const children = flatten(fieldArrayConfig?.fieldGroup || []);
141
+ if (!children.length)
142
+ return [];
143
+ return [{
144
+ ...field,
145
+ type: field.props?.['view']?.type || field.type,
146
+ readonly: this.viewMode,
147
+ disabled: this.viewMode,
148
+ fieldArray: {
149
+ ...fieldArrayConfig,
150
+ fieldGroup: children
151
+ }
152
+ }];
153
+ }
154
+ /* 3. SINGLE FIELD */
155
+ if (!field.props || field.props['view']?.hidden)
156
+ return [];
157
+ const type = field.props['view']?.type ||
158
+ field.props['table']?.type ||
159
+ field.props['filter']?.type ||
160
+ 'custom-label-type';
161
+ return [{
162
+ type,
163
+ key: field.key,
164
+ readonly: this.viewMode,
165
+ disabled: this.viewMode,
166
+ wrappers: field.wrappers ?? ['field-wrapper'],
167
+ className: field.className,
168
+ props: {
169
+ ...field.props,
170
+ ...(field.props['view']?.props ||
171
+ field.props['table']?.props ||
172
+ field.props['filter']?.props ||
173
+ {}),
174
+ },
175
+ expressions: field.props['view']?.expressions ||
176
+ field.props['table']?.expressions ||
177
+ field.props['filter']?.expressions
178
+ }];
179
+ });
180
+ return flatten(fields);
181
+ }
182
+ // getViewFields(fields: FormlyFieldConfig[] = []): FormlyFieldConfig[] {
183
+ // const flatten = (fields: FormlyFieldConfig[]): FormlyFieldConfig[] =>
184
+ // fields.flatMap(field => {
185
+ // if (field.fieldGroup?.length) return flatten(field.fieldGroup);
186
+ // if (!field.props
187
+ // || field.props['view']?.hidden
188
+ // // || field.props['table']?.hidden
189
+ // ) return [];
190
+ // const type = field.props['view']?.type || field.props['table']?.type || 'custom-label-type';
191
+ // return [{
192
+ // type,
193
+ // key: field['key'],
194
+ // readonly: this.viewMode,
195
+ // disabled: this.viewMode,
196
+ // wrappers: field.wrappers ?? ['field-wrapper'],
197
+ // props: {
198
+ // ...field.props,
199
+ // ...(field.props['view']?.props || field.props['table']?.props),
200
+ // },
201
+ // expressions: field.props['view']?.expressions || field.props['view']?.expressions,
202
+ // }];
203
+ // });
204
+ // return flatten(fields);
205
+ // }
206
+ // Use a map to store form groups for each row and column
207
+ cellForms = new Map();
208
+ getForm(rowIndex) {
209
+ const key = `${rowIndex}_`;
210
+ let form = this.cellForms.get(key);
211
+ if (!form) {
212
+ form = new FormGroup({});
213
+ this.cellForms.set(key, form);
214
+ }
215
+ return form;
216
+ }
217
+ async handleCreateEditAction(btn) {
218
+ try {
219
+ if (btn.action) {
220
+ // Execute the provided action
221
+ await btn.action(null); // You can pass row or context here
222
+ }
223
+ else {
224
+ // Fallback to emitting event
225
+ if (btn.actionName == 'cancel') {
226
+ this.back();
227
+ }
228
+ else {
229
+ this.action.emit({
230
+ name: btn.actionName ?? 'cancel',
231
+ row: null, // provide row if available
232
+ });
233
+ }
234
+ }
235
+ }
236
+ catch (err) {
237
+ console.error('Button action error', err);
238
+ }
239
+ }
240
+ onAction(act, model) {
241
+ if (act.action) {
242
+ act.action(model);
243
+ }
244
+ else {
245
+ // this.action.emit({ name: act.name, row:model });
246
+ this.emitAction({ name: act.name, row: model });
247
+ }
248
+ }
249
+ emitAction(event) {
250
+ switch (event.name) {
251
+ case 'edit':
252
+ this.dialog.openForm("edit", event.row);
253
+ break;
254
+ case 'delete':
255
+ this.onDelete(event.row);
256
+ break;
257
+ default:
258
+ this.action.emit(event);
259
+ break;
260
+ }
261
+ }
262
+ onDelete(item) {
263
+ const id = item[this.idField];
264
+ this.swalService.confirm('تأكيد الحذف', 'هل تريد حذف هذا السجل فعلاً؟', 'نعم، احذف', 'إلغاء').then((result) => {
265
+ if (result.isConfirmed) {
266
+ this.service.delete(id).subscribe({
267
+ next: () => {
268
+ this.swalService.success('تم الحذف بنجاح');
269
+ this.back();
270
+ },
271
+ error: (err) => {
272
+ this.loading = false;
273
+ }
274
+ });
275
+ }
276
+ });
277
+ }
278
+ afterSave(event) {
279
+ this.model = event.response;
280
+ // set the id from backend response
281
+ this.currentId = event.response[this.idField];
282
+ if (this.isCreateMode) {
283
+ this.goToMode('view');
284
+ }
285
+ else if (this.isEditMode) {
286
+ this.goToMode('view');
287
+ }
288
+ }
289
+ goToMode(mode) {
290
+ const tree = this.router.parseUrl(this.router.url);
291
+ const segments = tree.root.children['primary']?.segments.map(s => s.path) ?? [];
292
+ let newSegments;
293
+ if (mode === 'create') {
294
+ // always navigate to "add"
295
+ newSegments = [
296
+ ...segments.filter(s => !['view', 'edit', 'add'].includes(s)),
297
+ 'add',
298
+ ];
299
+ }
300
+ else {
301
+ // if in "add" mode, replace it with the new id
302
+ if (segments.includes('add')) {
303
+ newSegments = [
304
+ ...segments.filter(s => s !== 'add'),
305
+ String(this.currentId),
306
+ mode,
307
+ ];
308
+ }
309
+ else {
310
+ const idIndex = segments.findIndex(s => s === String(this.currentId));
311
+ if (idIndex === -1) {
312
+ newSegments = [...segments, String(this.currentId), mode];
313
+ }
314
+ else {
315
+ newSegments = segments.slice(0, idIndex + 1);
316
+ newSegments.push(mode);
317
+ }
318
+ }
319
+ }
320
+ this.router.navigate(newSegments);
321
+ this.refresh();
322
+ }
323
+ backToList() {
324
+ this.router.navigate(['../']);
325
+ }
326
+ back() {
327
+ // this.router.navigate(['..']);
328
+ this._location.back();
329
+ }
330
+ loadList() {
331
+ this.loading = true;
332
+ const filters = {
333
+ maxResultCount: this.pageSize,
334
+ skipCount: this.pageIndex * this.pageSize,
335
+ sorting: this.sort,
336
+ ...this.currentFilters,
337
+ ...this.pageFilters,
338
+ ...(this.searchGlobal ? { filter: this.searchGlobal } : {}),
339
+ };
340
+ this.service.getList(filters).subscribe({
341
+ next: (res) => {
342
+ this.list = res.items;
343
+ this.totalRecords = res.totalCount;
344
+ this.loading = false;
345
+ // set model_ to current id item
346
+ const found = this.list.find(x => x[this.idField] == this.currentId);
347
+ if (found) {
348
+ this.model_ = found;
349
+ }
350
+ },
351
+ error: err => {
352
+ console.error('Error loading list', err);
353
+ this.loading = false;
354
+ }
355
+ });
356
+ }
357
+ next() {
358
+ if (!this.currentId)
359
+ return;
360
+ // increment currentId numerically
361
+ // const newId = Number(this.currentId) + 1;
362
+ // this.currentId = newId;
363
+ // use goToMode to navigate and keep mode
364
+ const currentMode = this.isEditMode ? 'edit' : 'view';
365
+ // this.goToMode(currentMode);
366
+ }
367
+ previous() {
368
+ if (!this.currentId)
369
+ return;
370
+ // decrement currentId numerically
371
+ // const newId = Number(this.currentId) - 1;
372
+ // if (newId <= 0) return;
373
+ // this.currentId = newId;
374
+ // use goToMode to navigate and keep mode
375
+ const currentMode = this.isEditMode ? 'edit' : 'view';
376
+ // this.goToMode(currentMode);
377
+ }
378
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
379
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: GenericViewComponent, isStandalone: true, selector: "app-detail-view", inputs: { title: "title", actions: "actions", createEditActions: "createEditActions", tabs: "tabs", viewMode: "viewMode", breadcrumb: "breadcrumb", service: "service", formFields: "formFields", apiName: "apiName", moduleName: "moduleName", idField: "idField", standaloneMode: "standaloneMode", isViewMode: "isViewMode", isCreateMode: "isCreateMode", isEditMode: "isEditMode", model: "model", displayMode: "displayMode", mode: "mode", loading: "loading" }, outputs: { action: "action", afterDelete: "afterDelete" }, viewQueries: [{ propertyName: "dialog", first: true, predicate: ["dialog"], descendants: true }, { propertyName: "inlineForm", first: true, predicate: ["inlineForm"], descendants: true }], ngImport: i0, template: "\n@if (mode === 'detail') {\n <div class=\"w-full flex flex-col gap-3\">\n <!-- overlay -->\n @if (loading) {\n <div\n class=\"absolute inset-0 bg-white/70 flex items-center justify-center z-50\">\n <p-progress-spinner/>\n </div>\n }\n\n <!-- actual content -->\n <!-- Toolbar -->\n <p-toolbar style=\"background: transparent;border: 0px;box-shadow: none;\" class=\"bg-transparent shadow-none border-none rounded-md px-3\">\n <ng-template pTemplate=\"left\">\n <!-- <span class=\"font-semibold text-lg xs:hidden block\">{{ title }}</span> -->\n <app-breadcrumb class=\"xs:block\" [breadcrumb]=\"breadcrumb\"></app-breadcrumb> <!-- xs:block hidden -->\n </ng-template>\n <ng-template pTemplate=\"right\">\n <div class=\"flex gap-2\">\n\n <button\n pButton pRipple\n icon=\"pi pi-chevron-right\"\n class=\"p-button-text p-button-sm fd-btn\"\n pTooltip=\"\u0627\u0644\u062A\u0627\u0644\u064A\"\n (click)=\"next()\"\n ></button>\n <button\n pButton pRipple\n icon=\"pi pi-chevron-left\"\n class=\"p-button-text p-button-sm fd-btn\"\n pTooltip=\"\u0627\u0644\u0633\u0627\u0628\u0642\"\n (click)=\"previous()\"\n ></button>\n </div>\n </ng-template>\n </p-toolbar>\n <p-toolbar class=\"bg-white shadow rounded-md px-3\">\n\n <ng-template pTemplate=\"left\">\n @if (isViewMode) {\n <div class=\"flex gap-1\">\n @for (action of actions_; track $index) {\n <button\n pButton pRipple\n [icon]=\"action.icon ?? ''\"\n [label]=\"(action.label ?? '') | translate\"\n class=\"fd-btn\"\n (click)=\"onAction(action,model)\"\n ></button>\n }\n </div>\n }\n </ng-template>\n <ng-template pTemplate=\"right\">\n @if (isEditMode || isCreateMode) {\n <div class=\"flex gap-1\">\n @for (btn of createEditActions; track $index) {\n @if (!btn.visible || (btn.visible && btn.visible === true)) {\n @if (btn.type === 'submit' && inlineForm) {\n <lib-generic-button\n [type]=\"'submit'\"\n [loading]=\"inlineForm.loading\"\n [disabled]=\"inlineForm.loading || form.invalid\"\n [icon]=\"btn.icon\"\n [label]=\"btn.label | translate\"\n [variant]=\"btn.variant\"\n [severity]=\"btn.severity\"\n [size]=\"btn.size\"\n [model]=\"btn.splitActions\"\n [permission]=\"btn.permission\"\n (clicked)=\"inlineForm.onSubmit()\"\n ></lib-generic-button>\n }\n @else{\n <lib-generic-button\n [icon]=\"btn.icon\"\n [label]=\"btn.label | translate\"\n [variant]=\"btn.variant\"\n [severity]=\"btn.severity\"\n [size]=\"btn.size\"\n [model]=\"btn.splitActions\"\n [permission]=\"btn.permission\"\n (clicked)=\"handleCreateEditAction(btn)\"\n ></lib-generic-button>\n }\n }\n }\n </div>\n }\n </ng-template>\n\n </p-toolbar>\n\n <!-- Tabs -->\n <p-tabs value=\"0\">\n <p-tablist>\n @for (tab of tabs_; track $index) {\n <p-tab value=\"{{$index}}\">\n <i [class]=\"tab.icon\"></i>\n <span class=\"mr-1 ml-1\">{{ tab.header }}</span>\n </p-tab>\n }\n </p-tablist>\n <p-tabpanels>\n @for (tab of tabs_; track $index) {\n <p-tabpanel value=\"{{$index}}\">\n\n <!-- Formly fields -->\n <!-- border border-surface p-4-->\n <div class=\"\">\n @if (tab.fields.length && $index === 0) {\n\n @if (form) {\n <form [formGroup]=\"form\">\n @if (tab.fields.length && $index === 0 ) {\n @if (isEditMode || isCreateMode) {\n <app-generic-dialog\n #inlineForm\n [form]=\"form\"\n [model]=\"model\"\n [formFields]=\"formFields ?? []\"\n [apiName]=\"apiName\"\n [moduleName]=\"moduleName\"\n [idField]=\"idField ??'id'\"\n [displayMode]=\"'inline'\"\n [mode]=\"'form-only'\"\n [forceState]=\"isCreateMode ? 'create':'edit'\"\n (afterSave)=\"afterSave($event)\"\n >\n </app-generic-dialog>\n }\n @else if(isViewMode){\n <formly-form\n [form]=\"form\"\n [fields]=\"tab.fields\"\n [model]=\"model\"\n ></formly-form>\n }\n }\n </form>\n }\n\n }\n @if (tab.fields.length && $index > 0) {\n\n\n <formly-form\n [form]=\"getForm($index)\"\n [fields]=\"tab.fields\"\n [model]=\"tab.model || model\"\n ></formly-form>\n\n }\n\n <!-- Custom template -->\n @if (tab.content) {\n <ng-container\n *ngTemplateOutlet=\"tab.content; context: { model: model }\">\n </ng-container>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n</p-tabs>\n</div>\n\n<!-- [model]=\"model\" -->\n<app-generic-dialog\n #dialog\n [formFields]=\"formFields ?? []\"\n [apiName]=\"apiName\"\n [moduleName]=\"moduleName\"\n [idField]=\"idField ??'id'\"\n [displayMode]=\"displayMode ?? 'dialog'\"\n (afterSave)=\"afterSave($event)\"\n >\n</app-generic-dialog>\n}\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ToolbarModule }, { kind: "component", type: i2.Toolbar, selector: "p-toolbar", inputs: ["styleClass", "ariaLabelledBy"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: TabsModule }, { kind: "component", type: i5.Tabs, selector: "p-tabs", inputs: ["value", "scrollable", "lazy", "selectOnFocus", "showNavigators", "tabindex"], outputs: ["valueChange"] }, { kind: "component", type: i5.TabPanels, selector: "p-tabpanels" }, { kind: "component", type: i5.TabPanel, selector: "p-tabpanel", inputs: ["lazy", "value"], outputs: ["valueChange"] }, { kind: "component", type: i5.TabList, selector: "p-tablist" }, { kind: "component", type: i5.Tab, selector: "p-tab", inputs: ["value", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: BreadcrumbComponent, selector: "app-breadcrumb", inputs: ["breadcrumb"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip"] }, { 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: "component", type: GenericButton, selector: "lib-generic-button", inputs: ["model", "type", "icon", "label", "variant", "severity", "size", "iconPosition", "disabled", "loading", "ariaLabel", "extraClasses", "permission"], outputs: ["clicked", "itemClick"] }, { kind: "ngmodule", type: ProgressSpinnerModule }, { kind: "component", type: i8.ProgressSpinner, selector: "p-progressSpinner, p-progress-spinner, p-progressspinner", inputs: ["styleClass", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
380
+ }
381
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericViewComponent, decorators: [{
382
+ type: Component,
383
+ args: [{ selector: 'app-detail-view', standalone: true, imports: [
384
+ CommonModule,
385
+ ToolbarModule,
386
+ ButtonModule,
387
+ TabsModule,
388
+ FormlyForm,
389
+ FormsModule,
390
+ ReactiveFormsModule,
391
+ TranslatePipe,
392
+ BreadcrumbComponent,
393
+ TooltipModule,
394
+ GenericDialogComponent,
395
+ GenericButton,
396
+ ProgressSpinnerModule
397
+ ], template: "\n@if (mode === 'detail') {\n <div class=\"w-full flex flex-col gap-3\">\n <!-- overlay -->\n @if (loading) {\n <div\n class=\"absolute inset-0 bg-white/70 flex items-center justify-center z-50\">\n <p-progress-spinner/>\n </div>\n }\n\n <!-- actual content -->\n <!-- Toolbar -->\n <p-toolbar style=\"background: transparent;border: 0px;box-shadow: none;\" class=\"bg-transparent shadow-none border-none rounded-md px-3\">\n <ng-template pTemplate=\"left\">\n <!-- <span class=\"font-semibold text-lg xs:hidden block\">{{ title }}</span> -->\n <app-breadcrumb class=\"xs:block\" [breadcrumb]=\"breadcrumb\"></app-breadcrumb> <!-- xs:block hidden -->\n </ng-template>\n <ng-template pTemplate=\"right\">\n <div class=\"flex gap-2\">\n\n <button\n pButton pRipple\n icon=\"pi pi-chevron-right\"\n class=\"p-button-text p-button-sm fd-btn\"\n pTooltip=\"\u0627\u0644\u062A\u0627\u0644\u064A\"\n (click)=\"next()\"\n ></button>\n <button\n pButton pRipple\n icon=\"pi pi-chevron-left\"\n class=\"p-button-text p-button-sm fd-btn\"\n pTooltip=\"\u0627\u0644\u0633\u0627\u0628\u0642\"\n (click)=\"previous()\"\n ></button>\n </div>\n </ng-template>\n </p-toolbar>\n <p-toolbar class=\"bg-white shadow rounded-md px-3\">\n\n <ng-template pTemplate=\"left\">\n @if (isViewMode) {\n <div class=\"flex gap-1\">\n @for (action of actions_; track $index) {\n <button\n pButton pRipple\n [icon]=\"action.icon ?? ''\"\n [label]=\"(action.label ?? '') | translate\"\n class=\"fd-btn\"\n (click)=\"onAction(action,model)\"\n ></button>\n }\n </div>\n }\n </ng-template>\n <ng-template pTemplate=\"right\">\n @if (isEditMode || isCreateMode) {\n <div class=\"flex gap-1\">\n @for (btn of createEditActions; track $index) {\n @if (!btn.visible || (btn.visible && btn.visible === true)) {\n @if (btn.type === 'submit' && inlineForm) {\n <lib-generic-button\n [type]=\"'submit'\"\n [loading]=\"inlineForm.loading\"\n [disabled]=\"inlineForm.loading || form.invalid\"\n [icon]=\"btn.icon\"\n [label]=\"btn.label | translate\"\n [variant]=\"btn.variant\"\n [severity]=\"btn.severity\"\n [size]=\"btn.size\"\n [model]=\"btn.splitActions\"\n [permission]=\"btn.permission\"\n (clicked)=\"inlineForm.onSubmit()\"\n ></lib-generic-button>\n }\n @else{\n <lib-generic-button\n [icon]=\"btn.icon\"\n [label]=\"btn.label | translate\"\n [variant]=\"btn.variant\"\n [severity]=\"btn.severity\"\n [size]=\"btn.size\"\n [model]=\"btn.splitActions\"\n [permission]=\"btn.permission\"\n (clicked)=\"handleCreateEditAction(btn)\"\n ></lib-generic-button>\n }\n }\n }\n </div>\n }\n </ng-template>\n\n </p-toolbar>\n\n <!-- Tabs -->\n <p-tabs value=\"0\">\n <p-tablist>\n @for (tab of tabs_; track $index) {\n <p-tab value=\"{{$index}}\">\n <i [class]=\"tab.icon\"></i>\n <span class=\"mr-1 ml-1\">{{ tab.header }}</span>\n </p-tab>\n }\n </p-tablist>\n <p-tabpanels>\n @for (tab of tabs_; track $index) {\n <p-tabpanel value=\"{{$index}}\">\n\n <!-- Formly fields -->\n <!-- border border-surface p-4-->\n <div class=\"\">\n @if (tab.fields.length && $index === 0) {\n\n @if (form) {\n <form [formGroup]=\"form\">\n @if (tab.fields.length && $index === 0 ) {\n @if (isEditMode || isCreateMode) {\n <app-generic-dialog\n #inlineForm\n [form]=\"form\"\n [model]=\"model\"\n [formFields]=\"formFields ?? []\"\n [apiName]=\"apiName\"\n [moduleName]=\"moduleName\"\n [idField]=\"idField ??'id'\"\n [displayMode]=\"'inline'\"\n [mode]=\"'form-only'\"\n [forceState]=\"isCreateMode ? 'create':'edit'\"\n (afterSave)=\"afterSave($event)\"\n >\n </app-generic-dialog>\n }\n @else if(isViewMode){\n <formly-form\n [form]=\"form\"\n [fields]=\"tab.fields\"\n [model]=\"model\"\n ></formly-form>\n }\n }\n </form>\n }\n\n }\n @if (tab.fields.length && $index > 0) {\n\n\n <formly-form\n [form]=\"getForm($index)\"\n [fields]=\"tab.fields\"\n [model]=\"tab.model || model\"\n ></formly-form>\n\n }\n\n <!-- Custom template -->\n @if (tab.content) {\n <ng-container\n *ngTemplateOutlet=\"tab.content; context: { model: model }\">\n </ng-container>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n</p-tabs>\n</div>\n\n<!-- [model]=\"model\" -->\n<app-generic-dialog\n #dialog\n [formFields]=\"formFields ?? []\"\n [apiName]=\"apiName\"\n [moduleName]=\"moduleName\"\n [idField]=\"idField ??'id'\"\n [displayMode]=\"displayMode ?? 'dialog'\"\n (afterSave)=\"afterSave($event)\"\n >\n</app-generic-dialog>\n}\n" }]
398
+ }], propDecorators: { title: [{
399
+ type: Input
400
+ }], actions: [{
401
+ type: Input
402
+ }], createEditActions: [{
403
+ type: Input
404
+ }], tabs: [{
405
+ type: Input
406
+ }], viewMode: [{
407
+ type: Input
408
+ }], breadcrumb: [{
409
+ type: Input
410
+ }], service: [{
411
+ type: Input
412
+ }], formFields: [{
413
+ type: Input
414
+ }], apiName: [{
415
+ type: Input
416
+ }], moduleName: [{
417
+ type: Input
418
+ }], idField: [{
419
+ type: Input
420
+ }], standaloneMode: [{
421
+ type: Input
422
+ }], isViewMode: [{
423
+ type: Input
424
+ }], isCreateMode: [{
425
+ type: Input
426
+ }], isEditMode: [{
427
+ type: Input
428
+ }], model: [{
429
+ type: Input
430
+ }], displayMode: [{
431
+ type: Input
432
+ }], mode: [{
433
+ type: Input
434
+ }], action: [{
435
+ type: Output
436
+ }], afterDelete: [{
437
+ type: Output
438
+ }], dialog: [{
439
+ type: ViewChild,
440
+ args: ['dialog']
441
+ }], inlineForm: [{
442
+ type: ViewChild,
443
+ args: ['inlineForm']
444
+ }], loading: [{
445
+ type: Input
446
+ }] } });
447
+
448
+ class GenericViewModule {
449
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericViewModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
450
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: GenericViewModule, imports: [CommonModule] });
451
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericViewModule, imports: [CommonModule] });
452
+ }
453
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericViewModule, decorators: [{
454
+ type: NgModule,
455
+ args: [{
456
+ imports: [CommonModule],
457
+ }]
458
+ }] });
459
+
460
+ /**
461
+ * Generated bundle index. Do not edit.
462
+ */
463
+
464
+ export { GenericViewComponent, GenericViewModule };
465
+ //# sourceMappingURL=es.framework-ng.ui.core-generic-view.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"es.framework-ng.ui.core-generic-view.mjs","sources":["../../../../libs/ng.ui.core/generic-view/src/lib/generic-view.ts","../../../../libs/ng.ui.core/generic-view/src/lib/generic-view.html","../../../../libs/ng.ui.core/generic-view/src/lib/generic-view-module.ts","../../../../libs/ng.ui.core/generic-view/src/es.framework-ng.ui.core-generic-view.ts"],"sourcesContent":["import { TooltipModule } from 'primeng/tooltip';\r\nimport { Component, EventEmitter, inject, Input, OnInit, Output, TemplateRef, ViewChild } from '@angular/core';\r\nimport { CommonModule, Location } from '@angular/common';\r\nimport { ToolbarModule } from 'primeng/toolbar';\r\nimport { ButtonModule } from 'primeng/button';\r\nimport { FormlyForm, FormlyFieldConfig } from '@ngx-formly/core';\r\nimport { FormGroup, FormsModule, ReactiveFormsModule, UntypedFormGroup } from '@angular/forms';\r\nimport { TabsModule } from 'primeng/tabs';\r\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\r\nimport { MenuItem } from 'primeng/api';\r\nimport { BreadcrumbComponent } from '@es.framework/ng.ui.core/breadcrumb';\r\nimport { BaseService, SwalService } from '@es.framework/ng.core/services';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { ActionDef, ButtonConfig, PaginatedResult } from '@es.framework/ng.core/models';\r\nimport { ProgressSpinnerModule } from 'primeng/progressspinner';\r\nimport { GenericDialogComponent } from '@es.framework/ng.ui.core/generic-dialog';\r\nimport { GenericButton } from '@es.framework/ng.ui.core/generic-button';\r\n\r\nexport interface DetailTab {\r\n header: string;\r\n icon?: string;\r\n fields: FormlyFieldConfig[];\r\n model?: any;\r\n content?: TemplateRef<any>;\r\n}\r\n\r\n@Component({\r\n selector: 'app-detail-view',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n ToolbarModule,\r\n ButtonModule,\r\n TabsModule,\r\n FormlyForm,\r\n FormsModule,\r\n ReactiveFormsModule,\r\n TranslatePipe,\r\n BreadcrumbComponent,\r\n TooltipModule,\r\n GenericDialogComponent,\r\n GenericButton,\r\n ProgressSpinnerModule\r\n ],\r\n templateUrl: './generic-view.html',\r\n})\r\nexport class GenericViewComponent implements OnInit {\r\n private route = inject(ActivatedRoute);\r\n private router = inject(Router);\r\n\r\n form = new UntypedFormGroup({});\r\n\r\n @Input() title = '';\r\n @Input() actions: ActionDef<any>[] = [];\r\n @Input() createEditActions: ButtonConfig[] = [];\r\n actions_: ActionDef<any>[] = [];\r\n @Input() tabs: DetailTab[] = [];\r\n @Input() viewMode = true;\r\n @Input() breadcrumb: MenuItem[] | undefined;\r\n @Input() service: BaseService = inject(BaseService);\r\n @Input() formFields: FormlyFieldConfig[] = [];\r\n @Input() apiName = '';\r\n @Input() moduleName = '';\r\n @Input() idField = 'id';\r\n @Input() standaloneMode = false;\r\n @Input() isViewMode = true; // وضع المشاهدة فقط\r\n @Input() isCreateMode = false; // وضع الاضافة فقط\r\n @Input() isEditMode = false; // وضع التعديل\r\n @Input() model = {};\r\n @Input() displayMode:\r\n | 'drawer'\r\n | 'dialog'\r\n | 'route'\r\n | 'inline'\r\n | Partial<\r\n Record<\r\n 'add' | 'edit' | 'view',\r\n 'drawer' | 'dialog' | 'route' | 'inline'\r\n >\r\n > = 'drawer';\r\n@Input() mode: 'full' | 'form-only' | 'table-only' | 'detail' = 'full';\r\n\r\n @Output() action = new EventEmitter<{ name: string; row: any }>();\r\n @Output() afterDelete = new EventEmitter<{ record: any; response?: any }>();\r\n\r\n @ViewChild('dialog') dialog!: GenericDialogComponent;\r\n @ViewChild('inlineForm') inlineForm!: GenericDialogComponent;\r\n\r\n tabs_: DetailTab[] = [];\r\n model_: any = {};\r\n\r\n currentId!: string | number;\r\n list: any[] = [];\r\n totalRecords = 0;\r\n @Input() loading = false;\r\n\r\n // pagination state\r\n pageSize = 10;\r\n pageIndex = 0;\r\n sort = '';\r\n currentFilters: any = {};\r\n pageFilters: any = {};\r\n searchGlobal = '';\r\n private swalService = inject(SwalService);\r\n\r\n _location: Location = inject(Location);\r\n\r\n ngOnInit() {\r\n this.loading = true;\r\n if (this.apiName) {\r\n this.service.apiName = this.apiName;\r\n this.service.moduleName = this.moduleName;\r\n }\r\n\r\n\r\n this.actions_ = this.actions.filter(c=>c.name != 'view');\r\n\r\n this.route.paramMap.subscribe(params => {\r\n const id = params.get(this.idField);\r\n if (id) {\r\n this.currentId = id;\r\n if(this.standaloneMode){\r\n this.loadList();\r\n }\r\n }\r\n\r\n this.refresh();\r\n\r\n });\r\n\r\n\r\n }\r\n\r\n refresh(){\r\n\r\n // detect mode based on route\r\n const url = this.router.url.toLowerCase();\r\n this.isViewMode = url.includes('/view');\r\n this.isEditMode = url.includes('/edit');\r\n this.isCreateMode = url.includes('/create') || url.endsWith('/new') || url.endsWith('/add');\r\n\r\n this.tabs_ = [];\r\nfor (let i = 0; i < this.tabs.length; i++) {\r\n const t = this.tabs[i];\r\n this.tabs_.push({\r\n ...t,\r\n fields: [\r\n {\r\n props: { label: '' },\r\n // fieldGroupClassName: 'grid grid-cols-1 md:grid-cols-2 gap-3', // TODO\r\n fieldGroupClassName: '',\r\n fieldGroup:\r\n this.isCreateMode || this.isEditMode\r\n ? this.getCreateEditFields(i == 0 ? this.formFields: t.fields)\r\n : this.getViewFields(i == 0 ? this.formFields : t.fields),\r\n },\r\n ],\r\n });\r\n}\r\nthis.loading = false;\r\n }\r\n // as form\r\n getCreateEditFields(fields: FormlyFieldConfig[] = []): FormlyFieldConfig[] {\r\n return fields.map(f => ({\r\n ...f,\r\n props: { ...f.props, readonly: this.viewMode, disabled: this.viewMode },\r\n }));\r\n }\r\n getViewFields(fields: FormlyFieldConfig[] = []): FormlyFieldConfig[] {\r\n const flatten = (fields: FormlyFieldConfig[]): FormlyFieldConfig[] =>\r\n fields.flatMap((field:any) => {\r\n\r\n /* 1. GROUP / PANEL / WRAPPER */\r\n if (field.fieldGroup?.length) {\r\n const children = flatten(field.fieldGroup);\r\n\r\n if (!children.length) return [];\r\n\r\n return [{\r\n ...field,\r\n wrappers: field.wrappers,\r\n props: { ...field.props },\r\n fieldGroupClassName: field.fieldGroupClassName,\r\n fieldGroup: children\r\n }];\r\n }\r\n\r\n /* 2. FIELD ARRAY (REPEAT / TABLE / MULTI) */\r\n const fieldArrayConfig =\r\n typeof field.fieldArray === 'function'\r\n ? field.fieldArray(field)\r\n : field.fieldArray;\r\n\r\n if (field.fieldArray) {\r\n\r\n if (field.props?.['view']?.hidden) return [];\r\n\r\n const children = flatten(fieldArrayConfig?.fieldGroup || []);\r\n\r\n if (!children.length) return [];\r\n\r\n return [{\r\n ...field,\r\n type: field.props?.['view']?.type || field.type,\r\n readonly: this.viewMode,\r\n disabled: this.viewMode,\r\n fieldArray: {\r\n ...fieldArrayConfig,\r\n fieldGroup: children\r\n }\r\n }];\r\n }\r\n\r\n /* 3. SINGLE FIELD */\r\n if (!field.props || field.props['view']?.hidden) return [];\r\n\r\n const type =\r\n field.props['view']?.type ||\r\n field.props['table']?.type ||\r\n field.props['filter']?.type ||\r\n 'custom-label-type';\r\n\r\n return [{\r\n type,\r\n key: field.key,\r\n readonly: this.viewMode,\r\n disabled: this.viewMode,\r\n wrappers: field.wrappers ?? ['field-wrapper'],\r\n className: field.className,\r\n props: {\r\n ...field.props,\r\n ...(field.props['view']?.props ||\r\n field.props['table']?.props ||\r\n field.props['filter']?.props ||\r\n {}),\r\n },\r\n expressions:\r\n field.props['view']?.expressions ||\r\n field.props['table']?.expressions ||\r\n field.props['filter']?.expressions\r\n }];\r\n });\r\n\r\n return flatten(fields);\r\n}\r\n\r\n // getViewFields(fields: FormlyFieldConfig[] = []): FormlyFieldConfig[] {\r\n // const flatten = (fields: FormlyFieldConfig[]): FormlyFieldConfig[] =>\r\n // fields.flatMap(field => {\r\n // if (field.fieldGroup?.length) return flatten(field.fieldGroup);\r\n // if (!field.props\r\n // || field.props['view']?.hidden\r\n // // || field.props['table']?.hidden\r\n // ) return [];\r\n\r\n // const type = field.props['view']?.type || field.props['table']?.type || 'custom-label-type';\r\n // return [{\r\n // type,\r\n // key: field['key'],\r\n // readonly: this.viewMode,\r\n // disabled: this.viewMode,\r\n // wrappers: field.wrappers ?? ['field-wrapper'],\r\n // props: {\r\n // ...field.props,\r\n // ...(field.props['view']?.props || field.props['table']?.props),\r\n // },\r\n // expressions: field.props['view']?.expressions || field.props['view']?.expressions,\r\n // }];\r\n // });\r\n\r\n // return flatten(fields);\r\n // }\r\n\r\n // Use a map to store form groups for each row and column\r\n private cellForms: Map<string, FormGroup> = new Map();\r\n getForm(rowIndex: number): FormGroup {\r\n const key = `${rowIndex}_`;\r\n let form = this.cellForms.get(key);\r\n\r\n if (!form) {\r\n form = new FormGroup({});\r\n this.cellForms.set(key, form);\r\n }\r\n return form;\r\n }\r\n\r\n\r\n async handleCreateEditAction(btn: ButtonConfig) {\r\n try {\r\n if (btn.action) {\r\n // Execute the provided action\r\n await btn.action(null); // You can pass row or context here\r\n } else {\r\n // Fallback to emitting event\r\n if(btn.actionName == 'cancel'){\r\n this.back();\r\n }\r\n else{\r\n this.action.emit({\r\n name: btn.actionName ?? 'cancel',\r\n row: null!, // provide row if available\r\n });\r\n }\r\n }\r\n } catch (err) {\r\n console.error('Button action error', err);\r\n }\r\n }\r\n\r\n\r\nonAction(act: ActionDef<any>, model: any) {\r\n if (act.action) {\r\n act.action(model);\r\n } else {\r\n // this.action.emit({ name: act.name, row:model });\r\n this.emitAction({ name: act.name, row:model });\r\n }\r\n }\r\n\r\n emitAction(event: { name: string; row: any | null }): void {\r\n switch (event.name) {\r\n case 'edit':\r\n this.dialog.openForm(\"edit\",event.row);\r\n break;\r\n case 'delete':\r\n this.onDelete(event.row!);\r\n break;\r\n default :\r\n this.action.emit(event);\r\n break;\r\n }\r\n}\r\n\r\nonDelete(item: any): void {\r\n const id = item[this.idField];\r\n\r\n this.swalService.confirm(\r\n 'تأكيد الحذف',\r\n 'هل تريد حذف هذا السجل فعلاً؟',\r\n 'نعم، احذف',\r\n 'إلغاء'\r\n ).then((result) => {\r\n if (result.isConfirmed) {\r\n this.service.delete(id).subscribe({\r\n next: () => {\r\n this.swalService.success('تم الحذف بنجاح');\r\n this.back();\r\n },\r\n error: (err: any) => {\r\n this.loading = false;\r\n\r\n }\r\n });\r\n }\r\n });\r\n}\r\n afterSave(event: any) {\r\n this.model = event.response;\r\n\r\n // set the id from backend response\r\n this.currentId = event.response[this.idField];\r\n\r\n if (this.isCreateMode) {\r\n this.goToMode('view');\r\n } else if (this.isEditMode) {\r\n this.goToMode('view');\r\n }\r\n}\r\n\r\n\r\n\r\ngoToMode(mode: 'view' | 'edit' | 'create') {\r\n const tree = this.router.parseUrl(this.router.url);\r\n const segments = tree.root.children['primary']?.segments.map(s => s.path) ?? [];\r\n\r\n let newSegments: string[];\r\n\r\n if (mode === 'create') {\r\n // always navigate to \"add\"\r\n newSegments = [\r\n ...segments.filter(s => !['view', 'edit', 'add'].includes(s)),\r\n 'add',\r\n ];\r\n } else {\r\n // if in \"add\" mode, replace it with the new id\r\n if (segments.includes('add')) {\r\n newSegments = [\r\n ...segments.filter(s => s !== 'add'),\r\n String(this.currentId),\r\n mode,\r\n ];\r\n } else {\r\n const idIndex = segments.findIndex(s => s === String(this.currentId));\r\n if (idIndex === -1) {\r\n newSegments = [...segments, String(this.currentId), mode];\r\n } else {\r\n newSegments = segments.slice(0, idIndex + 1);\r\n newSegments.push(mode);\r\n }\r\n }\r\n }\r\n\r\n this.router.navigate(newSegments);\r\n this.refresh();\r\n}\r\n\r\n\r\nbackToList(){\r\n this.router.navigate(['../']);\r\n }\r\nback(){\r\n // this.router.navigate(['..']);\r\n this._location.back()\r\n }\r\n loadList() {\r\n this.loading = true;\r\n const filters = {\r\n maxResultCount: this.pageSize,\r\n skipCount: this.pageIndex * this.pageSize,\r\n sorting: this.sort,\r\n ...this.currentFilters,\r\n ...this.pageFilters,\r\n ...(this.searchGlobal ? { filter: this.searchGlobal } : {}),\r\n };\r\n\r\n this.service.getList(filters).subscribe({\r\n next: (res: PaginatedResult<any>) => {\r\n this.list = res.items;\r\n this.totalRecords = res.totalCount;\r\n this.loading = false;\r\n\r\n // set model_ to current id item\r\n const found = this.list.find(x => x[this.idField] == this.currentId);\r\n if (found) {\r\n this.model_ = found;\r\n }\r\n },\r\n error: err => {\r\n console.error('Error loading list', err);\r\n this.loading = false;\r\n }\r\n });\r\n }\r\n next() {\r\n if (!this.currentId) return;\r\n\r\n // increment currentId numerically\r\n // const newId = Number(this.currentId) + 1;\r\n // this.currentId = newId;\r\n // use goToMode to navigate and keep mode\r\n const currentMode = this.isEditMode ? 'edit' : 'view';\r\n // this.goToMode(currentMode);\r\n}\r\n\r\nprevious() {\r\n if (!this.currentId) return;\r\n\r\n // decrement currentId numerically\r\n // const newId = Number(this.currentId) - 1;\r\n // if (newId <= 0) return;\r\n\r\n // this.currentId = newId;\r\n\r\n // use goToMode to navigate and keep mode\r\n const currentMode = this.isEditMode ? 'edit' : 'view';\r\n // this.goToMode(currentMode);\r\n}\r\n\r\n\r\n // next() {\r\n // const idx = this.list.findIndex(x => x[this.idField] == this.currentId);\r\n // if (idx >= 0 && idx < this.list.length - 1) {\r\n // const newId = this.list[idx + 1][this.idField];\r\n // this.router.navigate(['../', newId], { relativeTo: this.route });\r\n // }\r\n // }\r\n\r\n // previous() {\r\n // const idx = this.list.findIndex(x => x[this.idField] == this.currentId);\r\n // if (idx > 0) {\r\n // const newId = this.list[idx - 1][this.idField];\r\n // this.router.navigate(['../', newId], { relativeTo: this.route });\r\n // }\r\n // }\r\n}\r\n\r\n","\n@if (mode === 'detail') {\n <div class=\"w-full flex flex-col gap-3\">\n <!-- overlay -->\n @if (loading) {\n <div\n class=\"absolute inset-0 bg-white/70 flex items-center justify-center z-50\">\n <p-progress-spinner/>\n </div>\n }\n\n <!-- actual content -->\n <!-- Toolbar -->\n <p-toolbar style=\"background: transparent;border: 0px;box-shadow: none;\" class=\"bg-transparent shadow-none border-none rounded-md px-3\">\n <ng-template pTemplate=\"left\">\n <!-- <span class=\"font-semibold text-lg xs:hidden block\">{{ title }}</span> -->\n <app-breadcrumb class=\"xs:block\" [breadcrumb]=\"breadcrumb\"></app-breadcrumb> <!-- xs:block hidden -->\n </ng-template>\n <ng-template pTemplate=\"right\">\n <div class=\"flex gap-2\">\n\n <button\n pButton pRipple\n icon=\"pi pi-chevron-right\"\n class=\"p-button-text p-button-sm fd-btn\"\n pTooltip=\"التالي\"\n (click)=\"next()\"\n ></button>\n <button\n pButton pRipple\n icon=\"pi pi-chevron-left\"\n class=\"p-button-text p-button-sm fd-btn\"\n pTooltip=\"السابق\"\n (click)=\"previous()\"\n ></button>\n </div>\n </ng-template>\n </p-toolbar>\n <p-toolbar class=\"bg-white shadow rounded-md px-3\">\n\n <ng-template pTemplate=\"left\">\n @if (isViewMode) {\n <div class=\"flex gap-1\">\n @for (action of actions_; track $index) {\n <button\n pButton pRipple\n [icon]=\"action.icon ?? ''\"\n [label]=\"(action.label ?? '') | translate\"\n class=\"fd-btn\"\n (click)=\"onAction(action,model)\"\n ></button>\n }\n </div>\n }\n </ng-template>\n <ng-template pTemplate=\"right\">\n @if (isEditMode || isCreateMode) {\n <div class=\"flex gap-1\">\n @for (btn of createEditActions; track $index) {\n @if (!btn.visible || (btn.visible && btn.visible === true)) {\n @if (btn.type === 'submit' && inlineForm) {\n <lib-generic-button\n [type]=\"'submit'\"\n [loading]=\"inlineForm.loading\"\n [disabled]=\"inlineForm.loading || form.invalid\"\n [icon]=\"btn.icon\"\n [label]=\"btn.label | translate\"\n [variant]=\"btn.variant\"\n [severity]=\"btn.severity\"\n [size]=\"btn.size\"\n [model]=\"btn.splitActions\"\n [permission]=\"btn.permission\"\n (clicked)=\"inlineForm.onSubmit()\"\n ></lib-generic-button>\n }\n @else{\n <lib-generic-button\n [icon]=\"btn.icon\"\n [label]=\"btn.label | translate\"\n [variant]=\"btn.variant\"\n [severity]=\"btn.severity\"\n [size]=\"btn.size\"\n [model]=\"btn.splitActions\"\n [permission]=\"btn.permission\"\n (clicked)=\"handleCreateEditAction(btn)\"\n ></lib-generic-button>\n }\n }\n }\n </div>\n }\n </ng-template>\n\n </p-toolbar>\n\n <!-- Tabs -->\n <p-tabs value=\"0\">\n <p-tablist>\n @for (tab of tabs_; track $index) {\n <p-tab value=\"{{$index}}\">\n <i [class]=\"tab.icon\"></i>\n <span class=\"mr-1 ml-1\">{{ tab.header }}</span>\n </p-tab>\n }\n </p-tablist>\n <p-tabpanels>\n @for (tab of tabs_; track $index) {\n <p-tabpanel value=\"{{$index}}\">\n\n <!-- Formly fields -->\n <!-- border border-surface p-4-->\n <div class=\"\">\n @if (tab.fields.length && $index === 0) {\n\n @if (form) {\n <form [formGroup]=\"form\">\n @if (tab.fields.length && $index === 0 ) {\n @if (isEditMode || isCreateMode) {\n <app-generic-dialog\n #inlineForm\n [form]=\"form\"\n [model]=\"model\"\n [formFields]=\"formFields ?? []\"\n [apiName]=\"apiName\"\n [moduleName]=\"moduleName\"\n [idField]=\"idField ??'id'\"\n [displayMode]=\"'inline'\"\n [mode]=\"'form-only'\"\n [forceState]=\"isCreateMode ? 'create':'edit'\"\n (afterSave)=\"afterSave($event)\"\n >\n </app-generic-dialog>\n }\n @else if(isViewMode){\n <formly-form\n [form]=\"form\"\n [fields]=\"tab.fields\"\n [model]=\"model\"\n ></formly-form>\n }\n }\n </form>\n }\n\n }\n @if (tab.fields.length && $index > 0) {\n\n\n <formly-form\n [form]=\"getForm($index)\"\n [fields]=\"tab.fields\"\n [model]=\"tab.model || model\"\n ></formly-form>\n\n }\n\n <!-- Custom template -->\n @if (tab.content) {\n <ng-container\n *ngTemplateOutlet=\"tab.content; context: { model: model }\">\n </ng-container>\n }\n </div>\n </p-tabpanel>\n }\n </p-tabpanels>\n</p-tabs>\n</div>\n\n<!-- [model]=\"model\" -->\n<app-generic-dialog\n #dialog\n [formFields]=\"formFields ?? []\"\n [apiName]=\"apiName\"\n [moduleName]=\"moduleName\"\n [idField]=\"idField ??'id'\"\n [displayMode]=\"displayMode ?? 'dialog'\"\n (afterSave)=\"afterSave($event)\"\n >\n</app-generic-dialog>\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class GenericViewModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import * as i0 from '@angular/core';
2
+ import { NgModule, Component } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+
5
+ class HeaderWrapperModule {
6
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: HeaderWrapperModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
7
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: HeaderWrapperModule, imports: [CommonModule] });
8
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: HeaderWrapperModule, imports: [CommonModule] });
9
+ }
10
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: HeaderWrapperModule, decorators: [{
11
+ type: NgModule,
12
+ args: [{
13
+ imports: [CommonModule],
14
+ }]
15
+ }] });
16
+
17
+ class HeaderWrapper {
18
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: HeaderWrapper, deps: [], target: i0.ɵɵFactoryTarget.Component });
19
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: HeaderWrapper, isStandalone: true, selector: "lib-header-wrapper", ngImport: i0, template: "<p>header-wrapper works!</p>\n", styles: [""] });
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: HeaderWrapper, decorators: [{
22
+ type: Component,
23
+ args: [{ selector: 'lib-header-wrapper', imports: [], template: "<p>header-wrapper works!</p>\n" }]
24
+ }] });
25
+
26
+ /**
27
+ * Generated bundle index. Do not edit.
28
+ */
29
+
30
+ export { HeaderWrapper, HeaderWrapperModule };
31
+ //# sourceMappingURL=es.framework-ng.ui.core-header-wrapper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"es.framework-ng.ui.core-header-wrapper.mjs","sources":["../../../../libs/ng.ui.core/header-wrapper/src/lib/header-wrapper-module.ts","../../../../libs/ng.ui.core/header-wrapper/src/lib/header-wrapper.ts","../../../../libs/ng.ui.core/header-wrapper/src/lib/header-wrapper.html","../../../../libs/ng.ui.core/header-wrapper/src/es.framework-ng.ui.core-header-wrapper.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class HeaderWrapperModule {}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'lib-header-wrapper',\n imports: [],\n templateUrl: './header-wrapper.html',\n styleUrl: './header-wrapper.css'\n})\nexport class HeaderWrapper {\n\n}\n","<p>header-wrapper works!</p>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;MAMa,mBAAmB,CAAA;uGAAnB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,YAFpB,YAAY,CAAA,EAAA,CAAA;AAEX,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,YAFpB,YAAY,CAAA,EAAA,CAAA;;2FAEX,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAH/B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;oBACR,OAAO,EAAE,CAAC,YAAY,CAAC;AACxB,iBAAA;;;MCGY,aAAa,CAAA;uGAAb,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAb,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,aAAa,8ECR1B,gCACA,EAAA,MAAA,EAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FDOa,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,oBAAoB,WACrB,EAAE,EAAA,QAAA,EAAA,gCAAA,EAAA;;;AEJb;;AAEG;;;;"}