@es.framework/ng.ui.core 2.0.62 → 2.0.64

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 (27) hide show
  1. package/fesm2022/es.framework-ng.ui.core-checkbox.mjs +72 -58
  2. package/fesm2022/es.framework-ng.ui.core-checkbox.mjs.map +1 -1
  3. package/fesm2022/es.framework-ng.ui.core-form-button.mjs +38 -27
  4. package/fesm2022/es.framework-ng.ui.core-form-button.mjs.map +1 -1
  5. package/fesm2022/es.framework-ng.ui.core-formly-ui-all.mjs +14 -1
  6. package/fesm2022/es.framework-ng.ui.core-formly-ui-all.mjs.map +1 -1
  7. package/fesm2022/es.framework-ng.ui.core-generic-crud-report.mjs +22 -0
  8. package/fesm2022/es.framework-ng.ui.core-generic-crud-report.mjs.map +1 -0
  9. package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs +1 -1
  10. package/fesm2022/es.framework-ng.ui.core-generic-crud-table.mjs.map +1 -1
  11. package/fesm2022/es.framework-ng.ui.core-generic-listbox.mjs +291 -0
  12. package/fesm2022/es.framework-ng.ui.core-generic-listbox.mjs.map +1 -0
  13. package/fesm2022/es.framework-ng.ui.core-generic-view.mjs +108 -131
  14. package/fesm2022/es.framework-ng.ui.core-generic-view.mjs.map +1 -1
  15. package/fesm2022/es.framework-ng.ui.core-input.mjs +2 -0
  16. package/fesm2022/es.framework-ng.ui.core-input.mjs.map +1 -1
  17. package/fesm2022/es.framework-ng.ui.core-repeat.mjs +62 -50
  18. package/fesm2022/es.framework-ng.ui.core-repeat.mjs.map +1 -1
  19. package/generic-crud-report/README.md +3 -0
  20. package/generic-listbox/README.md +3 -0
  21. package/package.json +9 -1
  22. package/types/es.framework-ng.ui.core-checkbox.d.ts +1 -0
  23. package/types/es.framework-ng.ui.core-form-button.d.ts +11 -3
  24. package/types/es.framework-ng.ui.core-formly-ui-all.d.ts +2 -1
  25. package/types/es.framework-ng.ui.core-generic-crud-report.d.ts +10 -0
  26. package/types/es.framework-ng.ui.core-generic-listbox.d.ts +72 -0
  27. package/types/es.framework-ng.ui.core-generic-view.d.ts +17 -6
@@ -0,0 +1,291 @@
1
+ import * as i0 from '@angular/core';
2
+ import { NgModule, inject, ViewChild, Component } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+ import { DialogService } from 'primeng/dynamicdialog';
5
+ import { finalize } from 'rxjs/operators';
6
+ import * as i2 from '@angular/forms';
7
+ import { FormsModule, ReactiveFormsModule } from '@angular/forms';
8
+ import * as i3 from 'primeng/listbox';
9
+ import { ListboxModule } from 'primeng/listbox';
10
+ import * as i5 from 'primeng/button';
11
+ import { ButtonModule } from 'primeng/button';
12
+ import { DomSanitizer } from '@angular/platform-browser';
13
+ import { FieldType, FormlyAttributes } from '@ngx-formly/core';
14
+ import { TranslatePipe } from '@es.framework/ng.core/pipes';
15
+ import * as i1 from '@es.framework/ng.core/services';
16
+ import { LocalizationService, QueryParser, BaseService } from '@es.framework/ng.core/services';
17
+ import { GenericDialogComponent } from '@es.framework/ng.ui.core/generic-dialog';
18
+ import * as i4 from 'primeng/api';
19
+
20
+ class GenericListboxModule {
21
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericListboxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
22
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.1.3", ngImport: i0, type: GenericListboxModule, imports: [CommonModule] });
23
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericListboxModule, imports: [CommonModule] });
24
+ }
25
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericListboxModule, decorators: [{
26
+ type: NgModule,
27
+ args: [{
28
+ imports: [CommonModule],
29
+ }]
30
+ }] });
31
+
32
+ class GenericListboxTypeComponent extends FieldType {
33
+ svc;
34
+ cdr;
35
+ dialog;
36
+ options_ = [];
37
+ selectedItem;
38
+ loading = false;
39
+ _offlineList = [];
40
+ translateService = inject(LocalizationService);
41
+ sanitizer = inject(DomSanitizer);
42
+ api;
43
+ valueChangeSubscription;
44
+ constructor(svc, cdr) {
45
+ super();
46
+ this.svc = svc;
47
+ this.cdr = cdr;
48
+ }
49
+ get optionLabel() {
50
+ if (this.props.useMultiLang) {
51
+ return this.translateService.currentLang === 'en' ? (this.props.labelFieldEn || 'name') : (this.props.labelField || 'name');
52
+ }
53
+ return this.props.labelField || 'name';
54
+ }
55
+ ngOnInit() {
56
+ this.api = this.svc;
57
+ this.api.apiName = this.props.serviceName;
58
+ this.api.moduleName = this.props.moduleName;
59
+ // تحميل البيانات لأول مرة
60
+ this.search({ query: '' });
61
+ this.valueChangeSubscription = this.formControl.valueChanges.subscribe(() => {
62
+ this.syncSelectionWithControl();
63
+ });
64
+ }
65
+ onFilterSearch(event) {
66
+ if (!this.props.offline) {
67
+ this.search({ query: event.filter });
68
+ }
69
+ }
70
+ onSelectionChange(val) {
71
+ const vf = this.props.valueField || 'id';
72
+ this.selectedItem = val;
73
+ if (this.props.multiple) {
74
+ const values = Array.isArray(val) ? val.map(i => i[vf]) : [];
75
+ this.formControl.setValue(values);
76
+ }
77
+ else {
78
+ this.formControl.setValue(val ? val[vf] : null);
79
+ }
80
+ if (this.props.onSelect) {
81
+ this.props.onSelect(this.field, { item: val });
82
+ }
83
+ }
84
+ syncSelectionWithControl() {
85
+ const val = this.formControl.value;
86
+ const vf = this.props.valueField || 'id';
87
+ if (val == null || (Array.isArray(val) && val.length === 0)) {
88
+ this.selectedItem = this.props.multiple ? [] : null;
89
+ }
90
+ else if (this.props.multiple && Array.isArray(val)) {
91
+ this.selectedItem = this.options_.filter(opt => val.includes(opt[vf]));
92
+ }
93
+ else {
94
+ this.selectedItem = this.options_.find(opt => opt[vf] === val);
95
+ }
96
+ this.cdr.detectChanges();
97
+ }
98
+ // الدالة التي طلبتها بنفس الآلية البسيطة
99
+ search(event) {
100
+ const q = event.query?.toString() || '';
101
+ const lf = this.optionLabel;
102
+ // --- أولاً: حالة الـ Offline (البحث المحلي) ---
103
+ if (this.props.offline) {
104
+ if (this.props.offlineDataFn) {
105
+ // إذا كان هناك دالة مخصصة لجلب البيانات محلياً
106
+ this.options_ = this.props.offlineDataFn(q);
107
+ }
108
+ else {
109
+ // البحث الافتراضي في المصفوفة المخزنة
110
+ this.options_ = this._offlineList.filter(item => {
111
+ const searchStr = q.toLowerCase();
112
+ // يبحث في الحقل المعرف كـ labelField
113
+ return item[lf]?.toString().toLowerCase().includes(searchStr) ||
114
+ // أو يبحث في id إذا كان البحث نصياً مطابقاً
115
+ item[this.props.valueField || 'id']?.toString().toLowerCase() === searchStr;
116
+ });
117
+ }
118
+ this.syncSelectionWithControl();
119
+ this.cdr.detectChanges();
120
+ return; // إنهاء الدالة هنا لأننا في وضع الأوفلاين
121
+ }
122
+ // --- ثانياً: حالة الـ Online (طلب API) ---
123
+ this.loading = true;
124
+ const fixedFilters = this.getFixedFilters(q);
125
+ const queryParams = {
126
+ filters: [],
127
+ top: this.props.query?.['top'] ?? 20,
128
+ skip: this.props.query?.['skip'] ?? 0,
129
+ orderBy: this.props.query?.['orderBy'] || [],
130
+ expand: this.props.query?.['expand'] || [],
131
+ select: this.props.query?.['select'] || [],
132
+ };
133
+ let dynamicFilters = [];
134
+ if (this.props.query && this.props.query['filters']) {
135
+ const f = this.props.query['filters'];
136
+ // هنا يتم تمرير searchText للدالة التي أرسلتها أنت في الـ Config
137
+ dynamicFilters = typeof f === 'function' ? f(q, this.field, this.model) : f;
138
+ }
139
+ if (dynamicFilters.length === 0) {
140
+ const mainGroup = { logicalOperator: 'and', conditions: [] };
141
+ if (q)
142
+ mainGroup.conditions.push({ field: lf, operator: 'contains', value: q });
143
+ Object.keys(fixedFilters || {}).forEach(key => {
144
+ if (fixedFilters[key] != null)
145
+ mainGroup.conditions.push({ field: key, operator: 'eq', value: fixedFilters[key] });
146
+ });
147
+ if (mainGroup.conditions.length > 0)
148
+ queryParams.filters.push(mainGroup);
149
+ }
150
+ else {
151
+ dynamicFilters.forEach((fg) => {
152
+ queryParams.filters.push({ ...fg, groupLogicalOperator: fg.groupLogicalOperator || 'and' });
153
+ });
154
+ if (Object.keys(fixedFilters || {}).length > 0) {
155
+ queryParams.filters.push({
156
+ logicalOperator: 'and',
157
+ groupLogicalOperator: 'and',
158
+ conditions: Object.keys(fixedFilters).map(k => ({ field: k, operator: 'eq', value: fixedFilters[k] }))
159
+ });
160
+ }
161
+ }
162
+ let listEndpoint = this.props.listEndpoint;
163
+ if (typeof listEndpoint === 'function')
164
+ listEndpoint = listEndpoint(this.model);
165
+ this.api.getList({ 'query': QueryParser.toString(queryParams) }, listEndpoint)
166
+ .pipe(finalize(() => {
167
+ this.loading = false;
168
+ this.cdr.detectChanges();
169
+ }))
170
+ .subscribe({
171
+ next: (res) => {
172
+ this.options_ = res.items ?? res ?? [];
173
+ this.syncSelectionWithControl();
174
+ this.cdr.detectChanges();
175
+ },
176
+ error: () => {
177
+ this.options_ = [];
178
+ this.cdr.detectChanges();
179
+ }
180
+ });
181
+ }
182
+ getFixedFilters(query = '') {
183
+ const ff = this.props.fixedFilters;
184
+ return typeof ff === 'function' ? ff(query, this.field) : (ff || {});
185
+ }
186
+ getFormattedLabel(item) {
187
+ if (!item)
188
+ return '';
189
+ const label = this.props.formatter ? this.props.formatter(item) : (item[this.optionLabel] || '');
190
+ return this.sanitizer.bypassSecurityTrustHtml(label);
191
+ }
192
+ getEmptyMessage() {
193
+ return this.loading ? 'LOADING_DATA_MESSAGE' : 'NO_RESULTS_FOUND';
194
+ }
195
+ onAddNewClick() { this.dialog.openForm("create"); }
196
+ afterSave(event) {
197
+ this.search({ query: '' });
198
+ if (this.props.afterSave)
199
+ this.props.afterSave(this.field, { item: event.record });
200
+ }
201
+ ngOnDestroy() {
202
+ if (this.valueChangeSubscription)
203
+ this.valueChangeSubscription.unsubscribe();
204
+ }
205
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericListboxTypeComponent, deps: [{ token: i1.BaseService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
206
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: GenericListboxTypeComponent, isStandalone: true, selector: "formly-generic-listbox", providers: [DialogService, BaseService], viewQueries: [{ propertyName: "dialog", first: true, predicate: ["dialog"], descendants: true }], usesInheritance: true, ngImport: i0, template: `
207
+ <div class="flex flex-col gap-2 w-full">
208
+ <div class="flex gap-1 items-center mb-1" *ngIf="props.canAdd && props.formFields">
209
+ <p-button icon="pi pi-plus" [label]="'ADD_NEW' | translate" size="small" severity="primary" (click)="onAddNewClick()" />
210
+ </div>
211
+
212
+ <p-listbox
213
+ [options]="options_"
214
+ [ngModel]="selectedItem"
215
+ (ngModelChange)="onSelectionChange($event)"
216
+ [formlyAttributes]="field"
217
+ [multiple]="props.multiple"
218
+ [checkbox]="props.multiple"
219
+ [filter]="props.filters !== false"
220
+ [optionLabel]="optionLabel"
221
+ [disabled]="!!props.disabled"
222
+ [listStyle]="{'max-height': props.listHeight || '250px'}"
223
+ (onFilter)="onFilterSearch($event)"
224
+ class="w-full"
225
+ [emptyMessage]="getEmptyMessage() | translate">
226
+
227
+ <ng-template let-item pTemplate="item">
228
+ <div class="flex flex-col">
229
+ <span [innerHTML]="getFormattedLabel(item)"></span>
230
+ </div>
231
+ </ng-template>
232
+ </p-listbox>
233
+
234
+ <app-generic-dialog #dialog [formFields]="props.formFields ?? []" [apiName]="props.serviceName" [moduleName]="props.moduleName"
235
+ [idField]="props.idField ?? 'id'" [displayMode]="'dialog'" (afterSave)="afterSave($event)">
236
+ </app-generic-dialog>
237
+ </div>
238
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: ListboxModule }, { kind: "component", type: i3.Listbox, selector: "p-listbox, p-listBox, p-list-box", inputs: ["hostName", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "ariaLabel", "selectOnFocus", "searchLocale", "focusOnHover", "filterMessage", "filterFields", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "scrollHeight", "tabindex", "multiple", "styleClass", "listStyle", "listStyleClass", "readonly", "checkbox", "filter", "filterBy", "filterMatchMode", "filterLocale", "metaKeySelection", "dataKey", "showToggleAll", "optionLabel", "optionValue", "optionGroupChildren", "optionGroupLabel", "optionDisabled", "ariaFilterLabel", "filterPlaceHolder", "emptyFilterMessage", "emptyMessage", "group", "options", "filterValue", "selectAll", "striped", "highlightOnSelect", "checkmark", "dragdrop", "dropListData", "fluid"], outputs: ["onChange", "onClick", "onDblClick", "onFilter", "onFocus", "onBlur", "onSelectAllChange", "onLazyLoad", "onDrop"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: FormlyAttributes, selector: "[formlyAttributes]", inputs: ["formlyAttributes", "id"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i5.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: GenericDialogComponent, selector: "app-generic-dialog", inputs: ["form", "service", "formFields", "model", "apiName", "moduleName", "idField", "dialogMaxWidth", "displayMode", "mode", "forceState", "drawerVisible", "dialogVisible", "isViewMode", "isEditMode", "useConfirmOnSave", "loading", "errorMsg", "errorMessage", "beforeSaveTransform", "hideTable", "autoShowForm"], outputs: ["action", "afterSave", "afterDelete", "beforeSave", "beforeDelete", "formCancel", "formInit", "dataLoaded", "selectionChange", "error", "visibleChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
239
+ }
240
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: GenericListboxTypeComponent, decorators: [{
241
+ type: Component,
242
+ args: [{
243
+ selector: 'formly-generic-listbox',
244
+ template: `
245
+ <div class="flex flex-col gap-2 w-full">
246
+ <div class="flex gap-1 items-center mb-1" *ngIf="props.canAdd && props.formFields">
247
+ <p-button icon="pi pi-plus" [label]="'ADD_NEW' | translate" size="small" severity="primary" (click)="onAddNewClick()" />
248
+ </div>
249
+
250
+ <p-listbox
251
+ [options]="options_"
252
+ [ngModel]="selectedItem"
253
+ (ngModelChange)="onSelectionChange($event)"
254
+ [formlyAttributes]="field"
255
+ [multiple]="props.multiple"
256
+ [checkbox]="props.multiple"
257
+ [filter]="props.filters !== false"
258
+ [optionLabel]="optionLabel"
259
+ [disabled]="!!props.disabled"
260
+ [listStyle]="{'max-height': props.listHeight || '250px'}"
261
+ (onFilter)="onFilterSearch($event)"
262
+ class="w-full"
263
+ [emptyMessage]="getEmptyMessage() | translate">
264
+
265
+ <ng-template let-item pTemplate="item">
266
+ <div class="flex flex-col">
267
+ <span [innerHTML]="getFormattedLabel(item)"></span>
268
+ </div>
269
+ </ng-template>
270
+ </p-listbox>
271
+
272
+ <app-generic-dialog #dialog [formFields]="props.formFields ?? []" [apiName]="props.serviceName" [moduleName]="props.moduleName"
273
+ [idField]="props.idField ?? 'id'" [displayMode]="'dialog'" (afterSave)="afterSave($event)">
274
+ </app-generic-dialog>
275
+ </div>
276
+ `,
277
+ providers: [DialogService, BaseService],
278
+ standalone: true,
279
+ imports: [FormsModule, ReactiveFormsModule, ListboxModule, FormlyAttributes, TranslatePipe, ButtonModule, GenericDialogComponent]
280
+ }]
281
+ }], ctorParameters: () => [{ type: i1.BaseService }, { type: i0.ChangeDetectorRef }], propDecorators: { dialog: [{
282
+ type: ViewChild,
283
+ args: ['dialog']
284
+ }] } });
285
+
286
+ /**
287
+ * Generated bundle index. Do not edit.
288
+ */
289
+
290
+ export { GenericListboxModule, GenericListboxTypeComponent };
291
+ //# sourceMappingURL=es.framework-ng.ui.core-generic-listbox.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"es.framework-ng.ui.core-generic-listbox.mjs","sources":["../../../../libs/ng.ui.core/generic-listbox/src/lib/generic-listbox.module.ts","../../../../libs/ng.ui.core/generic-listbox/src/lib/generic-listbox.component.ts","../../../../libs/ng.ui.core/generic-listbox/src/es.framework-ng.ui.core-generic-listbox.ts"],"sourcesContent":["import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\n@NgModule({\n imports: [CommonModule],\n})\nexport class GenericListboxModule {}\n","import { ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild, inject } from '@angular/core';\nimport { DialogService } from 'primeng/dynamicdialog';\nimport { Observable, Subscription } from 'rxjs';\nimport { finalize } from 'rxjs/operators';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { ListboxModule } from 'primeng/listbox';\nimport { ButtonModule } from 'primeng/button';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { FormlyFieldConfig, FieldType, FormlyAttributes, FieldTypeConfig } from '@ngx-formly/core';\nimport { TranslatePipe } from '@es.framework/ng.core/pipes';\nimport { FormlyFieldProps } from '@ngx-formly/primeng/form-field';\nimport { BaseService, FilterGroup, LocalizationService, QueryParameters, QueryParser } from '@es.framework/ng.core/services';\nimport { GenericDialogComponent } from '@es.framework/ng.ui.core/generic-dialog';\n\ninterface GenericListboxProps extends FormlyFieldProps {\n moduleName: string;\n serviceName: string;\n listEndpoint?: string | ((model: any) => string);\n labelField?: string;\n labelFieldEn?: string;\n valueField?: string;\n useMultiLang?: boolean;\n multiple?: boolean;\n offline?: boolean;\n offlineItems?: any[];\n offlineItems$?: Observable<any[]>;\n onSelect?: (field: FormlyFieldConfig, event?: any) => void;\n offlineDataFn?: (query?: string) => any[];\n query?: Record<string, any> | QueryParameters;\n fixedFilters?: Record<string, any>;\n canAdd?: boolean;\n formFields?: FormlyFieldConfig[];\n afterSave?: (field: FormlyFieldConfig, event?: any) => void;\n formatter?: (row: any, value?: any) => string;\n listHeight?: string;\n filters?: boolean;\n idField?: string;\n}\n\n@Component({\n selector: 'formly-generic-listbox',\n template: `\n <div class=\"flex flex-col gap-2 w-full\">\n <div class=\"flex gap-1 items-center mb-1\" *ngIf=\"props.canAdd && props.formFields\">\n <p-button icon=\"pi pi-plus\" [label]=\"'ADD_NEW' | translate\" size=\"small\" severity=\"primary\" (click)=\"onAddNewClick()\" />\n </div>\n\n <p-listbox\n [options]=\"options_\"\n [ngModel]=\"selectedItem\"\n (ngModelChange)=\"onSelectionChange($event)\"\n [formlyAttributes]=\"field\"\n [multiple]=\"props.multiple\"\n [checkbox]=\"props.multiple\"\n [filter]=\"props.filters !== false\"\n [optionLabel]=\"optionLabel\"\n [disabled]=\"!!props.disabled\"\n [listStyle]=\"{'max-height': props.listHeight || '250px'}\"\n (onFilter)=\"onFilterSearch($event)\"\n class=\"w-full\"\n [emptyMessage]=\"getEmptyMessage() | translate\">\n\n <ng-template let-item pTemplate=\"item\">\n <div class=\"flex flex-col\">\n <span [innerHTML]=\"getFormattedLabel(item)\"></span>\n </div>\n </ng-template>\n </p-listbox>\n\n <app-generic-dialog #dialog [formFields]=\"props.formFields ?? []\" [apiName]=\"props.serviceName\" [moduleName]=\"props.moduleName\"\n [idField]=\"props.idField ?? 'id'\" [displayMode]=\"'dialog'\" (afterSave)=\"afterSave($event)\">\n </app-generic-dialog>\n </div>\n `,\n providers: [DialogService, BaseService],\n standalone: true,\n imports: [FormsModule, ReactiveFormsModule, ListboxModule, FormlyAttributes, TranslatePipe, ButtonModule, GenericDialogComponent]\n})\nexport class GenericListboxTypeComponent extends FieldType<FieldTypeConfig<GenericListboxProps>> implements OnInit, OnDestroy {\n @ViewChild('dialog') dialog!: GenericDialogComponent;\n options_: any[] = [];\n selectedItem: any;\n loading = false;\n private _offlineList: any[] = [];\n private translateService = inject(LocalizationService);\n private sanitizer: DomSanitizer = inject(DomSanitizer);\n api: BaseService | any;\n private valueChangeSubscription!: Subscription;\n\n constructor(private svc: BaseService, private cdr: ChangeDetectorRef) { super(); }\n\n get optionLabel(): string {\n if (this.props.useMultiLang) {\n return this.translateService.currentLang === 'en' ? (this.props.labelFieldEn || 'name') : (this.props.labelField || 'name');\n }\n return this.props.labelField || 'name';\n }\n\n ngOnInit() {\n this.api = this.svc;\n this.api.apiName = this.props.serviceName;\n this.api.moduleName = this.props.moduleName;\n\n // تحميل البيانات لأول مرة\n this.search({ query: '' });\n\n this.valueChangeSubscription = this.formControl.valueChanges.subscribe(() => {\n this.syncSelectionWithControl();\n });\n }\n\n onFilterSearch(event: any) {\n if (!this.props.offline) {\n this.search({ query: event.filter });\n }\n }\n\n onSelectionChange(val: any) {\n const vf = this.props.valueField || 'id';\n this.selectedItem = val;\n\n if (this.props.multiple) {\n const values = Array.isArray(val) ? val.map(i => i[vf]) : [];\n this.formControl.setValue(values);\n } else {\n this.formControl.setValue(val ? val[vf] : null);\n }\n\n if (this.props.onSelect) {\n this.props.onSelect(this.field, { item: val });\n }\n }\n\n private syncSelectionWithControl() {\n const val = this.formControl.value;\n const vf = this.props.valueField || 'id';\n\n if (val == null || (Array.isArray(val) && val.length === 0)) {\n this.selectedItem = this.props.multiple ? [] : null;\n } else if (this.props.multiple && Array.isArray(val)) {\n this.selectedItem = this.options_.filter(opt => val.includes(opt[vf]));\n } else {\n this.selectedItem = this.options_.find(opt => opt[vf] === val);\n }\n this.cdr.detectChanges();\n }\n\n // الدالة التي طلبتها بنفس الآلية البسيطة\n search(event: { query: string }) {\n const q = event.query?.toString() || '';\n const lf = this.optionLabel;\n\n // --- أولاً: حالة الـ Offline (البحث المحلي) ---\n if (this.props.offline) {\n if (this.props.offlineDataFn) {\n // إذا كان هناك دالة مخصصة لجلب البيانات محلياً\n this.options_ = this.props.offlineDataFn(q);\n } else {\n // البحث الافتراضي في المصفوفة المخزنة\n this.options_ = this._offlineList.filter(item => {\n const searchStr = q.toLowerCase();\n // يبحث في الحقل المعرف كـ labelField\n return item[lf]?.toString().toLowerCase().includes(searchStr) ||\n // أو يبحث في id إذا كان البحث نصياً مطابقاً\n item[this.props.valueField || 'id']?.toString().toLowerCase() === searchStr;\n });\n }\n this.syncSelectionWithControl();\n this.cdr.detectChanges();\n return; // إنهاء الدالة هنا لأننا في وضع الأوفلاين\n }\n\n // --- ثانياً: حالة الـ Online (طلب API) ---\n this.loading = true;\n const fixedFilters = this.getFixedFilters(q);\n\n const queryParams: QueryParameters = {\n filters: [],\n top: this.props.query?.['top'] ?? 20,\n skip: this.props.query?.['skip'] ?? 0,\n orderBy: this.props.query?.['orderBy'] || [],\n expand: this.props.query?.['expand'] || [],\n select: this.props.query?.['select'] || [],\n };\n\n let dynamicFilters: any[] = [];\n if (this.props.query && this.props.query['filters']) {\n const f = this.props.query['filters'];\n // هنا يتم تمرير searchText للدالة التي أرسلتها أنت في الـ Config\n dynamicFilters = typeof f === 'function' ? f(q, this.field, this.model) : f;\n }\n\n if (dynamicFilters.length === 0) {\n const mainGroup: FilterGroup = { logicalOperator: 'and', conditions: [] };\n if (q) mainGroup.conditions.push({ field: lf, operator: 'contains', value: q });\n\n Object.keys(fixedFilters || {}).forEach(key => {\n if (fixedFilters[key] != null) mainGroup.conditions.push({ field: key, operator: 'eq', value: fixedFilters[key] });\n });\n\n if (mainGroup.conditions.length > 0) queryParams.filters.push(mainGroup);\n } else {\n dynamicFilters.forEach((fg) => {\n queryParams.filters.push({ ...fg, groupLogicalOperator: fg.groupLogicalOperator || 'and' });\n });\n\n if (Object.keys(fixedFilters || {}).length > 0) {\n queryParams.filters.push({\n logicalOperator: 'and',\n groupLogicalOperator: 'and',\n conditions: Object.keys(fixedFilters).map(k => ({ field: k, operator: 'eq', value: fixedFilters[k] }))\n });\n }\n }\n\n let listEndpoint = this.props.listEndpoint;\n if (typeof listEndpoint === 'function') listEndpoint = listEndpoint(this.model);\n\n this.api.getList({ 'query': QueryParser.toString(queryParams) }, listEndpoint)\n .pipe(finalize(() => {\n this.loading = false;\n this.cdr.detectChanges();\n }))\n .subscribe({\n next: (res: any) => {\n this.options_ = res.items ?? res ?? [];\n this.syncSelectionWithControl();\n this.cdr.detectChanges();\n },\n error: () => {\n this.options_ = [];\n this.cdr.detectChanges();\n }\n });\n }\n\n getFixedFilters(query: string = ''): any {\n const ff = this.props.fixedFilters;\n return typeof ff === 'function' ? ff(query, this.field) : (ff || {});\n }\n\n getFormattedLabel(item: any): SafeHtml {\n if (!item) return '';\n const label = this.props.formatter ? this.props.formatter(item) : (item[this.optionLabel] || '');\n return this.sanitizer.bypassSecurityTrustHtml(label);\n }\n\n getEmptyMessage(): string {\n return this.loading ? 'LOADING_DATA_MESSAGE' : 'NO_RESULTS_FOUND';\n }\n\n onAddNewClick() { this.dialog.openForm(\"create\"); }\n\n afterSave(event: any) {\n this.search({ query: '' });\n if (this.props.afterSave) this.props.afterSave(this.field, { item: event.record });\n }\n\n ngOnDestroy() {\n if (this.valueChangeSubscription) this.valueChangeSubscription.unsubscribe();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}