@elite.framework/ng.ui.core 0.0.1

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 (201) hide show
  1. package/README.md +3 -0
  2. package/attachments/README.md +3 -0
  3. package/attachments/index.d.ts +38 -0
  4. package/base-crud/README.md +3 -0
  5. package/base-crud/index.d.ts +68 -0
  6. package/breadcrumb/README.md +3 -0
  7. package/breadcrumb/index.d.ts +17 -0
  8. package/checkbox/README.md +3 -0
  9. package/checkbox/index.d.ts +33 -0
  10. package/color-picker/README.md +3 -0
  11. package/color-picker/index.d.ts +16 -0
  12. package/column-settings-popover/README.md +3 -0
  13. package/column-settings-popover/index.d.ts +46 -0
  14. package/condition-editor/README.md +3 -0
  15. package/condition-editor/index.d.ts +80 -0
  16. package/custom-switch/README.md +3 -0
  17. package/custom-switch/index.d.ts +19 -0
  18. package/datepicker/README.md +3 -0
  19. package/datepicker/index.d.ts +23 -0
  20. package/deactivation-reason/README.md +3 -0
  21. package/deactivation-reason/index.d.ts +31 -0
  22. package/fesm2022/elite.framework-ng.ui.core-attachments.mjs +217 -0
  23. package/fesm2022/elite.framework-ng.ui.core-attachments.mjs.map +1 -0
  24. package/fesm2022/elite.framework-ng.ui.core-base-crud.mjs +312 -0
  25. package/fesm2022/elite.framework-ng.ui.core-base-crud.mjs.map +1 -0
  26. package/fesm2022/elite.framework-ng.ui.core-breadcrumb.mjs +144 -0
  27. package/fesm2022/elite.framework-ng.ui.core-breadcrumb.mjs.map +1 -0
  28. package/fesm2022/elite.framework-ng.ui.core-checkbox.mjs +130 -0
  29. package/fesm2022/elite.framework-ng.ui.core-checkbox.mjs.map +1 -0
  30. package/fesm2022/elite.framework-ng.ui.core-color-picker.mjs +88 -0
  31. package/fesm2022/elite.framework-ng.ui.core-color-picker.mjs.map +1 -0
  32. package/fesm2022/elite.framework-ng.ui.core-column-settings-popover.mjs +184 -0
  33. package/fesm2022/elite.framework-ng.ui.core-column-settings-popover.mjs.map +1 -0
  34. package/fesm2022/elite.framework-ng.ui.core-condition-editor.mjs +782 -0
  35. package/fesm2022/elite.framework-ng.ui.core-condition-editor.mjs.map +1 -0
  36. package/fesm2022/elite.framework-ng.ui.core-custom-switch.mjs +122 -0
  37. package/fesm2022/elite.framework-ng.ui.core-custom-switch.mjs.map +1 -0
  38. package/fesm2022/elite.framework-ng.ui.core-datepicker.mjs +206 -0
  39. package/fesm2022/elite.framework-ng.ui.core-datepicker.mjs.map +1 -0
  40. package/fesm2022/elite.framework-ng.ui.core-deactivation-reason.mjs +142 -0
  41. package/fesm2022/elite.framework-ng.ui.core-deactivation-reason.mjs.map +1 -0
  42. package/fesm2022/elite.framework-ng.ui.core-form-button.mjs +62 -0
  43. package/fesm2022/elite.framework-ng.ui.core-form-button.mjs.map +1 -0
  44. package/fesm2022/elite.framework-ng.ui.core-form-field.mjs +155 -0
  45. package/fesm2022/elite.framework-ng.ui.core-form-field.mjs.map +1 -0
  46. package/fesm2022/elite.framework-ng.ui.core-form-template.mjs +37 -0
  47. package/fesm2022/elite.framework-ng.ui.core-form-template.mjs.map +1 -0
  48. package/fesm2022/elite.framework-ng.ui.core-formly-avatar-image.mjs +112 -0
  49. package/fesm2022/elite.framework-ng.ui.core-formly-avatar-image.mjs.map +1 -0
  50. package/fesm2022/elite.framework-ng.ui.core-formly-avatar-label.mjs +90 -0
  51. package/fesm2022/elite.framework-ng.ui.core-formly-avatar-label.mjs.map +1 -0
  52. package/fesm2022/elite.framework-ng.ui.core-formly-button-selector.mjs +179 -0
  53. package/fesm2022/elite.framework-ng.ui.core-formly-button-selector.mjs.map +1 -0
  54. package/fesm2022/elite.framework-ng.ui.core-formly-button.mjs +74 -0
  55. package/fesm2022/elite.framework-ng.ui.core-formly-button.mjs.map +1 -0
  56. package/fesm2022/elite.framework-ng.ui.core-formly-presets.mjs +201 -0
  57. package/fesm2022/elite.framework-ng.ui.core-formly-presets.mjs.map +1 -0
  58. package/fesm2022/elite.framework-ng.ui.core-formly-split-button.mjs +62 -0
  59. package/fesm2022/elite.framework-ng.ui.core-formly-split-button.mjs.map +1 -0
  60. package/fesm2022/elite.framework-ng.ui.core-formly-ui.mjs +416 -0
  61. package/fesm2022/elite.framework-ng.ui.core-formly-ui.mjs.map +1 -0
  62. package/fesm2022/elite.framework-ng.ui.core-formly-username-with-domain.mjs +88 -0
  63. package/fesm2022/elite.framework-ng.ui.core-formly-username-with-domain.mjs.map +1 -0
  64. package/fesm2022/elite.framework-ng.ui.core-generic-autocomplete.mjs +175 -0
  65. package/fesm2022/elite.framework-ng.ui.core-generic-autocomplete.mjs.map +1 -0
  66. package/fesm2022/elite.framework-ng.ui.core-generic-button.mjs +145 -0
  67. package/fesm2022/elite.framework-ng.ui.core-generic-button.mjs.map +1 -0
  68. package/fesm2022/elite.framework-ng.ui.core-generic-card.mjs +219 -0
  69. package/fesm2022/elite.framework-ng.ui.core-generic-card.mjs.map +1 -0
  70. package/fesm2022/elite.framework-ng.ui.core-generic-crud-table.mjs +398 -0
  71. package/fesm2022/elite.framework-ng.ui.core-generic-crud-table.mjs.map +1 -0
  72. package/fesm2022/elite.framework-ng.ui.core-generic-errormessage.mjs +35 -0
  73. package/fesm2022/elite.framework-ng.ui.core-generic-errormessage.mjs.map +1 -0
  74. package/fesm2022/elite.framework-ng.ui.core-generic-formly-fields.mjs +65 -0
  75. package/fesm2022/elite.framework-ng.ui.core-generic-formly-fields.mjs.map +1 -0
  76. package/fesm2022/elite.framework-ng.ui.core-generic-loadingspinner.mjs +35 -0
  77. package/fesm2022/elite.framework-ng.ui.core-generic-loadingspinner.mjs.map +1 -0
  78. package/fesm2022/elite.framework-ng.ui.core-generic-search.mjs +98 -0
  79. package/fesm2022/elite.framework-ng.ui.core-generic-search.mjs.map +1 -0
  80. package/fesm2022/elite.framework-ng.ui.core-generic-selector.mjs +441 -0
  81. package/fesm2022/elite.framework-ng.ui.core-generic-selector.mjs.map +1 -0
  82. package/fesm2022/elite.framework-ng.ui.core-generic-table.mjs +226 -0
  83. package/fesm2022/elite.framework-ng.ui.core-generic-table.mjs.map +1 -0
  84. package/fesm2022/elite.framework-ng.ui.core-header-wrapper.mjs +31 -0
  85. package/fesm2022/elite.framework-ng.ui.core-header-wrapper.mjs.map +1 -0
  86. package/fesm2022/elite.framework-ng.ui.core-icon-picker.mjs +207 -0
  87. package/fesm2022/elite.framework-ng.ui.core-icon-picker.mjs.map +1 -0
  88. package/fesm2022/elite.framework-ng.ui.core-input-switch.mjs +106 -0
  89. package/fesm2022/elite.framework-ng.ui.core-input-switch.mjs.map +1 -0
  90. package/fesm2022/elite.framework-ng.ui.core-input-with-icon.mjs +67 -0
  91. package/fesm2022/elite.framework-ng.ui.core-input-with-icon.mjs.map +1 -0
  92. package/fesm2022/elite.framework-ng.ui.core-input.mjs +201 -0
  93. package/fesm2022/elite.framework-ng.ui.core-input.mjs.map +1 -0
  94. package/fesm2022/elite.framework-ng.ui.core-label-type.mjs +125 -0
  95. package/fesm2022/elite.framework-ng.ui.core-label-type.mjs.map +1 -0
  96. package/fesm2022/elite.framework-ng.ui.core-odata-query-builder.mjs +308 -0
  97. package/fesm2022/elite.framework-ng.ui.core-odata-query-builder.mjs.map +1 -0
  98. package/fesm2022/elite.framework-ng.ui.core-radio.mjs +118 -0
  99. package/fesm2022/elite.framework-ng.ui.core-radio.mjs.map +1 -0
  100. package/fesm2022/elite.framework-ng.ui.core-repeat.mjs +147 -0
  101. package/fesm2022/elite.framework-ng.ui.core-repeat.mjs.map +1 -0
  102. package/fesm2022/elite.framework-ng.ui.core-select.mjs +180 -0
  103. package/fesm2022/elite.framework-ng.ui.core-select.mjs.map +1 -0
  104. package/fesm2022/elite.framework-ng.ui.core-sidebar-cards.mjs +52 -0
  105. package/fesm2022/elite.framework-ng.ui.core-sidebar-cards.mjs.map +1 -0
  106. package/fesm2022/elite.framework-ng.ui.core-sidebar-toggles.mjs +53 -0
  107. package/fesm2022/elite.framework-ng.ui.core-sidebar-toggles.mjs.map +1 -0
  108. package/fesm2022/elite.framework-ng.ui.core-tabs.mjs +57 -0
  109. package/fesm2022/elite.framework-ng.ui.core-tabs.mjs.map +1 -0
  110. package/fesm2022/elite.framework-ng.ui.core-tag-type.mjs +204 -0
  111. package/fesm2022/elite.framework-ng.ui.core-tag-type.mjs.map +1 -0
  112. package/fesm2022/elite.framework-ng.ui.core-text-editor.mjs +56 -0
  113. package/fesm2022/elite.framework-ng.ui.core-text-editor.mjs.map +1 -0
  114. package/fesm2022/elite.framework-ng.ui.core-textarea.mjs +95 -0
  115. package/fesm2022/elite.framework-ng.ui.core-textarea.mjs.map +1 -0
  116. package/fesm2022/elite.framework-ng.ui.core-ui-button.mjs +101 -0
  117. package/fesm2022/elite.framework-ng.ui.core-ui-button.mjs.map +1 -0
  118. package/fesm2022/elite.framework-ng.ui.core-wrappers.mjs +186 -0
  119. package/fesm2022/elite.framework-ng.ui.core-wrappers.mjs.map +1 -0
  120. package/fesm2022/elite.framework-ng.ui.core.mjs +18 -0
  121. package/fesm2022/elite.framework-ng.ui.core.mjs.map +1 -0
  122. package/form-button/README.md +3 -0
  123. package/form-button/index.d.ts +17 -0
  124. package/form-field/README.md +3 -0
  125. package/form-field/index.d.ts +30 -0
  126. package/form-template/README.md +3 -0
  127. package/form-template/index.d.ts +16 -0
  128. package/formly-avatar-image/README.md +3 -0
  129. package/formly-avatar-image/index.d.ts +18 -0
  130. package/formly-avatar-label/README.md +3 -0
  131. package/formly-avatar-label/index.d.ts +36 -0
  132. package/formly-button/README.md +3 -0
  133. package/formly-button/index.d.ts +20 -0
  134. package/formly-button-selector/README.md +3 -0
  135. package/formly-button-selector/index.d.ts +35 -0
  136. package/formly-presets/README.md +3 -0
  137. package/formly-presets/index.d.ts +37 -0
  138. package/formly-split-button/README.md +3 -0
  139. package/formly-split-button/index.d.ts +23 -0
  140. package/formly-ui/README.md +3 -0
  141. package/formly-ui/index.d.ts +42 -0
  142. package/formly-username-with-domain/README.md +3 -0
  143. package/formly-username-with-domain/index.d.ts +19 -0
  144. package/generic-autocomplete/README.md +3 -0
  145. package/generic-autocomplete/index.d.ts +41 -0
  146. package/generic-button/README.md +3 -0
  147. package/generic-button/index.d.ts +42 -0
  148. package/generic-card/README.md +3 -0
  149. package/generic-card/index.d.ts +93 -0
  150. package/generic-crud-table/README.md +3 -0
  151. package/generic-crud-table/index.d.ts +129 -0
  152. package/generic-errormessage/README.md +3 -0
  153. package/generic-errormessage/index.d.ts +17 -0
  154. package/generic-formly-fields/README.md +3 -0
  155. package/generic-formly-fields/index.d.ts +26 -0
  156. package/generic-loadingspinner/README.md +3 -0
  157. package/generic-loadingspinner/index.d.ts +16 -0
  158. package/generic-search/README.md +3 -0
  159. package/generic-search/index.d.ts +36 -0
  160. package/generic-selector/README.md +3 -0
  161. package/generic-selector/index.d.ts +73 -0
  162. package/generic-table/README.md +3 -0
  163. package/generic-table/index.d.ts +66 -0
  164. package/header-wrapper/README.md +3 -0
  165. package/header-wrapper/index.d.ts +15 -0
  166. package/icon-picker/README.md +3 -0
  167. package/icon-picker/index.d.ts +30 -0
  168. package/index.d.ts +8 -0
  169. package/input/README.md +3 -0
  170. package/input/index.d.ts +42 -0
  171. package/input-switch/README.md +3 -0
  172. package/input-switch/index.d.ts +16 -0
  173. package/input-with-icon/README.md +3 -0
  174. package/input-with-icon/index.d.ts +17 -0
  175. package/label-type/README.md +3 -0
  176. package/label-type/index.d.ts +26 -0
  177. package/odata-query-builder/README.md +3 -0
  178. package/odata-query-builder/index.d.ts +87 -0
  179. package/package.json +219 -0
  180. package/radio/README.md +3 -0
  181. package/radio/index.d.ts +38 -0
  182. package/repeat/README.md +3 -0
  183. package/repeat/index.d.ts +24 -0
  184. package/select/README.md +3 -0
  185. package/select/index.d.ts +42 -0
  186. package/sidebar-cards/README.md +3 -0
  187. package/sidebar-cards/index.d.ts +25 -0
  188. package/sidebar-toggles/README.md +3 -0
  189. package/sidebar-toggles/index.d.ts +25 -0
  190. package/tabs/README.md +3 -0
  191. package/tabs/index.d.ts +17 -0
  192. package/tag-type/README.md +3 -0
  193. package/tag-type/index.d.ts +34 -0
  194. package/text-editor/README.md +3 -0
  195. package/text-editor/index.d.ts +16 -0
  196. package/textarea/README.md +3 -0
  197. package/textarea/index.d.ts +36 -0
  198. package/ui-button/README.md +3 -0
  199. package/ui-button/index.d.ts +33 -0
  200. package/wrappers/README.md +3 -0
  201. package/wrappers/index.d.ts +31 -0
@@ -0,0 +1,398 @@
1
+ import * as i0 from '@angular/core';
2
+ import { NgModule, inject, EventEmitter, Input, Output, ViewChild, Component } from '@angular/core';
3
+ import * as i1 from '@angular/common';
4
+ import { CommonModule } from '@angular/common';
5
+ import { GenericButtonModule, GenericButton } from '@elite.framework/ng.ui.core/generic-button';
6
+ import * as i4 from 'primeng/divider';
7
+ import { DividerModule } from 'primeng/divider';
8
+ import { MessageModule } from 'primeng/message';
9
+ import * as i3 from 'primeng/button';
10
+ import { ButtonModule } from 'primeng/button';
11
+ import { TableModule } from 'primeng/table';
12
+ import { ToolbarModule } from 'primeng/toolbar';
13
+ import * as i8 from '@ngx-translate/core';
14
+ import { TranslateService, TranslateModule } from '@ngx-translate/core';
15
+ import { FormlyForm } from '@ngx-formly/core';
16
+ import { IconFieldModule } from 'primeng/iconfield';
17
+ import * as i5 from 'primeng/drawer';
18
+ import { DrawerModule } from 'primeng/drawer';
19
+ import * as i7 from 'primeng/dialog';
20
+ import { DialogModule } from 'primeng/dialog';
21
+ import * as i6 from '@angular/forms';
22
+ import { UntypedFormGroup, ReactiveFormsModule, FormsModule } from '@angular/forms';
23
+ import { SwalService } from '@elite.framework/ng.core/services';
24
+ import { BreadcrumbComponent } from '@elite.framework/ng.ui.core/breadcrumb';
25
+ import { GenericTable } from '@elite.framework/ng.ui.core/generic-table';
26
+ import { GenericSearch } from '@elite.framework/ng.ui.core/generic-search';
27
+ import { UiButtonComponent } from '@elite.framework/ng.ui.core/ui-button';
28
+ import * as i2 from 'primeng/api';
29
+
30
+ class GenericCrudTableModule {
31
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: GenericCrudTableModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
32
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.1.8", ngImport: i0, type: GenericCrudTableModule, imports: [CommonModule, GenericButtonModule] });
33
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: GenericCrudTableModule, imports: [CommonModule, GenericButtonModule] });
34
+ }
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: GenericCrudTableModule, decorators: [{
36
+ type: NgModule,
37
+ args: [{
38
+ imports: [CommonModule, GenericButtonModule],
39
+ }]
40
+ }] });
41
+
42
+ class GenericCrudTableComponent {
43
+ genericTable;
44
+ translate = inject(TranslateService);
45
+ swalService = inject(SwalService);
46
+ home = { icon: 'pi pi-home', routerLink: '/' };
47
+ data = [];
48
+ formFields_ = []; // <-- هنا
49
+ formFields = []; // <-- هنا
50
+ columns = []; // <-- هنا
51
+ isViewMode = false;
52
+ displayMode = 'drawer';
53
+ isEditMode = false;
54
+ drawerVisible = false;
55
+ dialogVisible = false;
56
+ form = new UntypedFormGroup({});
57
+ model;
58
+ model_ = {};
59
+ loading = false;
60
+ errorMsg = '';
61
+ errorMessage = '';
62
+ options = {};
63
+ actions = [];
64
+ /** تحدد طريقة العرض: 'buttons' أو 'menu' */
65
+ actionsMode = 'buttons';
66
+ action = new EventEmitter();
67
+ bulkAction = new EventEmitter();
68
+ singleAction = new EventEmitter();
69
+ // البحث
70
+ // Search
71
+ filters;
72
+ filterModel = {};
73
+ search = new EventEmitter();
74
+ /** للتحكم بإظهار/إخفاء قسم البحث */
75
+ showSearch = true;
76
+ /** Pagination Inputs */
77
+ first = 0;
78
+ rows = 10;
79
+ totalRecords = 0;
80
+ pageChange = new EventEmitter();
81
+ onSearch = new EventEmitter();
82
+ visibleChange = new EventEmitter();
83
+ ;
84
+ // @Output() visibleChange = new EventEmitter<boolean>();
85
+ viewHeaderTitle = 'عرض التفاصيل';
86
+ /** لجعل الجدول قابل لاختيار الصفوف (افتراضي false) */
87
+ rowSelectable = false;
88
+ /** حدث يخرج الصف المحدّد */
89
+ rowSelect = new EventEmitter();
90
+ selection = null;
91
+ // الفرز
92
+ sortField;
93
+ sortOrder = 1;
94
+ scrollHeight = '400px';
95
+ paginator = true;
96
+ service;
97
+ idField = 'id';
98
+ showRowSelectionCheckbox = false;
99
+ bulkActionButtons = [];
100
+ singleActionButtons = [];
101
+ _selectedRows = [];
102
+ get isSingleItemSelected() {
103
+ return this._selectedRows.length === 1;
104
+ }
105
+ get isMultipleItemSelected() {
106
+ return this._selectedRows.length > 1;
107
+ }
108
+ get selectedItems() {
109
+ return this._selectedRows;
110
+ }
111
+ /** للتحكم بإظهار زر الإضافة */
112
+ showAddButton = true;
113
+ splitActions = [];
114
+ /** الأيقونة الافتراضية لزر الإضافة */
115
+ addButtonIcon = 'pi pi-plus';
116
+ /** النص الافتراضي لزر الإضافة */
117
+ addButtonLabel = 'ADD';
118
+ /** تتحكّم بموقع زر الإضافة: 'top' أو 'bottom' */
119
+ addButtonPosition = 'top';
120
+ addButtonConfigs = [];
121
+ breadcrumb;
122
+ get breadcrumb_() {
123
+ return this.breadcrumb?.map(v => ({
124
+ ...v,
125
+ label: this.translate.instant(v.label ?? '')
126
+ }));
127
+ }
128
+ get rtl() {
129
+ try {
130
+ return document?.documentElement?.dir === 'rtl';
131
+ }
132
+ catch (error) {
133
+ return true;
134
+ }
135
+ }
136
+ // private destroy$ = new Subject<void>();
137
+ /** الآن يتلقّى pagination + sort في حدث واحد */
138
+ onLazyLoad(event) {
139
+ // this.model_= this.model ?? {};
140
+ this.model = this.model ?? {};
141
+ this.formFields_ = this.formFields;
142
+ const first = event.first ?? this.first;
143
+ const rows = event.rows ?? this.rows;
144
+ const sortField = typeof event.sortField === 'string'
145
+ ? event.sortField
146
+ : this.sortField;
147
+ const sortOrder = event.sortOrder === -1 ? -1 : 1;
148
+ const filters = {};
149
+ if (event.filters) {
150
+ Object.entries(event.filters).forEach(([field, meta]) => {
151
+ const value = meta.value;
152
+ if (value != null && value !== '') {
153
+ filters[field] = value;
154
+ }
155
+ });
156
+ }
157
+ this.first = first;
158
+ this.rows = rows;
159
+ this.sortField = sortField;
160
+ this.sortOrder = sortOrder;
161
+ const dir = sortOrder === 1 ? 'asc' : 'desc';
162
+ const sort = sortField ? `${sortField} ${dir}` : undefined;
163
+ this.pageChange.emit({ first, rows, sort, filters });
164
+ // يبني النص وإرساله
165
+ }
166
+ /** تصيير البيانات حسب الصفحة */
167
+ get pagedData() {
168
+ // return this.data ? this.data.slice(this.first, this.first + this.rows) : [];
169
+ return this.data;
170
+ }
171
+ get globalFilterFields() {
172
+ return this.columns.map(c => String(c.key));
173
+ }
174
+ /** أرسل إلى الأب لأتمتة شكل البحث إذا يحتاج */
175
+ // from generic-crud-table.component.ts
176
+ /** بدّل applySearch لتبث pageChange مباشرةً */
177
+ applySearch(filters) {
178
+ // this.genericTable.applyFilter(global);
179
+ this.onSearch.emit(filters);
180
+ }
181
+ /** دالة تنفّذ عند النقر على صف */
182
+ onRowClick(row) {
183
+ console.log('GenericCrudTableComponent.rowClick:', row);
184
+ if (this.rowSelectable) {
185
+ this.rowSelect.emit(row);
186
+ }
187
+ }
188
+ beforeSave = (record) => record;
189
+ // onSubmit() {
190
+ // if (this.form.invalid) return;
191
+ // this.loading = true;
192
+ // this.errorMessage = null;
193
+ // const service = this.service /* as CrudService<T> */;
194
+ // const id = this.isEditMode ? (this.model as any)[this.idField] : null;
195
+ // const recordToSave = this.beforeSave({ ...this.model });
196
+ // const operation$: Observable<any> = this.isEditMode
197
+ // ? service.update(id, recordToSave)
198
+ // : service.create(recordToSave);
199
+ // // operation$.pipe(takeUntil(this.destroy$)).subscribe({
200
+ // operation$.subscribe({
201
+ // next: () => {
202
+ // // this.ref.close(true); // نجاح العملية
203
+ // this.visibleChange.emit(false)
204
+ // // this.pageChange.emit({ first, rows ,sort, filters });
205
+ // this.applySearch('');
206
+ // // this.me
207
+ // },
208
+ // error: (err:any) => {
209
+ // this.loading = false;
210
+ // this.errorMessage = err.error?.title ||
211
+ // err.message ||
212
+ // 'حدث خطأ أثناء الحفظ. يرجى المحاولة مرة أخرى.';
213
+ // }
214
+ // });
215
+ // }
216
+ onSubmit() {
217
+ if (this.form.invalid)
218
+ return;
219
+ // ✅ أول شيء نطلب تأكيد من المستخدم
220
+ this.swalService.confirm(this.isEditMode ? 'تأكيد التعديل' : 'تأكيد الحفظ', this.isEditMode
221
+ ? 'هل تريد حفظ التعديلات على هذا السجل؟'
222
+ : 'هل تريد حفظ هذا السجل؟', 'نعم', 'إلغاء').then((result) => {
223
+ if (!result.isConfirmed)
224
+ return;
225
+ this.loading = true;
226
+ this.errorMessage = null;
227
+ const service = this.service;
228
+ const id = this.isEditMode ? this.model[this.idField] : null;
229
+ const recordToSave = this.beforeSave({ ...this.model });
230
+ const operation$ = this.isEditMode
231
+ ? service.update(id, recordToSave)
232
+ : service.create(recordToSave);
233
+ operation$.subscribe({
234
+ next: () => {
235
+ this.loading = false;
236
+ // ✅ رسالة نجاح
237
+ this.swalService.success(this.isEditMode ? 'تم التعديل بنجاح' : 'تم الحفظ بنجاح');
238
+ this.visibleChange.emit(false);
239
+ this.applySearch('');
240
+ },
241
+ error: (err) => {
242
+ this.loading = false;
243
+ const msg = err.error?.title ||
244
+ err.message ||
245
+ 'حدث خطأ أثناء الحفظ. يرجى المحاولة مرة أخرى.';
246
+ this.errorMessage = msg;
247
+ // ❌ رسالة خطأ
248
+ this.swalService.error('فشل الحفظ', msg);
249
+ }
250
+ });
251
+ });
252
+ }
253
+ trackByIdx(index, item) {
254
+ return index;
255
+ }
256
+ onSingleItemAction(btn) {
257
+ if (!this.isSingleItemSelected)
258
+ return;
259
+ const selectedItem = this._selectedRows[0];
260
+ this.singleAction.emit({
261
+ name: btn.actionName ?? 'singleAction',
262
+ item: selectedItem
263
+ });
264
+ }
265
+ onInternalBulkAction(btn) {
266
+ if (!this.isMultipleItemSelected)
267
+ return;
268
+ this.bulkAction.emit({
269
+ name: btn.actionName ?? 'bulkAction',
270
+ items: [...this._selectedRows] // نرسل نسخة من المصفوفة
271
+ });
272
+ }
273
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: GenericCrudTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
274
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.8", type: GenericCrudTableComponent, isStandalone: true, selector: "app-generic-crud-table", inputs: { data: "data", formFields: "formFields", columns: "columns", isViewMode: "isViewMode", displayMode: "displayMode", isEditMode: "isEditMode", drawerVisible: "drawerVisible", dialogVisible: "dialogVisible", model: "model", loading: "loading", errorMsg: "errorMsg", errorMessage: "errorMessage", actions: "actions", actionsMode: "actionsMode", filters: "filters", filterModel: "filterModel", showSearch: "showSearch", first: "first", rows: "rows", totalRecords: "totalRecords", rowSelectable: "rowSelectable", scrollHeight: "scrollHeight", paginator: "paginator", service: "service", idField: "idField", showRowSelectionCheckbox: "showRowSelectionCheckbox", bulkActionButtons: "bulkActionButtons", singleActionButtons: "singleActionButtons", showAddButton: "showAddButton", splitActions: "splitActions", addButtonIcon: "addButtonIcon", addButtonLabel: "addButtonLabel", addButtonPosition: "addButtonPosition", addButtonConfigs: "addButtonConfigs", breadcrumb: "breadcrumb", beforeSave: "beforeSave" }, outputs: { action: "action", bulkAction: "bulkAction", singleAction: "singleAction", search: "search", pageChange: "pageChange", onSearch: "onSearch", visibleChange: "visibleChange", rowSelect: "rowSelect" }, host: { classAttribute: "h-full flex-1 flex flex-col overflow-hidden border border-surface rounded-2xl p-4 bg-white" }, viewQueries: [{ propertyName: "genericTable", first: true, predicate: ["genericTable"], descendants: true }], ngImport: i0, template: "\r\n <div class=\"flex items-start gap-2 justify-between\">\r\n <div>\r\n <!-- <div class=\"text-2xl leading-8 font-medium bg-slate-800 p-4 rounded-md\">\r\n <p-breadcrumb\r\n [model]=\"breadcrumb_\"\r\n [home]=\"home\"\r\n styleClass=\"custom-breadcrumb\"\r\n ></p-breadcrumb>\r\n </div> -->\r\n\r\n<app-breadcrumb [breadcrumb]=\"breadcrumb_\"></app-breadcrumb>\r\n\r\n </div>\r\n\r\n<div class=\"flex items-center gap-2 justify-end flex-wrap\">\r\n <ng-container *ngIf=\"isSingleItemSelected\">\r\n <ng-container *ngFor=\"let btn of singleActionButtons; trackBy: trackByIdx\">\r\n <lib-generic-button\r\n\r\n [icon]=\"btn.icon\"\r\n[label]=\"btn.label | translate\"\r\n[variant]=\"btn.variant\"\r\n [size]=\"btn.size\"\r\n [permission]=\"btn.permission\"\r\n (clicked)=\"onSingleItemAction(btn)\"\r\n ></lib-generic-button>\r\n</ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedItems.length > 0\">\r\n <ng-container *ngFor=\"let btn of bulkActionButtons; trackBy: trackByIdx\">\r\n <lib-generic-button\r\n [icon]=\"btn.icon\"\r\n [label]=\"btn.label | translate\"\r\n [variant]=\"btn.variant\"\r\n [size]=\"btn.size\"\r\n [permission]=\"btn.permission\"\r\n (clicked)=\"onInternalBulkAction(btn)\"\r\n ></lib-generic-button>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let btn of addButtonConfigs; trackBy: trackByIdx\">\r\n <lib-generic-button\r\n [icon]=\"btn.icon\"\r\n [label]=\"btn.label | translate\"\r\n [variant]=\"btn.variant\"\r\n [size]=\"btn.size\"\r\n [permission]=\"btn.permission\"\r\n (clicked)=\" this.action.emit({ name: btn.actionName ?? 'add', row: null! });\"\r\n ></lib-generic-button>\r\n </ng-container>\r\n\r\n\r\n\r\n @if ((showAddButton || splitActions.length > 0)&& addButtonConfigs.length === 0) {\r\n\r\n @if (showAddButton && splitActions.length === 0) {\r\n\r\n <!-- <p-button\r\n icon=\"pi pi-circle-fill text-green-500\" *ngIf=\"showAddButton && addButtonConfigs.length === 0\"\r\n [label]=\"(addButtonLabel | translate)\r\n \"(onClick)=\"action.emit({ name: 'add', row: null! })\"\r\n outlined severity=\"secondary\" /> -->\r\n\r\n <ui-button\r\n [config]=\"{\r\n type: 'button',\r\n label: 'Add',\r\n icon: 'pi pi-plus',\r\n severity: 'secondary',\r\n outlined: true\r\n }\"\r\n (onClick)=\"action.emit({ name: 'add', row: null! })\">\r\n </ui-button>\r\n }\r\n @else {\r\n <!-- Split Button -->\r\n <ui-button\r\n [config]=\"{\r\n type: 'split',\r\n label: 'Save',\r\n icon: 'pi pi-check',\r\n severity: 'success',\r\n loading: false,\r\n items: splitActions\r\n }\"\r\n (onClick)=\"action.emit({ name: 'add', row: null! })\">\r\n </ui-button>\r\n }\r\n\r\n\r\n }\r\n\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n <div class=\"mt-2 mb-4 flex items-center justify-between\">\r\n\r\n <ng-container *ngIf=\"showSearch && filters; else emptySearch\">\r\n <lib-generic-search\r\n [model]=\"filterModel\"\r\n [fields]=\"filters\"\r\n (search)=\"applySearch($event)\"\r\n (reset)=\"applySearch('')\"\r\n ></lib-generic-search>\r\n </ng-container>\r\n\r\n <ng-template #emptySearch>\r\n <!-- Render a dummy div to preserve expected DOM shape -->\r\n <!-- <div class=\"min-h-[2.5rem] w-[12rem]\"></div> -->\r\n </ng-template>\r\n\r\n <div class=\"flex items-center gap-3\">\r\n\r\n <p-button icon=\"pi pi-refresh\" outlined severity=\"secondary\" (onClick)=\"applySearch('')\" />\r\n <p-divider layout=\"vertical\" class=\"m-0 p-0\" />\r\n <p-button icon=\"pi pi-sort\" outlined severity=\"secondary\" />\r\n <p-button label=\"1 of 15\" outlined severity=\"secondary\" />\r\n <p-button icon=\"pi pi-chevron-right\" outlined severity=\"secondary\" />\r\n <p-button icon=\"pi pi-chevron-left\" outlined severity=\"secondary\" />\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n<lib-generic-table\r\n [data]=\"data\"\r\n [columns]=\"columns\"\r\n [paginator]=\"paginator\"\r\n [loading]=\"loading\"\r\n [actions]=\"actions\"\r\n [actionsMode]=\"actionsMode\"\r\n [first]=\"first\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalRecords\"\r\n [sortField]=\"sortField\"\r\n [sortOrder]=\"sortOrder\"\r\n [globalFilterFields]=\"globalFilterFields\"\r\n [scrollHeight]=\"scrollHeight\"\r\n [showRowSelectionCheckbox]=\"showRowSelectionCheckbox\"\r\n (action)=\"action.emit($event)\"\r\n (pageChange)=\"onLazyLoad($event)\"\r\n [rowSelectable]=\"rowSelectable\"\r\n (rowSelect)=\"onRowClick($event)\"\r\n [(selection)]=\"_selectedRows\"\r\n #genericTable\r\n></lib-generic-table>\r\n\r\n\r\n\r\n\r\n<!-- Drawer -->\r\n<p-drawer\r\n *ngIf=\"(typeof displayMode === 'string' ? displayMode : isEditMode ? displayMode['edit'] : isViewMode === false ? displayMode['add'] : displayMode['view'] ) === 'drawer' && drawerVisible\"\r\n [(visible)]=\"drawerVisible\"\r\n [closable]=\"true\"\r\n [dismissible]=\"false\"\r\n [closeOnEscape]=\"true\"\r\n (visibleChange)=\"visibleChange.emit($event)\"\r\n styleClass=\"!w-full md:!w-80 lg:!w-[40rem]\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <span class=\"font-bold text-lg\">\r\n {{ isEditMode ? '\u062A\u0639\u062F\u064A\u0644' : isViewMode === false ? '\u0625\u0636\u0627\u0641\u0629' : '\u0639\u0631\u0636' }}\r\n </span>\r\n </ng-template>\r\n<!-- (ngSubmit)=\"onSubmit()\" -->\r\n <form *ngIf=\"form\" [formGroup]=\"form\" class=\"p-4\">\r\n <formly-form [form]=\"form\" [fields]=\"formFields_\" [model]=\"model\" [options]=\"options\"></formly-form>\r\n </form>\r\n\r\n <ng-template pTemplate=\"footer\" *ngIf=\"!isViewMode\">\r\n <div class=\"flex justify-end gap-2\">\r\n <button\r\n pButton\r\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\r\n type=\"button\"\r\n (click)=\"onSubmit()\"\r\n [disabled]=\"loading || form.invalid\"\r\n [loading]=\"loading\">\r\n </button>\r\n <button\r\n pButton\r\n label=\"{{ 'CANCEL' | translate }}\"\r\n severity=\"danger\"\r\n (click)=\"drawerVisible = false\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n</p-drawer>\r\n\r\n<!-- Dialog -->\r\n<p-dialog\r\n *ngIf=\"(typeof displayMode === 'string' ? displayMode : isEditMode ? displayMode['edit'] : isViewMode === false ? displayMode['add'] : displayMode['view'] ) === 'dialog' && dialogVisible\"\r\n [(visible)]=\"dialogVisible\"\r\n [modal]=\"true\"\r\n [closable]=\"true\"\r\n [dismissableMask]=\"true\"\r\n [closeOnEscape]=\"true\"\r\n (visibleChange)=\"visibleChange.emit($event)\"\r\n [style]=\"{ width: '95vw', maxWidth: '40rem' }\"\r\n [header]=\"isEditMode ? '\u062A\u0639\u062F\u064A\u0644' : isViewMode === false ? '\u0625\u0636\u0627\u0641\u0629' : viewHeaderTitle\">\r\n\r\n <div class=\"relative\">\r\n <div *ngIf=\"isViewMode\" class=\"absolute inset-0 z-10 bg-white/50 pointer-events-auto rounded-md\"></div>\r\n <form *ngIf=\"form\" [formGroup]=\"form\" class=\"p-4\">\r\n <formly-form [form]=\"form\" [fields]=\"formFields_\" [model]=\"model\" [options]=\"options\"></formly-form>\r\n </form>\r\n </div>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end gap-2\">\r\n <button *ngIf=\"!isViewMode\"\r\n pButton\r\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\r\n type=\"button\"\r\n [disabled]=\"loading || form.invalid\"\r\n [loading]=\"loading\"\r\n (click)=\"onSubmit()\">\r\n </button>\r\n <button\r\n pButton\r\n label=\"{{ isViewMode ? ('CLOSE' | translate) : ('CANCEL' | translate) }}\"\r\n severity=\"secondary\"\r\n (click)=\"dialogVisible = false\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n</p-dialog>\r\n\r\n\r\n\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TableModule }, { kind: "directive", type: i2.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { 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: ButtonModule }, { kind: "directive", type: i3.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain", "fluid", "label", "icon", "buttonProps"] }, { kind: "component", type: i3.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "buttonProps", "autofocus", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: GenericSearch, selector: "lib-generic-search", inputs: ["placeholder", "model", "fields"], outputs: ["search"] }, { kind: "component", type: GenericTable, selector: "lib-generic-table", inputs: ["data", "columns", "loading", "actions", "actionsMode", "first", "rows", "totalRecords", "sortField", "sortOrder", "globalFilterFields", "scrollHeight", "rowSelectable", "selection", "paginator", "showRowSelectionCheckbox"], outputs: ["action", "pageChange", "rowSelect", "selectionChange"] }, { kind: "ngmodule", type: ToolbarModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: DividerModule }, { kind: "component", type: i4.Divider, selector: "p-divider", inputs: ["styleClass", "layout", "type", "align"] }, { kind: "ngmodule", type: IconFieldModule }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i5.Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "component", type: FormlyForm, selector: "formly-form", inputs: ["form", "model", "fields", "options"], outputs: ["modelChange"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i6.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i6.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i6.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: MessageModule }, { kind: "component", type: BreadcrumbComponent, selector: "app-breadcrumb", inputs: ["breadcrumb"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i7.Dialog, selector: "p-dialog", inputs: ["header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "component", type: UiButtonComponent, selector: "ui-button", inputs: ["config"], outputs: ["onClick"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
275
+ }
276
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.8", ngImport: i0, type: GenericCrudTableComponent, decorators: [{
277
+ type: Component,
278
+ args: [{ selector: 'app-generic-crud-table', standalone: true, imports: [
279
+ CommonModule,
280
+ TableModule,
281
+ GenericButton,
282
+ ButtonModule,
283
+ GenericSearch,
284
+ GenericTable,
285
+ ToolbarModule,
286
+ TranslateModule,
287
+ DividerModule,
288
+ IconFieldModule,
289
+ DrawerModule,
290
+ FormlyForm,
291
+ ReactiveFormsModule,
292
+ FormsModule,
293
+ MessageModule,
294
+ BreadcrumbComponent,
295
+ DialogModule,
296
+ UiButtonComponent
297
+ ], host: {
298
+ class: 'h-full flex-1 flex flex-col overflow-hidden border border-surface rounded-2xl p-4 bg-white'
299
+ }, template: "\r\n <div class=\"flex items-start gap-2 justify-between\">\r\n <div>\r\n <!-- <div class=\"text-2xl leading-8 font-medium bg-slate-800 p-4 rounded-md\">\r\n <p-breadcrumb\r\n [model]=\"breadcrumb_\"\r\n [home]=\"home\"\r\n styleClass=\"custom-breadcrumb\"\r\n ></p-breadcrumb>\r\n </div> -->\r\n\r\n<app-breadcrumb [breadcrumb]=\"breadcrumb_\"></app-breadcrumb>\r\n\r\n </div>\r\n\r\n<div class=\"flex items-center gap-2 justify-end flex-wrap\">\r\n <ng-container *ngIf=\"isSingleItemSelected\">\r\n <ng-container *ngFor=\"let btn of singleActionButtons; trackBy: trackByIdx\">\r\n <lib-generic-button\r\n\r\n [icon]=\"btn.icon\"\r\n[label]=\"btn.label | translate\"\r\n[variant]=\"btn.variant\"\r\n [size]=\"btn.size\"\r\n [permission]=\"btn.permission\"\r\n (clicked)=\"onSingleItemAction(btn)\"\r\n ></lib-generic-button>\r\n</ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedItems.length > 0\">\r\n <ng-container *ngFor=\"let btn of bulkActionButtons; trackBy: trackByIdx\">\r\n <lib-generic-button\r\n [icon]=\"btn.icon\"\r\n [label]=\"btn.label | translate\"\r\n [variant]=\"btn.variant\"\r\n [size]=\"btn.size\"\r\n [permission]=\"btn.permission\"\r\n (clicked)=\"onInternalBulkAction(btn)\"\r\n ></lib-generic-button>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngFor=\"let btn of addButtonConfigs; trackBy: trackByIdx\">\r\n <lib-generic-button\r\n [icon]=\"btn.icon\"\r\n [label]=\"btn.label | translate\"\r\n [variant]=\"btn.variant\"\r\n [size]=\"btn.size\"\r\n [permission]=\"btn.permission\"\r\n (clicked)=\" this.action.emit({ name: btn.actionName ?? 'add', row: null! });\"\r\n ></lib-generic-button>\r\n </ng-container>\r\n\r\n\r\n\r\n @if ((showAddButton || splitActions.length > 0)&& addButtonConfigs.length === 0) {\r\n\r\n @if (showAddButton && splitActions.length === 0) {\r\n\r\n <!-- <p-button\r\n icon=\"pi pi-circle-fill text-green-500\" *ngIf=\"showAddButton && addButtonConfigs.length === 0\"\r\n [label]=\"(addButtonLabel | translate)\r\n \"(onClick)=\"action.emit({ name: 'add', row: null! })\"\r\n outlined severity=\"secondary\" /> -->\r\n\r\n <ui-button\r\n [config]=\"{\r\n type: 'button',\r\n label: 'Add',\r\n icon: 'pi pi-plus',\r\n severity: 'secondary',\r\n outlined: true\r\n }\"\r\n (onClick)=\"action.emit({ name: 'add', row: null! })\">\r\n </ui-button>\r\n }\r\n @else {\r\n <!-- Split Button -->\r\n <ui-button\r\n [config]=\"{\r\n type: 'split',\r\n label: 'Save',\r\n icon: 'pi pi-check',\r\n severity: 'success',\r\n loading: false,\r\n items: splitActions\r\n }\"\r\n (onClick)=\"action.emit({ name: 'add', row: null! })\">\r\n </ui-button>\r\n }\r\n\r\n\r\n }\r\n\r\n\r\n\r\n\r\n </div>\r\n </div>\r\n <div class=\"mt-2 mb-4 flex items-center justify-between\">\r\n\r\n <ng-container *ngIf=\"showSearch && filters; else emptySearch\">\r\n <lib-generic-search\r\n [model]=\"filterModel\"\r\n [fields]=\"filters\"\r\n (search)=\"applySearch($event)\"\r\n (reset)=\"applySearch('')\"\r\n ></lib-generic-search>\r\n </ng-container>\r\n\r\n <ng-template #emptySearch>\r\n <!-- Render a dummy div to preserve expected DOM shape -->\r\n <!-- <div class=\"min-h-[2.5rem] w-[12rem]\"></div> -->\r\n </ng-template>\r\n\r\n <div class=\"flex items-center gap-3\">\r\n\r\n <p-button icon=\"pi pi-refresh\" outlined severity=\"secondary\" (onClick)=\"applySearch('')\" />\r\n <p-divider layout=\"vertical\" class=\"m-0 p-0\" />\r\n <p-button icon=\"pi pi-sort\" outlined severity=\"secondary\" />\r\n <p-button label=\"1 of 15\" outlined severity=\"secondary\" />\r\n <p-button icon=\"pi pi-chevron-right\" outlined severity=\"secondary\" />\r\n <p-button icon=\"pi pi-chevron-left\" outlined severity=\"secondary\" />\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n<lib-generic-table\r\n [data]=\"data\"\r\n [columns]=\"columns\"\r\n [paginator]=\"paginator\"\r\n [loading]=\"loading\"\r\n [actions]=\"actions\"\r\n [actionsMode]=\"actionsMode\"\r\n [first]=\"first\"\r\n [rows]=\"rows\"\r\n [totalRecords]=\"totalRecords\"\r\n [sortField]=\"sortField\"\r\n [sortOrder]=\"sortOrder\"\r\n [globalFilterFields]=\"globalFilterFields\"\r\n [scrollHeight]=\"scrollHeight\"\r\n [showRowSelectionCheckbox]=\"showRowSelectionCheckbox\"\r\n (action)=\"action.emit($event)\"\r\n (pageChange)=\"onLazyLoad($event)\"\r\n [rowSelectable]=\"rowSelectable\"\r\n (rowSelect)=\"onRowClick($event)\"\r\n [(selection)]=\"_selectedRows\"\r\n #genericTable\r\n></lib-generic-table>\r\n\r\n\r\n\r\n\r\n<!-- Drawer -->\r\n<p-drawer\r\n *ngIf=\"(typeof displayMode === 'string' ? displayMode : isEditMode ? displayMode['edit'] : isViewMode === false ? displayMode['add'] : displayMode['view'] ) === 'drawer' && drawerVisible\"\r\n [(visible)]=\"drawerVisible\"\r\n [closable]=\"true\"\r\n [dismissible]=\"false\"\r\n [closeOnEscape]=\"true\"\r\n (visibleChange)=\"visibleChange.emit($event)\"\r\n styleClass=\"!w-full md:!w-80 lg:!w-[40rem]\">\r\n\r\n <ng-template pTemplate=\"header\">\r\n <span class=\"font-bold text-lg\">\r\n {{ isEditMode ? '\u062A\u0639\u062F\u064A\u0644' : isViewMode === false ? '\u0625\u0636\u0627\u0641\u0629' : '\u0639\u0631\u0636' }}\r\n </span>\r\n </ng-template>\r\n<!-- (ngSubmit)=\"onSubmit()\" -->\r\n <form *ngIf=\"form\" [formGroup]=\"form\" class=\"p-4\">\r\n <formly-form [form]=\"form\" [fields]=\"formFields_\" [model]=\"model\" [options]=\"options\"></formly-form>\r\n </form>\r\n\r\n <ng-template pTemplate=\"footer\" *ngIf=\"!isViewMode\">\r\n <div class=\"flex justify-end gap-2\">\r\n <button\r\n pButton\r\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\r\n type=\"button\"\r\n (click)=\"onSubmit()\"\r\n [disabled]=\"loading || form.invalid\"\r\n [loading]=\"loading\">\r\n </button>\r\n <button\r\n pButton\r\n label=\"{{ 'CANCEL' | translate }}\"\r\n severity=\"danger\"\r\n (click)=\"drawerVisible = false\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n</p-drawer>\r\n\r\n<!-- Dialog -->\r\n<p-dialog\r\n *ngIf=\"(typeof displayMode === 'string' ? displayMode : isEditMode ? displayMode['edit'] : isViewMode === false ? displayMode['add'] : displayMode['view'] ) === 'dialog' && dialogVisible\"\r\n [(visible)]=\"dialogVisible\"\r\n [modal]=\"true\"\r\n [closable]=\"true\"\r\n [dismissableMask]=\"true\"\r\n [closeOnEscape]=\"true\"\r\n (visibleChange)=\"visibleChange.emit($event)\"\r\n [style]=\"{ width: '95vw', maxWidth: '40rem' }\"\r\n [header]=\"isEditMode ? '\u062A\u0639\u062F\u064A\u0644' : isViewMode === false ? '\u0625\u0636\u0627\u0641\u0629' : viewHeaderTitle\">\r\n\r\n <div class=\"relative\">\r\n <div *ngIf=\"isViewMode\" class=\"absolute inset-0 z-10 bg-white/50 pointer-events-auto rounded-md\"></div>\r\n <form *ngIf=\"form\" [formGroup]=\"form\" class=\"p-4\">\r\n <formly-form [form]=\"form\" [fields]=\"formFields_\" [model]=\"model\" [options]=\"options\"></formly-form>\r\n </form>\r\n </div>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <div class=\"flex justify-end gap-2\">\r\n <button *ngIf=\"!isViewMode\"\r\n pButton\r\n [label]=\"isEditMode ? ('UPDATE' | translate) : ('SAVE' | translate)\"\r\n type=\"button\"\r\n [disabled]=\"loading || form.invalid\"\r\n [loading]=\"loading\"\r\n (click)=\"onSubmit()\">\r\n </button>\r\n <button\r\n pButton\r\n label=\"{{ isViewMode ? ('CLOSE' | translate) : ('CANCEL' | translate) }}\"\r\n severity=\"secondary\"\r\n (click)=\"dialogVisible = false\">\r\n </button>\r\n </div>\r\n </ng-template>\r\n</p-dialog>\r\n\r\n\r\n\r\n" }]
300
+ }], propDecorators: { genericTable: [{
301
+ type: ViewChild,
302
+ args: ['genericTable']
303
+ }], data: [{
304
+ type: Input
305
+ }], formFields: [{
306
+ type: Input
307
+ }], columns: [{
308
+ type: Input
309
+ }], isViewMode: [{
310
+ type: Input
311
+ }], displayMode: [{
312
+ type: Input
313
+ }], isEditMode: [{
314
+ type: Input
315
+ }], drawerVisible: [{
316
+ type: Input
317
+ }], dialogVisible: [{
318
+ type: Input
319
+ }], model: [{
320
+ type: Input
321
+ }], loading: [{
322
+ type: Input
323
+ }], errorMsg: [{
324
+ type: Input
325
+ }], errorMessage: [{
326
+ type: Input
327
+ }], actions: [{
328
+ type: Input
329
+ }], actionsMode: [{
330
+ type: Input
331
+ }], action: [{
332
+ type: Output
333
+ }], bulkAction: [{
334
+ type: Output
335
+ }], singleAction: [{
336
+ type: Output
337
+ }], filters: [{
338
+ type: Input
339
+ }], filterModel: [{
340
+ type: Input
341
+ }], search: [{
342
+ type: Output
343
+ }], showSearch: [{
344
+ type: Input
345
+ }], first: [{
346
+ type: Input
347
+ }], rows: [{
348
+ type: Input
349
+ }], totalRecords: [{
350
+ type: Input
351
+ }], pageChange: [{
352
+ type: Output
353
+ }], onSearch: [{
354
+ type: Output
355
+ }], visibleChange: [{
356
+ type: Output
357
+ }], rowSelectable: [{
358
+ type: Input
359
+ }], rowSelect: [{
360
+ type: Output
361
+ }], scrollHeight: [{
362
+ type: Input
363
+ }], paginator: [{
364
+ type: Input
365
+ }], service: [{
366
+ type: Input
367
+ }], idField: [{
368
+ type: Input
369
+ }], showRowSelectionCheckbox: [{
370
+ type: Input
371
+ }], bulkActionButtons: [{
372
+ type: Input
373
+ }], singleActionButtons: [{
374
+ type: Input
375
+ }], showAddButton: [{
376
+ type: Input
377
+ }], splitActions: [{
378
+ type: Input
379
+ }], addButtonIcon: [{
380
+ type: Input
381
+ }], addButtonLabel: [{
382
+ type: Input
383
+ }], addButtonPosition: [{
384
+ type: Input
385
+ }], addButtonConfigs: [{
386
+ type: Input
387
+ }], breadcrumb: [{
388
+ type: Input
389
+ }], beforeSave: [{
390
+ type: Input
391
+ }] } });
392
+
393
+ /**
394
+ * Generated bundle index. Do not edit.
395
+ */
396
+
397
+ export { GenericCrudTableComponent, GenericCrudTableModule };
398
+ //# sourceMappingURL=elite.framework-ng.ui.core-generic-crud-table.mjs.map