@memberjunction/ng-entity-viewer 4.4.0 → 5.1.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 (40) hide show
  1. package/dist/lib/confirm-dialog/confirm-dialog.component.d.ts +84 -0
  2. package/dist/lib/confirm-dialog/confirm-dialog.component.d.ts.map +1 -0
  3. package/dist/lib/confirm-dialog/confirm-dialog.component.js +166 -0
  4. package/dist/lib/confirm-dialog/confirm-dialog.component.js.map +1 -0
  5. package/dist/lib/duplicate-view-dialog/duplicate-view-dialog.component.d.ts +44 -0
  6. package/dist/lib/duplicate-view-dialog/duplicate-view-dialog.component.d.ts.map +1 -0
  7. package/dist/lib/duplicate-view-dialog/duplicate-view-dialog.component.js +182 -0
  8. package/dist/lib/duplicate-view-dialog/duplicate-view-dialog.component.js.map +1 -0
  9. package/dist/lib/entity-data-grid/entity-data-grid.component.d.ts +1 -1
  10. package/dist/lib/entity-data-grid/entity-data-grid.component.js +2 -2
  11. package/dist/lib/entity-data-grid/entity-data-grid.component.js.map +1 -1
  12. package/dist/lib/quick-save-dialog/quick-save-dialog.component.d.ts +94 -0
  13. package/dist/lib/quick-save-dialog/quick-save-dialog.component.d.ts.map +1 -0
  14. package/dist/lib/quick-save-dialog/quick-save-dialog.component.js +362 -0
  15. package/dist/lib/quick-save-dialog/quick-save-dialog.component.js.map +1 -0
  16. package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.d.ts +37 -0
  17. package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.d.ts.map +1 -0
  18. package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.js +100 -0
  19. package/dist/lib/shared-view-warning-dialog/shared-view-warning-dialog.component.js.map +1 -0
  20. package/dist/lib/types.d.ts +41 -0
  21. package/dist/lib/types.d.ts.map +1 -1
  22. package/dist/lib/types.js +0 -3
  23. package/dist/lib/types.js.map +1 -1
  24. package/dist/lib/view-config-panel/view-config-panel.component.d.ts +63 -4
  25. package/dist/lib/view-config-panel/view-config-panel.component.d.ts.map +1 -1
  26. package/dist/lib/view-config-panel/view-config-panel.component.js +692 -557
  27. package/dist/lib/view-config-panel/view-config-panel.component.js.map +1 -1
  28. package/dist/lib/view-header/view-header.component.d.ts +86 -0
  29. package/dist/lib/view-header/view-header.component.d.ts.map +1 -0
  30. package/dist/lib/view-header/view-header.component.js +216 -0
  31. package/dist/lib/view-header/view-header.component.js.map +1 -0
  32. package/dist/module.d.ts +12 -7
  33. package/dist/module.d.ts.map +1 -1
  34. package/dist/module.js +29 -4
  35. package/dist/module.js.map +1 -1
  36. package/dist/public-api.d.ts +5 -0
  37. package/dist/public-api.d.ts.map +1 -1
  38. package/dist/public-api.js +10 -0
  39. package/dist/public-api.js.map +1 -1
  40. package/package.json +9 -9
@@ -0,0 +1,84 @@
1
+ import { EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Style variants for the confirm button
5
+ */
6
+ export type ConfirmButtonStyle = 'primary' | 'danger';
7
+ /**
8
+ * ConfirmDialogComponent - Generic reusable confirmation dialog
9
+ *
10
+ * Used for:
11
+ * - Delete view confirmation
12
+ * - Filter mode switch warning (data loss)
13
+ * - Revert unsaved changes
14
+ * - Any action requiring user confirmation
15
+ *
16
+ * Follows the same @if backdrop + .dialog-panel.open pattern as AggregateSetupDialogComponent.
17
+ *
18
+ * @example
19
+ * ```html
20
+ * <mj-ev-confirm-dialog
21
+ * [IsOpen]="showDeleteConfirm"
22
+ * Title="Delete View"
23
+ * Message="Are you sure you want to delete this view?"
24
+ * DetailMessage="This action cannot be undone."
25
+ * ConfirmText="Delete"
26
+ * ConfirmStyle="danger"
27
+ * Icon="fa-solid fa-trash"
28
+ * (Confirmed)="onDeleteConfirmed()"
29
+ * (Cancelled)="showDeleteConfirm = false">
30
+ * </mj-ev-confirm-dialog>
31
+ * ```
32
+ */
33
+ export declare class ConfirmDialogComponent {
34
+ /**
35
+ * Whether the dialog is open
36
+ */
37
+ IsOpen: boolean;
38
+ /**
39
+ * Dialog title
40
+ */
41
+ Title: string;
42
+ /**
43
+ * Primary message to display
44
+ */
45
+ Message: string;
46
+ /**
47
+ * Optional secondary detail message (shown smaller, below primary)
48
+ */
49
+ DetailMessage: string;
50
+ /**
51
+ * Text for the confirm button
52
+ * @default 'Confirm'
53
+ */
54
+ ConfirmText: string;
55
+ /**
56
+ * Text for the cancel button
57
+ * @default 'Cancel'
58
+ */
59
+ CancelText: string;
60
+ /**
61
+ * Style variant for the confirm button
62
+ * 'primary' = blue, 'danger' = red
63
+ * @default 'primary'
64
+ */
65
+ ConfirmStyle: ConfirmButtonStyle;
66
+ /**
67
+ * Font Awesome icon class for the dialog header
68
+ * @default 'fa-solid fa-circle-question'
69
+ */
70
+ Icon: string;
71
+ /**
72
+ * Emitted when user clicks the confirm button
73
+ */
74
+ Confirmed: EventEmitter<void>;
75
+ /**
76
+ * Emitted when user clicks cancel or backdrop
77
+ */
78
+ Cancelled: EventEmitter<void>;
79
+ OnConfirm(): void;
80
+ OnCancel(): void;
81
+ static ɵfac: i0.ɵɵFactoryDeclaration<ConfirmDialogComponent, never>;
82
+ static ɵcmp: i0.ɵɵComponentDeclaration<ConfirmDialogComponent, "mj-ev-confirm-dialog", never, { "IsOpen": { "alias": "IsOpen"; "required": false; }; "Title": { "alias": "Title"; "required": false; }; "Message": { "alias": "Message"; "required": false; }; "DetailMessage": { "alias": "DetailMessage"; "required": false; }; "ConfirmText": { "alias": "ConfirmText"; "required": false; }; "CancelText": { "alias": "CancelText"; "required": false; }; "ConfirmStyle": { "alias": "ConfirmStyle"; "required": false; }; "Icon": { "alias": "Icon"; "required": false; }; }, { "Confirmed": "Confirmed"; "Cancelled": "Cancelled"; }, never, never, false, never>;
83
+ }
84
+ //# sourceMappingURL=confirm-dialog.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-dialog.component.d.ts","sourceRoot":"","sources":["../../../src/lib/confirm-dialog/confirm-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAC;;AAEvE;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAMa,sBAAsB;IACjC;;OAEG;IACM,MAAM,EAAE,OAAO,CAAS;IAEjC;;OAEG;IACM,KAAK,EAAE,MAAM,CAAa;IAEnC;;OAEG;IACM,OAAO,EAAE,MAAM,CAAmB;IAE3C;;OAEG;IACM,aAAa,EAAE,MAAM,CAAM;IAEpC;;;OAGG;IACM,WAAW,EAAE,MAAM,CAAa;IAEzC;;;OAGG;IACM,UAAU,EAAE,MAAM,CAAY;IAEvC;;;;OAIG;IACM,YAAY,EAAE,kBAAkB,CAAa;IAEtD;;;OAGG;IACM,IAAI,EAAE,MAAM,CAAiC;IAEtD;;OAEG;IACO,SAAS,qBAA4B;IAE/C;;OAEG;IACO,SAAS,qBAA4B;IAE/C,SAAS,IAAI,IAAI;IAIjB,QAAQ,IAAI,IAAI;yCA5DL,sBAAsB;2CAAtB,sBAAsB;CA+DlC"}
@@ -0,0 +1,166 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ function ConfirmDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
4
+ const _r1 = i0.ɵɵgetCurrentView();
5
+ i0.ɵɵelementStart(0, "div", 12);
6
+ i0.ɵɵlistener("click", function ConfirmDialogComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnCancel()); });
7
+ i0.ɵɵelementEnd();
8
+ } }
9
+ function ConfirmDialogComponent_Conditional_12_Template(rf, ctx) { if (rf & 1) {
10
+ i0.ɵɵelementStart(0, "p", 8);
11
+ i0.ɵɵtext(1);
12
+ i0.ɵɵelementEnd();
13
+ } if (rf & 2) {
14
+ const ctx_r1 = i0.ɵɵnextContext();
15
+ i0.ɵɵadvance();
16
+ i0.ɵɵtextInterpolate(ctx_r1.DetailMessage);
17
+ } }
18
+ /**
19
+ * ConfirmDialogComponent - Generic reusable confirmation dialog
20
+ *
21
+ * Used for:
22
+ * - Delete view confirmation
23
+ * - Filter mode switch warning (data loss)
24
+ * - Revert unsaved changes
25
+ * - Any action requiring user confirmation
26
+ *
27
+ * Follows the same @if backdrop + .dialog-panel.open pattern as AggregateSetupDialogComponent.
28
+ *
29
+ * @example
30
+ * ```html
31
+ * <mj-ev-confirm-dialog
32
+ * [IsOpen]="showDeleteConfirm"
33
+ * Title="Delete View"
34
+ * Message="Are you sure you want to delete this view?"
35
+ * DetailMessage="This action cannot be undone."
36
+ * ConfirmText="Delete"
37
+ * ConfirmStyle="danger"
38
+ * Icon="fa-solid fa-trash"
39
+ * (Confirmed)="onDeleteConfirmed()"
40
+ * (Cancelled)="showDeleteConfirm = false">
41
+ * </mj-ev-confirm-dialog>
42
+ * ```
43
+ */
44
+ export class ConfirmDialogComponent {
45
+ /**
46
+ * Whether the dialog is open
47
+ */
48
+ IsOpen = false;
49
+ /**
50
+ * Dialog title
51
+ */
52
+ Title = 'Confirm';
53
+ /**
54
+ * Primary message to display
55
+ */
56
+ Message = 'Are you sure?';
57
+ /**
58
+ * Optional secondary detail message (shown smaller, below primary)
59
+ */
60
+ DetailMessage = '';
61
+ /**
62
+ * Text for the confirm button
63
+ * @default 'Confirm'
64
+ */
65
+ ConfirmText = 'Confirm';
66
+ /**
67
+ * Text for the cancel button
68
+ * @default 'Cancel'
69
+ */
70
+ CancelText = 'Cancel';
71
+ /**
72
+ * Style variant for the confirm button
73
+ * 'primary' = blue, 'danger' = red
74
+ * @default 'primary'
75
+ */
76
+ ConfirmStyle = 'primary';
77
+ /**
78
+ * Font Awesome icon class for the dialog header
79
+ * @default 'fa-solid fa-circle-question'
80
+ */
81
+ Icon = 'fa-solid fa-circle-question';
82
+ /**
83
+ * Emitted when user clicks the confirm button
84
+ */
85
+ Confirmed = new EventEmitter();
86
+ /**
87
+ * Emitted when user clicks cancel or backdrop
88
+ */
89
+ Cancelled = new EventEmitter();
90
+ OnConfirm() {
91
+ this.Confirmed.emit();
92
+ }
93
+ OnCancel() {
94
+ this.Cancelled.emit();
95
+ }
96
+ static ɵfac = function ConfirmDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ConfirmDialogComponent)(); };
97
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConfirmDialogComponent, selectors: [["mj-ev-confirm-dialog"]], inputs: { IsOpen: "IsOpen", Title: "Title", Message: "Message", DetailMessage: "DetailMessage", ConfirmText: "ConfirmText", CancelText: "CancelText", ConfirmStyle: "ConfirmStyle", Icon: "Icon" }, outputs: { Confirmed: "Confirmed", Cancelled: "Cancelled" }, standalone: false, decls: 18, vars: 14, consts: [[1, "dialog-backdrop"], [1, "dialog-panel"], [1, "dialog-header"], [1, "header-title"], ["title", "Close", 1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "dialog-content"], [1, "message"], [1, "detail-message"], [1, "dialog-footer"], [1, "btn", "btn-confirm", 3, "click"], [1, "btn", "btn-cancel", 3, "click"], [1, "dialog-backdrop", 3, "click"]], template: function ConfirmDialogComponent_Template(rf, ctx) { if (rf & 1) {
98
+ i0.ɵɵconditionalCreate(0, ConfirmDialogComponent_Conditional_0_Template, 1, 0, "div", 0);
99
+ i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "div", 3);
100
+ i0.ɵɵelement(4, "i");
101
+ i0.ɵɵelementStart(5, "span");
102
+ i0.ɵɵtext(6);
103
+ i0.ɵɵelementEnd()();
104
+ i0.ɵɵelementStart(7, "button", 4);
105
+ i0.ɵɵlistener("click", function ConfirmDialogComponent_Template_button_click_7_listener() { return ctx.OnCancel(); });
106
+ i0.ɵɵelement(8, "i", 5);
107
+ i0.ɵɵelementEnd()();
108
+ i0.ɵɵelementStart(9, "div", 6)(10, "p", 7);
109
+ i0.ɵɵtext(11);
110
+ i0.ɵɵelementEnd();
111
+ i0.ɵɵconditionalCreate(12, ConfirmDialogComponent_Conditional_12_Template, 2, 1, "p", 8);
112
+ i0.ɵɵelementEnd();
113
+ i0.ɵɵelementStart(13, "div", 9)(14, "button", 10);
114
+ i0.ɵɵlistener("click", function ConfirmDialogComponent_Template_button_click_14_listener() { return ctx.OnConfirm(); });
115
+ i0.ɵɵtext(15);
116
+ i0.ɵɵelementEnd();
117
+ i0.ɵɵelementStart(16, "button", 11);
118
+ i0.ɵɵlistener("click", function ConfirmDialogComponent_Template_button_click_16_listener() { return ctx.OnCancel(); });
119
+ i0.ɵɵtext(17);
120
+ i0.ɵɵelementEnd()()();
121
+ } if (rf & 2) {
122
+ i0.ɵɵconditional(ctx.IsOpen ? 0 : -1);
123
+ i0.ɵɵadvance();
124
+ i0.ɵɵclassProp("open", ctx.IsOpen);
125
+ i0.ɵɵadvance(3);
126
+ i0.ɵɵclassMap(ctx.Icon);
127
+ i0.ɵɵadvance(2);
128
+ i0.ɵɵtextInterpolate(ctx.Title);
129
+ i0.ɵɵadvance(5);
130
+ i0.ɵɵtextInterpolate(ctx.Message);
131
+ i0.ɵɵadvance();
132
+ i0.ɵɵconditional(ctx.DetailMessage ? 12 : -1);
133
+ i0.ɵɵadvance(2);
134
+ i0.ɵɵclassProp("btn-primary", ctx.ConfirmStyle === "primary")("btn-danger", ctx.ConfirmStyle === "danger");
135
+ i0.ɵɵadvance();
136
+ i0.ɵɵtextInterpolate1(" ", ctx.ConfirmText, " ");
137
+ i0.ɵɵadvance(2);
138
+ i0.ɵɵtextInterpolate1(" ", ctx.CancelText, " ");
139
+ } }, 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.4);\n z-index: 2000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.dialog-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n width: 420px;\n max-width: calc(100vw - 40px);\n background: white;\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n z-index: 2001;\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n\n.dialog-panel.open[_ngcontent-%COMP%] {\n opacity: 1;\n pointer-events: auto;\n transform: translate(-50%, -50%) scale(1);\n}\n\n\n\n.dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 18px 24px;\n border-bottom: 1px solid #e5e7eb;\n background: #f8fafc;\n border-radius: 16px 16px 0 0;\n}\n\n.header-title[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 17px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.header-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3b82f6;\n font-size: 18px;\n}\n\n.close-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n color: #6b7280;\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: #f3f4f6;\n color: #374151;\n}\n\n\n\n.dialog-content[_ngcontent-%COMP%] {\n padding: 24px;\n}\n\n.message[_ngcontent-%COMP%] {\n font-size: 15px;\n color: #374151;\n line-height: 1.5;\n margin: 0;\n}\n\n.detail-message[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6b7280;\n line-height: 1.5;\n margin: 12px 0 0 0;\n}\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px 24px;\n border-top: 1px solid #e5e7eb;\n background: #f8fafc;\n border-radius: 0 0 16px 16px;\n}\n\n\n\n.btn[_ngcontent-%COMP%] {\n padding: 9px 20px;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn-confirm.btn-primary[_ngcontent-%COMP%] {\n background: #3b82f6;\n color: white;\n}\n\n.btn-confirm.btn-primary[_ngcontent-%COMP%]:hover {\n background: #2563eb;\n}\n\n.btn-confirm.btn-danger[_ngcontent-%COMP%] {\n background: #ef4444;\n color: white;\n}\n\n.btn-confirm.btn-danger[_ngcontent-%COMP%]:hover {\n background: #dc2626;\n}\n\n.btn-cancel[_ngcontent-%COMP%] {\n background: #f3f4f6;\n color: #374151;\n}\n\n.btn-cancel[_ngcontent-%COMP%]:hover {\n background: #e5e7eb;\n}"] });
140
+ }
141
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConfirmDialogComponent, [{
142
+ type: Component,
143
+ args: [{ standalone: false, selector: 'mj-ev-confirm-dialog', template: "<!-- Dialog Backdrop -->\n@if (IsOpen) {\n <div class=\"dialog-backdrop\" (click)=\"OnCancel()\"></div>\n}\n\n<!-- Dialog Panel -->\n<div class=\"dialog-panel\" [class.open]=\"IsOpen\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <div class=\"header-title\">\n <i [class]=\"Icon\"></i>\n <span>{{ Title }}</span>\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 <p class=\"message\">{{ Message }}</p>\n @if (DetailMessage) {\n <p class=\"detail-message\">{{ DetailMessage }}</p>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"dialog-footer\">\n <button\n class=\"btn btn-confirm\"\n [class.btn-primary]=\"ConfirmStyle === 'primary'\"\n [class.btn-danger]=\"ConfirmStyle === 'danger'\"\n (click)=\"OnConfirm()\">\n {{ ConfirmText }}\n </button>\n <button class=\"btn btn-cancel\" (click)=\"OnCancel()\">\n {{ CancelText }}\n </button>\n </div>\n</div>\n", styles: ["/* Dialog 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.4);\n z-index: 2000;\n animation: fadeIn 0.2s ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Dialog Panel */\n.dialog-panel {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n width: 420px;\n max-width: calc(100vw - 40px);\n background: white;\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n z-index: 2001;\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n\n.dialog-panel.open {\n opacity: 1;\n pointer-events: auto;\n transform: translate(-50%, -50%) scale(1);\n}\n\n/* Dialog Header */\n.dialog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 18px 24px;\n border-bottom: 1px solid #e5e7eb;\n background: #f8fafc;\n border-radius: 16px 16px 0 0;\n}\n\n.header-title {\n display: flex;\n align-items: center;\n gap: 12px;\n font-size: 17px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.header-title i {\n color: #3b82f6;\n font-size: 18px;\n}\n\n.close-btn {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n color: #6b7280;\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: #f3f4f6;\n color: #374151;\n}\n\n/* Dialog Content */\n.dialog-content {\n padding: 24px;\n}\n\n.message {\n font-size: 15px;\n color: #374151;\n line-height: 1.5;\n margin: 0;\n}\n\n.detail-message {\n font-size: 13px;\n color: #6b7280;\n line-height: 1.5;\n margin: 12px 0 0 0;\n}\n\n/* Dialog Footer */\n.dialog-footer {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px 24px;\n border-top: 1px solid #e5e7eb;\n background: #f8fafc;\n border-radius: 0 0 16px 16px;\n}\n\n/* Buttons */\n.btn {\n padding: 9px 20px;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn-confirm.btn-primary {\n background: #3b82f6;\n color: white;\n}\n\n.btn-confirm.btn-primary:hover {\n background: #2563eb;\n}\n\n.btn-confirm.btn-danger {\n background: #ef4444;\n color: white;\n}\n\n.btn-confirm.btn-danger:hover {\n background: #dc2626;\n}\n\n.btn-cancel {\n background: #f3f4f6;\n color: #374151;\n}\n\n.btn-cancel:hover {\n background: #e5e7eb;\n}\n"] }]
144
+ }], null, { IsOpen: [{
145
+ type: Input
146
+ }], Title: [{
147
+ type: Input
148
+ }], Message: [{
149
+ type: Input
150
+ }], DetailMessage: [{
151
+ type: Input
152
+ }], ConfirmText: [{
153
+ type: Input
154
+ }], CancelText: [{
155
+ type: Input
156
+ }], ConfirmStyle: [{
157
+ type: Input
158
+ }], Icon: [{
159
+ type: Input
160
+ }], Confirmed: [{
161
+ type: Output
162
+ }], Cancelled: [{
163
+ type: Output
164
+ }] }); })();
165
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConfirmDialogComponent, { className: "ConfirmDialogComponent", filePath: "src/lib/confirm-dialog/confirm-dialog.component.ts", lineNumber: 40 }); })();
166
+ //# sourceMappingURL=confirm-dialog.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"confirm-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/confirm-dialog/confirm-dialog.component.ts","../../../src/lib/confirm-dialog/confirm-dialog.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;;;;ICErE,+BAAkD;IAArB,uLAAS,iBAAU,KAAC;IAAC,iBAAM;;;IAoBpD,4BAA0B;IAAA,YAAmB;IAAA,iBAAI;;;IAAvB,cAAmB;IAAnB,0CAAmB;;ADfnD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAOH,MAAM,OAAO,sBAAsB;IACjC;;OAEG;IACM,MAAM,GAAY,KAAK,CAAC;IAEjC;;OAEG;IACM,KAAK,GAAW,SAAS,CAAC;IAEnC;;OAEG;IACM,OAAO,GAAW,eAAe,CAAC;IAE3C;;OAEG;IACM,aAAa,GAAW,EAAE,CAAC;IAEpC;;;OAGG;IACM,WAAW,GAAW,SAAS,CAAC;IAEzC;;;OAGG;IACM,UAAU,GAAW,QAAQ,CAAC;IAEvC;;;;OAIG;IACM,YAAY,GAAuB,SAAS,CAAC;IAEtD;;;OAGG;IACM,IAAI,GAAW,6BAA6B,CAAC;IAEtD;;OAEG;IACO,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE/C;;OAEG;IACO,SAAS,GAAG,IAAI,YAAY,EAAQ,CAAC;IAE/C,SAAS;QACP,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;gHA9DU,sBAAsB;6DAAtB,sBAAsB;YCtCnC,wFAAc;YAQV,AADF,AAFF,8BAAgD,aAEnB,aACC;YACxB,oBAAsB;YACtB,4BAAM;YAAA,YAAW;YACnB,AADmB,iBAAO,EACpB;YACN,iCAA6D;YAAnC,mGAAS,cAAU,IAAC;YAC5C,uBAAiC;YAErC,AADE,iBAAS,EACL;YAIJ,AADF,8BAA4B,YACP;YAAA,aAAa;YAAA,iBAAI;YACpC,wFAAqB;YAGvB,iBAAM;YAIJ,AADF,+BAA2B,kBAKD;YAAtB,oGAAS,eAAW,IAAC;YACrB,aACF;YAAA,iBAAS;YACT,mCAAoD;YAArB,oGAAS,cAAU,IAAC;YACjD,aACF;YAEJ,AADE,AADE,iBAAS,EACL,EACF;;YAtCN,qCAEC;YAGyB,cAAqB;YAArB,kCAAqB;YAItC,eAAc;YAAd,uBAAc;YACX,eAAW;YAAX,+BAAW;YASA,eAAa;YAAb,iCAAa;YAChC,cAEC;YAFD,6CAEC;YAOC,eAAgD;YAChD,AADA,6DAAgD,6CACF;YAE9C,cACF;YADE,gDACF;YAEE,eACF;YADE,+CACF;;;iFDES,sBAAsB;cANlC,SAAS;6BACI,KAAK,YACP,sBAAsB;;kBAQ/B,KAAK;;kBAKL,KAAK;;kBAKL,KAAK;;kBAKL,KAAK;;kBAML,KAAK;;kBAML,KAAK;;kBAOL,KAAK;;kBAML,KAAK;;kBAKL,MAAM;;kBAKN,MAAM;;kFAtDI,sBAAsB"}
@@ -0,0 +1,44 @@
1
+ import { EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';
2
+ import { ViewConfigSummary } from '../types';
3
+ import * as i0 from "@angular/core";
4
+ /**
5
+ * Event emitted when user confirms the duplicate action
6
+ */
7
+ export interface DuplicateViewEvent {
8
+ /** The user-chosen name for the copy */
9
+ Name: string;
10
+ }
11
+ /**
12
+ * DuplicateViewDialogComponent - Modal for duplicating a view with a custom name
13
+ *
14
+ * Shows the source view name, allows renaming the copy, and displays
15
+ * a metadata summary (filters, columns, sorts) of what will be duplicated.
16
+ *
17
+ * @example
18
+ * ```html
19
+ * <mj-duplicate-view-dialog
20
+ * [IsOpen]="showDuplicateDialog"
21
+ * [SourceViewName]="viewToDuplicate?.Name"
22
+ * [Summary]="duplicateSummary"
23
+ * (Duplicate)="onDuplicateConfirmed($event)"
24
+ * (Cancel)="showDuplicateDialog = false">
25
+ * </mj-duplicate-view-dialog>
26
+ * ```
27
+ */
28
+ export declare class DuplicateViewDialogComponent implements OnChanges {
29
+ private cdr;
30
+ IsOpen: boolean;
31
+ SourceViewName: string;
32
+ Summary: ViewConfigSummary | null;
33
+ Duplicate: EventEmitter<DuplicateViewEvent>;
34
+ Cancel: EventEmitter<void>;
35
+ NewName: string;
36
+ NameTouched: boolean;
37
+ constructor(cdr: ChangeDetectorRef);
38
+ ngOnChanges(changes: SimpleChanges): void;
39
+ OnDuplicate(): void;
40
+ OnCancel(): void;
41
+ static ɵfac: i0.ɵɵFactoryDeclaration<DuplicateViewDialogComponent, never>;
42
+ static ɵcmp: i0.ɵɵComponentDeclaration<DuplicateViewDialogComponent, "mj-duplicate-view-dialog", never, { "IsOpen": { "alias": "IsOpen"; "required": false; }; "SourceViewName": { "alias": "SourceViewName"; "required": false; }; "Summary": { "alias": "Summary"; "required": false; }; }, { "Duplicate": "Duplicate"; "Cancel": "Cancel"; }, never, never, false, never>;
43
+ }
44
+ //# sourceMappingURL=duplicate-view-dialog.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-view-dialog.component.d.ts","sourceRoot":"","sources":["../../../src/lib/duplicate-view-dialog/duplicate-view-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;;AAE7C;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAMa,4BAA6B,YAAW,SAAS;IAWhD,OAAO,CAAC,GAAG;IAVd,MAAM,EAAE,OAAO,CAAS;IACxB,cAAc,EAAE,MAAM,CAAM;IAC5B,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAExC,SAAS,mCAA0C;IACnD,MAAM,qBAA4B;IAErC,OAAO,EAAE,MAAM,CAAM;IACrB,WAAW,EAAE,OAAO,CAAS;gBAEhB,GAAG,EAAE,iBAAiB;IAE1C,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAQzC,WAAW,IAAI,IAAI;IAKnB,QAAQ,IAAI,IAAI;yCA1BL,4BAA4B;2CAA5B,4BAA4B;CA6BxC"}
@@ -0,0 +1,182 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "@angular/forms";
4
+ function DuplicateViewDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
5
+ const _r1 = i0.ɵɵgetCurrentView();
6
+ i0.ɵɵelementStart(0, "div", 18);
7
+ i0.ɵɵlistener("click", function DuplicateViewDialogComponent_Conditional_0_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnCancel()); });
8
+ i0.ɵɵelementEnd();
9
+ } }
10
+ function DuplicateViewDialogComponent_Conditional_19_Template(rf, ctx) { if (rf & 1) {
11
+ i0.ɵɵelementStart(0, "span", 13);
12
+ i0.ɵɵtext(1, "Name is required");
13
+ i0.ɵɵelementEnd();
14
+ } }
15
+ function DuplicateViewDialogComponent_Conditional_20_Conditional_1_Template(rf, ctx) { if (rf & 1) {
16
+ i0.ɵɵelementStart(0, "span", 19);
17
+ i0.ɵɵelement(1, "i", 21);
18
+ i0.ɵɵtext(2);
19
+ i0.ɵɵelementEnd();
20
+ } if (rf & 2) {
21
+ const ctx_r1 = i0.ɵɵnextContext(2);
22
+ i0.ɵɵadvance(2);
23
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.Summary.FilterCount, " filter", ctx_r1.Summary.FilterCount !== 1 ? "s" : "", " ");
24
+ } }
25
+ function DuplicateViewDialogComponent_Conditional_20_Conditional_5_Template(rf, ctx) { if (rf & 1) {
26
+ i0.ɵɵelementStart(0, "span", 19);
27
+ i0.ɵɵelement(1, "i", 22);
28
+ i0.ɵɵtext(2);
29
+ i0.ɵɵelementEnd();
30
+ } if (rf & 2) {
31
+ const ctx_r1 = i0.ɵɵnextContext(2);
32
+ i0.ɵɵadvance(2);
33
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.Summary.SortCount, " sort", ctx_r1.Summary.SortCount !== 1 ? "s" : "", " ");
34
+ } }
35
+ function DuplicateViewDialogComponent_Conditional_20_Conditional_6_Template(rf, ctx) { if (rf & 1) {
36
+ i0.ɵɵelementStart(0, "span", 19);
37
+ i0.ɵɵelement(1, "i", 23);
38
+ i0.ɵɵtext(2);
39
+ i0.ɵɵelementEnd();
40
+ } if (rf & 2) {
41
+ const ctx_r1 = i0.ɵɵnextContext(2);
42
+ i0.ɵɵadvance(2);
43
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.Summary.AggregateCount, " aggregate", ctx_r1.Summary.AggregateCount !== 1 ? "s" : "", " ");
44
+ } }
45
+ function DuplicateViewDialogComponent_Conditional_20_Template(rf, ctx) { if (rf & 1) {
46
+ i0.ɵɵelementStart(0, "div", 14);
47
+ i0.ɵɵconditionalCreate(1, DuplicateViewDialogComponent_Conditional_20_Conditional_1_Template, 3, 2, "span", 19);
48
+ i0.ɵɵelementStart(2, "span", 19);
49
+ i0.ɵɵelement(3, "i", 20);
50
+ i0.ɵɵtext(4);
51
+ i0.ɵɵelementEnd();
52
+ i0.ɵɵconditionalCreate(5, DuplicateViewDialogComponent_Conditional_20_Conditional_5_Template, 3, 2, "span", 19);
53
+ i0.ɵɵconditionalCreate(6, DuplicateViewDialogComponent_Conditional_20_Conditional_6_Template, 3, 2, "span", 19);
54
+ i0.ɵɵelementEnd();
55
+ } if (rf & 2) {
56
+ const ctx_r1 = i0.ɵɵnextContext();
57
+ i0.ɵɵadvance();
58
+ i0.ɵɵconditional(ctx_r1.Summary.FilterCount > 0 ? 1 : -1);
59
+ i0.ɵɵadvance(3);
60
+ i0.ɵɵtextInterpolate2(" ", ctx_r1.Summary.ColumnCount, " column", ctx_r1.Summary.ColumnCount !== 1 ? "s" : "", " ");
61
+ i0.ɵɵadvance();
62
+ i0.ɵɵconditional(ctx_r1.Summary.SortCount > 0 ? 5 : -1);
63
+ i0.ɵɵadvance();
64
+ i0.ɵɵconditional(ctx_r1.Summary.AggregateCount > 0 ? 6 : -1);
65
+ } }
66
+ /**
67
+ * DuplicateViewDialogComponent - Modal for duplicating a view with a custom name
68
+ *
69
+ * Shows the source view name, allows renaming the copy, and displays
70
+ * a metadata summary (filters, columns, sorts) of what will be duplicated.
71
+ *
72
+ * @example
73
+ * ```html
74
+ * <mj-duplicate-view-dialog
75
+ * [IsOpen]="showDuplicateDialog"
76
+ * [SourceViewName]="viewToDuplicate?.Name"
77
+ * [Summary]="duplicateSummary"
78
+ * (Duplicate)="onDuplicateConfirmed($event)"
79
+ * (Cancel)="showDuplicateDialog = false">
80
+ * </mj-duplicate-view-dialog>
81
+ * ```
82
+ */
83
+ export class DuplicateViewDialogComponent {
84
+ cdr;
85
+ IsOpen = false;
86
+ SourceViewName = '';
87
+ Summary = null;
88
+ Duplicate = new EventEmitter();
89
+ Cancel = new EventEmitter();
90
+ NewName = '';
91
+ NameTouched = false;
92
+ constructor(cdr) {
93
+ this.cdr = cdr;
94
+ }
95
+ ngOnChanges(changes) {
96
+ if (changes['IsOpen'] && this.IsOpen) {
97
+ this.NewName = this.SourceViewName ? `${this.SourceViewName} (Copy)` : '';
98
+ this.NameTouched = false;
99
+ this.cdr.detectChanges();
100
+ }
101
+ }
102
+ OnDuplicate() {
103
+ if (!this.NewName.trim())
104
+ return;
105
+ this.Duplicate.emit({ Name: this.NewName.trim() });
106
+ }
107
+ OnCancel() {
108
+ this.Cancel.emit();
109
+ }
110
+ static ɵfac = function DuplicateViewDialogComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || DuplicateViewDialogComponent)(i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
111
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: DuplicateViewDialogComponent, selectors: [["mj-duplicate-view-dialog"]], inputs: { IsOpen: "IsOpen", SourceViewName: "SourceViewName", Summary: "Summary" }, outputs: { Duplicate: "Duplicate", Cancel: "Cancel" }, standalone: false, features: [i0.ɵɵNgOnChangesFeature], decls: 27, vars: 10, consts: [[1, "dialog-backdrop"], [1, "dialog-panel"], [1, "dialog-header"], [1, "icon-circle"], [1, "fa-regular", "fa-copy"], [1, "header-title"], ["title", "Close", 1, "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "dialog-body"], [1, "intro-text"], [1, "form-group"], ["for", "duplicateName"], ["id", "duplicateName", "type", "text", 1, "form-input", 3, "ngModelChange", "blur", "keydown.enter", "ngModel"], [1, "validation-error"], [1, "meta-summary"], [1, "dialog-footer"], [1, "btn", "btn-primary", 3, "click", "disabled"], [1, "btn", "btn-cancel", 3, "click"], [1, "dialog-backdrop", 3, "click"], [1, "meta-item"], [1, "fa-solid", "fa-table-columns"], [1, "fa-solid", "fa-filter"], [1, "fa-solid", "fa-arrow-down-short-wide"], [1, "fa-solid", "fa-chart-simple"]], template: function DuplicateViewDialogComponent_Template(rf, ctx) { if (rf & 1) {
112
+ i0.ɵɵconditionalCreate(0, DuplicateViewDialogComponent_Conditional_0_Template, 1, 0, "div", 0);
113
+ i0.ɵɵelementStart(1, "div", 1)(2, "div", 2)(3, "div", 3);
114
+ i0.ɵɵelement(4, "i", 4);
115
+ i0.ɵɵelementEnd();
116
+ i0.ɵɵelementStart(5, "span", 5);
117
+ i0.ɵɵtext(6, "Duplicate View");
118
+ i0.ɵɵelementEnd();
119
+ i0.ɵɵelementStart(7, "button", 6);
120
+ i0.ɵɵlistener("click", function DuplicateViewDialogComponent_Template_button_click_7_listener() { return ctx.OnCancel(); });
121
+ i0.ɵɵelement(8, "i", 7);
122
+ i0.ɵɵelementEnd()();
123
+ i0.ɵɵelementStart(9, "div", 8)(10, "p", 9);
124
+ i0.ɵɵtext(11, " Creating a copy of ");
125
+ i0.ɵɵelementStart(12, "strong");
126
+ i0.ɵɵtext(13);
127
+ i0.ɵɵelementEnd();
128
+ i0.ɵɵtext(14, " with all its columns, filters, and sorting. ");
129
+ i0.ɵɵelementEnd();
130
+ i0.ɵɵelementStart(15, "div", 10)(16, "label", 11);
131
+ i0.ɵɵtext(17, "New View Name");
132
+ i0.ɵɵelementEnd();
133
+ i0.ɵɵelementStart(18, "input", 12);
134
+ i0.ɵɵtwoWayListener("ngModelChange", function DuplicateViewDialogComponent_Template_input_ngModelChange_18_listener($event) { i0.ɵɵtwoWayBindingSet(ctx.NewName, $event) || (ctx.NewName = $event); return $event; });
135
+ i0.ɵɵlistener("blur", function DuplicateViewDialogComponent_Template_input_blur_18_listener() { return ctx.NameTouched = true; })("keydown.enter", function DuplicateViewDialogComponent_Template_input_keydown_enter_18_listener() { return ctx.OnDuplicate(); });
136
+ i0.ɵɵelementEnd();
137
+ i0.ɵɵconditionalCreate(19, DuplicateViewDialogComponent_Conditional_19_Template, 2, 0, "span", 13);
138
+ i0.ɵɵelementEnd();
139
+ i0.ɵɵconditionalCreate(20, DuplicateViewDialogComponent_Conditional_20_Template, 7, 5, "div", 14);
140
+ i0.ɵɵelementEnd();
141
+ i0.ɵɵelementStart(21, "div", 15)(22, "button", 16);
142
+ i0.ɵɵlistener("click", function DuplicateViewDialogComponent_Template_button_click_22_listener() { return ctx.OnDuplicate(); });
143
+ i0.ɵɵelement(23, "i", 4);
144
+ i0.ɵɵtext(24, " Duplicate ");
145
+ i0.ɵɵelementEnd();
146
+ i0.ɵɵelementStart(25, "button", 17);
147
+ i0.ɵɵlistener("click", function DuplicateViewDialogComponent_Template_button_click_25_listener() { return ctx.OnCancel(); });
148
+ i0.ɵɵtext(26, " Cancel ");
149
+ i0.ɵɵelementEnd()()();
150
+ } if (rf & 2) {
151
+ i0.ɵɵconditional(ctx.IsOpen ? 0 : -1);
152
+ i0.ɵɵadvance();
153
+ i0.ɵɵclassProp("open", ctx.IsOpen);
154
+ i0.ɵɵadvance(12);
155
+ i0.ɵɵtextInterpolate1("\"", ctx.SourceViewName, "\"");
156
+ i0.ɵɵadvance(5);
157
+ i0.ɵɵclassProp("invalid", ctx.NameTouched && !ctx.NewName.trim());
158
+ i0.ɵɵtwoWayProperty("ngModel", ctx.NewName);
159
+ i0.ɵɵadvance();
160
+ i0.ɵɵconditional(ctx.NameTouched && !ctx.NewName.trim() ? 19 : -1);
161
+ i0.ɵɵadvance();
162
+ i0.ɵɵconditional(ctx.Summary ? 20 : -1);
163
+ i0.ɵɵadvance(2);
164
+ i0.ɵɵproperty("disabled", !ctx.NewName.trim());
165
+ } }, dependencies: [i1.DefaultValueAccessor, i1.NgControlStatus, i1.NgModel], 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.4);\n z-index: 2000;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n\n\n.dialog-panel[_ngcontent-%COMP%] {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n width: 420px;\n max-width: calc(100vw - 40px);\n background: white;\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n z-index: 2001;\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n\n.dialog-panel.open[_ngcontent-%COMP%] {\n opacity: 1;\n pointer-events: auto;\n transform: translate(-50%, -50%) scale(1);\n}\n\n\n\n.dialog-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px 24px 0;\n}\n\n.icon-circle[_ngcontent-%COMP%] {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n background: #eff6ff;\n color: #3b82f6;\n flex-shrink: 0;\n}\n\n.header-title[_ngcontent-%COMP%] {\n font-size: 18px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.close-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n color: #6b7280;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: auto;\n}\n\n.close-btn[_ngcontent-%COMP%]:hover {\n background: #f3f4f6;\n color: #374151;\n}\n\n\n\n.dialog-body[_ngcontent-%COMP%] {\n padding: 20px 24px;\n}\n\n.intro-text[_ngcontent-%COMP%] {\n font-size: 14px;\n color: #6b7280;\n line-height: 1.5;\n margin: 0 0 16px 0;\n}\n\n.intro-text[_ngcontent-%COMP%] strong[_ngcontent-%COMP%] {\n color: #374151;\n}\n\n\n\n.form-group[_ngcontent-%COMP%] {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 16px;\n}\n\n.form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n font-size: 13px;\n font-weight: 600;\n color: #6b7280;\n}\n\n.form-input[_ngcontent-%COMP%] {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #d1d5db;\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n color: #1f2937;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n box-sizing: border-box;\n}\n\n.form-input[_ngcontent-%COMP%]:focus {\n outline: none;\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n}\n\n.form-input.invalid[_ngcontent-%COMP%] {\n border-color: #ef4444;\n}\n\n.validation-error[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #ef4444;\n}\n\n\n\n.meta-summary[_ngcontent-%COMP%] {\n display: flex;\n gap: 16px;\n background: #f8fafc;\n border-radius: 8px;\n padding: 10px 14px;\n font-size: 12px;\n color: #6b7280;\n}\n\n.meta-item[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.meta-item[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3b82f6;\n font-size: 11px;\n}\n\n\n\n.dialog-footer[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px 24px 20px;\n border-top: 1px solid #e5e7eb;\n}\n\n\n\n.btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn-primary[_ngcontent-%COMP%] {\n background: #3b82f6;\n color: white;\n}\n\n.btn-primary[_ngcontent-%COMP%]:hover:not(:disabled) {\n background: #2563eb;\n}\n\n.btn-primary[_ngcontent-%COMP%]:disabled {\n background: #93c5fd;\n cursor: not-allowed;\n}\n\n.btn-cancel[_ngcontent-%COMP%] {\n background: #f3f4f6;\n color: #374151;\n}\n\n.btn-cancel[_ngcontent-%COMP%]:hover {\n background: #e5e7eb;\n}"] });
166
+ }
167
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DuplicateViewDialogComponent, [{
168
+ type: Component,
169
+ args: [{ standalone: false, selector: 'mj-duplicate-view-dialog', template: "<!-- Dialog Backdrop -->\n@if (IsOpen) {\n <div class=\"dialog-backdrop\" (click)=\"OnCancel()\"></div>\n}\n\n<!-- Dialog Panel -->\n<div class=\"dialog-panel\" [class.open]=\"IsOpen\">\n <!-- Header -->\n <div class=\"dialog-header\">\n <div class=\"icon-circle\">\n <i class=\"fa-regular fa-copy\"></i>\n </div>\n <span class=\"header-title\">Duplicate View</span>\n <button class=\"close-btn\" (click)=\"OnCancel()\" title=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n\n <!-- Body -->\n <div class=\"dialog-body\">\n <p class=\"intro-text\">\n Creating a copy of <strong>\"{{ SourceViewName }}\"</strong> with all its columns, filters, and sorting.\n </p>\n\n <!-- New Name Input -->\n <div class=\"form-group\">\n <label for=\"duplicateName\">New View Name</label>\n <input\n id=\"duplicateName\"\n type=\"text\"\n class=\"form-input\"\n [class.invalid]=\"NameTouched && !NewName.trim()\"\n [(ngModel)]=\"NewName\"\n (blur)=\"NameTouched = true\"\n (keydown.enter)=\"OnDuplicate()\"\n />\n @if (NameTouched && !NewName.trim()) {\n <span class=\"validation-error\">Name is required</span>\n }\n </div>\n\n <!-- Metadata Summary -->\n @if (Summary) {\n <div class=\"meta-summary\">\n @if (Summary.FilterCount > 0) {\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-filter\"></i>\n {{ Summary.FilterCount }} filter{{ Summary.FilterCount !== 1 ? 's' : '' }}\n </span>\n }\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-table-columns\"></i>\n {{ Summary.ColumnCount }} column{{ Summary.ColumnCount !== 1 ? 's' : '' }}\n </span>\n @if (Summary.SortCount > 0) {\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-arrow-down-short-wide\"></i>\n {{ Summary.SortCount }} sort{{ Summary.SortCount !== 1 ? 's' : '' }}\n </span>\n }\n @if (Summary.AggregateCount > 0) {\n <span class=\"meta-item\">\n <i class=\"fa-solid fa-chart-simple\"></i>\n {{ Summary.AggregateCount }} aggregate{{ Summary.AggregateCount !== 1 ? 's' : '' }}\n </span>\n }\n </div>\n }\n </div>\n\n <!-- Footer -->\n <div class=\"dialog-footer\">\n <button\n class=\"btn btn-primary\"\n (click)=\"OnDuplicate()\"\n [disabled]=\"!NewName.trim()\">\n <i class=\"fa-regular fa-copy\"></i>\n Duplicate\n </button>\n <button class=\"btn btn-cancel\" (click)=\"OnCancel()\">\n Cancel\n </button>\n </div>\n</div>\n", styles: ["/* Dialog 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.4);\n z-index: 2000;\n animation: fadeIn 0.2s ease;\n}\n\n@keyframes fadeIn {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Dialog Panel */\n.dialog-panel {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.95);\n width: 420px;\n max-width: calc(100vw - 40px);\n background: white;\n border-radius: 16px;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.2);\n z-index: 2001;\n display: flex;\n flex-direction: column;\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n\n.dialog-panel.open {\n opacity: 1;\n pointer-events: auto;\n transform: translate(-50%, -50%) scale(1);\n}\n\n/* Dialog Header */\n.dialog-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 20px 24px 0;\n}\n\n.icon-circle {\n width: 40px;\n height: 40px;\n border-radius: 50%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 18px;\n background: #eff6ff;\n color: #3b82f6;\n flex-shrink: 0;\n}\n\n.header-title {\n font-size: 18px;\n font-weight: 600;\n color: #1f2937;\n}\n\n.close-btn {\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n border-radius: 8px;\n cursor: pointer;\n color: #6b7280;\n transition: all 0.15s ease;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: auto;\n}\n\n.close-btn:hover {\n background: #f3f4f6;\n color: #374151;\n}\n\n/* Dialog Body */\n.dialog-body {\n padding: 20px 24px;\n}\n\n.intro-text {\n font-size: 14px;\n color: #6b7280;\n line-height: 1.5;\n margin: 0 0 16px 0;\n}\n\n.intro-text strong {\n color: #374151;\n}\n\n/* Form Group */\n.form-group {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 16px;\n}\n\n.form-group label {\n font-size: 13px;\n font-weight: 600;\n color: #6b7280;\n}\n\n.form-input {\n width: 100%;\n padding: 10px 12px;\n border: 1px solid #d1d5db;\n border-radius: 8px;\n font-size: 14px;\n font-family: inherit;\n color: #1f2937;\n transition: border-color 0.15s ease, box-shadow 0.15s ease;\n box-sizing: border-box;\n}\n\n.form-input:focus {\n outline: none;\n border-color: #3b82f6;\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);\n}\n\n.form-input.invalid {\n border-color: #ef4444;\n}\n\n.validation-error {\n font-size: 12px;\n color: #ef4444;\n}\n\n/* Metadata Summary */\n.meta-summary {\n display: flex;\n gap: 16px;\n background: #f8fafc;\n border-radius: 8px;\n padding: 10px 14px;\n font-size: 12px;\n color: #6b7280;\n}\n\n.meta-item {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n\n.meta-item i {\n color: #3b82f6;\n font-size: 11px;\n}\n\n/* Dialog Footer */\n.dialog-footer {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 16px 24px 20px;\n border-top: 1px solid #e5e7eb;\n}\n\n/* Buttons */\n.btn {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 20px;\n border: none;\n border-radius: 8px;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s ease;\n}\n\n.btn-primary {\n background: #3b82f6;\n color: white;\n}\n\n.btn-primary:hover:not(:disabled) {\n background: #2563eb;\n}\n\n.btn-primary:disabled {\n background: #93c5fd;\n cursor: not-allowed;\n}\n\n.btn-cancel {\n background: #f3f4f6;\n color: #374151;\n}\n\n.btn-cancel:hover {\n background: #e5e7eb;\n}\n"] }]
170
+ }], () => [{ type: i0.ChangeDetectorRef }], { IsOpen: [{
171
+ type: Input
172
+ }], SourceViewName: [{
173
+ type: Input
174
+ }], Summary: [{
175
+ type: Input
176
+ }], Duplicate: [{
177
+ type: Output
178
+ }], Cancel: [{
179
+ type: Output
180
+ }] }); })();
181
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(DuplicateViewDialogComponent, { className: "DuplicateViewDialogComponent", filePath: "src/lib/duplicate-view-dialog/duplicate-view-dialog.component.ts", lineNumber: 35 }); })();
182
+ //# sourceMappingURL=duplicate-view-dialog.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"duplicate-view-dialog.component.js","sourceRoot":"","sources":["../../../src/lib/duplicate-view-dialog/duplicate-view-dialog.component.ts","../../../src/lib/duplicate-view-dialog/duplicate-view-dialog.component.html"],"names":[],"mappings":"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"}
@@ -681,7 +681,7 @@ export declare class EntityDataGridComponent implements OnInit, OnDestroy {
681
681
  private generateColumnsFromMetadata;
682
682
  /**
683
683
  * Determines if a field should be shown by default when no saved view exists.
684
- * This logic is aligned with UserViewEntity.SetDefaultsFromEntity() to ensure
684
+ * This logic is aligned with MJUserViewEntity.SetDefaultsFromEntity() to ensure
685
685
  * consistent column visibility between initial load and saved views.
686
686
  */
687
687
  private shouldShowField;
@@ -2063,7 +2063,7 @@ export class EntityDataGridComponent {
2063
2063
  }
2064
2064
  /**
2065
2065
  * Determines if a field should be shown by default when no saved view exists.
2066
- * This logic is aligned with UserViewEntity.SetDefaultsFromEntity() to ensure
2066
+ * This logic is aligned with MJUserViewEntity.SetDefaultsFromEntity() to ensure
2067
2067
  * consistent column visibility between initial load and saved views.
2068
2068
  */
2069
2069
  shouldShowField(field) {
@@ -2075,7 +2075,7 @@ export class EntityDataGridComponent {
2075
2075
  return false;
2076
2076
  }
2077
2077
  // Only show fields explicitly marked as DefaultInView
2078
- // This aligns with UserViewEntity.SetDefaultsFromEntity() behavior
2078
+ // This aligns with MJUserViewEntity.SetDefaultsFromEntity() behavior
2079
2079
  // ensuring users see the same columns before and after saving a view
2080
2080
  return field.DefaultInView === true;
2081
2081
  }