@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.
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts +79 -0
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.d.ts.map +1 -0
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js +195 -0
- package/dist/DataExplorer/components/filter-dialog/filter-dialog.component.js.map +1 -0
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts +67 -1
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.d.ts.map +1 -1
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js +377 -79
- package/dist/DataExplorer/components/view-config-panel/view-config-panel.component.js.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts +87 -4
- package/dist/DataExplorer/data-explorer-dashboard.component.d.ts.map +1 -1
- package/dist/DataExplorer/data-explorer-dashboard.component.js +517 -209
- package/dist/DataExplorer/data-explorer-dashboard.component.js.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.d.ts +13 -2
- package/dist/DataExplorer/models/explorer-state.interface.d.ts.map +1 -1
- package/dist/DataExplorer/models/explorer-state.interface.js +3 -0
- package/dist/DataExplorer/models/explorer-state.interface.js.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.d.ts +2 -2
- package/dist/DataExplorer/services/explorer-state.service.d.ts.map +1 -1
- package/dist/DataExplorer/services/explorer-state.service.js.map +1 -1
- package/dist/module.d.ts +28 -26
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +10 -3
- package/dist/module.js.map +1 -1
- 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":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAU,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7F,OAAO,EAA8C,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;;;;;ICWxG,+BAA2B;IAAA,YAAsB;IAAA,iBAAO;;;IAA7B,cAAsB;IAAtB,6CAAsB;;;;IAVzD,8BAAkD;IAArB,sLAAS,iBAAU,KAAC;IAAC,iBAAM;IAMpD,AADF,AAFF,8BAA2B,aAEE,aACC;IACxB,uBAAkC;IAClC,4BAAM;IAAA,4BAAY;IAAA,iBAAO;IACzB,6FAA4B;IAG9B,iBAAM;IACN,iCAA6D;IAAnC,yLAAS,iBAAU,KAAC;IAC5C,uBAAiC;IAErC,AADE,iBAAS,EACL;IAIJ,AADF,+BAA4B,4BAOgB;IAAxC,yNAAgB,6BAAsB,KAAC;IAE3C,AADE,iBAAoB,EAChB;IAIJ,AADF,gCAA2B,kBACgF;IAApE,0LAAS,gBAAS,KAAC;IACtD,yBAAkC;IAClC,4BACF;IAAA,iBAAS;IAEP,AADF,gCAA0B,kBACmC;IAArB,0LAAS,iBAAU,KAAC;IACxD,yBACF;IAAA,iBAAS;IACT,mCAA+E;IAA1C,0LAAS,gBAAS,KAAC;IACtD,yBAAiC;IACjC,gCACF;IAGN,AADE,AADE,AADE,iBAAS,EACL,EACF,EACF;;;IArCA,eAEC;IAFD,sDAEC;IAUD,eAAiB;IAIjB,AADA,AADA,AADA,AADA,sCAAiB,gCACO,6BACH,qBACD,sCACsC;IAOH,eAA+C;IAA/C,2EAA+C;IAQ7C,eAAqB;IAArB,0CAAqB;;ADvCtF;;;;;GAKG;AAMH,MAAM,OAAO,qBAAqB;IAChC;;OAEG;IACM,MAAM,GAAY,KAAK,CAAC;IAEjC;;OAEG;IACM,MAAM,GAAsB,EAAE,CAAC;IAExC;;OAEG;IACM,MAAM,GAA8B,iBAAiB,EAAE,CAAC;IAEjE;;OAEG;IACM,QAAQ,GAAY,KAAK,CAAC;IAEnC;;OAEG;IACO,KAAK,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE3C;;OAEG;IACO,KAAK,GAAG,IAAI,YAAY,EAA6B,CAAC;IAEhE;;OAEG;IACI,aAAa,GAA8B,iBAAiB,EAAE,CAAC;IAEtE;;OAEG;IAEH,YAAY;QACV,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClB,CAAC;IACH,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,uBAAuB,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,WAAW;QACT,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,uBAAuB;QAC7B,4CAA4C;QAC5C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,IAAI,iBAAiB,EAAE,CAAC,CAAC,CAAC;IACtF,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,MAAiC;QAC9C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,OAAO;QACL,IAAI,CAAC,aAAa,GAAG,iBAAiB,EAAE,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,MAAiC;QACpD,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YACxC,IAAI,OAAO,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;gBACzC,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,IAAiC,CAAC,CAAC;YAChE,CAAC;iBAAM,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;gBAC3B,KAAK,EAAE,CAAC;YACV,CAAC;QACH,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;+EApHU,qBAAqB;6DAArB,qBAAqB;YAArB,4GAAA,kBAAc,iCAAO;;YCdlC,qEAAc;;YAAd,qCAiDC;;;iFDnCY,qBAAqB;cALjC,SAAS;2BACE,kBAAkB;gBAQnB,MAAM;kBAAd,KAAK;YAKG,MAAM;kBAAd,KAAK;YAKG,MAAM;kBAAd,KAAK;YAKG,QAAQ;kBAAhB,KAAK;YAKI,KAAK;kBAAd,MAAM;YAKG,KAAK;kBAAd,MAAM;YAWP,YAAY;kBADX,YAAY;mBAAC,yBAAyB;;kFAvC5B,qBAAqB"}
|
|
@@ -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":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAgB,MAAM,eAAe,CAAC;AAC1I,OAAO,EAAE,UAAU,EAAE,eAAe,EAAY,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAiC,MAAM,+BAA+B,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAoB,MAAM,kCAAkC,CAAC;;
|
|
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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"}
|