@memberjunction/ng-dashboards 5.39.0 → 5.40.0

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 (129) hide show
  1. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts +128 -4
  2. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.d.ts.map +1 -1
  3. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js +548 -145
  4. package/dist/AI/components/autotagging/autotagging-pipeline-resource.component.js.map +1 -1
  5. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts +56 -0
  6. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.d.ts.map +1 -0
  7. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js +423 -0
  8. package/dist/AI/components/autotagging/components/classify-item-drilldown.component.js.map +1 -0
  9. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts +70 -0
  10. package/dist/AI/components/autotagging/components/classify-item-grid.component.d.ts.map +1 -0
  11. package/dist/AI/components/autotagging/components/classify-item-grid.component.js +308 -0
  12. package/dist/AI/components/autotagging/components/classify-item-grid.component.js.map +1 -0
  13. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts +29 -0
  14. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.d.ts.map +1 -0
  15. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js +186 -0
  16. package/dist/AI/components/autotagging/components/classify-org-context-editor.component.js.map +1 -0
  17. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts +69 -0
  18. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.d.ts.map +1 -0
  19. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js +278 -0
  20. package/dist/AI/components/autotagging/components/classify-overview-analytics.component.js.map +1 -0
  21. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts +73 -0
  22. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.d.ts.map +1 -0
  23. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js +393 -0
  24. package/dist/AI/components/autotagging/components/classify-seed-taxonomy.component.js.map +1 -0
  25. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts +122 -0
  26. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.d.ts.map +1 -0
  27. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js +908 -0
  28. package/dist/AI/components/autotagging/dialogs/classify-setup-wizard.component.js.map +1 -0
  29. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts +100 -2
  30. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.d.ts.map +1 -1
  31. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js +603 -213
  32. package/dist/AI/components/autotagging/dialogs/source-type-form.dialog.component.js.map +1 -1
  33. package/dist/AI/components/autotagging/shared/classify.format.d.ts +15 -0
  34. package/dist/AI/components/autotagging/shared/classify.format.d.ts.map +1 -1
  35. package/dist/AI/components/autotagging/shared/classify.format.js +51 -0
  36. package/dist/AI/components/autotagging/shared/classify.format.js.map +1 -1
  37. package/dist/AI/components/autotagging/shared/classify.types.d.ts +43 -0
  38. package/dist/AI/components/autotagging/shared/classify.types.d.ts.map +1 -1
  39. package/dist/AI/components/autotagging/shared/classify.types.js.map +1 -1
  40. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts +38 -1
  41. package/dist/AI/components/autotagging/tabs/history-tab.component.d.ts.map +1 -1
  42. package/dist/AI/components/autotagging/tabs/history-tab.component.js +185 -68
  43. package/dist/AI/components/autotagging/tabs/history-tab.component.js.map +1 -1
  44. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts +10 -1
  45. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.d.ts.map +1 -1
  46. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js +249 -188
  47. package/dist/AI/components/autotagging/tabs/pipeline-tab.component.js.map +1 -1
  48. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts +12 -1
  49. package/dist/AI/components/autotagging/tabs/sources-tab.component.d.ts.map +1 -1
  50. package/dist/AI/components/autotagging/tabs/sources-tab.component.js +377 -296
  51. package/dist/AI/components/autotagging/tabs/sources-tab.component.js.map +1 -1
  52. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts +8 -0
  53. package/dist/AI/components/autotagging/tabs/tags-tab.component.d.ts.map +1 -1
  54. package/dist/AI/components/autotagging/tabs/tags-tab.component.js +112 -68
  55. package/dist/AI/components/autotagging/tabs/tags-tab.component.js.map +1 -1
  56. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts +9 -0
  57. package/dist/AI/components/autotagging/tabs/types-tab.component.d.ts.map +1 -1
  58. package/dist/AI/components/autotagging/tabs/types-tab.component.js +87 -36
  59. package/dist/AI/components/autotagging/tabs/types-tab.component.js.map +1 -1
  60. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts +3 -0
  61. package/dist/AI/components/duplicates/duplicate-detection-resource.component.d.ts.map +1 -1
  62. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js +15 -3
  63. package/dist/AI/components/duplicates/duplicate-detection-resource.component.js.map +1 -1
  64. package/dist/AI/components/execution-monitoring.component.js +1 -1
  65. package/dist/AI/components/execution-monitoring.component.js.map +1 -1
  66. package/dist/AI/components/tags/tags-resource.component.d.ts +1 -0
  67. package/dist/AI/components/tags/tags-resource.component.d.ts.map +1 -1
  68. package/dist/AI/components/tags/tags-resource.component.js +28 -6
  69. package/dist/AI/components/tags/tags-resource.component.js.map +1 -1
  70. package/dist/AI/components/vectors/vector-management-resource.component.d.ts +3 -0
  71. package/dist/AI/components/vectors/vector-management-resource.component.d.ts.map +1 -1
  72. package/dist/AI/components/vectors/vector-management-resource.component.js +330 -302
  73. package/dist/AI/components/vectors/vector-management-resource.component.js.map +1 -1
  74. package/dist/APIKeys/api-applications-panel.component.js +2 -2
  75. package/dist/APIKeys/api-key-create-dialog.component.js +2 -2
  76. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +31 -340
  77. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  78. package/dist/DataExplorer/data-explorer-dashboard.component.js +468 -1958
  79. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  80. package/dist/DataExplorer/data-explorer-resource.component.d.ts.map +1 -1
  81. package/dist/DataExplorer/data-explorer-resource.component.js +10 -0
  82. package/dist/DataExplorer/data-explorer-resource.component.js.map +1 -1
  83. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.d.ts.map +1 -1
  84. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js +12 -9
  85. package/dist/KnowledgeHub/components/analytics/analytics-resource.component.js.map +1 -1
  86. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts +27 -2
  87. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.d.ts.map +1 -1
  88. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js +244 -120
  89. package/dist/KnowledgeHub/components/clusters/cluster-visualization-resource.component.js.map +1 -1
  90. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts +65 -0
  91. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.d.ts.map +1 -0
  92. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js +176 -0
  93. package/dist/KnowledgeHub/components/visualize/record-drilldown/record-drilldown.component.js.map +1 -0
  94. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts +81 -0
  95. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.d.ts.map +1 -0
  96. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js +308 -0
  97. package/dist/KnowledgeHub/components/visualize/tag-cloud/tag-cloud.component.js.map +1 -0
  98. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts +85 -0
  99. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.d.ts.map +1 -0
  100. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js +362 -0
  101. package/dist/KnowledgeHub/components/visualize/visualize-resource.component.js.map +1 -0
  102. package/dist/KnowledgeHub/index.d.ts +3 -0
  103. package/dist/KnowledgeHub/index.d.ts.map +1 -1
  104. package/dist/KnowledgeHub/index.js +3 -0
  105. package/dist/KnowledgeHub/index.js.map +1 -1
  106. package/dist/MCP/components/mcp-server-dialog.component.js +2 -2
  107. package/dist/QueryBrowser/query-browser-resource.component.js +1 -1
  108. package/dist/QueryBrowser/query-browser-resource.component.js.map +1 -1
  109. package/dist/ai-dashboards.module.d.ts +48 -38
  110. package/dist/ai-dashboards.module.d.ts.map +1 -1
  111. package/dist/ai-dashboards.module.js +41 -1
  112. package/dist/ai-dashboards.module.js.map +1 -1
  113. package/dist/data-explorer-dashboards.module.d.ts +12 -14
  114. package/dist/data-explorer-dashboards.module.d.ts.map +1 -1
  115. package/dist/data-explorer-dashboards.module.js +5 -14
  116. package/dist/data-explorer-dashboards.module.js.map +1 -1
  117. package/dist/public-api.d.ts +3 -0
  118. package/dist/public-api.d.ts.map +1 -1
  119. package/dist/public-api.js +3 -0
  120. package/dist/public-api.js.map +1 -1
  121. package/package.json +57 -55
  122. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +0 -79
  123. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +0 -1
  124. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +0 -195
  125. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +0 -1
  126. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts +0 -226
  127. package/dist/DataExplorer/components/view-selector/view-selector.component.d.ts.map +0 -1
  128. package/dist/DataExplorer/components/view-selector/view-selector.component.js +0 -861
  129. package/dist/DataExplorer/components/view-selector/view-selector.component.js.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@memberjunction/ng-dashboards",
3
- "version": "5.39.0",
3
+ "version": "5.40.0",
4
4
  "description": "MemberJunction Dashboards",
5
5
  "main": "./dist/public-api.js",
6
6
  "typings": "./dist/public-api.d.ts",
@@ -93,60 +93,62 @@
93
93
  "@codemirror/merge": "^6.11.2",
94
94
  "@codemirror/state": "^6.5.4",
95
95
  "@codemirror/view": "^6.39.12",
96
- "@memberjunction/actions-base": "5.39.0",
97
- "@memberjunction/ai-core-plus": "5.39.0",
98
- "@memberjunction/ai-engine-base": "5.39.0",
99
- "@memberjunction/api-keys-base": "5.39.0",
100
- "@memberjunction/core": "5.39.0",
101
- "@memberjunction/core-entities": "5.39.0",
102
- "@memberjunction/credentials": "5.39.0",
103
- "@memberjunction/export-engine": "5.39.0",
104
- "@memberjunction/tag-engine-base": "5.39.0",
105
- "@memberjunction/global": "5.39.0",
106
- "@memberjunction/graphql-dataprovider": "5.39.0",
107
- "@memberjunction/integration-engine-base": "5.39.0",
108
- "@memberjunction/interactive-component-types": "5.39.0",
109
- "@memberjunction/lists-base": "5.39.0",
110
- "@memberjunction/ng-action-gallery": "5.39.0",
111
- "@memberjunction/ng-actions": "5.39.0",
112
- "@memberjunction/ng-agent-requests": "5.39.0",
113
- "@memberjunction/ng-agents": "5.39.0",
114
- "@memberjunction/ng-ai-test-harness": "5.39.0",
115
- "@memberjunction/ng-archive-manager": "5.39.0",
116
- "@memberjunction/ng-base-application": "5.39.0",
117
- "@memberjunction/ng-base-types": "5.39.0",
118
- "@memberjunction/ng-clustering": "5.39.0",
119
- "@memberjunction/ng-code-editor": "5.39.0",
120
- "@memberjunction/ng-container-directives": "5.39.0",
121
- "@memberjunction/ng-conversations": "5.39.0",
122
- "@memberjunction/ng-core-entity-forms": "5.39.0",
123
- "@memberjunction/ng-credentials": "5.39.0",
124
- "@memberjunction/ng-dashboard-viewer": "5.39.0",
125
- "@memberjunction/ng-entity-relationship-diagram": "5.39.0",
126
- "@memberjunction/ng-entity-viewer": "5.39.0",
127
- "@memberjunction/ng-explorer-settings": "5.39.0",
128
- "@memberjunction/ng-export-service": "5.39.0",
129
- "@memberjunction/ng-filter-builder": "5.39.0",
130
- "@memberjunction/ng-list-management": "5.39.0",
131
- "@memberjunction/ng-map-view": "5.39.0",
132
- "@memberjunction/ng-markdown": "5.39.0",
133
- "@memberjunction/ng-notifications": "5.39.0",
134
- "@memberjunction/ng-query-viewer": "5.39.0",
135
- "@memberjunction/ng-base-forms": "5.39.0",
136
- "@memberjunction/ng-react": "5.39.0",
137
- "@memberjunction/ng-resource-permissions": "5.39.0",
138
- "@memberjunction/ng-scheduling": "5.39.0",
139
- "@memberjunction/ng-search": "5.39.0",
140
- "@memberjunction/ng-shared": "5.39.0",
141
- "@memberjunction/ng-shared-generic": "5.39.0",
142
- "@memberjunction/ng-testing": "5.39.0",
143
- "@memberjunction/ng-trees": "5.39.0",
144
- "@memberjunction/ng-ui-components": "5.39.0",
145
- "@memberjunction/ng-versions": "5.39.0",
146
- "@memberjunction/ng-word-cloud": "5.39.0",
147
- "@memberjunction/skip-types": "5.39.0",
148
- "@memberjunction/templates-base-types": "5.39.0",
149
- "@memberjunction/testing-engine-base": "5.39.0",
96
+ "@memberjunction/actions-base": "5.40.0",
97
+ "@memberjunction/ai-core-plus": "5.40.0",
98
+ "@memberjunction/ai-engine-base": "5.40.0",
99
+ "@memberjunction/api-keys-base": "5.40.0",
100
+ "@memberjunction/core": "5.40.0",
101
+ "@memberjunction/core-entities": "5.40.0",
102
+ "@memberjunction/credentials": "5.40.0",
103
+ "@memberjunction/export-engine": "5.40.0",
104
+ "@memberjunction/tag-engine-base": "5.40.0",
105
+ "@memberjunction/global": "5.40.0",
106
+ "@memberjunction/graphql-dataprovider": "5.40.0",
107
+ "@memberjunction/integration-engine-base": "5.40.0",
108
+ "@memberjunction/interactive-component-types": "5.40.0",
109
+ "@memberjunction/lists-base": "5.40.0",
110
+ "@memberjunction/ng-action-gallery": "5.40.0",
111
+ "@memberjunction/ng-actions": "5.40.0",
112
+ "@memberjunction/ng-agent-requests": "5.40.0",
113
+ "@memberjunction/ng-agents": "5.40.0",
114
+ "@memberjunction/ng-ai-test-harness": "5.40.0",
115
+ "@memberjunction/ng-archive-manager": "5.40.0",
116
+ "@memberjunction/ng-base-application": "5.40.0",
117
+ "@memberjunction/ng-base-types": "5.40.0",
118
+ "@memberjunction/ng-clustering": "5.40.0",
119
+ "@memberjunction/ng-code-editor": "5.40.0",
120
+ "@memberjunction/ng-container-directives": "5.40.0",
121
+ "@memberjunction/ng-conversations": "5.40.0",
122
+ "@memberjunction/ng-core-entity-forms": "5.40.0",
123
+ "@memberjunction/ng-credentials": "5.40.0",
124
+ "@memberjunction/ng-dashboard-viewer": "5.40.0",
125
+ "@memberjunction/ng-entity-relationship-diagram": "5.40.0",
126
+ "@memberjunction/ng-entity-viewer": "5.40.0",
127
+ "@memberjunction/ng-explorer-settings": "5.40.0",
128
+ "@memberjunction/ng-export-service": "5.40.0",
129
+ "@memberjunction/ng-filter-builder": "5.40.0",
130
+ "@memberjunction/ng-list-management": "5.40.0",
131
+ "@memberjunction/ng-map-view": "5.40.0",
132
+ "@memberjunction/ng-markdown": "5.40.0",
133
+ "@memberjunction/ng-notifications": "5.40.0",
134
+ "@memberjunction/ng-query-viewer": "5.40.0",
135
+ "@memberjunction/ng-base-forms": "5.40.0",
136
+ "@memberjunction/ng-react": "5.40.0",
137
+ "@memberjunction/ng-resource-permissions": "5.40.0",
138
+ "@memberjunction/ng-scheduling": "5.40.0",
139
+ "@memberjunction/ng-search": "5.40.0",
140
+ "@memberjunction/ng-shared": "5.40.0",
141
+ "@memberjunction/ng-shared-generic": "5.40.0",
142
+ "@memberjunction/ng-testing": "5.40.0",
143
+ "@memberjunction/ng-trees": "5.40.0",
144
+ "@memberjunction/ng-ui-components": "5.40.0",
145
+ "@memberjunction/ng-versions": "5.40.0",
146
+ "@memberjunction/ng-word-cloud": "5.40.0",
147
+ "@memberjunction/skip-types": "5.40.0",
148
+ "@memberjunction/templates-base-types": "5.40.0",
149
+ "@memberjunction/testing-engine-base": "5.40.0",
150
+ "ag-grid-angular": "^35.0.1",
151
+ "ag-grid-community": "^35.0.1",
150
152
  "angular-split": "^20.0.0",
151
153
  "codemirror": "^6.0.2",
152
154
  "d3": "^7.8.5",
@@ -1,79 +0,0 @@
1
- import { EventEmitter, OnInit } from '@angular/core';
2
- import { CompositeFilterDescriptor, FilterFieldInfo } from '@memberjunction/ng-filter-builder';
3
- import * as i0 from "@angular/core";
4
- /**
5
- * FilterDialogComponent - Modal dialog for editing filters
6
- *
7
- * Provides a full-width editing experience for the filter builder,
8
- * suitable for complex filter expressions.
9
- */
10
- export declare class FilterDialogComponent implements OnInit {
11
- /**
12
- * Whether the dialog is open
13
- */
14
- isOpen: boolean;
15
- /**
16
- * Available fields to filter on
17
- */
18
- fields: FilterFieldInfo[];
19
- /**
20
- * Current filter state
21
- */
22
- filter: CompositeFilterDescriptor;
23
- /**
24
- * Whether the filter builder is disabled (read-only mode)
25
- */
26
- disabled: boolean;
27
- /**
28
- * Emitted when the dialog should close
29
- */
30
- close: EventEmitter<void>;
31
- /**
32
- * Emitted when the filter is applied
33
- */
34
- apply: EventEmitter<CompositeFilterDescriptor>;
35
- /**
36
- * Internal working copy of the filter
37
- */
38
- workingFilter: CompositeFilterDescriptor;
39
- /**
40
- * Handle Escape key to close dialog
41
- */
42
- handleEscape(): void;
43
- ngOnInit(): void;
44
- /**
45
- * Initialize working filter when input changes
46
- */
47
- ngOnChanges(): void;
48
- /**
49
- * Create a working copy of the filter
50
- */
51
- private initializeWorkingFilter;
52
- /**
53
- * Handle filter changes from the filter builder
54
- */
55
- onFilterChange(filter: CompositeFilterDescriptor): void;
56
- /**
57
- * Apply the filter and close
58
- */
59
- onApply(): void;
60
- /**
61
- * Cancel and close without saving
62
- */
63
- onCancel(): void;
64
- /**
65
- * Clear all filters
66
- */
67
- onClear(): void;
68
- /**
69
- * Get filter count for display
70
- */
71
- getFilterCount(): number;
72
- /**
73
- * Count filters recursively
74
- */
75
- private countFilters;
76
- static ɵfac: i0.ɵɵFactoryDeclaration<FilterDialogComponent, never>;
77
- static ɵcmp: i0.ɵɵComponentDeclaration<FilterDialogComponent, "mj-filter-dialog", never, { "isOpen": { "alias": "isOpen"; "required": false; }; "fields": { "alias": "fields"; "required": false; }; "filter": { "alias": "filter"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "close": "close"; "apply": "apply"; }, never, never, false, never>;
78
- }
79
- //# sourceMappingURL=filter-dialog.component.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filter-dialog.component.d.ts","sourceRoot":"","sources":["../../../../src/DataExplorer/components/filter-dialog/filter-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAgB,MAAM,eAAe,CAAC;AAC7F,OAAO,EAAE,yBAAyB,EAAE,eAAe,EAAqB,MAAM,mCAAmC,CAAC;;AAElH;;;;;GAKG;AACH,qBAMa,qBAAsB,YAAW,MAAM;IAClD;;OAEG;IACM,MAAM,EAAE,OAAO,CAAS;IAEjC;;OAEG;IACM,MAAM,EAAE,eAAe,EAAE,CAAM;IAExC;;OAEG;IACM,MAAM,EAAE,yBAAyB,CAAuB;IAEjE;;OAEG;IACM,QAAQ,EAAE,OAAO,CAAS;IAEnC;;OAEG;IACO,KAAK,qBAA4B;IAE3C;;OAEG;IACO,KAAK,0CAAiD;IAEhE;;OAEG;IACI,aAAa,EAAE,yBAAyB,CAAuB;IAEtE;;OAEG;IAEH,YAAY,IAAI,IAAI;IAMpB,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACH,WAAW,IAAI,IAAI;IAMnB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAK/B;;OAEG;IACH,cAAc,CAAC,MAAM,EAAE,yBAAyB,GAAG,IAAI;IAIvD;;OAEG;IACH,OAAO,IAAI,IAAI;IAKf;;OAEG;IACH,QAAQ,IAAI,IAAI;IAIhB;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,cAAc,IAAI,MAAM;IAIxB;;OAEG;IACH,OAAO,CAAC,YAAY;yCA1GT,qBAAqB;2CAArB,qBAAqB;CAqHjC"}
@@ -1,195 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core';
2
- import { createEmptyFilter } from '@memberjunction/ng-filter-builder';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "@memberjunction/ng-filter-builder";
5
- const _c0 = () => ({ showClearButton: false, applyOnChange: true });
6
- function FilterDialogComponent_Conditional_0_Conditional_7_Template(rf, ctx) { if (rf & 1) {
7
- i0.ɵɵelementStart(0, "span", 5);
8
- i0.ɵɵtext(1);
9
- i0.ɵɵelementEnd();
10
- } if (rf & 2) {
11
- const ctx_r1 = i0.ɵɵnextContext(2);
12
- i0.ɵɵadvance();
13
- i0.ɵɵtextInterpolate(ctx_r1.getFilterCount());
14
- } }
15
- function FilterDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
16
- const _r1 = i0.ɵɵgetCurrentView();
17
- i0.ɵɵelementStart(0, "div", 0);
18
- i0.ɵɵlistener("click", function FilterDialogComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
19
- i0.ɵɵelementEnd();
20
- i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "div", 3);
21
- i0.ɵɵelement(4, "i", 4);
22
- i0.ɵɵelementStart(5, "span");
23
- i0.ɵɵtext(6, "Edit Filters");
24
- i0.ɵɵelementEnd();
25
- i0.ɵɵconditionalCreate(7, FilterDialogComponent_Conditional_0_Conditional_7_Template, 2, 1, "span", 5);
26
- i0.ɵɵelementEnd();
27
- i0.ɵɵelementStart(8, "button", 6);
28
- i0.ɵɵlistener("click", function FilterDialogComponent_Conditional_0_Template_button_click_8_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
29
- i0.ɵɵelement(9, "i", 7);
30
- i0.ɵɵelementEnd()();
31
- i0.ɵɵelementStart(10, "div", 8)(11, "mj-filter-builder", 9);
32
- i0.ɵɵlistener("filterChange", function FilterDialogComponent_Conditional_0_Template_mj_filter_builder_filterChange_11_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onFilterChange($event)); });
33
- i0.ɵɵelementEnd()();
34
- i0.ɵɵelementStart(12, "div", 10)(13, "button", 11);
35
- i0.ɵɵlistener("click", function FilterDialogComponent_Conditional_0_Template_button_click_13_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onClear()); });
36
- i0.ɵɵelement(14, "i", 12);
37
- i0.ɵɵtext(15, " Clear All ");
38
- i0.ɵɵelementEnd();
39
- i0.ɵɵelementStart(16, "div", 13)(17, "button", 14);
40
- i0.ɵɵlistener("click", function FilterDialogComponent_Conditional_0_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
41
- i0.ɵɵtext(18, " Cancel ");
42
- i0.ɵɵelementEnd();
43
- i0.ɵɵelementStart(19, "button", 15);
44
- i0.ɵɵlistener("click", function FilterDialogComponent_Conditional_0_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onApply()); });
45
- i0.ɵɵelement(20, "i", 16);
46
- i0.ɵɵtext(21, " Apply Filters ");
47
- i0.ɵɵelementEnd()()()();
48
- } if (rf & 2) {
49
- const ctx_r1 = i0.ɵɵnextContext();
50
- i0.ɵɵadvance(7);
51
- i0.ɵɵconditional(ctx_r1.getFilterCount() > 0 ? 7 : -1);
52
- i0.ɵɵadvance(4);
53
- i0.ɵɵproperty("fields", ctx_r1.fields)("filter", ctx_r1.workingFilter)("disabled", ctx_r1.disabled)("showSummary", true)("config", i0.ɵɵpureFunction0(8, _c0));
54
- i0.ɵɵadvance(2);
55
- i0.ɵɵproperty("disabled", ctx_r1.disabled || ctx_r1.getFilterCount() === 0);
56
- i0.ɵɵadvance(6);
57
- i0.ɵɵproperty("disabled", ctx_r1.disabled);
58
- } }
59
- /**
60
- * FilterDialogComponent - Modal dialog for editing filters
61
- *
62
- * Provides a full-width editing experience for the filter builder,
63
- * suitable for complex filter expressions.
64
- */
65
- export class FilterDialogComponent {
66
- /**
67
- * Whether the dialog is open
68
- */
69
- isOpen = false;
70
- /**
71
- * Available fields to filter on
72
- */
73
- fields = [];
74
- /**
75
- * Current filter state
76
- */
77
- filter = createEmptyFilter();
78
- /**
79
- * Whether the filter builder is disabled (read-only mode)
80
- */
81
- disabled = false;
82
- /**
83
- * Emitted when the dialog should close
84
- */
85
- close = new EventEmitter();
86
- /**
87
- * Emitted when the filter is applied
88
- */
89
- apply = new EventEmitter();
90
- /**
91
- * Internal working copy of the filter
92
- */
93
- workingFilter = createEmptyFilter();
94
- /**
95
- * Handle Escape key to close dialog
96
- */
97
- handleEscape() {
98
- if (this.isOpen) {
99
- this.onCancel();
100
- }
101
- }
102
- ngOnInit() {
103
- this.initializeWorkingFilter();
104
- }
105
- /**
106
- * Initialize working filter when input changes
107
- */
108
- ngOnChanges() {
109
- if (this.isOpen) {
110
- this.initializeWorkingFilter();
111
- }
112
- }
113
- /**
114
- * Create a working copy of the filter
115
- */
116
- initializeWorkingFilter() {
117
- // Deep clone to avoid mutating the original
118
- this.workingFilter = JSON.parse(JSON.stringify(this.filter || createEmptyFilter()));
119
- }
120
- /**
121
- * Handle filter changes from the filter builder
122
- */
123
- onFilterChange(filter) {
124
- this.workingFilter = filter;
125
- }
126
- /**
127
- * Apply the filter and close
128
- */
129
- onApply() {
130
- this.apply.emit(this.workingFilter);
131
- this.close.emit();
132
- }
133
- /**
134
- * Cancel and close without saving
135
- */
136
- onCancel() {
137
- this.close.emit();
138
- }
139
- /**
140
- * Clear all filters
141
- */
142
- onClear() {
143
- this.workingFilter = createEmptyFilter();
144
- }
145
- /**
146
- * Get filter count for display
147
- */
148
- getFilterCount() {
149
- return this.countFilters(this.workingFilter);
150
- }
151
- /**
152
- * Count filters recursively
153
- */
154
- countFilters(filter) {
155
- let count = 0;
156
- for (const item of filter.filters || []) {
157
- if ('logic' in item && 'filters' in item) {
158
- count += this.countFilters(item);
159
- }
160
- else if ('field' in item) {
161
- count++;
162
- }
163
- }
164
- return count;
165
- }
166
- static ɵfac = function FilterDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || FilterDialogComponent)(); };
167
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: FilterDialogComponent, selectors: [["mj-filter-dialog"]], hostBindings: function FilterDialogComponent_HostBindings(rf, ctx) { if (rf & 1) {
168
- i0.ɵɵlistener("keydown.escape", function FilterDialogComponent_keydown_escape_HostBindingHandler() { return ctx.handleEscape(); }, i0.ɵɵresolveDocument);
169
- } }, inputs: { isOpen: "isOpen", fields: "fields", filter: "filter", disabled: "disabled" }, outputs: { close: "close", apply: "apply" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[1, "dialog-backdrop", 3, "click"], [1, "filter-dialog"], [1, "dialog-header"], [1, "header-title"], [1, "fa-solid", "fa-filter"], [1, "filter-badge"], ["title", "Close", 1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "dialog-content"], [3, "filterChange", "fields", "filter", "disabled", "showSummary", "config"], [1, "dialog-footer"], [1, "footer-btn", "clear-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-eraser"], [1, "footer-right"], [1, "footer-btn", "cancel-btn", 3, "click"], [1, "footer-btn", "apply-btn", 3, "click", "disabled"], [1, "fa-solid", "fa-check"]], template: function FilterDialogComponent_Template(rf, ctx) { if (rf & 1) {
170
- i0.ɵɵconditionalCreate(0, FilterDialogComponent_Conditional_0_Template, 22, 9);
171
- } if (rf & 2) {
172
- i0.ɵɵconditional(ctx.isOpen ? 0 : -1);
173
- } }, dependencies: [i1.FilterBuilderComponent], styles: ["\n\n.dialog-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 2000; \n\n animation: _ngcontent-%COMP%_fadeIn 0.15s ease;\n}\n\n\n\n.filter-dialog[_ngcontent-%COMP%] {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 90%;\n max-width: 800px;\n max-height: 85vh;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n z-index: 2001; \n\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_slideIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes _ngcontent-%COMP%_slideIn {\n from {\n opacity: 0;\n transform: translate(-50%, -48%);\n }\n to {\n opacity: 1;\n transform: translate(-50%, -50%);\n }\n}\n\n\n\n.dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.header-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.header-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--mj-brand-primary);\n}\n\n.filter-badge[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 12px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.close-btn[_ngcontent-%COMP%] {\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-disabled);\n font-size: 16px;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n min-height: 200px;\n}\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n border-radius: 0 0 12px 12px;\n flex-shrink: 0;\n}\n\n.footer-right[_ngcontent-%COMP%] {\n display: flex;\n gap: 8px;\n}\n\n.footer-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 10px 16px;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.footer-btn[_ngcontent-%COMP%]:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.footer-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 12px;\n}\n\n.clear-btn[_ngcontent-%COMP%] {\n background: transparent;\n color: var(--mj-status-error);\n border: 1px solid var(--mj-border-default);\n}\n\n.clear-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error);\n}\n\n.cancel-btn[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n}\n\n.cancel-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.apply-btn[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.apply-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n\n\n@media (max-width: 600px) {\n .filter-dialog[_ngcontent-%COMP%] {\n width: 95%;\n max-height: 90vh;\n border-radius: 8px;\n }\n\n .dialog-header[_ngcontent-%COMP%] {\n padding: 14px 16px;\n }\n\n .header-title[_ngcontent-%COMP%] {\n font-size: 16px;\n }\n\n .dialog-content[_ngcontent-%COMP%] {\n padding: 16px;\n }\n\n .dialog-footer[_ngcontent-%COMP%] {\n flex-direction: column;\n gap: 12px;\n padding: 14px 16px;\n }\n\n .footer-right[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: stretch;\n }\n\n .footer-btn[_ngcontent-%COMP%] {\n flex: 1;\n justify-content: center;\n }\n\n .clear-btn[_ngcontent-%COMP%] {\n width: 100%;\n justify-content: center;\n }\n}"] });
174
- }
175
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(FilterDialogComponent, [{
176
- type: Component,
177
- args: [{ standalone: false, selector: 'mj-filter-dialog', template: "@if (isOpen) {\n <!-- Backdrop -->\n <div class=\"dialog-backdrop\" (click)=\"onCancel()\"></div>\n\n <!-- Dialog -->\n <div class=\"filter-dialog\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-filter\"></i>\n <span>Edit Filters</span>\n @if (getFilterCount() > 0) {\n <span class=\"filter-badge\">{{ getFilterCount() }}</span>\n }\n </div>\n <button class=\"close-btn\" (click)=\"onCancel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"dialog-content\">\n <mj-filter-builder\n [fields]=\"fields\"\n [filter]=\"workingFilter\"\n [disabled]=\"disabled\"\n [showSummary]=\"true\"\n [config]=\"{ showClearButton: false, applyOnChange: true }\"\n (filterChange)=\"onFilterChange($event)\">\n </mj-filter-builder>\n </div>\n\n <!-- Footer -->\n <div class=\"dialog-footer\">\n <button class=\"footer-btn clear-btn\" (click)=\"onClear()\" [disabled]=\"disabled || getFilterCount() === 0\">\n <i class=\"fa-solid fa-eraser\"></i>\n Clear All\n </button>\n <div class=\"footer-right\">\n <button class=\"footer-btn cancel-btn\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button class=\"footer-btn apply-btn\" (click)=\"onApply()\" [disabled]=\"disabled\">\n <i class=\"fa-solid fa-check\"></i>\n Apply Filters\n </button>\n </div>\n </div>\n </div>\n}\n", styles: ["/* Backdrop */\n.dialog-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 2000; /* Above view-config-panel (1201) and Leaflet map (1000) */\n animation: fadeIn 0.15s ease;\n}\n\n/* Dialog */\n.filter-dialog {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 90%;\n max-width: 800px;\n max-height: 85vh;\n background: var(--mj-bg-surface);\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n z-index: 2001; /* Above backdrop (2000) */\n display: flex;\n flex-direction: column;\n animation: slideIn 0.2s ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n@keyframes slideIn {\n from {\n opacity: 0;\n transform: translate(-50%, -48%);\n }\n to {\n opacity: 1;\n transform: translate(-50%, -50%);\n }\n}\n\n/* Header */\n.dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n flex-shrink: 0;\n}\n\n.header-title {\n display: flex;\n align-items: center;\n gap: 10px;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.header-title i {\n color: var(--mj-brand-primary);\n}\n\n.filter-badge {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n font-size: 12px;\n font-weight: 600;\n padding: 2px 8px;\n border-radius: 10px;\n}\n\n.close-btn {\n width: 36px;\n height: 36px;\n border: none;\n background: transparent;\n border-radius: 6px;\n cursor: pointer;\n color: var(--mj-text-disabled);\n font-size: 16px;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.close-btn:hover {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-primary);\n}\n\n/* Content */\n.dialog-content {\n flex: 1;\n overflow-y: auto;\n padding: 20px;\n min-height: 200px;\n}\n\n/* Footer */\n.dialog-footer {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-top: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n border-radius: 0 0 12px 12px;\n flex-shrink: 0;\n}\n\n.footer-right {\n display: flex;\n gap: 8px;\n}\n\n.footer-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 10px 16px;\n border: none;\n border-radius: 6px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.footer-btn:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.footer-btn i {\n font-size: 12px;\n}\n\n.clear-btn {\n background: transparent;\n color: var(--mj-status-error);\n border: 1px solid var(--mj-border-default);\n}\n\n.clear-btn:hover:not(:disabled) {\n background: var(--mj-status-error-bg);\n border-color: var(--mj-status-error);\n}\n\n.cancel-btn {\n background: var(--mj-bg-surface-card);\n color: var(--mj-text-secondary);\n}\n\n.cancel-btn:hover:not(:disabled) {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n}\n\n.apply-btn {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n}\n\n.apply-btn:hover:not(:disabled) {\n background: var(--mj-brand-primary-hover);\n}\n\n/* Responsive */\n@media (max-width: 600px) {\n .filter-dialog {\n width: 95%;\n max-height: 90vh;\n border-radius: 8px;\n }\n\n .dialog-header {\n padding: 14px 16px;\n }\n\n .header-title {\n font-size: 16px;\n }\n\n .dialog-content {\n padding: 16px;\n }\n\n .dialog-footer {\n flex-direction: column;\n gap: 12px;\n padding: 14px 16px;\n }\n\n .footer-right {\n width: 100%;\n justify-content: stretch;\n }\n\n .footer-btn {\n flex: 1;\n justify-content: center;\n }\n\n .clear-btn {\n width: 100%;\n justify-content: center;\n }\n}\n"] }]
178
- }], null, { isOpen: [{
179
- type: Input
180
- }], fields: [{
181
- type: Input
182
- }], filter: [{
183
- type: Input
184
- }], disabled: [{
185
- type: Input
186
- }], close: [{
187
- type: Output
188
- }], apply: [{
189
- type: Output
190
- }], handleEscape: [{
191
- type: HostListener,
192
- args: ['document:keydown.escape']
193
- }] }); })();
194
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(FilterDialogComponent, { className: "FilterDialogComponent", filePath: "src/DataExplorer/components/filter-dialog/filter-dialog.component.ts", lineNumber: 16 }); })();
195
- //# sourceMappingURL=filter-dialog.component.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"filter-dialog.component.js","sourceRoot":"","sources":["../../../../src/DataExplorer/components/filter-dialog/filter-dialog.component.ts","../../../../src/DataExplorer/components/filter-dialog/filter-dialog.component.html"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, HostListener } from '@angular/core';\nimport { CompositeFilterDescriptor, FilterFieldInfo, createEmptyFilter } from '@memberjunction/ng-filter-builder';\n\n/**\n * FilterDialogComponent - Modal dialog for editing filters\n *\n * Provides a full-width editing experience for the filter builder,\n * suitable for complex filter expressions.\n */\n@Component({\n standalone: false,\n selector: 'mj-filter-dialog',\n templateUrl: './filter-dialog.component.html',\n styleUrls: ['./filter-dialog.component.css']\n})\nexport class FilterDialogComponent implements OnInit {\n /**\n * Whether the dialog is open\n */\n @Input() isOpen: boolean = false;\n\n /**\n * Available fields to filter on\n */\n @Input() fields: FilterFieldInfo[] = [];\n\n /**\n * Current filter state\n */\n @Input() filter: CompositeFilterDescriptor = createEmptyFilter();\n\n /**\n * Whether the filter builder is disabled (read-only mode)\n */\n @Input() disabled: boolean = false;\n\n /**\n * Emitted when the dialog should close\n */\n @Output() close = new EventEmitter<void>();\n\n /**\n * Emitted when the filter is applied\n */\n @Output() apply = new EventEmitter<CompositeFilterDescriptor>();\n\n /**\n * Internal working copy of the filter\n */\n public workingFilter: CompositeFilterDescriptor = createEmptyFilter();\n\n /**\n * Handle Escape key to close dialog\n */\n @HostListener('document:keydown.escape')\n handleEscape(): void {\n if (this.isOpen) {\n this.onCancel();\n }\n }\n\n ngOnInit(): void {\n this.initializeWorkingFilter();\n }\n\n /**\n * Initialize working filter when input changes\n */\n ngOnChanges(): void {\n if (this.isOpen) {\n this.initializeWorkingFilter();\n }\n }\n\n /**\n * Create a working copy of the filter\n */\n private initializeWorkingFilter(): void {\n // Deep clone to avoid mutating the original\n this.workingFilter = JSON.parse(JSON.stringify(this.filter || createEmptyFilter()));\n }\n\n /**\n * Handle filter changes from the filter builder\n */\n onFilterChange(filter: CompositeFilterDescriptor): void {\n this.workingFilter = filter;\n }\n\n /**\n * Apply the filter and close\n */\n onApply(): void {\n this.apply.emit(this.workingFilter);\n this.close.emit();\n }\n\n /**\n * Cancel and close without saving\n */\n onCancel(): void {\n this.close.emit();\n }\n\n /**\n * Clear all filters\n */\n onClear(): void {\n this.workingFilter = createEmptyFilter();\n }\n\n /**\n * Get filter count for display\n */\n getFilterCount(): number {\n return this.countFilters(this.workingFilter);\n }\n\n /**\n * Count filters recursively\n */\n private countFilters(filter: CompositeFilterDescriptor): number {\n let count = 0;\n for (const item of filter.filters || []) {\n if ('logic' in item && 'filters' in item) {\n count += this.countFilters(item as CompositeFilterDescriptor);\n } else if ('field' in item) {\n count++;\n }\n }\n return count;\n }\n}\n","@if (isOpen) {\n <!-- Backdrop -->\n <div class=\"dialog-backdrop\" (click)=\"onCancel()\"></div>\n\n <!-- Dialog -->\n <div class=\"filter-dialog\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <div class=\"header-title\">\n <i class=\"fa-solid fa-filter\"></i>\n <span>Edit Filters</span>\n @if (getFilterCount() > 0) {\n <span class=\"filter-badge\">{{ getFilterCount() }}</span>\n }\n </div>\n <button class=\"close-btn\" (click)=\"onCancel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Content -->\n <div class=\"dialog-content\">\n <mj-filter-builder\n [fields]=\"fields\"\n [filter]=\"workingFilter\"\n [disabled]=\"disabled\"\n [showSummary]=\"true\"\n [config]=\"{ showClearButton: false, applyOnChange: true }\"\n (filterChange)=\"onFilterChange($event)\">\n </mj-filter-builder>\n </div>\n\n <!-- Footer -->\n <div class=\"dialog-footer\">\n <button class=\"footer-btn clear-btn\" (click)=\"onClear()\" [disabled]=\"disabled || getFilterCount() === 0\">\n <i class=\"fa-solid fa-eraser\"></i>\n Clear All\n </button>\n <div class=\"footer-right\">\n <button class=\"footer-btn cancel-btn\" (click)=\"onCancel()\">\n Cancel\n </button>\n <button class=\"footer-btn apply-btn\" (click)=\"onApply()\" [disabled]=\"disabled\">\n <i class=\"fa-solid fa-check\"></i>\n Apply Filters\n </button>\n </div>\n </div>\n </div>\n}\n"]}