@acorex/modules 20.0.9 → 20.0.11

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 (53) hide show
  1. package/common/index.d.ts +1 -0
  2. package/conversation/index.d.ts +4 -1
  3. package/data-management/README.md +3 -0
  4. package/data-management/index.d.ts +101 -0
  5. package/fesm2022/{acorex-modules-auth-acorex-modules-auth-BXc_ogZY.mjs → acorex-modules-auth-acorex-modules-auth-DqsEqXec.mjs} +11 -11
  6. package/fesm2022/acorex-modules-auth-acorex-modules-auth-DqsEqXec.mjs.map +1 -0
  7. package/fesm2022/{acorex-modules-auth-app-chooser.component-BS8kyO4q.mjs → acorex-modules-auth-app-chooser.component-D0pKNUts.mjs} +2 -2
  8. package/fesm2022/{acorex-modules-auth-app-chooser.component-BS8kyO4q.mjs.map → acorex-modules-auth-app-chooser.component-D0pKNUts.mjs.map} +1 -1
  9. package/fesm2022/{acorex-modules-auth-login.module-DGE_lE3s.mjs → acorex-modules-auth-login.module-Dky49ylL.mjs} +4 -4
  10. package/fesm2022/{acorex-modules-auth-login.module-DGE_lE3s.mjs.map → acorex-modules-auth-login.module-Dky49ylL.mjs.map} +1 -1
  11. package/fesm2022/{acorex-modules-auth-master.layout-BsgOcazS.mjs → acorex-modules-auth-master.layout-DXfRjCLL.mjs} +2 -2
  12. package/fesm2022/{acorex-modules-auth-master.layout-BsgOcazS.mjs.map → acorex-modules-auth-master.layout-DXfRjCLL.mjs.map} +1 -1
  13. package/fesm2022/{acorex-modules-auth-password.component-BjpLB-GX.mjs → acorex-modules-auth-password.component-BbsQWpEh.mjs} +2 -2
  14. package/fesm2022/{acorex-modules-auth-password.component-BjpLB-GX.mjs.map → acorex-modules-auth-password.component-BbsQWpEh.mjs.map} +1 -1
  15. package/fesm2022/{acorex-modules-auth-password.component-DwQwyJv_.mjs → acorex-modules-auth-password.component-oH5OFHqQ.mjs} +2 -2
  16. package/fesm2022/{acorex-modules-auth-password.component-DwQwyJv_.mjs.map → acorex-modules-auth-password.component-oH5OFHqQ.mjs.map} +1 -1
  17. package/fesm2022/{acorex-modules-auth-routes-j9Ujy-xB.mjs → acorex-modules-auth-routes-DAiaTm4Y.mjs} +2 -2
  18. package/fesm2022/{acorex-modules-auth-routes-j9Ujy-xB.mjs.map → acorex-modules-auth-routes-DAiaTm4Y.mjs.map} +1 -1
  19. package/fesm2022/{acorex-modules-auth-two-factor.module-EN4l_a4V.mjs → acorex-modules-auth-two-factor.module-Coe4NNUW.mjs} +2 -2
  20. package/fesm2022/{acorex-modules-auth-two-factor.module-EN4l_a4V.mjs.map → acorex-modules-auth-two-factor.module-Coe4NNUW.mjs.map} +1 -1
  21. package/fesm2022/{acorex-modules-auth-user-sessions.component-D9D-vWic.mjs → acorex-modules-auth-user-sessions.component-CtTrstZT.mjs} +2 -2
  22. package/fesm2022/{acorex-modules-auth-user-sessions.component-D9D-vWic.mjs.map → acorex-modules-auth-user-sessions.component-CtTrstZT.mjs.map} +1 -1
  23. package/fesm2022/acorex-modules-auth.mjs +1 -1
  24. package/fesm2022/acorex-modules-common.mjs +1 -0
  25. package/fesm2022/acorex-modules-common.mjs.map +1 -1
  26. package/fesm2022/acorex-modules-content-management.mjs +1 -1
  27. package/fesm2022/acorex-modules-content-management.mjs.map +1 -1
  28. package/fesm2022/acorex-modules-conversation.mjs +6 -6
  29. package/fesm2022/acorex-modules-conversation.mjs.map +1 -1
  30. package/fesm2022/acorex-modules-data-management.mjs +2328 -0
  31. package/fesm2022/acorex-modules-data-management.mjs.map +1 -0
  32. package/fesm2022/{acorex-modules-issue-management-acorex-modules-issue-management-BhascWnH.mjs → acorex-modules-issue-management-acorex-modules-issue-management-DKdtV_QL.mjs} +2 -7
  33. package/fesm2022/acorex-modules-issue-management-acorex-modules-issue-management-DKdtV_QL.mjs.map +1 -0
  34. package/fesm2022/{acorex-modules-issue-management-capture-screen.component-BIWYcqOI.mjs → acorex-modules-issue-management-capture-screen.component-CucnKDr1.mjs} +2 -2
  35. package/fesm2022/{acorex-modules-issue-management-capture-screen.component-BIWYcqOI.mjs.map → acorex-modules-issue-management-capture-screen.component-CucnKDr1.mjs.map} +1 -1
  36. package/fesm2022/acorex-modules-issue-management.mjs +1 -1
  37. package/fesm2022/acorex-modules-notification-management.mjs +1 -1
  38. package/fesm2022/acorex-modules-notification-management.mjs.map +1 -1
  39. package/fesm2022/{acorex-modules-report-management-report-runner-root-page.component-sI0yzJ4s.mjs → acorex-modules-report-management-report-runner-root-page.component-CAxcD_pe.mjs} +16 -16
  40. package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-CAxcD_pe.mjs.map +1 -0
  41. package/fesm2022/acorex-modules-report-management.mjs +170 -11
  42. package/fesm2022/acorex-modules-report-management.mjs.map +1 -1
  43. package/fesm2022/acorex-modules-workflow-management-task-board.page-Dp7SJ3NA.mjs +876 -0
  44. package/fesm2022/acorex-modules-workflow-management-task-board.page-Dp7SJ3NA.mjs.map +1 -0
  45. package/fesm2022/acorex-modules-workflow-management.mjs +8 -1
  46. package/fesm2022/acorex-modules-workflow-management.mjs.map +1 -1
  47. package/package.json +5 -1
  48. package/workflow-management/index.d.ts +1 -0
  49. package/fesm2022/acorex-modules-auth-acorex-modules-auth-BXc_ogZY.mjs.map +0 -1
  50. package/fesm2022/acorex-modules-issue-management-acorex-modules-issue-management-BhascWnH.mjs.map +0 -1
  51. package/fesm2022/acorex-modules-report-management-report-runner-root-page.component-sI0yzJ4s.mjs.map +0 -1
  52. package/fesm2022/acorex-modules-workflow-management-task-board.page-Dh9nI9dz.mjs +0 -762
  53. package/fesm2022/acorex-modules-workflow-management-task-board.page-Dh9nI9dz.mjs.map +0 -1
@@ -0,0 +1,2328 @@
1
+ import * as i0 from '@angular/core';
2
+ import { inject, Injector, Injectable, EventEmitter, signal, Output, Input, ChangeDetectionStrategy, Component, computed, NgModule } from '@angular/core';
3
+ import { AXP_PERMISSION_DEFINITION_PROVIDER } from '@acorex/platform/auth';
4
+ import { AXPSearchCommandProvider, createAllQueryView, AXPEntityCommandScope, AXPEntityQueryType, AXP_MENU_PROVIDER, AXP_SETTING_DEFINITION_PROVIDER, AXP_SEARCH_PROVIDER } from '@acorex/platform/common';
5
+ import { AXPEntityService, AXMEntityCrudServiceImpl, AXP_ENTITY_DEFINITION_LOADER } from '@acorex/platform/layout/entity';
6
+ import * as i4$1 from '@acorex/platform/layout/builder';
7
+ import { AXPWidgetsCatalog, AXPWidgetGroupEnum, AXP_WIDGETS_EDITOR_CATEGORY, AXPLayoutBuilderModule, AXPValueWidgetComponent } from '@acorex/platform/layout/builder';
8
+ import { AXDataSource } from '@acorex/cdk/common';
9
+ import { AXPWidgetsList } from '@acorex/modules/common';
10
+ import { AXMDataSourceService } from '@acorex/modules/platform-management';
11
+ import { AXP_NAME_PROPERTY, AXP_DATA_PATH_PROPERTY, AXP_LABEL_PROPERTY, AXP_READONLY_PROPERTY, AXP_DISABLED_PROPERTY } from '@acorex/platform/widgets';
12
+ import * as i2 from '@acorex/components/button';
13
+ import { AXButtonModule } from '@acorex/components/button';
14
+ import * as i1 from '@acorex/components/select-box';
15
+ import { AXSelectBoxModule } from '@acorex/components/select-box';
16
+ import { AXTextBoxModule } from '@acorex/components/text-box';
17
+ import { AXFormModule } from '@acorex/components/form';
18
+ import * as i4 from '@acorex/components/decorators';
19
+ import { AXDecoratorModule } from '@acorex/components/decorators';
20
+ import * as i5 from '@acorex/components/dropdown';
21
+ import { AXDropdownModule } from '@acorex/components/dropdown';
22
+ import { moveItemInArray, AXDragDirective, AXDragHandleDirective, AXDropListDirective } from '@acorex/cdk/drag-drop';
23
+ import * as i1$1 from '@angular/common';
24
+ import { CommonModule } from '@angular/common';
25
+ import { FormsModule } from '@angular/forms';
26
+
27
+ const config = {
28
+ i18n: 'data-management',
29
+ };
30
+ const RootConfig = {
31
+ config,
32
+ module: {
33
+ route: 'data-management',
34
+ module: 'dataManagement',
35
+ name: 'DataManagement',
36
+ title: `t('module-name', {scope:"${config.i18n}"})`,
37
+ icon: 'fa-regular fa-database',
38
+ },
39
+ entities: {
40
+ query: {
41
+ name: 'Query',
42
+ title: `t("query", { scope: "${config.i18n}" })`,
43
+ titlePlural: `t("queryPlural", { scope: "${config.i18n}" })`,
44
+ icon: 'fa-regular fa-nfc-magnifying-glass',
45
+ },
46
+ queryCategory: {
47
+ name: 'QueryCategory',
48
+ title: `t("queryCategory", { scope: "${config.i18n}" })`,
49
+ titlePlural: `t("queryCategoryPlural", { scope: "${config.i18n}" })`,
50
+ icon: 'fa-regular fa-layer-group',
51
+ },
52
+ // category: {
53
+ // name: 'Category',
54
+ // title: 't("category", { scope: "common" })',
55
+ // icon: 'fa-light fa-list'
56
+ // },
57
+ },
58
+ };
59
+
60
+ class AXMMenuProvider {
61
+ constructor() {
62
+ this.entityService = inject(AXPEntityService);
63
+ }
64
+ async provide(context) {
65
+ const module = RootConfig.module;
66
+ context.addItems([
67
+ {
68
+ text: `t('module-name', {scope:"${RootConfig.config.i18n}"})`,
69
+ icon: module.icon,
70
+ priority: 90001,
71
+ children: [
72
+ {
73
+ text: RootConfig.entities.queryCategory.title,
74
+ path: this.entityService.createPath(RootConfig.module.name, RootConfig.entities.queryCategory.name),
75
+ icon: RootConfig.entities.queryCategory.icon,
76
+ priority: 9001,
77
+ },
78
+ {
79
+ text: RootConfig.entities.query.title,
80
+ path: this.entityService.createPath(RootConfig.module.name, RootConfig.entities.query.name),
81
+ icon: RootConfig.entities.query.icon,
82
+ priority: 9002,
83
+ },
84
+ ]
85
+ }
86
+ ]);
87
+ }
88
+ }
89
+
90
+ class AXMEntityProvider {
91
+ constructor() {
92
+ this.injector = inject(Injector);
93
+ }
94
+ preload() {
95
+ const module = RootConfig.module.name;
96
+ return Array.from(Object.values(RootConfig.entities)).map((entity) => ({
97
+ module: module,
98
+ entity: entity.name,
99
+ }));
100
+ }
101
+ async get(moduleName, entityName) {
102
+ if (moduleName == RootConfig.module.name) {
103
+ switch (entityName) {
104
+ case RootConfig.entities.queryCategory.name:
105
+ return (await Promise.resolve().then(function () { return queryCategory_entity; })).queryCategoryFactory(this.injector);
106
+ case RootConfig.entities.query.name:
107
+ return (await Promise.resolve().then(function () { return query_entity; })).queryFactory(this.injector);
108
+ }
109
+ }
110
+ return null;
111
+ }
112
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMEntityProvider, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
113
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMEntityProvider }); }
114
+ }
115
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMEntityProvider, decorators: [{
116
+ type: Injectable
117
+ }] });
118
+
119
+ class AXMPermissionDefinitionProvider {
120
+ async define(context) {
121
+ // context.addPermissions([
122
+ // {
123
+ // name: 'view_templates',
124
+ // title: 'Permission to view templates',
125
+ // isArchived: false,
126
+ // },
127
+ // ]);
128
+ }
129
+ }
130
+
131
+ class AXMSettingProvider {
132
+ async provide(context) {
133
+ // context
134
+ // // Add Form Template Group
135
+ // .addGroup('form-template', 'Form Template', 'Settings related to form templates.', RootConfig.module.icon)
136
+ // // Start Interface Section
137
+ // .addSection('interface', 'UI Interface', 'Customize the user interface for forms.')
138
+ // .addSetting({
139
+ // key: 'history-panel',
140
+ // title: 'Show History Panel',
141
+ // scope: 'U',
142
+ // isInherited: true,
143
+ // defaultValue: false,
144
+ // widget: {
145
+ // type: AXPWidgetsCatalog.toggle,
146
+ // },
147
+ // description: 'Enable or disable the history panel for forms.',
148
+ // validationRules: [
149
+ // {
150
+ // rule: 'required',
151
+ // },
152
+ // ],
153
+ // })
154
+ // .endSection()
155
+ // .endGroup();
156
+ }
157
+ }
158
+
159
+ class AXMSearchCommandProvider extends AXPSearchCommandProvider {
160
+ constructor() {
161
+ super(...arguments);
162
+ this.commands = [
163
+ // {
164
+ // group: 'command',
165
+ // title: 'New Form Template',
166
+ // icon: RootConfig.entities.template.icon,
167
+ // description: 'Create a new form template for designing reusable forms.', // Added description
168
+ // commands: {
169
+ // 'create-entity': {
170
+ // entity: `${RootConfig.module.name}.${RootConfig.entities.template.name}`,
171
+ // },
172
+ // },
173
+ // }
174
+ ];
175
+ }
176
+ }
177
+
178
+ class AXMQueryCategoryService extends AXMEntityCrudServiceImpl {
179
+ }
180
+ class AXMQueryCategoryServiceImpl extends AXMQueryCategoryService {
181
+ constructor() {
182
+ super(`${RootConfig.module.name}.${RootConfig.entities.queryCategory.name}`);
183
+ }
184
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMQueryCategoryServiceImpl, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
185
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMQueryCategoryServiceImpl }); }
186
+ }
187
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMQueryCategoryServiceImpl, decorators: [{
188
+ type: Injectable
189
+ }], ctorParameters: () => [] });
190
+
191
+ async function queryCategoryFactory(injector) {
192
+ const dataService = injector.get(AXMQueryCategoryService);
193
+ const i18n = RootConfig.config.i18n;
194
+ const entityDef = {
195
+ module: RootConfig.module.name,
196
+ name: RootConfig.entities.queryCategory.name,
197
+ parentKey: 'parentId',
198
+ source: '',
199
+ title: RootConfig.entities.queryCategory.title,
200
+ formats: {
201
+ individual: RootConfig.entities.queryCategory.title,
202
+ plural: RootConfig.entities.queryCategory.titlePlural,
203
+ searchResult: {
204
+ title: '{{ title }}',
205
+ description: RootConfig.module.title,
206
+ },
207
+ },
208
+ relatedEntities: [],
209
+ groups: [
210
+ {
211
+ id: 'section',
212
+ title: `t("queryCategory", { scope: "common" })`,
213
+ },
214
+ ],
215
+ properties: [
216
+ {
217
+ name: 'title',
218
+ title: `t("title", { scope: "common" })`,
219
+ groupId: 'section',
220
+ schema: {
221
+ dataType: 'string',
222
+ interface: {
223
+ type: AXPWidgetsCatalog.text,
224
+ options: {
225
+ width: '400px',
226
+ },
227
+ },
228
+ },
229
+ validations: [
230
+ {
231
+ rule: 'required',
232
+ },
233
+ ],
234
+ },
235
+ {
236
+ name: 'parentId',
237
+ title: `t("parent", { scope: "${i18n}" })`,
238
+ groupId: 'section',
239
+ schema: {
240
+ dataType: 'string',
241
+ interface: {
242
+ type: AXPWidgetsCatalog.lookup,
243
+ options: {
244
+ entity: `${RootConfig.module.name}.${RootConfig.entities.queryCategory.name}`,
245
+ },
246
+ },
247
+ },
248
+ },
249
+ ],
250
+ columns: [{ name: 'title' }],
251
+ commands: {
252
+ create: {
253
+ execute: async (data) => {
254
+ const res = await dataService.insertOne(data);
255
+ return { id: res };
256
+ },
257
+ },
258
+ delete: {
259
+ execute: async (id) => {
260
+ return await dataService.deleteOne(id);
261
+ },
262
+ },
263
+ update: {
264
+ execute: async (data) => {
265
+ return await dataService.updateOne(data.id, data);
266
+ },
267
+ },
268
+ },
269
+ queries: {
270
+ byKey: {
271
+ execute: async (id) => {
272
+ return await dataService.getOne(id);
273
+ },
274
+ type: AXPEntityQueryType.Single,
275
+ },
276
+ list: {
277
+ execute: async (e) => {
278
+ return await dataService.query({ skip: e.skip, take: e.take, filter: e.filter });
279
+ },
280
+ type: AXPEntityQueryType.List,
281
+ },
282
+ },
283
+ interfaces: {
284
+ master: {
285
+ create: {
286
+ sections: [
287
+ {
288
+ id: 'section',
289
+ },
290
+ ],
291
+ properties: [
292
+ {
293
+ name: 'title',
294
+ layout: {
295
+ positions: {
296
+ lg: {
297
+ colSpan: 12,
298
+ },
299
+ },
300
+ },
301
+ },
302
+ {
303
+ name: 'parentId',
304
+ layout: {
305
+ positions: {
306
+ lg: {
307
+ colSpan: 12,
308
+ },
309
+ },
310
+ },
311
+ },
312
+ ],
313
+ },
314
+ update: {
315
+ sections: [
316
+ {
317
+ id: 'section',
318
+ },
319
+ ],
320
+ properties: [
321
+ {
322
+ name: 'title',
323
+ layout: {
324
+ positions: {
325
+ lg: {
326
+ colSpan: 12,
327
+ },
328
+ },
329
+ },
330
+ },
331
+ {
332
+ name: 'parentId',
333
+ layout: {
334
+ positions: {
335
+ lg: {
336
+ colSpan: 12,
337
+ },
338
+ },
339
+ },
340
+ },
341
+ ],
342
+ },
343
+ single: {
344
+ title: '{{title}}',
345
+ sections: [
346
+ {
347
+ id: 'section',
348
+ layout: {
349
+ positions: {
350
+ lg: {
351
+ colSpan: 12,
352
+ },
353
+ },
354
+ },
355
+ },
356
+ ],
357
+ properties: [
358
+ {
359
+ name: 'title',
360
+ layout: {
361
+ positions: {
362
+ lg: {
363
+ colSpan: 6,
364
+ },
365
+ },
366
+ },
367
+ },
368
+ ],
369
+ actions: [],
370
+ },
371
+ list: {
372
+ actions: [
373
+ {
374
+ title: `t("create", { scope: "common" })`,
375
+ command: 'create-entity',
376
+ priority: 'primary',
377
+ type: 'create',
378
+ scope: AXPEntityCommandScope.TypeLevel,
379
+ },
380
+ {
381
+ title: 't("deleteItems", { scope: "common" })',
382
+ command: 'delete-entity',
383
+ priority: 'primary',
384
+ type: 'delete',
385
+ scope: AXPEntityCommandScope.Selected,
386
+ },
387
+ {
388
+ title: 't("detail", { scope: "common" })',
389
+ command: 'open-entity',
390
+ priority: 'secondary',
391
+ type: 'view',
392
+ scope: AXPEntityCommandScope.Individual,
393
+ },
394
+ {
395
+ title: 't("delete", { scope: "common" })',
396
+ command: 'delete-entity',
397
+ priority: 'secondary',
398
+ type: 'delete',
399
+ scope: AXPEntityCommandScope.Individual,
400
+ },
401
+ ],
402
+ views: [createAllQueryView()],
403
+ },
404
+ },
405
+ },
406
+ };
407
+ return entityDef;
408
+ }
409
+
410
+ var queryCategory_entity = /*#__PURE__*/Object.freeze({
411
+ __proto__: null,
412
+ queryCategoryFactory: queryCategoryFactory
413
+ });
414
+
415
+ class AXMQueryService extends AXMEntityCrudServiceImpl {
416
+ }
417
+ class AXMQueryServiceImpl extends AXMQueryService {
418
+ constructor() {
419
+ super(`${RootConfig.module.name}.${RootConfig.entities.query.name}`);
420
+ }
421
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMQueryServiceImpl, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
422
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMQueryServiceImpl }); }
423
+ }
424
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMQueryServiceImpl, decorators: [{
425
+ type: Injectable
426
+ }], ctorParameters: () => [] });
427
+
428
+ async function queryFactory(injector) {
429
+ const dataService = injector.get(AXMQueryService);
430
+ const dataSourceService = injector.get(AXMDataSourceService);
431
+ const i18n = RootConfig.config.i18n;
432
+ const entityDef = {
433
+ module: RootConfig.module.name,
434
+ name: RootConfig.entities.query.name,
435
+ source: '',
436
+ title: RootConfig.entities.query.title,
437
+ formats: {
438
+ individual: RootConfig.entities.query.title,
439
+ plural: RootConfig.entities.query.titlePlural,
440
+ searchResult: {
441
+ title: '{{ title }}',
442
+ description: RootConfig.module.title,
443
+ },
444
+ },
445
+ relatedEntities: [],
446
+ category: {
447
+ entity: `${RootConfig.module.name}.${RootConfig.entities.queryCategory.name}`,
448
+ title: 'Categories',
449
+ textField: 'title',
450
+ valueField: 'id',
451
+ applyConditions: [
452
+ {
453
+ name: 'categoryIds',
454
+ operator: {
455
+ type: 'contains',
456
+ },
457
+ value: 'id',
458
+ },
459
+ ],
460
+ },
461
+ groups: [
462
+ {
463
+ id: 'section',
464
+ title: RootConfig.entities.query.title,
465
+ },
466
+ ],
467
+ properties: [
468
+ {
469
+ name: 'name',
470
+ title: `t("name", { scope: "common" })`,
471
+ groupId: 'section',
472
+ options: {
473
+ sort: {
474
+ enabled: true,
475
+ },
476
+ filter: {
477
+ advance: {
478
+ enabled: true,
479
+ },
480
+ inline: {
481
+ enabled: false,
482
+ },
483
+ },
484
+ },
485
+ schema: {
486
+ dataType: 'string',
487
+ interface: {
488
+ type: AXPWidgetsCatalog.text,
489
+ },
490
+ },
491
+ validations: [
492
+ {
493
+ rule: 'required',
494
+ },
495
+ ],
496
+ },
497
+ {
498
+ name: 'title',
499
+ title: `t("title", { scope: "common" })`,
500
+ groupId: 'section',
501
+ options: {
502
+ sort: {
503
+ enabled: true,
504
+ },
505
+ filter: {
506
+ advance: {
507
+ enabled: true,
508
+ },
509
+ inline: {
510
+ enabled: false,
511
+ },
512
+ },
513
+ },
514
+ schema: {
515
+ dataType: 'string',
516
+ interface: {
517
+ type: AXPWidgetsCatalog.text,
518
+ },
519
+ },
520
+ validations: [
521
+ {
522
+ rule: 'required',
523
+ },
524
+ ],
525
+ },
526
+ {
527
+ name: 'categoryIds',
528
+ title: `t("category", { scope: "common" })`,
529
+ groupId: 'section',
530
+ schema: {
531
+ dataType: 'string',
532
+ interface: {
533
+ type: AXPWidgetsCatalog.lookup,
534
+ options: {
535
+ entity: `${RootConfig.module.name}.${RootConfig.entities.queryCategory.name}`,
536
+ multiple: true,
537
+ expose: [
538
+ { source: 'id', target: 'categories.{id}' },
539
+ { source: 'title', target: 'categories.{title}' },
540
+ ],
541
+ },
542
+ },
543
+ },
544
+ validations: [
545
+ {
546
+ rule: 'required',
547
+ },
548
+ ],
549
+ },
550
+ {
551
+ name: 'dataSource',
552
+ title: `t("dataSource", { scope: "${i18n}" })`,
553
+ groupId: 'section',
554
+ schema: {
555
+ dataType: 'string',
556
+ interface: {
557
+ type: AXPWidgetsCatalog.select,
558
+ options: {
559
+ valueField: 'name',
560
+ textField: 'title',
561
+ dataSource: new AXDataSource({
562
+ load: async () => {
563
+ const items = await dataSourceService.query({
564
+ skip: 0,
565
+ take: 10000,
566
+ });
567
+ return { total: items.total, items: items.items };
568
+ },
569
+ pageSize: 1000,
570
+ }),
571
+ multiple: false,
572
+ },
573
+ triggers: [
574
+ {
575
+ event: "{{ events.context('dataSource') }}",
576
+ action: `{{
577
+ var selectedDataSource = context.eval('dataSource');
578
+ if (selectedDataSource) {
579
+ context.set('availableColumns', selectedDataSource.columns || []);
580
+ }
581
+ }}`,
582
+ },
583
+ ],
584
+ },
585
+ },
586
+ validations: [
587
+ {
588
+ rule: 'required',
589
+ },
590
+ ],
591
+ },
592
+ {
593
+ name: 'query',
594
+ title: `t("query", { scope: "${i18n}" })`,
595
+ groupId: 'section',
596
+ schema: {
597
+ dataType: 'object',
598
+ interface: {
599
+ type: AXPWidgetsList.Editors.QueryBuilder,
600
+ options: {
601
+ dataSources: '{{ [context.eval("dataSource")] }}',
602
+ availableColumns: '{{ context.eval("availableColumns") || [] }}',
603
+ },
604
+ },
605
+ },
606
+ },
607
+ ],
608
+ columns: [
609
+ { name: 'name' },
610
+ { name: 'title' },
611
+ { name: 'categoryIds', options: { dataPath: 'categories' } },
612
+ { name: 'dataSource' },
613
+ { name: 'query' },
614
+ ],
615
+ commands: {
616
+ create: {
617
+ execute: async (data) => {
618
+ console.log(data.query);
619
+ const res = await dataService.insertOne(data);
620
+ return { id: res };
621
+ },
622
+ },
623
+ delete: {
624
+ execute: async (id) => {
625
+ return await dataService.deleteOne(id);
626
+ },
627
+ },
628
+ update: {
629
+ execute: async (data) => {
630
+ return await dataService.updateOne(data.id, data);
631
+ },
632
+ },
633
+ },
634
+ queries: {
635
+ byKey: {
636
+ execute: async (id) => {
637
+ return await dataService.getOne(id);
638
+ },
639
+ type: AXPEntityQueryType.Single,
640
+ },
641
+ list: {
642
+ execute: async (e) => {
643
+ return await dataService.query({ skip: e.skip, take: e.take, filter: e.filter });
644
+ },
645
+ type: AXPEntityQueryType.List,
646
+ },
647
+ },
648
+ interfaces: {
649
+ master: {
650
+ create: {
651
+ sections: [
652
+ {
653
+ id: 'section',
654
+ },
655
+ ],
656
+ properties: [
657
+ {
658
+ name: 'name',
659
+ layout: {
660
+ positions: {
661
+ lg: {
662
+ colSpan: 6,
663
+ order: 1,
664
+ },
665
+ },
666
+ },
667
+ },
668
+ {
669
+ name: 'title',
670
+ layout: {
671
+ positions: {
672
+ lg: {
673
+ colSpan: 6,
674
+ order: 2,
675
+ },
676
+ },
677
+ },
678
+ },
679
+ {
680
+ name: 'categoryIds',
681
+ layout: {
682
+ positions: {
683
+ lg: {
684
+ colSpan: 6,
685
+ order: 3,
686
+ },
687
+ },
688
+ },
689
+ },
690
+ {
691
+ name: 'dataSource',
692
+ layout: {
693
+ positions: {
694
+ lg: {
695
+ colSpan: 6,
696
+ order: 4,
697
+ },
698
+ },
699
+ },
700
+ },
701
+ {
702
+ name: 'query',
703
+ layout: {
704
+ positions: {
705
+ lg: {
706
+ colSpan: 12,
707
+ order: 5,
708
+ },
709
+ },
710
+ },
711
+ },
712
+ ],
713
+ },
714
+ update: {
715
+ sections: [
716
+ {
717
+ id: 'section',
718
+ },
719
+ ],
720
+ properties: [
721
+ {
722
+ name: 'name',
723
+ layout: {
724
+ positions: {
725
+ lg: {
726
+ colSpan: 6,
727
+ order: 1,
728
+ },
729
+ },
730
+ },
731
+ },
732
+ {
733
+ name: 'title',
734
+ layout: {
735
+ positions: {
736
+ lg: {
737
+ colSpan: 6,
738
+ order: 2,
739
+ },
740
+ },
741
+ },
742
+ },
743
+ {
744
+ name: 'categoryIds',
745
+ layout: {
746
+ positions: {
747
+ lg: {
748
+ colSpan: 6,
749
+ order: 3,
750
+ },
751
+ },
752
+ },
753
+ },
754
+ {
755
+ name: 'dataSource',
756
+ layout: {
757
+ positions: {
758
+ lg: {
759
+ colSpan: 6,
760
+ order: 4,
761
+ },
762
+ },
763
+ },
764
+ },
765
+ {
766
+ name: 'query',
767
+ layout: {
768
+ positions: {
769
+ lg: {
770
+ colSpan: 12,
771
+ order: 5,
772
+ },
773
+ },
774
+ },
775
+ },
776
+ ],
777
+ },
778
+ single: {
779
+ title: '{{title}}',
780
+ sections: [
781
+ {
782
+ id: 'section',
783
+ layout: {
784
+ positions: {
785
+ lg: {
786
+ colSpan: 12,
787
+ },
788
+ },
789
+ },
790
+ },
791
+ ],
792
+ properties: [
793
+ {
794
+ name: 'name',
795
+ layout: {
796
+ positions: {
797
+ lg: {
798
+ colSpan: 6,
799
+ order: 1,
800
+ },
801
+ },
802
+ },
803
+ },
804
+ {
805
+ name: 'title',
806
+ layout: {
807
+ positions: {
808
+ lg: {
809
+ colSpan: 6,
810
+ order: 2,
811
+ },
812
+ },
813
+ },
814
+ },
815
+ {
816
+ name: 'categoryIds',
817
+ dataPath: 'categories',
818
+ layout: {
819
+ positions: {
820
+ lg: {
821
+ colSpan: 6,
822
+ order: 3,
823
+ },
824
+ },
825
+ },
826
+ },
827
+ {
828
+ name: 'dataSource',
829
+ layout: {
830
+ positions: {
831
+ lg: {
832
+ colSpan: 6,
833
+ order: 4,
834
+ },
835
+ },
836
+ },
837
+ },
838
+ {
839
+ name: 'query',
840
+ layout: {
841
+ positions: {
842
+ lg: {
843
+ colSpan: 12,
844
+ order: 5,
845
+ },
846
+ },
847
+ },
848
+ },
849
+ ],
850
+ actions: [],
851
+ },
852
+ list: {
853
+ actions: [
854
+ {
855
+ title: `t("create", { scope: "common" })`,
856
+ command: {
857
+ name: 'create-entity',
858
+ options: {
859
+ layout: {
860
+ size: 'lg',
861
+ },
862
+ },
863
+ },
864
+ priority: 'primary',
865
+ type: 'create',
866
+ scope: AXPEntityCommandScope.TypeLevel,
867
+ },
868
+ {
869
+ title: 't("deleteItems", { scope: "common" })',
870
+ command: 'delete-entity',
871
+ priority: 'primary',
872
+ type: 'delete',
873
+ scope: AXPEntityCommandScope.Selected,
874
+ },
875
+ {
876
+ title: 't("detail", { scope: "common" })',
877
+ command: 'open-entity',
878
+ priority: 'secondary',
879
+ type: 'view',
880
+ scope: AXPEntityCommandScope.Individual,
881
+ },
882
+ {
883
+ title: 't("delete", { scope: "common" })',
884
+ command: 'delete-entity',
885
+ priority: 'secondary',
886
+ type: 'delete',
887
+ scope: AXPEntityCommandScope.Individual,
888
+ },
889
+ ],
890
+ views: [
891
+ createAllQueryView({
892
+ sorts: [{ name: 'name', dir: 'asc' }],
893
+ }),
894
+ ],
895
+ },
896
+ },
897
+ },
898
+ };
899
+ return entityDef;
900
+ }
901
+
902
+ var query_entity = /*#__PURE__*/Object.freeze({
903
+ __proto__: null,
904
+ queryFactory: queryFactory
905
+ });
906
+
907
+ const AXPQueryBuilderWidget = {
908
+ name: 'query-builder-editor',
909
+ title: 'Query Builder',
910
+ categories: AXP_WIDGETS_EDITOR_CATEGORY,
911
+ groups: [AXPWidgetGroupEnum.FormElement],
912
+ description: 'Visual query builder for creating dynamic queries',
913
+ icon: 'fa-light fa-filter',
914
+ defaultFilterWidgetName: 'string-filter',
915
+ type: 'editor',
916
+ options: {
917
+ needLabel: false,
918
+ },
919
+ properties: [
920
+ AXP_NAME_PROPERTY,
921
+ AXP_DATA_PATH_PROPERTY,
922
+ AXP_LABEL_PROPERTY,
923
+ AXP_READONLY_PROPERTY,
924
+ AXP_DISABLED_PROPERTY,
925
+ ],
926
+ components: {
927
+ designer: {
928
+ component: () => Promise.resolve().then(function () { return queryBuilderWidgetDesigner_component; }).then((c) => c.AXPQueryBuilderWidgetDesignerComponent),
929
+ },
930
+ view: {
931
+ component: () => Promise.resolve().then(function () { return queryBuilderWidgetView_component; }).then((c) => c.AXPQueryBuilderWidgetViewComponent),
932
+ },
933
+ edit: {
934
+ component: () => Promise.resolve().then(function () { return queryBuilderWidgetEdit_component; }).then((c) => c.AXPQueryBuilderWidgetEditComponent),
935
+ },
936
+ print: {
937
+ component: () => Promise.resolve().then(function () { return queryBuilderWidgetView_component; }).then((c) => c.AXPQueryBuilderWidgetViewComponent),
938
+ },
939
+ column: {
940
+ component: () => Promise.resolve().then(function () { return queryBuilderWidgetColumn_component; }).then((c) => c.AXPQueryBuilderWidgetColumnComponent),
941
+ },
942
+ filter: {
943
+ component: () => Promise.resolve().then(function () { return queryBuilderWidgetEdit_component; }).then((c) => c.AXPQueryBuilderWidgetEditComponent),
944
+ },
945
+ },
946
+ };
947
+
948
+ //#endregion
949
+ class AXPQueryBuilderConditionComponent {
950
+ constructor() {
951
+ this.itemChange = new EventEmitter();
952
+ this.removeItem = new EventEmitter();
953
+ this.context = signal({});
954
+ //#endregion
955
+ //#region ---- Signals ----
956
+ this.selectedField = signal(null);
957
+ this.filterNode = signal({
958
+ name: 'filter',
959
+ path: 'filter',
960
+ type: `string-filter`,
961
+ mode: 'edit'
962
+ });
963
+ }
964
+ ngOnInit() {
965
+ this.selectedField.set({
966
+ field: this.item?.field ?? '',
967
+ operator: this.item?.operator?.type ?? 'equal',
968
+ value: this.item?.value ?? '',
969
+ id: this.item?.id ?? '',
970
+ });
971
+ }
972
+ //#endregion
973
+ //#region ---- Private Methods ----
974
+ getFieldType(field) {
975
+ if (!field) {
976
+ return 'string';
977
+ }
978
+ const type = field.type;
979
+ if (typeof type === 'object' && type !== null && type.name && typeof type.name === 'string') {
980
+ return type.name.toLowerCase();
981
+ }
982
+ if (typeof type === 'string') {
983
+ switch (type.toLowerCase()) {
984
+ case 'number-editor':
985
+ case 'number':
986
+ return 'number';
987
+ case 'date-time-editor':
988
+ case 'datetime':
989
+ case 'date':
990
+ return 'date';
991
+ case 'checkbox-editor':
992
+ case 'toggle-editor':
993
+ case 'boolean':
994
+ return 'boolean';
995
+ default:
996
+ return 'string';
997
+ }
998
+ }
999
+ return 'string';
1000
+ }
1001
+ //#endregion
1002
+ //#region ---- Event Handlers ----
1003
+ onFieldChange(event) {
1004
+ this.selectedField.update(prev => ({
1005
+ ...prev,
1006
+ field: event.value,
1007
+ }));
1008
+ this.filterNode.update((n) => {
1009
+ const nowField = this.availableFields.find((x) => x.value === event.value);
1010
+ return {
1011
+ ...n,
1012
+ type: `${this.getFieldType(nowField)}-filter`
1013
+ };
1014
+ });
1015
+ this.itemChange.emit(this.selectedField());
1016
+ }
1017
+ onContextChange(event) {
1018
+ this.selectedField.update(prev => ({
1019
+ ...prev,
1020
+ operator: event.data.filter.operation.type,
1021
+ value: event.data.filter.value,
1022
+ }));
1023
+ this.itemChange.emit(this.selectedField());
1024
+ }
1025
+ onRemoveClick() {
1026
+ this.removeItem.emit(this.item.id);
1027
+ }
1028
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPQueryBuilderConditionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1029
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.7", type: AXPQueryBuilderConditionComponent, isStandalone: true, selector: "axp-query-builder-condition", inputs: { item: "item", availableFields: "availableFields" }, outputs: { itemChange: "itemChange", removeItem: "removeItem" }, ngImport: i0, template: "<div class=\"__condition-card\">\n <div class=\"__condition-content\">\n <!-- Field -->\n <div class=\"__field-group\">\n <label class=\"__field-label\">Field</label>\n <ax-select-box\n [dataSource]=\"availableFields\"\n (onValueChanged)=\"onFieldChange($event)\"\n valueField=\"value\"\n textField=\"field\"\n placeholder=\"Select field\"\n >\n </ax-select-box>\n </div>\n\n <!-- render -->\n <div class=\"__field-group\">\n <label class=\"__field-label\">Value</label>\n <axp-widgets-container class=\"ax-flex ax-flex-col ax-gap-2 ax-p-4\" [context]=\"context()\" (onContextChanged)='onContextChange($event)'>\n <ng-container axp-widget-renderer [node]=\"filterNode()\" [mode]=\"'edit'\"> </ng-container>\n </axp-widgets-container>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"__condition-actions\">\n <ax-button [look]=\"'blank'\" [color]=\"'danger'\" (onClick)=\"onRemoveClick()\">\n <ax-icon class=\"fa-light fa-trash\"></ax-icon>\n </ax-button>\n </div>\n</div>\n", styles: [".__condition-card{display:flex;align-items:center;align-content:center;gap:.5rem;padding:.75rem;background-color:var(--ax-form-field-background);border:1px solid var(--ax-form-field-border-color);border-radius:var(--ax-form-field-border-radius);width:100%}.__condition-content{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;flex-grow:1}.__field-group{display:flex;flex-direction:column;gap:.25rem}.__field-label{font-size:.75rem;color:var(--ax-text-color-secondary);font-weight:500}.__condition-actions{display:flex;align-items:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i1.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i4.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "ngmodule", type: AXPLayoutBuilderModule }, { kind: "component", type: i4$1.AXPWidgetContainerComponent, selector: "axp-widgets-container", inputs: ["context", "functions"], outputs: ["onContextChanged"] }, { kind: "directive", type: i4$1.AXPWidgetRendererDirective, selector: "[axp-widget-renderer]", inputs: ["parentNode", "index", "mode", "node"], outputs: ["onOptionsChanged", "onValueChanged"], exportAs: ["widgetRenderer"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1030
+ }
1031
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPQueryBuilderConditionComponent, decorators: [{
1032
+ type: Component,
1033
+ args: [{ selector: 'axp-query-builder-condition', standalone: true, imports: [
1034
+ CommonModule,
1035
+ FormsModule,
1036
+ AXSelectBoxModule,
1037
+ AXTextBoxModule,
1038
+ AXButtonModule,
1039
+ AXDecoratorModule,
1040
+ AXPLayoutBuilderModule
1041
+ ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"__condition-card\">\n <div class=\"__condition-content\">\n <!-- Field -->\n <div class=\"__field-group\">\n <label class=\"__field-label\">Field</label>\n <ax-select-box\n [dataSource]=\"availableFields\"\n (onValueChanged)=\"onFieldChange($event)\"\n valueField=\"value\"\n textField=\"field\"\n placeholder=\"Select field\"\n >\n </ax-select-box>\n </div>\n\n <!-- render -->\n <div class=\"__field-group\">\n <label class=\"__field-label\">Value</label>\n <axp-widgets-container class=\"ax-flex ax-flex-col ax-gap-2 ax-p-4\" [context]=\"context()\" (onContextChanged)='onContextChange($event)'>\n <ng-container axp-widget-renderer [node]=\"filterNode()\" [mode]=\"'edit'\"> </ng-container>\n </axp-widgets-container>\n </div>\n </div>\n\n <!-- Actions -->\n <div class=\"__condition-actions\">\n <ax-button [look]=\"'blank'\" [color]=\"'danger'\" (onClick)=\"onRemoveClick()\">\n <ax-icon class=\"fa-light fa-trash\"></ax-icon>\n </ax-button>\n </div>\n</div>\n", styles: [".__condition-card{display:flex;align-items:center;align-content:center;gap:.5rem;padding:.75rem;background-color:var(--ax-form-field-background);border:1px solid var(--ax-form-field-border-color);border-radius:var(--ax-form-field-border-radius);width:100%}.__condition-content{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;flex-grow:1}.__field-group{display:flex;flex-direction:column;gap:.25rem}.__field-label{font-size:.75rem;color:var(--ax-text-color-secondary);font-weight:500}.__condition-actions{display:flex;align-items:center}\n"] }]
1042
+ }], propDecorators: { item: [{
1043
+ type: Input
1044
+ }], availableFields: [{
1045
+ type: Input
1046
+ }], itemChange: [{
1047
+ type: Output
1048
+ }], removeItem: [{
1049
+ type: Output
1050
+ }] } });
1051
+
1052
+ //#endregion
1053
+ class AXPQueryBuilderWidgetEditComponent extends AXPValueWidgetComponent {
1054
+ //#endregion
1055
+ //#region ---- Lifecycle Methods ----
1056
+ constructor() {
1057
+ super();
1058
+ //#region ---- Signals ----
1059
+ this.queryData = signal({
1060
+ id: 'root',
1061
+ type: 'group',
1062
+ logic: 'and',
1063
+ filters: []
1064
+ });
1065
+ //#endregion
1066
+ //#region ---- Data Sources ----
1067
+ this.selectedDataSource = signal(null);
1068
+ this.logicalOperators = [
1069
+ { value: 'and', text: 'And' },
1070
+ { value: 'or', text: 'Or' }
1071
+ ];
1072
+ this.availableDataSources = computed(() => {
1073
+ // Get data sources from options or parent context
1074
+ const dataSources = this.options()['dataSources'] || [];
1075
+ return dataSources;
1076
+ });
1077
+ this.availableFields = computed(() => {
1078
+ // Get columns from options (passed from entity context)
1079
+ const columns = this.options()['availableColumns'] || [];
1080
+ return columns.map((column) => ({
1081
+ value: column.name,
1082
+ text: column.title || column.name,
1083
+ type: column.type || 'string'
1084
+ }));
1085
+ });
1086
+ this.initializeFromValue();
1087
+ }
1088
+ //#endregion
1089
+ //#region ---- Private Methods ----
1090
+ initializeFromValue() {
1091
+ const currentValue = this.getValue();
1092
+ if (currentValue?.filters) {
1093
+ this.queryData.set(currentValue);
1094
+ }
1095
+ }
1096
+ generateId() {
1097
+ return Math.random().toString(36).substr(2, 9);
1098
+ }
1099
+ updateValue() {
1100
+ this.setValue(this.queryData());
1101
+ }
1102
+ findItemById(id, filters = this.queryData().filters) {
1103
+ for (const item of filters) {
1104
+ if (item.id === id) {
1105
+ return { item, parent: null };
1106
+ }
1107
+ if (item.type === 'group') {
1108
+ const found = this.findItemById(id, item.filters);
1109
+ if (found) {
1110
+ return { item: found.item, parent: item };
1111
+ }
1112
+ }
1113
+ }
1114
+ return null;
1115
+ }
1116
+ findGroupById(id, filters = this.queryData().filters) {
1117
+ for (const item of filters) {
1118
+ if (item.type === 'group' && item.id === id) {
1119
+ return item;
1120
+ }
1121
+ if (item.type === 'group') {
1122
+ const found = this.findGroupById(id, item.filters);
1123
+ if (found)
1124
+ return found;
1125
+ }
1126
+ }
1127
+ return null;
1128
+ }
1129
+ //#endregion
1130
+ //#region ---- Public Methods ----
1131
+ addCondition() {
1132
+ const newCondition = {
1133
+ id: this.generateId(),
1134
+ type: 'condition',
1135
+ title: 'New Condition',
1136
+ field: '',
1137
+ value: '',
1138
+ operator: { type: 'equal' },
1139
+ widget: { type: 'text' },
1140
+ };
1141
+ this.queryData.update(data => ({
1142
+ ...data,
1143
+ filters: [...data.filters, newCondition]
1144
+ }));
1145
+ this.updateValue();
1146
+ }
1147
+ addGroup() {
1148
+ const newGroup = {
1149
+ id: this.generateId(),
1150
+ type: 'group',
1151
+ logic: 'and',
1152
+ filters: []
1153
+ };
1154
+ this.queryData.update(data => ({
1155
+ ...data,
1156
+ filters: [...data.filters, newGroup]
1157
+ }));
1158
+ this.updateValue();
1159
+ }
1160
+ addConditionToGroup(groupId) {
1161
+ const newCondition = {
1162
+ id: this.generateId(),
1163
+ type: 'condition',
1164
+ title: 'New Condition',
1165
+ field: '',
1166
+ value: '',
1167
+ operator: { type: 'equal' },
1168
+ widget: { type: 'text' },
1169
+ };
1170
+ this.queryData.update(data => {
1171
+ const updateFilters = (filters) => {
1172
+ return filters.map(filter => {
1173
+ if (filter.type === 'group' && filter.id === groupId) {
1174
+ return {
1175
+ ...filter,
1176
+ filters: [...filter.filters, newCondition]
1177
+ };
1178
+ }
1179
+ else if (filter.type === 'group') {
1180
+ return {
1181
+ ...filter,
1182
+ filters: updateFilters(filter.filters)
1183
+ };
1184
+ }
1185
+ return filter;
1186
+ });
1187
+ };
1188
+ return {
1189
+ ...data,
1190
+ filters: updateFilters(data.filters)
1191
+ };
1192
+ });
1193
+ this.updateValue();
1194
+ }
1195
+ addGroupToGroup(parentGroupId) {
1196
+ const newGroup = {
1197
+ id: this.generateId(),
1198
+ type: 'group',
1199
+ logic: 'and',
1200
+ filters: []
1201
+ };
1202
+ this.queryData.update(data => {
1203
+ const updateFilters = (filters) => {
1204
+ return filters.map(filter => {
1205
+ if (filter.type === 'group' && filter.id === parentGroupId) {
1206
+ return {
1207
+ ...filter,
1208
+ filters: [...filter.filters, newGroup]
1209
+ };
1210
+ }
1211
+ else if (filter.type === 'group') {
1212
+ return {
1213
+ ...filter,
1214
+ filters: updateFilters(filter.filters)
1215
+ };
1216
+ }
1217
+ return filter;
1218
+ });
1219
+ };
1220
+ return {
1221
+ ...data,
1222
+ filters: updateFilters(data.filters)
1223
+ };
1224
+ });
1225
+ this.updateValue();
1226
+ }
1227
+ removeItem(id) {
1228
+ this.queryData.update(data => {
1229
+ const removeFromFilters = (filters) => {
1230
+ return filters.filter(filter => filter.id !== id).map(filter => {
1231
+ if (filter.type === 'group') {
1232
+ return {
1233
+ ...filter,
1234
+ filters: removeFromFilters(filter.filters)
1235
+ };
1236
+ }
1237
+ return filter;
1238
+ });
1239
+ };
1240
+ return {
1241
+ ...data,
1242
+ filters: removeFromFilters(data.filters)
1243
+ };
1244
+ });
1245
+ this.updateValue();
1246
+ }
1247
+ updateCondition(condition) {
1248
+ this.queryData.update(data => {
1249
+ const updateFilters = (filters) => {
1250
+ return filters.map(filter => {
1251
+ if (filter.id === condition.id) {
1252
+ return {
1253
+ ...filter,
1254
+ field: condition.field,
1255
+ operator: { type: condition.operator },
1256
+ value: condition.value,
1257
+ };
1258
+ }
1259
+ if (filter.type === 'group') {
1260
+ return {
1261
+ ...filter,
1262
+ filters: updateFilters(filter.filters)
1263
+ };
1264
+ }
1265
+ return filter;
1266
+ });
1267
+ };
1268
+ return {
1269
+ ...data,
1270
+ filters: updateFilters(data.filters)
1271
+ };
1272
+ });
1273
+ this.updateValue();
1274
+ }
1275
+ updateRootLogicalOperator(operator) {
1276
+ this.queryData.update(data => ({
1277
+ ...data,
1278
+ logic: operator
1279
+ }));
1280
+ this.updateValue();
1281
+ }
1282
+ updateGroupLogicalOperator(groupId, operator) {
1283
+ this.queryData.update(data => {
1284
+ const updateFilters = (filters) => {
1285
+ return filters.map(filter => {
1286
+ if (filter.type === 'group' && filter.id === groupId) {
1287
+ return { ...filter, logic: operator };
1288
+ }
1289
+ else if (filter.type === 'group') {
1290
+ return {
1291
+ ...filter,
1292
+ filters: updateFilters(filter.filters)
1293
+ };
1294
+ }
1295
+ return filter;
1296
+ });
1297
+ };
1298
+ return {
1299
+ ...data,
1300
+ filters: updateFilters(data.filters)
1301
+ };
1302
+ });
1303
+ this.updateValue();
1304
+ }
1305
+ clearAll() {
1306
+ this.queryData.update(data => ({
1307
+ ...data,
1308
+ filters: []
1309
+ }));
1310
+ this.updateValue();
1311
+ }
1312
+ getTotalItemsCount() {
1313
+ const countFilters = (filters) => {
1314
+ return filters.reduce((count, filter) => {
1315
+ if (filter.type === 'condition') {
1316
+ return count + 1;
1317
+ }
1318
+ else {
1319
+ return count + 1 + countFilters(filter.filters);
1320
+ }
1321
+ }, 0);
1322
+ };
1323
+ return countFilters(this.queryData().filters);
1324
+ }
1325
+ //#endregion
1326
+ //#region ---- Drag and Drop / Move Methods ----
1327
+ reorderRootItems(event) {
1328
+ this.queryData.update(data => {
1329
+ const filters = [...data.filters];
1330
+ moveItemInArray(filters, event.previousIndex, event.currentIndex);
1331
+ return {
1332
+ ...data,
1333
+ filters
1334
+ };
1335
+ });
1336
+ this.updateValue();
1337
+ }
1338
+ reorderGroupItems(groupId, previousIndex, currentIndex) {
1339
+ this.queryData.update(data => {
1340
+ const updateFilters = (filters) => {
1341
+ return filters.map(filter => {
1342
+ if (filter.type === 'group' && filter.id === groupId) {
1343
+ const groupFilters = [...filter.filters];
1344
+ moveItemInArray(groupFilters, previousIndex, currentIndex);
1345
+ return {
1346
+ ...filter,
1347
+ filters: groupFilters
1348
+ };
1349
+ }
1350
+ else if (filter.type === 'group') {
1351
+ return {
1352
+ ...filter,
1353
+ filters: updateFilters(filter.filters)
1354
+ };
1355
+ }
1356
+ return filter;
1357
+ });
1358
+ };
1359
+ return {
1360
+ ...data,
1361
+ filters: updateFilters(data.filters)
1362
+ };
1363
+ });
1364
+ this.updateValue();
1365
+ }
1366
+ reorderGroupItemsEvent(groupId, event) {
1367
+ this.reorderGroupItems(groupId, event.previousIndex, event.currentIndex);
1368
+ }
1369
+ moveItemUp(index, parentId) {
1370
+ if (index === 0)
1371
+ return;
1372
+ if (parentId === 'root') {
1373
+ // Create a fake event for root items
1374
+ const fakeEvent = {
1375
+ previousIndex: index,
1376
+ currentIndex: index - 1,
1377
+ item: null,
1378
+ container: null,
1379
+ previousContainer: null,
1380
+ nativeEvent: null,
1381
+ sender: null
1382
+ };
1383
+ this.reorderRootItems(fakeEvent);
1384
+ }
1385
+ else {
1386
+ this.reorderGroupItems(parentId, index, index - 1);
1387
+ }
1388
+ }
1389
+ moveItemDown(index, parentId) {
1390
+ if (parentId === 'root') {
1391
+ if (index === this.queryData().filters.length - 1)
1392
+ return;
1393
+ // Create a fake event for root items
1394
+ const fakeEvent = {
1395
+ previousIndex: index,
1396
+ currentIndex: index + 1,
1397
+ item: null,
1398
+ container: null,
1399
+ previousContainer: null,
1400
+ nativeEvent: null,
1401
+ sender: null
1402
+ };
1403
+ this.reorderRootItems(fakeEvent);
1404
+ }
1405
+ else {
1406
+ const group = this.findGroupById(parentId);
1407
+ if (!group || index === group.filters.length - 1)
1408
+ return;
1409
+ this.reorderGroupItems(parentId, index, index + 1);
1410
+ }
1411
+ }
1412
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPQueryBuilderWidgetEditComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1413
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.7", type: AXPQueryBuilderWidgetEditComponent, isStandalone: true, selector: "axp-query-builder-widget-edit", usesInheritance: true, ngImport: i0, template: `
1414
+ <div class="__query-builder">
1415
+ <div class="__header">
1416
+ <div class="__title">
1417
+ <i class="fa-light fa-filter"></i>
1418
+ <span>Advanced Query Builder</span>
1419
+ </div>
1420
+ <div class="__actions">
1421
+ <ax-button
1422
+ [look]="'outline'"
1423
+ [color]="'primary'"
1424
+ text="Add Item">
1425
+ <ax-icon class='fa-light fa-plus'></ax-icon>
1426
+ <ax-dropdown-panel>
1427
+ <ax-button-item-list>
1428
+ <ax-button-item text="Add Condition" (onClick)="addCondition()">
1429
+ <ax-prefix>
1430
+ <ax-icon class="fa-light fa-filter"></ax-icon>
1431
+ </ax-prefix>
1432
+ </ax-button-item>
1433
+ <ax-button-item text="Add Group" (onClick)="addGroup()">
1434
+ <ax-prefix>
1435
+ <ax-icon class="fa-light fa-layer-group"></ax-icon>
1436
+ </ax-prefix>
1437
+ </ax-button-item>
1438
+ </ax-button-item-list>
1439
+ </ax-dropdown-panel>
1440
+ </ax-button>
1441
+ </div>
1442
+ </div>
1443
+
1444
+ <div class="__query-content">
1445
+ @if (queryData().filters.length === 0) {
1446
+ <div class="__empty-state">
1447
+ <div class="__empty-content">
1448
+ <i class="fa-light fa-filter-slash"></i>
1449
+ <p>No conditions or groups added yet</p>
1450
+ <div class="__empty-actions">
1451
+ <ax-button
1452
+ [look]="'solid'"
1453
+ [color]="'primary'"
1454
+ text="Add Condition"
1455
+ (onClick)="addCondition()">
1456
+ </ax-button>
1457
+ <ax-button
1458
+ [look]="'outline'"
1459
+ [color]="'primary'"
1460
+ text="Add Group"
1461
+ (onClick)="addGroup()">
1462
+ </ax-button>
1463
+ </div>
1464
+ </div>
1465
+ </div>
1466
+ } @else {
1467
+ <div class="__root-group">
1468
+ <div class="__group-header">
1469
+ <div class="__group-operator">
1470
+ <label>Root Group:</label>
1471
+ <ax-select-box
1472
+ [dataSource]="logicalOperators"
1473
+ [value]="queryData().logic"
1474
+ textField="text"
1475
+ valueField="value"
1476
+ (onValueChanged)="updateRootLogicalOperator($event.value)"
1477
+ [look]="'outline'">
1478
+ </ax-select-box>
1479
+ </div>
1480
+ </div>
1481
+
1482
+ <div class="__group-content"
1483
+ axDropList
1484
+ (dropListDropped)="reorderRootItems($event)">
1485
+ @for (item of queryData().filters; track item.id; let i = $index) {
1486
+ <div class="__query-item"
1487
+ axDrag>
1488
+
1489
+ <!-- Drag Handle and Move Controls -->
1490
+ <div class="__item-controls">
1491
+ <div class="__drag-handle" axDragHandle>
1492
+ <i class="fa-light fa-grip-dots-vertical"></i>
1493
+ </div>
1494
+ <div class="__move-controls">
1495
+ <ax-button
1496
+ [look]="'blank'"
1497
+ [color]="'default'"
1498
+ [size]="'xs'"
1499
+ [disabled]="i === 0"
1500
+ (onClick)="moveItemUp(i, 'root')">
1501
+ <ax-icon class='fa-light fa-arrow-up'></ax-icon>
1502
+ </ax-button>
1503
+ <ax-button
1504
+ [look]="'blank'"
1505
+ [color]="'default'"
1506
+ [size]="'xs'"
1507
+ [disabled]="i === queryData().filters.length - 1"
1508
+ (onClick)="moveItemDown(i, 'root')">
1509
+ <ax-icon class='fa-light fa-arrow-down'></ax-icon>
1510
+ </ax-button>
1511
+ </div>
1512
+ </div>
1513
+
1514
+ <div class="__item-content">
1515
+ <!-- Logical Operator between items -->
1516
+ @if (i > 0) {
1517
+ <div class="__item-connector">
1518
+ <span class="__operator-badge">{{ queryData().logic }}</span>
1519
+ </div>
1520
+ }
1521
+
1522
+ <!-- Render Condition or Group -->
1523
+ @if (item.type === 'condition') {
1524
+ <axp-query-builder-condition
1525
+ [item]="item"
1526
+ [availableFields]="availableFields()"
1527
+ (itemChange)="updateCondition($event)"
1528
+ (removeItem)="removeItem($event)">
1529
+ </axp-query-builder-condition>
1530
+ } @else {
1531
+ <ng-container [ngTemplateOutlet]="groupTemplate" [ngTemplateOutletContext]="{group: item}"></ng-container>
1532
+ }
1533
+ </div>
1534
+ </div>
1535
+ }
1536
+ </div>
1537
+ </div>
1538
+ }
1539
+ </div>
1540
+
1541
+ @if (queryData().filters.length > 0) {
1542
+ <div class="__footer">
1543
+ <div class="__footer-info">
1544
+ <span class="__item-count">{{ getTotalItemsCount() }} items total</span>
1545
+ </div>
1546
+ <ax-button
1547
+ [look]="'outline'"
1548
+ [color]="'danger'"
1549
+ text="Clear All"
1550
+ (onClick)="clearAll()">
1551
+ <ax-icon class='fa-light fa-trash'></ax-icon>
1552
+ </ax-button>
1553
+ </div>
1554
+ }
1555
+
1556
+ </div>
1557
+
1558
+ <!-- Templates -->
1559
+ <ng-template #groupTemplate let-group="group">
1560
+ <div class="__nested-group">
1561
+ <div class="__group-header">
1562
+ <div class="__group-info">
1563
+ <i class="fa-light fa-layer-group"></i>
1564
+ <span class="__group-label">Group ({{ group.filters.length }} items)</span>
1565
+ </div>
1566
+ <div class="__group-operator">
1567
+ <ax-select-box
1568
+ [dataSource]="logicalOperators"
1569
+ [value]="group.logic"
1570
+ (onValueChanged)="updateGroupLogicalOperator(group.id, $event.value)"
1571
+ [look]="'outline'">
1572
+ </ax-select-box>
1573
+ </div>
1574
+ <div class="__group-actions">
1575
+ <ax-button
1576
+ [look]="'outline'"
1577
+ [color]="'primary'"
1578
+ [size]="'xs'">
1579
+ <ax-icon class='fa-light fa-plus'></ax-icon>
1580
+ <ax-dropdown-panel>
1581
+ <ax-button-item-list>
1582
+ <ax-button-item text="Add Condition" (onClick)="addConditionToGroup(group.id)">
1583
+ <ax-prefix>
1584
+ <ax-icon class="fa-light fa-filter"></ax-icon>
1585
+ </ax-prefix>
1586
+ </ax-button-item>
1587
+ <ax-button-item text="Add Nested Group" (onClick)="addGroupToGroup(group.id)">
1588
+ <ax-prefix>
1589
+ <ax-icon class="fa-light fa-layer-group"></ax-icon>
1590
+ </ax-prefix>
1591
+ </ax-button-item>
1592
+ </ax-button-item-list>
1593
+ </ax-dropdown-panel>
1594
+ </ax-button>
1595
+ <ax-button
1596
+ [look]="'blank'"
1597
+ [color]="'danger'"
1598
+ [size]="'xs'"
1599
+ (onClick)="removeItem(group.id)">
1600
+ <ax-icon class='fa-light fa-trash'></ax-icon>
1601
+ </ax-button>
1602
+ </div>
1603
+ </div>
1604
+
1605
+ <div class="__group-content"
1606
+ axDropList
1607
+ (dropListDropped)="reorderGroupItemsEvent(group.id, $event)">
1608
+ @if (group.filters.length === 0) {
1609
+ <div class="__group-empty">
1610
+ <span>Empty group - add conditions or nested groups</span>
1611
+ </div>
1612
+ } @else {
1613
+ @for (item of group.filters; track item; let i = $index) {
1614
+ <div class="__query-item"
1615
+ axDrag>
1616
+
1617
+ <!-- Drag Handle and Move Controls -->
1618
+ <div class="__item-controls">
1619
+ <div class="__drag-handle" axDragHandle>
1620
+ <i class="fa-light fa-grip-dots-vertical"></i>
1621
+ </div>
1622
+ <div class="__move-controls">
1623
+ <ax-button
1624
+ [look]="'blank'"
1625
+ [color]="'default'"
1626
+ [size]="'xs'"
1627
+ [disabled]="i === 0"
1628
+ (onClick)="moveItemUp(i, group.id)">
1629
+ <ax-icon class='fa-light fa-arrow-up'></ax-icon>
1630
+ </ax-button>
1631
+ <ax-button
1632
+ [look]="'blank'"
1633
+ [color]="'default'"
1634
+ [size]="'xs'"
1635
+ [disabled]="i === group.filters.length - 1"
1636
+ (onClick)="moveItemDown(i, group.id)">
1637
+ <ax-icon class='fa-light fa-arrow-down'></ax-icon>
1638
+ </ax-button>
1639
+ </div>
1640
+ </div>
1641
+
1642
+ <div class="__item-content">
1643
+ <!-- Logical Operator between items -->
1644
+ @if (i > 0) {
1645
+ <div class="__item-connector">
1646
+ <span class="__operator-badge">{{ group.logic }}</span>
1647
+ </div>
1648
+ }
1649
+
1650
+ <!-- Render Condition or Nested Group -->
1651
+ @if (item.type === 'condition') {
1652
+ <axp-query-builder-condition
1653
+ [item]="item"
1654
+ [availableFields]="availableFields()"
1655
+ (itemChange)="updateCondition($event)"
1656
+ (removeItem)="removeItem($event)">
1657
+ </axp-query-builder-condition>
1658
+ } @else {
1659
+ <ng-container [ngTemplateOutlet]="groupTemplate" [ngTemplateOutletContext]="{group: item}"></ng-container>
1660
+ }
1661
+ </div>
1662
+ </div>
1663
+ }
1664
+ }
1665
+ </div>
1666
+ </div>
1667
+ </ng-template>
1668
+ `, isInline: true, styles: [".__query-builder{width:100%;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.__query-builder .__header{display:flex;align-items:center;justify-content:space-between;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));background-image:linear-gradient(to right,var(--tw-gradient-stops));--tw-gradient-from: #eff6ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(239 246 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);--tw-gradient-to: #eef2ff var(--tw-gradient-to-position);padding:1rem}.__query-builder .__header .__title{display:flex;align-items:center;gap:.5rem;font-weight:600;--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.__query-builder .__header .__title i{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.__query-builder .__header .__actions{display:flex;gap:.5rem}.__query-builder .__query-content{padding:1rem}.__query-builder .__query-content .__empty-state{display:flex;min-height:10rem;align-items:center;justify-content:center;text-align:center}.__query-builder .__query-content .__empty-state .__empty-content{display:flex;flex-direction:column;align-items:center;gap:1rem}.__query-builder .__query-content .__empty-state .__empty-content i{font-size:2.25rem;line-height:2.5rem;--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__empty-state .__empty-content p{font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__empty-state .__empty-content .__empty-actions{display:flex;gap:.5rem}.__query-builder .__query-content .__root-group{border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1));padding:1rem}.__query-builder .__query-content .__root-group .__group-header{margin-bottom:1rem;display:flex;align-items:center;justify-content:space-between}.__query-builder .__query-content .__root-group .__group-header .__group-operator{display:flex;align-items:center;gap:.5rem}.__query-builder .__query-content .__root-group .__group-header .__group-operator label{font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__root-group .__group-content>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.__query-builder .__query-content .__root-group .__group-content.ax-drop-list-receiving{border-radius:.5rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.__query-builder .__query-content .__root-group .__group-content .__query-item{display:flex;align-items:flex-start;gap:.75rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;animation-duration:.2s}.__query-builder .__query-content .__root-group .__group-content .__query-item.ax-drag-preview{border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem;--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.__query-builder .__query-content .__root-group .__group-content .__query-item.ax-drag-disabled .__item-controls .__drag-handle{cursor:not-allowed;opacity:.5}.__query-builder .__query-content .__query-item{position:relative}.__query-builder .__query-content .__query-item.ax-drag-preview{--tw-rotate: 2deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));opacity:.8;--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.__query-builder .__query-content .__query-item.ax-drag-placeholder{border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1));opacity:.5}.__query-builder .__query-content .__query-item .__item-controls{margin-right:.75rem;display:flex;align-items:center;gap:.5rem}.__query-builder .__query-content .__query-item .__item-controls .__drag-handle{cursor:move;padding:.5rem;--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.__query-builder .__query-content .__query-item .__item-controls .__drag-handle:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1));border-radius:.25rem;--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.__query-builder .__query-content .__query-item .__item-controls .__move-controls{display:flex;flex-direction:column;gap:.25rem}.__query-builder .__query-content .__query-item .__item-content{flex:1 1 0%}.__query-builder .__query-content .__query-item .__item-connector{display:flex;justify-content:center;padding-top:.5rem;padding-bottom:.5rem}.__query-builder .__query-content .__query-item .__item-connector .__operator-badge{border-radius:9999px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1));padding:.25rem .75rem;font-size:.75rem;line-height:1rem;font-weight:600;--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__condition-card{display:flex;align-items:flex-start;gap:1rem;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.__query-builder .__query-content .__condition-card .__condition-content{display:grid;flex:1 1 0%;grid-template-columns:repeat(1,minmax(0,1fr));gap:1rem}@media (min-width: 768px){.__query-builder .__query-content .__condition-card .__condition-content{grid-template-columns:repeat(3,minmax(0,1fr))}}.__query-builder .__query-content .__condition-card .__condition-content .__field-group{display:flex;flex-direction:column;gap:.5rem}.__query-builder .__query-content .__condition-card .__condition-content .__field-group .__field-label{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__condition-card .__condition-actions{display:flex;align-items:center}.__query-builder .__query-content .__nested-group{border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1));padding:.75rem}.__query-builder .__query-content .__nested-group .__group-header{margin-bottom:.75rem;display:flex;align-items:center;justify-content:space-between;border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem}.__query-builder .__query-content .__nested-group .__group-header .__group-info{display:flex;align-items:center;gap:.5rem}.__query-builder .__query-content .__nested-group .__group-header .__group-info i{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__nested-group .__group-header .__group-info .__group-label{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__nested-group .__group-header .__group-operator{display:flex;align-items:center;gap:.5rem}.__query-builder .__query-content .__nested-group .__group-header .__group-actions{display:flex;align-items:center;gap:.25rem}.__query-builder .__query-content .__nested-group .__group-content>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.__query-builder .__query-content .__nested-group .__group-content .__group-empty{padding-top:1rem;padding-bottom:1rem;text-align:center;font-size:.875rem;line-height:1.25rem;font-style:italic;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__nested-group .__nested-group{margin-left:1rem;--tw-border-opacity: 1;border-color:rgb(253 186 116 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.__query-builder .__query-content .__nested-group .__nested-group .__group-header{--tw-border-opacity: 1;border-color:rgb(254 215 170 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.__query-builder .__query-content .__nested-group .__nested-group .__group-header .__group-info i{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__nested-group .__nested-group .__nested-group{margin-left:1rem;--tw-border-opacity: 1;border-color:rgb(216 180 254 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.__query-builder .__query-content .__nested-group .__nested-group .__nested-group .__group-header{--tw-border-opacity: 1;border-color:rgb(233 213 255 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.__query-builder .__query-content .__nested-group .__nested-group .__nested-group .__group-header .__group-info i{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.__query-builder .__footer{display:flex;align-items:center;justify-content:space-between;border-top-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1));padding:1rem}.__query-builder .__footer .__footer-info{display:flex;align-items:center;gap:.5rem}.__query-builder .__footer .__footer-info .__item-count{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: AXButtonModule }, { kind: "component", type: i2.AXButtonComponent, selector: "ax-button", inputs: ["disabled", "size", "tabIndex", "color", "look", "text", "toggleable", "selected", "iconOnly", "type", "loadingText"], outputs: ["onBlur", "onFocus", "onClick", "selectedChange", "toggleableChange", "lookChange", "colorChange", "disabledChange", "loadingTextChange"] }, { kind: "component", type: i2.AXButtonItemComponent, selector: "ax-button-item", inputs: ["color", "disabled", "text", "selected", "divided", "data", "name"], outputs: ["onClick", "onFocus", "onBlur", "disabledChange"] }, { kind: "component", type: i2.AXButtonItemListComponent, selector: "ax-button-item-list", inputs: ["items"], outputs: ["onItemClick"] }, { kind: "ngmodule", type: AXSelectBoxModule }, { kind: "component", type: i1.AXSelectBoxComponent, selector: "ax-select-box", inputs: ["disabled", "readonly", "tabIndex", "placeholder", "minValue", "maxValue", "value", "state", "name", "id", "type", "look", "multiple", "valueField", "textField", "disabledField", "textTemplate", "selectedItems", "dataSource", "minRecordsForSearch", "caption", "itemTemplate", "selectedTemplate", "emptyTemplate", "loadingTemplate", "dropdownWidth", "searchBoxAutoFocus"], outputs: ["valueChange", "stateChange", "onValueChanged", "onBlur", "onFocus", "readonlyChange", "disabledChange", "onOpened", "onClosed"] }, { kind: "ngmodule", type: AXTextBoxModule }, { kind: "ngmodule", type: AXFormModule }, { kind: "ngmodule", type: AXDecoratorModule }, { kind: "component", type: i4.AXDecoratorIconComponent, selector: "ax-icon", inputs: ["icon"] }, { kind: "component", type: i4.AXDecoratorGenericComponent, selector: "ax-footer, ax-header, ax-content, ax-divider, ax-form-hint, ax-prefix, ax-suffix, ax-text, ax-title, ax-subtitle, ax-placeholder, ax-overlay" }, { kind: "ngmodule", type: AXDropdownModule }, { kind: "component", type: i5.AXDropdownPanelComponent, selector: "ax-dropdown-panel", inputs: ["isOpen", "fitParent", "dropdownWidth", "position", "placement", "_target", "adaptivityEnabled"], outputs: ["onOpened", "onClosed"] }, { kind: "directive", type: AXDragDirective, selector: "[axDrag]", inputs: ["dragData", "dragDisabled", "dragTransition", "dragElementClone", "dropZoneGroup", "dragStartDelay", "dragResetOnDblClick", "dragLockAxis", "dragClonedTemplate", "dragCursor", "dragBoundary", "dragTransitionDuration"], outputs: ["dragPositionChanged"] }, { kind: "directive", type: AXDragHandleDirective, selector: "[axDragHandle]" }, { kind: "directive", type: AXDropListDirective, selector: "[axDropList]", inputs: ["sortingDisabled", "dropListGroup", "dropListOrientation"], outputs: ["dropListDropped"], exportAs: ["axDropList"] }, { kind: "component", type: AXPQueryBuilderConditionComponent, selector: "axp-query-builder-condition", inputs: ["item", "availableFields"], outputs: ["itemChange", "removeItem"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
1669
+ }
1670
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPQueryBuilderWidgetEditComponent, decorators: [{
1671
+ type: Component,
1672
+ args: [{ selector: 'axp-query-builder-widget-edit', template: `
1673
+ <div class="__query-builder">
1674
+ <div class="__header">
1675
+ <div class="__title">
1676
+ <i class="fa-light fa-filter"></i>
1677
+ <span>Advanced Query Builder</span>
1678
+ </div>
1679
+ <div class="__actions">
1680
+ <ax-button
1681
+ [look]="'outline'"
1682
+ [color]="'primary'"
1683
+ text="Add Item">
1684
+ <ax-icon class='fa-light fa-plus'></ax-icon>
1685
+ <ax-dropdown-panel>
1686
+ <ax-button-item-list>
1687
+ <ax-button-item text="Add Condition" (onClick)="addCondition()">
1688
+ <ax-prefix>
1689
+ <ax-icon class="fa-light fa-filter"></ax-icon>
1690
+ </ax-prefix>
1691
+ </ax-button-item>
1692
+ <ax-button-item text="Add Group" (onClick)="addGroup()">
1693
+ <ax-prefix>
1694
+ <ax-icon class="fa-light fa-layer-group"></ax-icon>
1695
+ </ax-prefix>
1696
+ </ax-button-item>
1697
+ </ax-button-item-list>
1698
+ </ax-dropdown-panel>
1699
+ </ax-button>
1700
+ </div>
1701
+ </div>
1702
+
1703
+ <div class="__query-content">
1704
+ @if (queryData().filters.length === 0) {
1705
+ <div class="__empty-state">
1706
+ <div class="__empty-content">
1707
+ <i class="fa-light fa-filter-slash"></i>
1708
+ <p>No conditions or groups added yet</p>
1709
+ <div class="__empty-actions">
1710
+ <ax-button
1711
+ [look]="'solid'"
1712
+ [color]="'primary'"
1713
+ text="Add Condition"
1714
+ (onClick)="addCondition()">
1715
+ </ax-button>
1716
+ <ax-button
1717
+ [look]="'outline'"
1718
+ [color]="'primary'"
1719
+ text="Add Group"
1720
+ (onClick)="addGroup()">
1721
+ </ax-button>
1722
+ </div>
1723
+ </div>
1724
+ </div>
1725
+ } @else {
1726
+ <div class="__root-group">
1727
+ <div class="__group-header">
1728
+ <div class="__group-operator">
1729
+ <label>Root Group:</label>
1730
+ <ax-select-box
1731
+ [dataSource]="logicalOperators"
1732
+ [value]="queryData().logic"
1733
+ textField="text"
1734
+ valueField="value"
1735
+ (onValueChanged)="updateRootLogicalOperator($event.value)"
1736
+ [look]="'outline'">
1737
+ </ax-select-box>
1738
+ </div>
1739
+ </div>
1740
+
1741
+ <div class="__group-content"
1742
+ axDropList
1743
+ (dropListDropped)="reorderRootItems($event)">
1744
+ @for (item of queryData().filters; track item.id; let i = $index) {
1745
+ <div class="__query-item"
1746
+ axDrag>
1747
+
1748
+ <!-- Drag Handle and Move Controls -->
1749
+ <div class="__item-controls">
1750
+ <div class="__drag-handle" axDragHandle>
1751
+ <i class="fa-light fa-grip-dots-vertical"></i>
1752
+ </div>
1753
+ <div class="__move-controls">
1754
+ <ax-button
1755
+ [look]="'blank'"
1756
+ [color]="'default'"
1757
+ [size]="'xs'"
1758
+ [disabled]="i === 0"
1759
+ (onClick)="moveItemUp(i, 'root')">
1760
+ <ax-icon class='fa-light fa-arrow-up'></ax-icon>
1761
+ </ax-button>
1762
+ <ax-button
1763
+ [look]="'blank'"
1764
+ [color]="'default'"
1765
+ [size]="'xs'"
1766
+ [disabled]="i === queryData().filters.length - 1"
1767
+ (onClick)="moveItemDown(i, 'root')">
1768
+ <ax-icon class='fa-light fa-arrow-down'></ax-icon>
1769
+ </ax-button>
1770
+ </div>
1771
+ </div>
1772
+
1773
+ <div class="__item-content">
1774
+ <!-- Logical Operator between items -->
1775
+ @if (i > 0) {
1776
+ <div class="__item-connector">
1777
+ <span class="__operator-badge">{{ queryData().logic }}</span>
1778
+ </div>
1779
+ }
1780
+
1781
+ <!-- Render Condition or Group -->
1782
+ @if (item.type === 'condition') {
1783
+ <axp-query-builder-condition
1784
+ [item]="item"
1785
+ [availableFields]="availableFields()"
1786
+ (itemChange)="updateCondition($event)"
1787
+ (removeItem)="removeItem($event)">
1788
+ </axp-query-builder-condition>
1789
+ } @else {
1790
+ <ng-container [ngTemplateOutlet]="groupTemplate" [ngTemplateOutletContext]="{group: item}"></ng-container>
1791
+ }
1792
+ </div>
1793
+ </div>
1794
+ }
1795
+ </div>
1796
+ </div>
1797
+ }
1798
+ </div>
1799
+
1800
+ @if (queryData().filters.length > 0) {
1801
+ <div class="__footer">
1802
+ <div class="__footer-info">
1803
+ <span class="__item-count">{{ getTotalItemsCount() }} items total</span>
1804
+ </div>
1805
+ <ax-button
1806
+ [look]="'outline'"
1807
+ [color]="'danger'"
1808
+ text="Clear All"
1809
+ (onClick)="clearAll()">
1810
+ <ax-icon class='fa-light fa-trash'></ax-icon>
1811
+ </ax-button>
1812
+ </div>
1813
+ }
1814
+
1815
+ </div>
1816
+
1817
+ <!-- Templates -->
1818
+ <ng-template #groupTemplate let-group="group">
1819
+ <div class="__nested-group">
1820
+ <div class="__group-header">
1821
+ <div class="__group-info">
1822
+ <i class="fa-light fa-layer-group"></i>
1823
+ <span class="__group-label">Group ({{ group.filters.length }} items)</span>
1824
+ </div>
1825
+ <div class="__group-operator">
1826
+ <ax-select-box
1827
+ [dataSource]="logicalOperators"
1828
+ [value]="group.logic"
1829
+ (onValueChanged)="updateGroupLogicalOperator(group.id, $event.value)"
1830
+ [look]="'outline'">
1831
+ </ax-select-box>
1832
+ </div>
1833
+ <div class="__group-actions">
1834
+ <ax-button
1835
+ [look]="'outline'"
1836
+ [color]="'primary'"
1837
+ [size]="'xs'">
1838
+ <ax-icon class='fa-light fa-plus'></ax-icon>
1839
+ <ax-dropdown-panel>
1840
+ <ax-button-item-list>
1841
+ <ax-button-item text="Add Condition" (onClick)="addConditionToGroup(group.id)">
1842
+ <ax-prefix>
1843
+ <ax-icon class="fa-light fa-filter"></ax-icon>
1844
+ </ax-prefix>
1845
+ </ax-button-item>
1846
+ <ax-button-item text="Add Nested Group" (onClick)="addGroupToGroup(group.id)">
1847
+ <ax-prefix>
1848
+ <ax-icon class="fa-light fa-layer-group"></ax-icon>
1849
+ </ax-prefix>
1850
+ </ax-button-item>
1851
+ </ax-button-item-list>
1852
+ </ax-dropdown-panel>
1853
+ </ax-button>
1854
+ <ax-button
1855
+ [look]="'blank'"
1856
+ [color]="'danger'"
1857
+ [size]="'xs'"
1858
+ (onClick)="removeItem(group.id)">
1859
+ <ax-icon class='fa-light fa-trash'></ax-icon>
1860
+ </ax-button>
1861
+ </div>
1862
+ </div>
1863
+
1864
+ <div class="__group-content"
1865
+ axDropList
1866
+ (dropListDropped)="reorderGroupItemsEvent(group.id, $event)">
1867
+ @if (group.filters.length === 0) {
1868
+ <div class="__group-empty">
1869
+ <span>Empty group - add conditions or nested groups</span>
1870
+ </div>
1871
+ } @else {
1872
+ @for (item of group.filters; track item; let i = $index) {
1873
+ <div class="__query-item"
1874
+ axDrag>
1875
+
1876
+ <!-- Drag Handle and Move Controls -->
1877
+ <div class="__item-controls">
1878
+ <div class="__drag-handle" axDragHandle>
1879
+ <i class="fa-light fa-grip-dots-vertical"></i>
1880
+ </div>
1881
+ <div class="__move-controls">
1882
+ <ax-button
1883
+ [look]="'blank'"
1884
+ [color]="'default'"
1885
+ [size]="'xs'"
1886
+ [disabled]="i === 0"
1887
+ (onClick)="moveItemUp(i, group.id)">
1888
+ <ax-icon class='fa-light fa-arrow-up'></ax-icon>
1889
+ </ax-button>
1890
+ <ax-button
1891
+ [look]="'blank'"
1892
+ [color]="'default'"
1893
+ [size]="'xs'"
1894
+ [disabled]="i === group.filters.length - 1"
1895
+ (onClick)="moveItemDown(i, group.id)">
1896
+ <ax-icon class='fa-light fa-arrow-down'></ax-icon>
1897
+ </ax-button>
1898
+ </div>
1899
+ </div>
1900
+
1901
+ <div class="__item-content">
1902
+ <!-- Logical Operator between items -->
1903
+ @if (i > 0) {
1904
+ <div class="__item-connector">
1905
+ <span class="__operator-badge">{{ group.logic }}</span>
1906
+ </div>
1907
+ }
1908
+
1909
+ <!-- Render Condition or Nested Group -->
1910
+ @if (item.type === 'condition') {
1911
+ <axp-query-builder-condition
1912
+ [item]="item"
1913
+ [availableFields]="availableFields()"
1914
+ (itemChange)="updateCondition($event)"
1915
+ (removeItem)="removeItem($event)">
1916
+ </axp-query-builder-condition>
1917
+ } @else {
1918
+ <ng-container [ngTemplateOutlet]="groupTemplate" [ngTemplateOutletContext]="{group: item}"></ng-container>
1919
+ }
1920
+ </div>
1921
+ </div>
1922
+ }
1923
+ }
1924
+ </div>
1925
+ </div>
1926
+ </ng-template>
1927
+ `, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
1928
+ CommonModule,
1929
+ AXButtonModule,
1930
+ AXSelectBoxModule,
1931
+ AXTextBoxModule,
1932
+ AXFormModule,
1933
+ AXDecoratorModule,
1934
+ AXDropdownModule,
1935
+ AXDragDirective,
1936
+ AXDragHandleDirective,
1937
+ AXDropListDirective,
1938
+ AXPQueryBuilderConditionComponent,
1939
+ ], styles: [".__query-builder{width:100%;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.__query-builder .__header{display:flex;align-items:center;justify-content:space-between;border-bottom-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));background-image:linear-gradient(to right,var(--tw-gradient-stops));--tw-gradient-from: #eff6ff var(--tw-gradient-from-position);--tw-gradient-to: rgb(239 246 255 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);--tw-gradient-to: #eef2ff var(--tw-gradient-to-position);padding:1rem}.__query-builder .__header .__title{display:flex;align-items:center;gap:.5rem;font-weight:600;--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.__query-builder .__header .__title i{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.__query-builder .__header .__actions{display:flex;gap:.5rem}.__query-builder .__query-content{padding:1rem}.__query-builder .__query-content .__empty-state{display:flex;min-height:10rem;align-items:center;justify-content:center;text-align:center}.__query-builder .__query-content .__empty-state .__empty-content{display:flex;flex-direction:column;align-items:center;gap:1rem}.__query-builder .__query-content .__empty-state .__empty-content i{font-size:2.25rem;line-height:2.5rem;--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__empty-state .__empty-content p{font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__empty-state .__empty-content .__empty-actions{display:flex;gap:.5rem}.__query-builder .__query-content .__root-group{border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1));padding:1rem}.__query-builder .__query-content .__root-group .__group-header{margin-bottom:1rem;display:flex;align-items:center;justify-content:space-between}.__query-builder .__query-content .__root-group .__group-header .__group-operator{display:flex;align-items:center;gap:.5rem}.__query-builder .__query-content .__root-group .__group-header .__group-operator label{font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__root-group .__group-content>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.__query-builder .__query-content .__root-group .__group-content.ax-drop-list-receiving{border-radius:.5rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1))}.__query-builder .__query-content .__root-group .__group-content .__query-item{display:flex;align-items:flex-start;gap:.75rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.2s;animation-duration:.2s}.__query-builder .__query-content .__root-group .__group-content .__query-item.ax-drag-preview{border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem;--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.__query-builder .__query-content .__root-group .__group-content .__query-item.ax-drag-disabled .__item-controls .__drag-handle{cursor:not-allowed;opacity:.5}.__query-builder .__query-content .__query-item{position:relative}.__query-builder .__query-content .__query-item.ax-drag-preview{--tw-rotate: 2deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));opacity:.8;--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.__query-builder .__query-content .__query-item.ax-drag-placeholder{border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(147 197 253 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1));opacity:.5}.__query-builder .__query-content .__query-item .__item-controls{margin-right:.75rem;display:flex;align-items:center;gap:.5rem}.__query-builder .__query-content .__query-item .__item-controls .__drag-handle{cursor:move;padding:.5rem;--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1));transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.__query-builder .__query-content .__query-item .__item-controls .__drag-handle:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1));border-radius:.25rem;--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.__query-builder .__query-content .__query-item .__item-controls .__move-controls{display:flex;flex-direction:column;gap:.25rem}.__query-builder .__query-content .__query-item .__item-content{flex:1 1 0%}.__query-builder .__query-content .__query-item .__item-connector{display:flex;justify-content:center;padding-top:.5rem;padding-bottom:.5rem}.__query-builder .__query-content .__query-item .__item-connector .__operator-badge{border-radius:9999px;border-width:1px;--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1));padding:.25rem .75rem;font-size:.75rem;line-height:1rem;font-weight:600;--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__condition-card{display:flex;align-items:flex-start;gap:1rem;border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:1rem;--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.__query-builder .__query-content .__condition-card .__condition-content{display:grid;flex:1 1 0%;grid-template-columns:repeat(1,minmax(0,1fr));gap:1rem}@media (min-width: 768px){.__query-builder .__query-content .__condition-card .__condition-content{grid-template-columns:repeat(3,minmax(0,1fr))}}.__query-builder .__query-content .__condition-card .__condition-content .__field-group{display:flex;flex-direction:column;gap:.5rem}.__query-builder .__query-content .__condition-card .__condition-content .__field-group .__field-label{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__condition-card .__condition-actions{display:flex;align-items:center}.__query-builder .__query-content .__nested-group{border-radius:.5rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1));padding:.75rem}.__query-builder .__query-content .__nested-group .__group-header{margin-bottom:.75rem;display:flex;align-items:center;justify-content:space-between;border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem}.__query-builder .__query-content .__nested-group .__group-header .__group-info{display:flex;align-items:center;gap:.5rem}.__query-builder .__query-content .__nested-group .__group-header .__group-info i{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__nested-group .__group-header .__group-info .__group-label{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__nested-group .__group-header .__group-operator{display:flex;align-items:center;gap:.5rem}.__query-builder .__query-content .__nested-group .__group-header .__group-actions{display:flex;align-items:center;gap:.25rem}.__query-builder .__query-content .__nested-group .__group-content>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.__query-builder .__query-content .__nested-group .__group-content .__group-empty{padding-top:1rem;padding-bottom:1rem;text-align:center;font-size:.875rem;line-height:1.25rem;font-style:italic;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__nested-group .__nested-group{margin-left:1rem;--tw-border-opacity: 1;border-color:rgb(253 186 116 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.__query-builder .__query-content .__nested-group .__nested-group .__group-header{--tw-border-opacity: 1;border-color:rgb(254 215 170 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.__query-builder .__query-content .__nested-group .__nested-group .__group-header .__group-info i{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.__query-builder .__query-content .__nested-group .__nested-group .__nested-group{margin-left:1rem;--tw-border-opacity: 1;border-color:rgb(216 180 254 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.__query-builder .__query-content .__nested-group .__nested-group .__nested-group .__group-header{--tw-border-opacity: 1;border-color:rgb(233 213 255 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.__query-builder .__query-content .__nested-group .__nested-group .__nested-group .__group-header .__group-info i{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.__query-builder .__footer{display:flex;align-items:center;justify-content:space-between;border-top-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1));padding:1rem}.__query-builder .__footer .__footer-info{display:flex;align-items:center;gap:.5rem}.__query-builder .__footer .__footer-info .__item-count{font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}\n"] }]
1940
+ }], ctorParameters: () => [] });
1941
+
1942
+ var queryBuilderWidgetEdit_component = /*#__PURE__*/Object.freeze({
1943
+ __proto__: null,
1944
+ AXPQueryBuilderWidgetEditComponent: AXPQueryBuilderWidgetEditComponent
1945
+ });
1946
+
1947
+ //#endregion
1948
+ class AXPQueryBuilderWidgetViewComponent extends AXPValueWidgetComponent {
1949
+ constructor() {
1950
+ super(...arguments);
1951
+ //#region ---- Computed Properties ----
1952
+ this.queryData = computed(() => {
1953
+ const value = this.getValue();
1954
+ console.log(value);
1955
+ return value;
1956
+ });
1957
+ }
1958
+ //#endregion
1959
+ //#region ---- Public Methods ----
1960
+ getTotalItemsCount() {
1961
+ const countFilters = (filters) => {
1962
+ if (!filters)
1963
+ return 0;
1964
+ return filters.reduce((count, filter) => {
1965
+ if (filter.type === 'condition') {
1966
+ return count + 1;
1967
+ }
1968
+ else {
1969
+ return count + 1 + countFilters(filter.filters);
1970
+ }
1971
+ }, 0);
1972
+ };
1973
+ const data = this.queryData();
1974
+ return data?.filters ? countFilters(data.filters) : 0;
1975
+ }
1976
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPQueryBuilderWidgetViewComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
1977
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.7", type: AXPQueryBuilderWidgetViewComponent, isStandalone: true, selector: "axp-query-builder-widget-view", usesInheritance: true, ngImport: i0, template: `
1978
+ <div class="__query-builder-view">
1979
+ @if (queryData().filters.length) {
1980
+ <div class="__query-display">
1981
+ <div class="__root-group">
1982
+ <div class="__group-header">
1983
+ <span class="__group-title">Query ({{ queryData().logic }})</span>
1984
+ </div>
1985
+ <div class="__group-content">
1986
+ @for (item of queryData().filters; track item.id; let i = $index) {
1987
+ <div class="__query-item">
1988
+ <!-- Logical Operator -->
1989
+ @if (i > 0) {
1990
+ <div class="__item-connector">
1991
+ <span class="__operator-badge">{{ queryData().logic }}</span>
1992
+ </div>
1993
+ }
1994
+
1995
+ <!-- Render Item -->
1996
+ @if (item.type === 'condition') {
1997
+ <ng-container [ngTemplateOutlet]="conditionTemplate" [ngTemplateOutletContext]="{condition: item}"></ng-container>
1998
+ } @else {
1999
+ <ng-container [ngTemplateOutlet]="groupTemplate" [ngTemplateOutletContext]="{group: item}"></ng-container>
2000
+ }
2001
+ </div>
2002
+ }
2003
+ </div>
2004
+ </div>
2005
+ </div>
2006
+
2007
+ <div class="__summary">
2008
+ <small class="__count">{{ getTotalItemsCount() }} item(s) total</small>
2009
+ </div>
2010
+ } @else {
2011
+ <div class="__empty-state">
2012
+ <span class="__empty-message">No query conditions defined</span>
2013
+ </div>
2014
+ }
2015
+ </div>
2016
+
2017
+ <!-- Templates -->
2018
+ <ng-template #conditionTemplate let-condition="condition">
2019
+ <div class="__condition-display">
2020
+ <span class="__field">{{ condition.field }}</span>
2021
+ <span class="__operator">{{ condition.operator.type }}</span>
2022
+ <span class="__value">{{ condition.value }}</span>
2023
+ </div>
2024
+ </ng-template>
2025
+
2026
+ <ng-template #groupTemplate let-group="group">
2027
+ <div class="__group-display">
2028
+ <div class="__group-header">
2029
+ <span class="__group-title">Group ({{ group.logic }}) - {{ group.filters.length }} items</span>
2030
+ </div>
2031
+ <div class="__group-content">
2032
+ @for (item of group.filters; track item.id; let i = $index) {
2033
+ <div class="__query-item">
2034
+ <!-- Logical Operator -->
2035
+ @if (i > 0) {
2036
+ <div class="__item-connector">
2037
+ <span class="__operator-badge">{{ group.logic }}</span>
2038
+ </div>
2039
+ }
2040
+
2041
+ <!-- Render Item -->
2042
+ @if (item.type === 'condition') {
2043
+ <ng-container [ngTemplateOutlet]="conditionTemplate" [ngTemplateOutletContext]="{condition: item}"></ng-container>
2044
+ } @else {
2045
+ <ng-container [ngTemplateOutlet]="groupTemplate" [ngTemplateOutletContext]="{group: item}"></ng-container>
2046
+ }
2047
+ </div>
2048
+ }
2049
+ </div>
2050
+ </div>
2051
+ </ng-template>
2052
+ `, isInline: true, styles: [".__query-builder-view{width:100%;border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.__query-builder-view .__query-display{padding:.75rem}.__query-builder-view .__query-display .__root-group{border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1));padding:.75rem}.__query-builder-view .__query-display .__root-group .__group-header{margin-bottom:.75rem}.__query-builder-view .__query-display .__root-group .__group-header .__group-title{font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.__query-builder-view .__query-display .__root-group .__group-content>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.__query-builder-view .__query-display .__query-item{position:relative}.__query-builder-view .__query-display .__query-item .__item-connector{display:flex;justify-content:center;padding-top:.25rem;padding-bottom:.25rem}.__query-builder-view .__query-display .__query-item .__item-connector .__operator-badge{border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1));padding:.25rem .5rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.__query-builder-view .__query-display .__condition-display{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem}.__query-builder-view .__query-display .__condition-display .__field{border-radius:.25rem;--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1));padding:.25rem .5rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.__query-builder-view .__query-display .__condition-display .__operator{border-radius:.25rem;--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1));padding:.25rem .5rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.__query-builder-view .__query-display .__condition-display .__value{border-radius:.25rem;--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1));padding:.25rem .5rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.__query-builder-view .__query-display .__group-display{border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));padding:.5rem}.__query-builder-view .__query-display .__group-display .__group-header{margin-bottom:.5rem}.__query-builder-view .__query-display .__group-display .__group-header .__group-title{font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.__query-builder-view .__query-display .__group-display .__group-content>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.__query-builder-view .__query-display .__group-display .__group-display{--tw-border-opacity: 1;border-color:rgb(253 186 116 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.__query-builder-view .__query-display .__group-display .__group-display .__group-display{--tw-border-opacity: 1;border-color:rgb(216 180 254 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.__query-builder-view .__summary{border-top-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));padding:.5rem .75rem}.__query-builder-view .__summary .__count{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.__query-builder-view .__empty-state{padding:1rem;text-align:center}.__query-builder-view .__empty-state .__empty-message{font-size:.875rem;line-height:1.25rem;font-style:italic;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2053
+ }
2054
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPQueryBuilderWidgetViewComponent, decorators: [{
2055
+ type: Component,
2056
+ args: [{ selector: 'axp-query-builder-widget-view', template: `
2057
+ <div class="__query-builder-view">
2058
+ @if (queryData().filters.length) {
2059
+ <div class="__query-display">
2060
+ <div class="__root-group">
2061
+ <div class="__group-header">
2062
+ <span class="__group-title">Query ({{ queryData().logic }})</span>
2063
+ </div>
2064
+ <div class="__group-content">
2065
+ @for (item of queryData().filters; track item.id; let i = $index) {
2066
+ <div class="__query-item">
2067
+ <!-- Logical Operator -->
2068
+ @if (i > 0) {
2069
+ <div class="__item-connector">
2070
+ <span class="__operator-badge">{{ queryData().logic }}</span>
2071
+ </div>
2072
+ }
2073
+
2074
+ <!-- Render Item -->
2075
+ @if (item.type === 'condition') {
2076
+ <ng-container [ngTemplateOutlet]="conditionTemplate" [ngTemplateOutletContext]="{condition: item}"></ng-container>
2077
+ } @else {
2078
+ <ng-container [ngTemplateOutlet]="groupTemplate" [ngTemplateOutletContext]="{group: item}"></ng-container>
2079
+ }
2080
+ </div>
2081
+ }
2082
+ </div>
2083
+ </div>
2084
+ </div>
2085
+
2086
+ <div class="__summary">
2087
+ <small class="__count">{{ getTotalItemsCount() }} item(s) total</small>
2088
+ </div>
2089
+ } @else {
2090
+ <div class="__empty-state">
2091
+ <span class="__empty-message">No query conditions defined</span>
2092
+ </div>
2093
+ }
2094
+ </div>
2095
+
2096
+ <!-- Templates -->
2097
+ <ng-template #conditionTemplate let-condition="condition">
2098
+ <div class="__condition-display">
2099
+ <span class="__field">{{ condition.field }}</span>
2100
+ <span class="__operator">{{ condition.operator.type }}</span>
2101
+ <span class="__value">{{ condition.value }}</span>
2102
+ </div>
2103
+ </ng-template>
2104
+
2105
+ <ng-template #groupTemplate let-group="group">
2106
+ <div class="__group-display">
2107
+ <div class="__group-header">
2108
+ <span class="__group-title">Group ({{ group.logic }}) - {{ group.filters.length }} items</span>
2109
+ </div>
2110
+ <div class="__group-content">
2111
+ @for (item of group.filters; track item.id; let i = $index) {
2112
+ <div class="__query-item">
2113
+ <!-- Logical Operator -->
2114
+ @if (i > 0) {
2115
+ <div class="__item-connector">
2116
+ <span class="__operator-badge">{{ group.logic }}</span>
2117
+ </div>
2118
+ }
2119
+
2120
+ <!-- Render Item -->
2121
+ @if (item.type === 'condition') {
2122
+ <ng-container [ngTemplateOutlet]="conditionTemplate" [ngTemplateOutletContext]="{condition: item}"></ng-container>
2123
+ } @else {
2124
+ <ng-container [ngTemplateOutlet]="groupTemplate" [ngTemplateOutletContext]="{group: item}"></ng-container>
2125
+ }
2126
+ </div>
2127
+ }
2128
+ </div>
2129
+ </div>
2130
+ </ng-template>
2131
+ `, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule], styles: [".__query-builder-view{width:100%;border-radius:.375rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.__query-builder-view .__query-display{padding:.75rem}.__query-builder-view .__query-display .__root-group{border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(239 246 255 / var(--tw-bg-opacity, 1));padding:.75rem}.__query-builder-view .__query-display .__root-group .__group-header{margin-bottom:.75rem}.__query-builder-view .__query-display .__root-group .__group-header .__group-title{font-size:.875rem;line-height:1.25rem;font-weight:600;--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.__query-builder-view .__query-display .__root-group .__group-content>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.__query-builder-view .__query-display .__query-item{position:relative}.__query-builder-view .__query-display .__query-item .__item-connector{display:flex;justify-content:center;padding-top:.25rem;padding-bottom:.25rem}.__query-builder-view .__query-display .__query-item .__item-connector .__operator-badge{border-radius:9999px;--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1));padding:.25rem .5rem;font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.__query-builder-view .__query-display .__condition-display{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1));padding:.5rem}.__query-builder-view .__query-display .__condition-display .__field{border-radius:.25rem;--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1));padding:.25rem .5rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.__query-builder-view .__query-display .__condition-display .__operator{border-radius:.25rem;--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1));padding:.25rem .5rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.__query-builder-view .__query-display .__condition-display .__value{border-radius:.25rem;--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1));padding:.25rem .5rem;font-size:.875rem;line-height:1.25rem;font-weight:500;--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.__query-builder-view .__query-display .__group-display{border-radius:.25rem;border-width:1px;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));padding:.5rem}.__query-builder-view .__query-display .__group-display .__group-header{margin-bottom:.5rem}.__query-builder-view .__query-display .__group-display .__group-header .__group-title{font-size:.75rem;line-height:1rem;font-weight:500;--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.__query-builder-view .__query-display .__group-display .__group-content>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.__query-builder-view .__query-display .__group-display .__group-display{--tw-border-opacity: 1;border-color:rgb(253 186 116 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.__query-builder-view .__query-display .__group-display .__group-display .__group-display{--tw-border-opacity: 1;border-color:rgb(216 180 254 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.__query-builder-view .__summary{border-top-width:1px;--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1));--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1));padding:.5rem .75rem}.__query-builder-view .__summary .__count{font-size:.75rem;line-height:1rem;--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.__query-builder-view .__empty-state{padding:1rem;text-align:center}.__query-builder-view .__empty-state .__empty-message{font-size:.875rem;line-height:1.25rem;font-style:italic;--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}\n"] }]
2132
+ }] });
2133
+
2134
+ var queryBuilderWidgetView_component = /*#__PURE__*/Object.freeze({
2135
+ __proto__: null,
2136
+ AXPQueryBuilderWidgetViewComponent: AXPQueryBuilderWidgetViewComponent
2137
+ });
2138
+
2139
+ //#endregion
2140
+ class AXPQueryBuilderWidgetColumnComponent extends AXPValueWidgetComponent {
2141
+ constructor() {
2142
+ super(...arguments);
2143
+ //#region ---- Computed Properties ----
2144
+ this.queryData = computed(() => {
2145
+ const value = this.getValue();
2146
+ return value;
2147
+ });
2148
+ }
2149
+ //#endregion
2150
+ //#region ---- Public Methods ----
2151
+ getTotalItemsCount() {
2152
+ const countFilters = (filters) => {
2153
+ if (!filters)
2154
+ return 0;
2155
+ return filters.reduce((count, filter) => {
2156
+ if (filter.type === 'condition') {
2157
+ return count + 1;
2158
+ }
2159
+ else {
2160
+ return count + 1 + countFilters(filter.filters);
2161
+ }
2162
+ }, 0);
2163
+ };
2164
+ const data = this.queryData();
2165
+ return data?.filters ? countFilters(data.filters) : 0;
2166
+ }
2167
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPQueryBuilderWidgetColumnComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2168
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.7", type: AXPQueryBuilderWidgetColumnComponent, isStandalone: true, selector: "axp-query-builder-widget-column", usesInheritance: true, ngImport: i0, template: `
2169
+ <div class="__query-builder-column">
2170
+ @if (queryData().filters.length) {
2171
+ <span class="__summary">{{ getTotalItemsCount() }} item(s)</span>
2172
+ } @else {
2173
+ <span class="__empty">No conditions</span>
2174
+ }
2175
+ </div>
2176
+ `, isInline: true, styles: [".__query-builder-column{font-size:.875rem;line-height:1.25rem}.__query-builder-column .__summary{font-weight:500}.__query-builder-column .__summary{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.__query-builder-column .__empty{font-style:italic}.__query-builder-column .__empty{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2177
+ }
2178
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPQueryBuilderWidgetColumnComponent, decorators: [{
2179
+ type: Component,
2180
+ args: [{ selector: 'axp-query-builder-widget-column', template: `
2181
+ <div class="__query-builder-column">
2182
+ @if (queryData().filters.length) {
2183
+ <span class="__summary">{{ getTotalItemsCount() }} item(s)</span>
2184
+ } @else {
2185
+ <span class="__empty">No conditions</span>
2186
+ }
2187
+ </div>
2188
+ `, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule], styles: [".__query-builder-column{font-size:.875rem;line-height:1.25rem}.__query-builder-column .__summary{font-weight:500}.__query-builder-column .__summary{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.__query-builder-column .__empty{font-style:italic}.__query-builder-column .__empty{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}\n"] }]
2189
+ }] });
2190
+
2191
+ var queryBuilderWidgetColumn_component = /*#__PURE__*/Object.freeze({
2192
+ __proto__: null,
2193
+ AXPQueryBuilderWidgetColumnComponent: AXPQueryBuilderWidgetColumnComponent
2194
+ });
2195
+
2196
+ class AXPQueryBuilderWidgetDesignerComponent extends AXPValueWidgetComponent {
2197
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPQueryBuilderWidgetDesignerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
2198
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.0.7", type: AXPQueryBuilderWidgetDesignerComponent, isStandalone: true, selector: "axp-query-builder-widget-designer", usesInheritance: true, ngImport: i0, template: `
2199
+ <div class="__query-builder-designer">
2200
+ <div class="__preview">
2201
+ <div class="__icon">
2202
+ <i class="fa-light fa-filter"></i>
2203
+ </div>
2204
+ <div class="__content">
2205
+ <h4 class="__title">Query Builder</h4>
2206
+ <p class="__description">Visual query builder for creating dynamic queries</p>
2207
+ </div>
2208
+ </div>
2209
+ </div>
2210
+ `, isInline: true, styles: [".__query-builder-designer{width:100%;border-radius:.5rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));padding:1rem}.__query-builder-designer .__preview{display:flex}.__query-builder-designer .__preview{align-items:center}.__query-builder-designer .__preview{gap:.75rem}.__query-builder-designer .__preview .__icon{display:flex}.__query-builder-designer .__preview .__icon{height:2.5rem}.__query-builder-designer .__preview .__icon{width:2.5rem}.__query-builder-designer .__preview .__icon{align-items:center}.__query-builder-designer .__preview .__icon{justify-content:center}.__query-builder-designer .__preview .__icon{border-radius:.5rem}.__query-builder-designer .__preview .__icon{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.__query-builder-designer .__preview .__icon i{font-size:1.125rem;line-height:1.75rem}.__query-builder-designer .__preview .__icon i{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.__query-builder-designer .__preview .__content .__title{margin-bottom:.25rem}.__query-builder-designer .__preview .__content .__title{font-size:.875rem;line-height:1.25rem}.__query-builder-designer .__preview .__content .__title{font-weight:600}.__query-builder-designer .__preview .__content .__title{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.__query-builder-designer .__preview .__content .__description{font-size:.75rem;line-height:1rem}.__query-builder-designer .__preview .__content .__description{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
2211
+ }
2212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXPQueryBuilderWidgetDesignerComponent, decorators: [{
2213
+ type: Component,
2214
+ args: [{ selector: 'axp-query-builder-widget-designer', template: `
2215
+ <div class="__query-builder-designer">
2216
+ <div class="__preview">
2217
+ <div class="__icon">
2218
+ <i class="fa-light fa-filter"></i>
2219
+ </div>
2220
+ <div class="__content">
2221
+ <h4 class="__title">Query Builder</h4>
2222
+ <p class="__description">Visual query builder for creating dynamic queries</p>
2223
+ </div>
2224
+ </div>
2225
+ </div>
2226
+ `, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule], styles: [".__query-builder-designer{width:100%;border-radius:.5rem;border-width:2px;border-style:dashed;--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1));padding:1rem}.__query-builder-designer .__preview{display:flex}.__query-builder-designer .__preview{align-items:center}.__query-builder-designer .__preview{gap:.75rem}.__query-builder-designer .__preview .__icon{display:flex}.__query-builder-designer .__preview .__icon{height:2.5rem}.__query-builder-designer .__preview .__icon{width:2.5rem}.__query-builder-designer .__preview .__icon{align-items:center}.__query-builder-designer .__preview .__icon{justify-content:center}.__query-builder-designer .__preview .__icon{border-radius:.5rem}.__query-builder-designer .__preview .__icon{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.__query-builder-designer .__preview .__icon i{font-size:1.125rem;line-height:1.75rem}.__query-builder-designer .__preview .__icon i{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.__query-builder-designer .__preview .__content .__title{margin-bottom:.25rem}.__query-builder-designer .__preview .__content .__title{font-size:.875rem;line-height:1.25rem}.__query-builder-designer .__preview .__content .__title{font-weight:600}.__query-builder-designer .__preview .__content .__title{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.__query-builder-designer .__preview .__content .__description{font-size:.75rem;line-height:1rem}.__query-builder-designer .__preview .__content .__description{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}\n"] }]
2227
+ }] });
2228
+
2229
+ var queryBuilderWidgetDesigner_component = /*#__PURE__*/Object.freeze({
2230
+ __proto__: null,
2231
+ AXPQueryBuilderWidgetDesignerComponent: AXPQueryBuilderWidgetDesignerComponent
2232
+ });
2233
+
2234
+ class AXMDataManagementModule {
2235
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMDataManagementModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
2236
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.0.7", ngImport: i0, type: AXMDataManagementModule, imports: [i4$1.AXPLayoutBuilderModule] }); }
2237
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMDataManagementModule, providers: [
2238
+ {
2239
+ provide: AXP_MENU_PROVIDER,
2240
+ useClass: AXMMenuProvider,
2241
+ multi: true,
2242
+ },
2243
+ {
2244
+ provide: AXP_ENTITY_DEFINITION_LOADER,
2245
+ useClass: AXMEntityProvider,
2246
+ multi: true,
2247
+ },
2248
+ {
2249
+ provide: AXP_SETTING_DEFINITION_PROVIDER,
2250
+ useClass: AXMSettingProvider,
2251
+ multi: true,
2252
+ },
2253
+ {
2254
+ provide: AXP_SEARCH_PROVIDER,
2255
+ useClass: AXMSearchCommandProvider,
2256
+ multi: true,
2257
+ },
2258
+ {
2259
+ provide: AXP_PERMISSION_DEFINITION_PROVIDER,
2260
+ useClass: AXMPermissionDefinitionProvider,
2261
+ multi: true,
2262
+ },
2263
+ {
2264
+ provide: AXMQueryCategoryService,
2265
+ useClass: AXMQueryCategoryServiceImpl,
2266
+ },
2267
+ {
2268
+ provide: AXMQueryService,
2269
+ useClass: AXMQueryServiceImpl,
2270
+ }
2271
+ ], imports: [AXPLayoutBuilderModule.forChild({
2272
+ widgets: [AXPQueryBuilderWidget],
2273
+ })] }); }
2274
+ }
2275
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.7", ngImport: i0, type: AXMDataManagementModule, decorators: [{
2276
+ type: NgModule,
2277
+ args: [{
2278
+ imports: [
2279
+ AXPLayoutBuilderModule.forChild({
2280
+ widgets: [AXPQueryBuilderWidget],
2281
+ }),
2282
+ ],
2283
+ exports: [],
2284
+ declarations: [],
2285
+ providers: [
2286
+ {
2287
+ provide: AXP_MENU_PROVIDER,
2288
+ useClass: AXMMenuProvider,
2289
+ multi: true,
2290
+ },
2291
+ {
2292
+ provide: AXP_ENTITY_DEFINITION_LOADER,
2293
+ useClass: AXMEntityProvider,
2294
+ multi: true,
2295
+ },
2296
+ {
2297
+ provide: AXP_SETTING_DEFINITION_PROVIDER,
2298
+ useClass: AXMSettingProvider,
2299
+ multi: true,
2300
+ },
2301
+ {
2302
+ provide: AXP_SEARCH_PROVIDER,
2303
+ useClass: AXMSearchCommandProvider,
2304
+ multi: true,
2305
+ },
2306
+ {
2307
+ provide: AXP_PERMISSION_DEFINITION_PROVIDER,
2308
+ useClass: AXMPermissionDefinitionProvider,
2309
+ multi: true,
2310
+ },
2311
+ {
2312
+ provide: AXMQueryCategoryService,
2313
+ useClass: AXMQueryCategoryServiceImpl,
2314
+ },
2315
+ {
2316
+ provide: AXMQueryService,
2317
+ useClass: AXMQueryServiceImpl,
2318
+ }
2319
+ ]
2320
+ }]
2321
+ }] });
2322
+
2323
+ /**
2324
+ * Generated bundle index. Do not edit.
2325
+ */
2326
+
2327
+ export { AXMDataManagementModule, AXMEntityProvider, AXMMenuProvider, AXMQueryCategoryService, AXMQueryCategoryServiceImpl, AXMQueryService, AXMQueryServiceImpl, AXMSearchCommandProvider, AXMSettingProvider, RootConfig, queryCategoryFactory, queryFactory };
2328
+ //# sourceMappingURL=acorex-modules-data-management.mjs.map