@memberjunction/ng-dashboards 2.122.2 → 2.123.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +79 -0
  2. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +1 -0
  3. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +195 -0
  4. package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +1 -0
  5. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts +67 -1
  6. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts.map +1 -1
  7. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js +377 -79
  8. package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js.map +1 -1
  9. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +87 -4
  10. package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
  11. package/dist/DataExplorer/data-explorer-dashboard.component.js +517 -209
  12. package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
  13. package/dist/DataExplorer/models/explorer-state.interface.d.ts +13 -2
  14. package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
  15. package/dist/DataExplorer/models/explorer-state.interface.js +3 -0
  16. package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
  17. package/dist/DataExplorer/services/explorer-state.service.d.ts +2 -2
  18. package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
  19. package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
  20. package/dist/module.d.ts +28 -26
  21. package/dist/module.d.ts.map +1 -1
  22. package/dist/module.js +10 -3
  23. package/dist/module.js.map +1 -1
  24. package/package.json +25 -24
@@ -0,0 +1,79 @@
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
@@ -0,0 +1 @@
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,qBAKa,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"}
@@ -0,0 +1,195 @@
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.ɵɵtemplate(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(t) { return new (t || 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(); }, false, i0.ɵɵresolveDocument);
169
+ } }, inputs: { isOpen: "isOpen", fields: "fields", filter: "filter", disabled: "disabled" }, outputs: { close: "close", apply: "apply" }, 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.ɵɵtemplate(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: rgba(0, 0, 0, 0.5);\n z-index: 1000;\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: white;\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n z-index: 1001;\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 #e8e8e8;\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: #333;\n}\n\n.header-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #1976d2;\n}\n\n.filter-badge[_ngcontent-%COMP%] {\n background: #1976d2;\n color: white;\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: #999;\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: #f5f5f5;\n color: #333;\n}\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n flex: 1;\n overflow: visible;\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 #e8e8e8;\n background: #fafafa;\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: #c62828;\n border: 1px solid #e0e0e0;\n}\n\n.clear-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #ffebee;\n border-color: #c62828;\n}\n\n.cancel-btn[_ngcontent-%COMP%] {\n background: #f5f5f5;\n color: #666;\n}\n\n.cancel-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #e8e8e8;\n color: #333;\n}\n\n.apply-btn[_ngcontent-%COMP%] {\n background: #1976d2;\n color: white;\n}\n\n.apply-btn[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #1565c0;\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: [{ 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: rgba(0, 0, 0, 0.5);\n z-index: 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: white;\n border-radius: 12px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);\n z-index: 1001;\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 #e8e8e8;\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: #333;\n}\n\n.header-title i {\n color: #1976d2;\n}\n\n.filter-badge {\n background: #1976d2;\n color: white;\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: #999;\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: #f5f5f5;\n color: #333;\n}\n\n/* Content */\n.dialog-content {\n flex: 1;\n overflow: visible;\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 #e8e8e8;\n background: #fafafa;\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: #c62828;\n border: 1px solid #e0e0e0;\n}\n\n.clear-btn:hover:not(:disabled) {\n background: #ffebee;\n border-color: #c62828;\n}\n\n.cancel-btn {\n background: #f5f5f5;\n color: #666;\n}\n\n.cancel-btn:hover:not(:disabled) {\n background: #e8e8e8;\n color: #333;\n}\n\n.apply-btn {\n background: #1976d2;\n color: white;\n}\n\n.apply-btn:hover:not(:disabled) {\n background: #1565c0;\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: 15 }); })();
195
+ //# sourceMappingURL=filter-dialog.component.js.map
@@ -0,0 +1 @@
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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"}
@@ -2,6 +2,7 @@ import { EventEmitter, OnChanges, OnInit, SimpleChanges, ChangeDetectorRef } fro
2
2
  import { EntityInfo, EntityFieldInfo } from '@memberjunction/core';
3
3
  import { UserViewEntityExtended } from '@memberjunction/core-entities';
4
4
  import { ViewGridStateConfig } from '@memberjunction/ng-entity-viewer';
5
+ import { CompositeFilterDescriptor, FilterFieldInfo } from '@memberjunction/ng-filter-builder';
5
6
  import * as i0 from "@angular/core";
6
7
  /**
7
8
  * Column configuration for the view
@@ -28,6 +29,8 @@ export interface ViewSaveEvent {
28
29
  sortDirection: 'asc' | 'desc';
29
30
  smartFilterEnabled: boolean;
30
31
  smartFilterPrompt: string;
32
+ /** Traditional filter state in Kendo-compatible JSON format */
33
+ filterState: CompositeFilterDescriptor | null;
31
34
  }
32
35
  /**
33
36
  * ViewConfigPanelComponent - Sliding panel for configuring view settings
@@ -70,6 +73,17 @@ export declare class ViewConfigPanelComponent implements OnInit, OnChanges {
70
73
  * Emitted when the view should be deleted
71
74
  */
72
75
  delete: EventEmitter<void>;
76
+ /**
77
+ * Emitted when filter dialog should be opened (at dashboard level for full width)
78
+ */
79
+ openFilterDialogRequest: EventEmitter<{
80
+ filterState: CompositeFilterDescriptor;
81
+ filterFields: FilterFieldInfo[];
82
+ }>;
83
+ /**
84
+ * Filter state from external dialog (set by parent after dialog closes)
85
+ */
86
+ externalFilterState: CompositeFilterDescriptor | null;
73
87
  viewName: string;
74
88
  viewDescription: string;
75
89
  isShared: boolean;
@@ -79,6 +93,9 @@ export declare class ViewConfigPanelComponent implements OnInit, OnChanges {
79
93
  smartFilterEnabled: boolean;
80
94
  smartFilterPrompt: string;
81
95
  smartFilterExplanation: string;
96
+ filterState: CompositeFilterDescriptor;
97
+ filterFields: FilterFieldInfo[];
98
+ filterMode: 'smart' | 'traditional';
82
99
  activeTab: 'columns' | 'filters' | 'settings';
83
100
  isSaving: boolean;
84
101
  columnSearchText: string;
@@ -97,6 +114,42 @@ export declare class ViewConfigPanelComponent implements OnInit, OnChanges {
97
114
  * Priority for column state: currentGridState > viewEntity.Columns > entity defaults
98
115
  */
99
116
  private initializeFromEntity;
117
+ /**
118
+ * Build filter fields from entity fields
119
+ */
120
+ private buildFilterFields;
121
+ /**
122
+ * Map entity field type to filter field type
123
+ */
124
+ private mapFieldType;
125
+ /**
126
+ * Parse the filter state from JSON string
127
+ */
128
+ private parseFilterState;
129
+ /**
130
+ * Handle filter state change from filter builder
131
+ */
132
+ onFilterChange(filter: CompositeFilterDescriptor): void;
133
+ /**
134
+ * Open the filter dialog - emits event to parent (dashboard) which renders the dialog at viewport level
135
+ */
136
+ openFilterDialog(): void;
137
+ /**
138
+ * Get the count of active filter rules
139
+ */
140
+ getFilterCount(): number;
141
+ /**
142
+ * Count filters recursively
143
+ */
144
+ private countFilters;
145
+ /**
146
+ * Get a human-readable summary of the filter state
147
+ */
148
+ getFilterSummary(): string;
149
+ /**
150
+ * Clear all filters
151
+ */
152
+ clearFilters(): void;
100
153
  /**
101
154
  * Apply grid state column settings to the columns array
102
155
  */
@@ -157,6 +210,10 @@ export declare class ViewConfigPanelComponent implements OnInit, OnChanges {
157
210
  * Close the panel
158
211
  */
159
212
  onClose(): void;
213
+ /**
214
+ * Check if filter state has any active filters
215
+ */
216
+ private hasActiveFilters;
160
217
  /**
161
218
  * Save the view
162
219
  */
@@ -173,7 +230,16 @@ export declare class ViewConfigPanelComponent implements OnInit, OnChanges {
173
230
  * Set the active tab
174
231
  */
175
232
  setActiveTab(tab: 'columns' | 'filters' | 'settings'): void;
233
+ /**
234
+ * Set the filter mode (smart or traditional)
235
+ * When switching modes, clear the other mode's settings
236
+ */
237
+ setFilterMode(mode: 'smart' | 'traditional'): void;
238
+ /**
239
+ * Apply a smart filter example to the prompt field
240
+ */
241
+ applySmartFilterExample(example: string): void;
176
242
  static ɵfac: i0.ɵɵFactoryDeclaration<ViewConfigPanelComponent, never>;
177
- static ɵcmp: i0.ɵɵComponentDeclaration<ViewConfigPanelComponent, "mj-view-config-panel", never, { "entity": { "alias": "entity"; "required": false; }; "viewEntity": { "alias": "viewEntity"; "required": false; }; "isOpen": { "alias": "isOpen"; "required": false; }; "currentGridState": { "alias": "currentGridState"; "required": false; }; }, { "close": "close"; "save": "save"; "delete": "delete"; }, never, never, false, never>;
243
+ static ɵcmp: i0.ɵɵComponentDeclaration<ViewConfigPanelComponent, "mj-view-config-panel", never, { "entity": { "alias": "entity"; "required": false; }; "viewEntity": { "alias": "viewEntity"; "required": false; }; "isOpen": { "alias": "isOpen"; "required": false; }; "currentGridState": { "alias": "currentGridState"; "required": false; }; "externalFilterState": { "alias": "externalFilterState"; "required": false; }; }, { "close": "close"; "save": "save"; "delete": "delete"; "openFilterDialogRequest": "openFilterDialogRequest"; }, never, never, false, never>;
178
244
  }
179
245
  //# sourceMappingURL=view-config-panel.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"view-config-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/DataExplorer/components/view-config-panel/view-config-panel.component.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"view-config-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/DataExplorer/components/view-config-panel/view-config-panel.component.ts"],"names":[],"mappings":"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"}