@memberjunction/ng-ui-components 0.0.1 → 5.23.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 (69) hide show
  1. package/dist/lib/accordion/accordion.component.d.ts +58 -0
  2. package/dist/lib/accordion/accordion.component.d.ts.map +1 -0
  3. package/dist/lib/accordion/accordion.component.js +163 -0
  4. package/dist/lib/accordion/accordion.component.js.map +1 -0
  5. package/dist/lib/accordion/accordion.scss +45 -0
  6. package/dist/lib/button/button.directive.d.ts +45 -0
  7. package/dist/lib/button/button.directive.d.ts.map +1 -0
  8. package/dist/lib/button/button.directive.js +114 -0
  9. package/dist/lib/button/button.directive.js.map +1 -0
  10. package/dist/lib/button/button.scss +250 -0
  11. package/dist/lib/calendar/calendar-utils.d.ts +16 -0
  12. package/dist/lib/calendar/calendar-utils.d.ts.map +1 -0
  13. package/dist/lib/calendar/calendar-utils.js +41 -0
  14. package/dist/lib/calendar/calendar-utils.js.map +1 -0
  15. package/dist/lib/combobox/combobox.component.d.ts +83 -0
  16. package/dist/lib/combobox/combobox.component.d.ts.map +1 -0
  17. package/dist/lib/combobox/combobox.component.js +483 -0
  18. package/dist/lib/combobox/combobox.component.js.map +1 -0
  19. package/dist/lib/combobox/combobox.scss +86 -0
  20. package/dist/lib/datepicker/datepicker.component.d.ts +50 -0
  21. package/dist/lib/datepicker/datepicker.component.d.ts.map +1 -0
  22. package/dist/lib/datepicker/datepicker.component.js +279 -0
  23. package/dist/lib/datepicker/datepicker.component.js.map +1 -0
  24. package/dist/lib/datepicker/datepicker.scss +60 -0
  25. package/dist/lib/dialog/dialog.component.d.ts +84 -0
  26. package/dist/lib/dialog/dialog.component.d.ts.map +1 -0
  27. package/dist/lib/dialog/dialog.component.js +285 -0
  28. package/dist/lib/dialog/dialog.component.js.map +1 -0
  29. package/dist/lib/dialog/dialog.scss +134 -0
  30. package/dist/lib/dialog/dialog.service.d.ts +114 -0
  31. package/dist/lib/dialog/dialog.service.d.ts.map +1 -0
  32. package/dist/lib/dialog/dialog.service.js +282 -0
  33. package/dist/lib/dialog/dialog.service.js.map +1 -0
  34. package/dist/lib/dropdown/dropdown.component.d.ts +75 -0
  35. package/dist/lib/dropdown/dropdown.component.d.ts.map +1 -0
  36. package/dist/lib/dropdown/dropdown.component.js +445 -0
  37. package/dist/lib/dropdown/dropdown.component.js.map +1 -0
  38. package/dist/lib/dropdown/dropdown.scss +68 -0
  39. package/dist/lib/input/chip.scss +64 -0
  40. package/dist/lib/input/input-switch-progress.scss +57 -0
  41. package/dist/lib/input/input.scss +77 -0
  42. package/dist/lib/numeric-input/numeric-input.component.d.ts +31 -0
  43. package/dist/lib/numeric-input/numeric-input.component.d.ts.map +1 -0
  44. package/dist/lib/numeric-input/numeric-input.component.js +103 -0
  45. package/dist/lib/numeric-input/numeric-input.component.js.map +1 -0
  46. package/dist/lib/progress-bar/progress-bar.component.d.ts +14 -0
  47. package/dist/lib/progress-bar/progress-bar.component.d.ts.map +1 -0
  48. package/dist/lib/progress-bar/progress-bar.component.js +62 -0
  49. package/dist/lib/progress-bar/progress-bar.component.js.map +1 -0
  50. package/dist/lib/splitter/splitter.component.d.ts +23 -0
  51. package/dist/lib/splitter/splitter.component.d.ts.map +1 -0
  52. package/dist/lib/splitter/splitter.component.js +24 -0
  53. package/dist/lib/splitter/splitter.component.js.map +1 -0
  54. package/dist/lib/splitter/splitter.scss +29 -0
  55. package/dist/lib/switch/switch.component.d.ts +24 -0
  56. package/dist/lib/switch/switch.component.d.ts.map +1 -0
  57. package/dist/lib/switch/switch.component.js +82 -0
  58. package/dist/lib/switch/switch.component.js.map +1 -0
  59. package/dist/lib/window/window.component.d.ts +115 -0
  60. package/dist/lib/window/window.component.d.ts.map +1 -0
  61. package/dist/lib/window/window.component.js +502 -0
  62. package/dist/lib/window/window.component.js.map +1 -0
  63. package/dist/lib/window/window.scss +97 -0
  64. package/dist/public-api.d.ts +14 -0
  65. package/dist/public-api.d.ts.map +1 -0
  66. package/dist/public-api.js +16 -0
  67. package/dist/public-api.js.map +1 -0
  68. package/package.json +39 -6
  69. package/README.md +0 -45
@@ -0,0 +1,282 @@
1
+ import { Injectable, ApplicationRef, Injector, createComponent, inject } from '@angular/core';
2
+ import { Subject } from 'rxjs';
3
+ /**
4
+ * Internal container component that wraps dialog content.
5
+ * This is dynamically created by MJDialogService.
6
+ */
7
+ import { Component, Input, Output, EventEmitter } from '@angular/core';
8
+ import * as i0 from "@angular/core";
9
+ const _forTrack0 = ($index, $item) => $item.text;
10
+ function MJDialogContainerComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
11
+ const _r2 = i0.ɵɵgetCurrentView();
12
+ i0.ɵɵdomElementStart(0, "div", 3)(1, "h3", 6);
13
+ i0.ɵɵtext(2);
14
+ i0.ɵɵdomElementEnd();
15
+ i0.ɵɵdomElementStart(3, "button", 7);
16
+ i0.ɵɵdomListener("click", function MJDialogContainerComponent_Conditional_2_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.OnCloseClick()); });
17
+ i0.ɵɵdomElement(4, "i", 8);
18
+ i0.ɵɵdomElementEnd()();
19
+ } if (rf & 2) {
20
+ const ctx_r2 = i0.ɵɵnextContext();
21
+ i0.ɵɵadvance(2);
22
+ i0.ɵɵtextInterpolate(ctx_r2.Title);
23
+ } }
24
+ function MJDialogContainerComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
25
+ i0.ɵɵdomElementStart(0, "p");
26
+ i0.ɵɵtext(1);
27
+ i0.ɵɵdomElementEnd();
28
+ } if (rf & 2) {
29
+ const ctx_r2 = i0.ɵɵnextContext();
30
+ i0.ɵɵadvance();
31
+ i0.ɵɵtextInterpolate(ctx_r2.StringContent);
32
+ } }
33
+ function MJDialogContainerComponent_Conditional_7_For_2_Template(rf, ctx) { if (rf & 1) {
34
+ const _r4 = i0.ɵɵgetCurrentView();
35
+ i0.ɵɵdomElementStart(0, "button", 10);
36
+ i0.ɵɵdomListener("click", function MJDialogContainerComponent_Conditional_7_For_2_Template_button_click_0_listener() { const action_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnActionClick(action_r5)); });
37
+ i0.ɵɵtext(1);
38
+ i0.ɵɵdomElementEnd();
39
+ } if (rf & 2) {
40
+ const action_r5 = ctx.$implicit;
41
+ i0.ɵɵclassProp("mj-btn--primary", action_r5.primary)("mj-btn--danger", action_r5.themeColor === "error");
42
+ i0.ɵɵadvance();
43
+ i0.ɵɵtextInterpolate1(" ", action_r5.text, " ");
44
+ } }
45
+ function MJDialogContainerComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
46
+ i0.ɵɵdomElementStart(0, "div", 5);
47
+ i0.ɵɵrepeaterCreate(1, MJDialogContainerComponent_Conditional_7_For_2_Template, 2, 5, "button", 9, _forTrack0);
48
+ i0.ɵɵdomElementEnd();
49
+ } if (rf & 2) {
50
+ const ctx_r2 = i0.ɵɵnextContext();
51
+ i0.ɵɵadvance();
52
+ i0.ɵɵrepeater(ctx_r2.Actions);
53
+ } }
54
+ /**
55
+ * Reference to an open dialog. Used to access content instance and subscribe to results.
56
+ */
57
+ export class MJDialogRef {
58
+ resultSubject = new Subject();
59
+ containerRef = null;
60
+ /** The content component instance (when content is a Component class) */
61
+ Content = null;
62
+ /** Observable that emits when the dialog is closed */
63
+ get Result() {
64
+ return this.resultSubject.asObservable();
65
+ }
66
+ /** @internal */
67
+ SetContainerRef(ref) {
68
+ this.containerRef = ref;
69
+ }
70
+ /** Close the dialog with a result */
71
+ Close(result) {
72
+ this.resultSubject.next(result);
73
+ this.resultSubject.complete();
74
+ this.containerRef?.location.nativeElement.remove();
75
+ this.containerRef?.destroy();
76
+ }
77
+ }
78
+ export class MJDialogContainerComponent {
79
+ Title = '';
80
+ StringContent = '';
81
+ Width = null;
82
+ MinWidth = null;
83
+ Height = null;
84
+ Actions = [];
85
+ ActionClicked = new EventEmitter();
86
+ CloseClicked = new EventEmitter();
87
+ OnBackdropClick() {
88
+ this.CloseClicked.emit();
89
+ }
90
+ OnCloseClick() {
91
+ this.CloseClicked.emit();
92
+ }
93
+ OnActionClick(action) {
94
+ this.ActionClicked.emit(action);
95
+ }
96
+ static ɵfac = function MJDialogContainerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJDialogContainerComponent)(); };
97
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJDialogContainerComponent, selectors: [["mj-dialog-container-internal"]], inputs: { Title: "Title", StringContent: "StringContent", Width: "Width", MinWidth: "MinWidth", Height: "Height", Actions: "Actions" }, outputs: { ActionClicked: "ActionClicked", CloseClicked: "CloseClicked" }, decls: 8, vars: 9, consts: [["contentHost", ""], [1, "mj-dialog-backdrop", 3, "click"], ["role", "dialog", "aria-modal", "true", 1, "mj-dialog-container", 3, "click"], [1, "mj-dialog-titlebar"], [1, "mj-dialog-body"], [1, "mj-dialog-actions"], [1, "mj-dialog-title"], ["aria-label", "Close", 1, "mj-dialog-close", 3, "click"], [1, "fa-solid", "fa-times"], [1, "mj-btn", 3, "mj-btn--primary", "mj-btn--danger"], [1, "mj-btn", 3, "click"]], template: function MJDialogContainerComponent_Template(rf, ctx) { if (rf & 1) {
98
+ const _r1 = i0.ɵɵgetCurrentView();
99
+ i0.ɵɵdomElementStart(0, "div", 1);
100
+ i0.ɵɵdomListener("click", function MJDialogContainerComponent_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.OnBackdropClick()); });
101
+ i0.ɵɵdomElementStart(1, "div", 2);
102
+ i0.ɵɵdomListener("click", function MJDialogContainerComponent_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView($event.stopPropagation()); });
103
+ i0.ɵɵconditionalCreate(2, MJDialogContainerComponent_Conditional_2_Template, 5, 1, "div", 3);
104
+ i0.ɵɵdomElementStart(3, "div", 4);
105
+ i0.ɵɵconditionalCreate(4, MJDialogContainerComponent_Conditional_4_Template, 2, 1, "p");
106
+ i0.ɵɵdomElement(5, "div", null, 0);
107
+ i0.ɵɵdomElementEnd();
108
+ i0.ɵɵconditionalCreate(7, MJDialogContainerComponent_Conditional_7_Template, 3, 0, "div", 5);
109
+ i0.ɵɵdomElementEnd()();
110
+ } if (rf & 2) {
111
+ i0.ɵɵadvance();
112
+ i0.ɵɵstyleProp("width", ctx.Width ? ctx.Width + "px" : "450px")("min-width", ctx.MinWidth ? ctx.MinWidth + "px" : null)("height", ctx.Height ? ctx.Height + "px" : null);
113
+ i0.ɵɵadvance();
114
+ i0.ɵɵconditional(ctx.Title ? 2 : -1);
115
+ i0.ɵɵadvance(2);
116
+ i0.ɵɵconditional(ctx.StringContent ? 4 : -1);
117
+ i0.ɵɵadvance(3);
118
+ i0.ɵɵconditional(ctx.Actions && ctx.Actions.length > 0 ? 7 : -1);
119
+ } }, styles: [".mj-dialog-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n top: 0; left: 0; right: 0; bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 10001;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .mj-dialog-container[_ngcontent-%COMP%] {\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-xl, 0 20px 60px color-mix(in srgb, var(--mj-text-primary) 30%, transparent));\n display: flex;\n flex-direction: column;\n max-height: 90vh;\n max-width: 90vw;\n overflow: hidden;\n }\n\n .mj-dialog-titlebar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n }\n\n .mj-dialog-title[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 1.1rem;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n }\n\n .mj-dialog-close[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--mj-text-muted);\n border-radius: var(--mj-radius-sm);\n transition: var(--mj-transition-colors);\n }\n .mj-dialog-close[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .mj-dialog-body[_ngcontent-%COMP%] {\n flex: 1;\n padding: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .mj-dialog-body[_ngcontent-%COMP%] > p[_ngcontent-%COMP%] {\n padding: 20px;\n }\n\n .mj-dialog-body[_ngcontent-%COMP%] > div[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n }\n\n .mj-dialog-body[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n color: var(--mj-text-primary);\n line-height: 1.5;\n }\n\n .mj-dialog-actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .mj-btn[_ngcontent-%COMP%] {\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n font-size: 0.875rem;\n transition: var(--mj-transition-colors);\n }\n .mj-btn[_ngcontent-%COMP%]:hover { background: var(--mj-bg-surface-hover); }\n .mj-btn--primary[_ngcontent-%COMP%] {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n }\n .mj-btn--primary[_ngcontent-%COMP%]:hover { background: var(--mj-brand-primary-hover); }\n .mj-btn--danger[_ngcontent-%COMP%] {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n }\n\n @media (max-width: 767px) {\n .mj-dialog-container[_ngcontent-%COMP%] {\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw;\n max-height: 100vh;\n border-radius: 0;\n }\n }"] });
120
+ }
121
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJDialogContainerComponent, [{
122
+ type: Component,
123
+ args: [{ selector: 'mj-dialog-container-internal', standalone: true, template: `
124
+ <div class="mj-dialog-backdrop" (click)="OnBackdropClick()">
125
+ <div class="mj-dialog-container"
126
+ [style.width]="Width ? Width + 'px' : '450px'"
127
+ [style.min-width]="MinWidth ? MinWidth + 'px' : null"
128
+ [style.height]="Height ? Height + 'px' : null"
129
+ (click)="$event.stopPropagation()"
130
+ role="dialog"
131
+ aria-modal="true">
132
+
133
+ @if (Title) {
134
+ <div class="mj-dialog-titlebar">
135
+ <h3 class="mj-dialog-title">{{ Title }}</h3>
136
+ <button class="mj-dialog-close" (click)="OnCloseClick()" aria-label="Close">
137
+ <i class="fa-solid fa-times"></i>
138
+ </button>
139
+ </div>
140
+ }
141
+
142
+ <div class="mj-dialog-body">
143
+ @if (StringContent) {
144
+ <p>{{ StringContent }}</p>
145
+ }
146
+ <div #contentHost></div>
147
+ </div>
148
+
149
+ @if (Actions && Actions.length > 0) {
150
+ <div class="mj-dialog-actions">
151
+ @for (action of Actions; track action.text) {
152
+ <button
153
+ class="mj-btn"
154
+ [class.mj-btn--primary]="action.primary"
155
+ [class.mj-btn--danger]="action.themeColor === 'error'"
156
+ (click)="OnActionClick(action)">
157
+ {{ action.text }}
158
+ </button>
159
+ }
160
+ </div>
161
+ }
162
+ </div>
163
+ </div>
164
+ `, styles: ["\n .mj-dialog-backdrop {\n position: fixed;\n top: 0; left: 0; right: 0; bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 10001;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .mj-dialog-container {\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-xl, 0 20px 60px color-mix(in srgb, var(--mj-text-primary) 30%, transparent));\n display: flex;\n flex-direction: column;\n max-height: 90vh;\n max-width: 90vw;\n overflow: hidden;\n }\n\n .mj-dialog-titlebar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n }\n\n .mj-dialog-title {\n margin: 0;\n font-size: 1.1rem;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n }\n\n .mj-dialog-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--mj-text-muted);\n border-radius: var(--mj-radius-sm);\n transition: var(--mj-transition-colors);\n }\n .mj-dialog-close:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .mj-dialog-body {\n flex: 1;\n padding: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .mj-dialog-body > p {\n padding: 20px;\n }\n\n .mj-dialog-body > div {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n }\n\n .mj-dialog-body p {\n margin: 0;\n color: var(--mj-text-primary);\n line-height: 1.5;\n }\n\n .mj-dialog-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .mj-btn {\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n font-size: 0.875rem;\n transition: var(--mj-transition-colors);\n }\n .mj-btn:hover { background: var(--mj-bg-surface-hover); }\n .mj-btn--primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n }\n .mj-btn--primary:hover { background: var(--mj-brand-primary-hover); }\n .mj-btn--danger {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n }\n\n @media (max-width: 767px) {\n .mj-dialog-container {\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw;\n max-height: 100vh;\n border-radius: 0;\n }\n }\n "] }]
165
+ }], null, { Title: [{
166
+ type: Input
167
+ }], StringContent: [{
168
+ type: Input
169
+ }], Width: [{
170
+ type: Input
171
+ }], MinWidth: [{
172
+ type: Input
173
+ }], Height: [{
174
+ type: Input
175
+ }], Actions: [{
176
+ type: Input
177
+ }], ActionClicked: [{
178
+ type: Output
179
+ }], CloseClicked: [{
180
+ type: Output
181
+ }] }); })();
182
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJDialogContainerComponent, { className: "MJDialogContainerComponent", filePath: "lib/dialog/dialog.service.ts", lineNumber: 247 }); })();
183
+ /**
184
+ * MJDialogService — Programmatic dialog opening. Replaces Kendo `DialogService`.
185
+ *
186
+ * @example
187
+ * ```typescript
188
+ * // Simple confirm
189
+ * const dialogRef = this.dialogService.Open({
190
+ * title: 'Confirm',
191
+ * content: 'Are you sure?',
192
+ * actions: [
193
+ * { text: 'OK', primary: true },
194
+ * { text: 'Cancel' }
195
+ * ]
196
+ * });
197
+ * dialogRef.Result.subscribe(result => { ... });
198
+ *
199
+ * // Component content
200
+ * const dialogRef = this.dialogService.Open({
201
+ * content: MyDialogComponent,
202
+ * width: 500
203
+ * });
204
+ * dialogRef.Content.instance.someInput = 'value';
205
+ * dialogRef.Result.subscribe(result => { ... });
206
+ * ```
207
+ */
208
+ export class MJDialogService {
209
+ appRef = inject(ApplicationRef);
210
+ injector = inject(Injector);
211
+ /**
212
+ * Open a dialog programmatically.
213
+ *
214
+ * Kendo-compatible API: accepts `content` as string or Component class,
215
+ * returns a ref with `.Content.instance` and `.Result` observable.
216
+ */
217
+ Open(settings) {
218
+ const dialogRef = new MJDialogRef();
219
+ const injector = settings.appendTo?.injector ?? this.injector;
220
+ const containerRef = this.createContainer(injector);
221
+ this.configureContainer(containerRef, settings, dialogRef);
222
+ this.attachToDOM(containerRef, settings);
223
+ this.attachContentComponent(containerRef, settings, dialogRef, injector);
224
+ containerRef.changeDetectorRef.detectChanges();
225
+ return dialogRef;
226
+ }
227
+ createContainer(injector) {
228
+ return createComponent(MJDialogContainerComponent, {
229
+ environmentInjector: this.appRef.injector,
230
+ elementInjector: injector
231
+ });
232
+ }
233
+ configureContainer(containerRef, settings, dialogRef) {
234
+ containerRef.instance.Title = settings.title ?? '';
235
+ containerRef.instance.Width = settings.width ?? null;
236
+ containerRef.instance.MinWidth = settings.minWidth ?? null;
237
+ containerRef.instance.Height = settings.height ?? null;
238
+ containerRef.instance.Actions = settings.actions ?? [];
239
+ if (typeof settings.content === 'string') {
240
+ containerRef.instance.StringContent = settings.content;
241
+ }
242
+ containerRef.instance.CloseClicked.subscribe(() => dialogRef.Close(undefined));
243
+ containerRef.instance.ActionClicked.subscribe((action) => dialogRef.Close(action));
244
+ dialogRef.SetContainerRef(containerRef);
245
+ }
246
+ attachToDOM(containerRef, settings) {
247
+ if (settings.appendTo) {
248
+ settings.appendTo.insert(containerRef.hostView);
249
+ }
250
+ else {
251
+ document.body.appendChild(containerRef.location.nativeElement);
252
+ this.appRef.attachView(containerRef.hostView);
253
+ }
254
+ }
255
+ attachContentComponent(containerRef, settings, dialogRef, injector) {
256
+ if (!settings.content || typeof settings.content === 'string')
257
+ return;
258
+ const contentHost = containerRef.location.nativeElement.querySelector('.mj-dialog-body div');
259
+ if (!contentHost)
260
+ return;
261
+ const contentRef = createComponent(settings.content, {
262
+ environmentInjector: this.appRef.injector,
263
+ elementInjector: injector,
264
+ hostElement: contentHost
265
+ });
266
+ this.appRef.attachView(contentRef.hostView);
267
+ dialogRef.Content = { instance: contentRef.instance };
268
+ }
269
+ /**
270
+ * Kendo-compatible alias — lowercase `open` for easier migration.
271
+ */
272
+ open(settings) {
273
+ return this.Open(settings);
274
+ }
275
+ static ɵfac = function MJDialogService_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJDialogService)(); };
276
+ static ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: MJDialogService, factory: MJDialogService.ɵfac, providedIn: 'root' });
277
+ }
278
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJDialogService, [{
279
+ type: Injectable,
280
+ args: [{ providedIn: 'root' }]
281
+ }], null, null); })();
282
+ //# sourceMappingURL=dialog.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialog.service.js","sourceRoot":"","sources":["../../../src/lib/dialog/dialog.service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAIV,cAAc,EACd,QAAQ,EACR,eAAe,EACf,MAAM,EACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,OAAO,EAAc,MAAM,MAAM,CAAC;AA4D3C;;;GAGG;AACH,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;;;;;IAiB3D,AADF,iCAAgC,YACF;IAAA,YAAW;IAAA,oBAAK;IAC5C,oCAA4E;IAA5C,iMAAS,qBAAc,KAAC;IACtD,0BAAiC;IAErC,AADE,oBAAS,EACL;;;IAJwB,eAAW;IAAX,kCAAW;;;IASvC,4BAAG;IAAA,YAAmB;IAAA,oBAAI;;;IAAvB,cAAmB;IAAnB,0CAAmB;;;;IAQpB,qCAIkC;IAAhC,oOAAS,+BAAqB,KAAC;IAC/B,YACF;IAAA,oBAAS;;;IAHP,AADA,oDAAwC,oDACc;IAEtD,cACF;IADE,+CACF;;;IARJ,iCAA+B;IAC7B,8GAQC;IACH,oBAAM;;;IATJ,cAQC;IARD,6BAQC;;AA1Eb;;GAEG;AACH,MAAM,OAAO,WAAW;IACd,aAAa,GAAG,IAAI,OAAO,EAAW,CAAC;IACvC,YAAY,GAAoD,IAAI,CAAC;IAE7E,yEAAyE;IACzE,OAAO,GAAiD,IAAI,CAAC;IAE7D,sDAAsD;IACtD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;IAC3C,CAAC;IAED,gBAAgB;IAChB,eAAe,CAAC,GAA6C;QAC3D,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;IAC1B,CAAC;IAED,qCAAqC;IACrC,KAAK,CAAC,MAAgB;QACpB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QACnD,IAAI,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;CACF;AAkLD,MAAM,OAAO,0BAA0B;IAC5B,KAAK,GAAG,EAAE,CAAC;IACX,aAAa,GAAG,EAAE,CAAC;IACnB,KAAK,GAAkB,IAAI,CAAC;IAC5B,QAAQ,GAAkB,IAAI,CAAC;IAC/B,MAAM,GAAkB,IAAI,CAAC;IAC7B,OAAO,GAAqB,EAAE,CAAC;IAC9B,aAAa,GAAG,IAAI,YAAY,EAAkB,CAAC;IACnD,YAAY,GAAG,IAAI,YAAY,EAAQ,CAAC;IAElD,eAAe;QACb,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,YAAY;QACV,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,aAAa,CAAC,MAAsB;QAClC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;oHApBU,0BAA0B;6DAA1B,0BAA0B;;YAtKnC,iCAA4D;YAA5B,6IAAS,qBAAiB,KAAC;YACzD,iCAMoB;YAFlB,mJAAS,wBAAwB,KAAC;YAIlC,4FAAa;YASb,iCAA4B;YAC1B,uFAAqB;YAGrB,kCAAwB;YAC1B,oBAAM;YAEN,4FAAqC;YAczC,AADE,oBAAM,EACF;;YArCF,cAA8C;YAE9C,AADA,AADA,+DAA8C,wDACO,iDACP;YAK9C,cAOC;YAPD,oCAOC;YAGC,eAEC;YAFD,4CAEC;YAIH,eAYC;YAZD,gEAYC;;;iFAiII,0BAA0B;cA1KtC,SAAS;2BACE,8BAA8B,cAC5B,IAAI,YACN;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCT;;kBA+HA,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,MAAM;;kBACN,MAAM;;kFARI,0BAA0B;AAuBvC;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,MAAM,OAAO,eAAe;IAClB,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;IAChC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAEpC;;;;;OAKG;IACH,IAAI,CAAC,QAA0B;QAC7B,MAAM,SAAS,GAAG,IAAI,WAAW,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC;QAE9D,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC,kBAAkB,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3D,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEzE,YAAY,CAAC,iBAAiB,CAAC,aAAa,EAAE,CAAC;QAC/C,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,eAAe,CAAC,QAAkB;QACxC,OAAO,eAAe,CAAC,0BAA0B,EAAE;YACjD,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YACzC,eAAe,EAAE,QAAQ;SAC1B,CAAC,CAAC;IACL,CAAC;IAEO,kBAAkB,CACxB,YAAsD,EACtD,QAA0B,EAC1B,SAAsB;QAEtB,YAAY,CAAC,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;QACnD,YAAY,CAAC,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC;QACrD,YAAY,CAAC,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,IAAI,IAAI,CAAC;QAC3D,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,IAAI,IAAI,CAAC;QACvD,YAAY,CAAC,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,IAAI,EAAE,CAAC;QAEvD,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACzC,YAAY,CAAC,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC;QACzD,CAAC;QAED,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;QAC/E,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,MAAsB,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;QACnG,SAAS,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;IAEO,WAAW,CAAC,YAAsD,EAAE,QAA0B;QACpG,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACtB,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YAC/D,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAEO,sBAAsB,CAC5B,YAAsD,EACtD,QAA0B,EAC1B,SAAsB,EACtB,QAAkB;QAElB,IAAI,CAAC,QAAQ,CAAC,OAAO,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;YAAE,OAAO;QAEtE,MAAM,WAAW,GAAG,YAAY,CAAC,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;QAC7F,IAAI,CAAC,WAAW;YAAE,OAAO;QAEzB,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,OAAwB,EAAE;YACpE,mBAAmB,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YACzC,eAAe,EAAE,QAAQ;YACzB,WAAW,EAAE,WAAW;SACzB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5C,SAAS,CAAC,OAAO,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,QAAmC,EAAE,CAAC;IACnF,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,QAA0B;QAC7B,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;yGApFU,eAAe;gEAAf,eAAe,WAAf,eAAe,mBADF,MAAM;;iFACnB,eAAe;cAD3B,UAAU;eAAC,EAAE,UAAU,EAAE,MAAM,EAAE","sourcesContent":["import {\n Injectable,\n ComponentRef,\n Type,\n ViewContainerRef,\n ApplicationRef,\n Injector,\n createComponent,\n inject\n} from '@angular/core';\nimport { Subject, Observable } from 'rxjs';\n\n/**\n * Result returned when a dialog action button is clicked.\n */\nexport interface MJDialogAction {\n text: string;\n primary?: boolean;\n themeColor?: string;\n}\n\n/**\n * Options for opening a dialog programmatically.\n */\nexport interface MJDialogSettings {\n /** Dialog title */\n title?: string;\n /** Content: either a string message or a Component class */\n content?: string | Type<unknown>;\n /** Action buttons shown in the footer */\n actions?: MJDialogAction[];\n /** Dialog width in pixels */\n width?: number;\n /** Dialog minimum width in pixels */\n minWidth?: number;\n /** Dialog height in pixels */\n height?: number;\n /** ViewContainerRef to attach the dialog to (for proper DI context) */\n appendTo?: ViewContainerRef;\n}\n\n/**\n * Reference to an open dialog. Used to access content instance and subscribe to results.\n */\nexport class MJDialogRef {\n private resultSubject = new Subject<unknown>();\n private containerRef: ComponentRef<MJDialogContainerComponent> | null = null;\n\n /** The content component instance (when content is a Component class) */\n Content: { instance: Record<string, unknown> } | null = null;\n\n /** Observable that emits when the dialog is closed */\n get Result(): Observable<unknown> {\n return this.resultSubject.asObservable();\n }\n\n /** @internal */\n SetContainerRef(ref: ComponentRef<MJDialogContainerComponent>): void {\n this.containerRef = ref;\n }\n\n /** Close the dialog with a result */\n Close(result?: unknown): void {\n this.resultSubject.next(result);\n this.resultSubject.complete();\n this.containerRef?.location.nativeElement.remove();\n this.containerRef?.destroy();\n }\n}\n\n/**\n * Internal container component that wraps dialog content.\n * This is dynamically created by MJDialogService.\n */\nimport { Component, Input, Output, EventEmitter } from '@angular/core';\n\n@Component({\n selector: 'mj-dialog-container-internal',\n standalone: true,\n template: `\n <div class=\"mj-dialog-backdrop\" (click)=\"OnBackdropClick()\">\n <div class=\"mj-dialog-container\"\n [style.width]=\"Width ? Width + 'px' : '450px'\"\n [style.min-width]=\"MinWidth ? MinWidth + 'px' : null\"\n [style.height]=\"Height ? Height + 'px' : null\"\n (click)=\"$event.stopPropagation()\"\n role=\"dialog\"\n aria-modal=\"true\">\n\n @if (Title) {\n <div class=\"mj-dialog-titlebar\">\n <h3 class=\"mj-dialog-title\">{{ Title }}</h3>\n <button class=\"mj-dialog-close\" (click)=\"OnCloseClick()\" aria-label=\"Close\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n }\n\n <div class=\"mj-dialog-body\">\n @if (StringContent) {\n <p>{{ StringContent }}</p>\n }\n <div #contentHost></div>\n </div>\n\n @if (Actions && Actions.length > 0) {\n <div class=\"mj-dialog-actions\">\n @for (action of Actions; track action.text) {\n <button\n class=\"mj-btn\"\n [class.mj-btn--primary]=\"action.primary\"\n [class.mj-btn--danger]=\"action.themeColor === 'error'\"\n (click)=\"OnActionClick(action)\">\n {{ action.text }}\n </button>\n }\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .mj-dialog-backdrop {\n position: fixed;\n top: 0; left: 0; right: 0; bottom: 0;\n background: var(--mj-bg-overlay);\n z-index: 10001;\n display: flex;\n align-items: center;\n justify-content: center;\n }\n\n .mj-dialog-container {\n background: var(--mj-bg-surface);\n border-radius: var(--mj-radius-lg);\n box-shadow: var(--mj-shadow-xl, 0 20px 60px color-mix(in srgb, var(--mj-text-primary) 30%, transparent));\n display: flex;\n flex-direction: column;\n max-height: 90vh;\n max-width: 90vw;\n overflow: hidden;\n }\n\n .mj-dialog-titlebar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n border-bottom: 1px solid var(--mj-border-default);\n background: var(--mj-bg-surface-card);\n }\n\n .mj-dialog-title {\n margin: 0;\n font-size: 1.1rem;\n font-weight: var(--mj-font-semibold);\n color: var(--mj-text-primary);\n }\n\n .mj-dialog-close {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n border: none;\n background: none;\n cursor: pointer;\n color: var(--mj-text-muted);\n border-radius: var(--mj-radius-sm);\n transition: var(--mj-transition-colors);\n }\n .mj-dialog-close:hover {\n background: var(--mj-bg-surface-hover);\n color: var(--mj-text-primary);\n }\n\n .mj-dialog-body {\n flex: 1;\n padding: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n min-height: 0;\n }\n\n .mj-dialog-body > p {\n padding: 20px;\n }\n\n .mj-dialog-body > div {\n flex: 1;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n min-height: 0;\n }\n\n .mj-dialog-body p {\n margin: 0;\n color: var(--mj-text-primary);\n line-height: 1.5;\n }\n\n .mj-dialog-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 20px;\n border-top: 1px solid var(--mj-border-default);\n }\n\n .mj-btn {\n padding: 8px 16px;\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-sm);\n background: var(--mj-bg-surface);\n color: var(--mj-text-primary);\n cursor: pointer;\n font-size: 0.875rem;\n transition: var(--mj-transition-colors);\n }\n .mj-btn:hover { background: var(--mj-bg-surface-hover); }\n .mj-btn--primary {\n background: var(--mj-brand-primary);\n color: var(--mj-text-inverse);\n border-color: var(--mj-brand-primary);\n }\n .mj-btn--primary:hover { background: var(--mj-brand-primary-hover); }\n .mj-btn--danger {\n background: var(--mj-status-error);\n color: var(--mj-text-inverse);\n border-color: var(--mj-status-error);\n }\n\n @media (max-width: 767px) {\n .mj-dialog-container {\n width: 100vw !important;\n height: 100vh !important;\n max-width: 100vw;\n max-height: 100vh;\n border-radius: 0;\n }\n }\n `]\n})\nexport class MJDialogContainerComponent {\n @Input() Title = '';\n @Input() StringContent = '';\n @Input() Width: number | null = null;\n @Input() MinWidth: number | null = null;\n @Input() Height: number | null = null;\n @Input() Actions: MJDialogAction[] = [];\n @Output() ActionClicked = new EventEmitter<MJDialogAction>();\n @Output() CloseClicked = new EventEmitter<void>();\n\n OnBackdropClick(): void {\n this.CloseClicked.emit();\n }\n\n OnCloseClick(): void {\n this.CloseClicked.emit();\n }\n\n OnActionClick(action: MJDialogAction): void {\n this.ActionClicked.emit(action);\n }\n}\n\n/**\n * MJDialogService — Programmatic dialog opening. Replaces Kendo `DialogService`.\n *\n * @example\n * ```typescript\n * // Simple confirm\n * const dialogRef = this.dialogService.Open({\n * title: 'Confirm',\n * content: 'Are you sure?',\n * actions: [\n * { text: 'OK', primary: true },\n * { text: 'Cancel' }\n * ]\n * });\n * dialogRef.Result.subscribe(result => { ... });\n *\n * // Component content\n * const dialogRef = this.dialogService.Open({\n * content: MyDialogComponent,\n * width: 500\n * });\n * dialogRef.Content.instance.someInput = 'value';\n * dialogRef.Result.subscribe(result => { ... });\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MJDialogService {\n private appRef = inject(ApplicationRef);\n private injector = inject(Injector);\n\n /**\n * Open a dialog programmatically.\n *\n * Kendo-compatible API: accepts `content` as string or Component class,\n * returns a ref with `.Content.instance` and `.Result` observable.\n */\n Open(settings: MJDialogSettings): MJDialogRef {\n const dialogRef = new MJDialogRef();\n const injector = settings.appendTo?.injector ?? this.injector;\n\n const containerRef = this.createContainer(injector);\n this.configureContainer(containerRef, settings, dialogRef);\n this.attachToDOM(containerRef, settings);\n this.attachContentComponent(containerRef, settings, dialogRef, injector);\n\n containerRef.changeDetectorRef.detectChanges();\n return dialogRef;\n }\n\n private createContainer(injector: Injector): ComponentRef<MJDialogContainerComponent> {\n return createComponent(MJDialogContainerComponent, {\n environmentInjector: this.appRef.injector,\n elementInjector: injector\n });\n }\n\n private configureContainer(\n containerRef: ComponentRef<MJDialogContainerComponent>,\n settings: MJDialogSettings,\n dialogRef: MJDialogRef\n ): void {\n containerRef.instance.Title = settings.title ?? '';\n containerRef.instance.Width = settings.width ?? null;\n containerRef.instance.MinWidth = settings.minWidth ?? null;\n containerRef.instance.Height = settings.height ?? null;\n containerRef.instance.Actions = settings.actions ?? [];\n\n if (typeof settings.content === 'string') {\n containerRef.instance.StringContent = settings.content;\n }\n\n containerRef.instance.CloseClicked.subscribe(() => dialogRef.Close(undefined));\n containerRef.instance.ActionClicked.subscribe((action: MJDialogAction) => dialogRef.Close(action));\n dialogRef.SetContainerRef(containerRef);\n }\n\n private attachToDOM(containerRef: ComponentRef<MJDialogContainerComponent>, settings: MJDialogSettings): void {\n if (settings.appendTo) {\n settings.appendTo.insert(containerRef.hostView);\n } else {\n document.body.appendChild(containerRef.location.nativeElement);\n this.appRef.attachView(containerRef.hostView);\n }\n }\n\n private attachContentComponent(\n containerRef: ComponentRef<MJDialogContainerComponent>,\n settings: MJDialogSettings,\n dialogRef: MJDialogRef,\n injector: Injector\n ): void {\n if (!settings.content || typeof settings.content === 'string') return;\n\n const contentHost = containerRef.location.nativeElement.querySelector('.mj-dialog-body div');\n if (!contentHost) return;\n\n const contentRef = createComponent(settings.content as Type<unknown>, {\n environmentInjector: this.appRef.injector,\n elementInjector: injector,\n hostElement: contentHost\n });\n this.appRef.attachView(contentRef.hostView);\n dialogRef.Content = { instance: contentRef.instance as Record<string, unknown> };\n }\n\n /**\n * Kendo-compatible alias — lowercase `open` for easier migration.\n */\n open(settings: MJDialogSettings): MJDialogRef {\n return this.Open(settings);\n }\n}\n"]}
@@ -0,0 +1,75 @@
1
+ import { EventEmitter, TemplateRef, OnDestroy } from '@angular/core';
2
+ import { ControlValueAccessor } from '@angular/forms';
3
+ import { ConnectedPosition } from '@angular/cdk/overlay';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * mj-dropdown — Dropdown select component using CDK Overlay.
7
+ *
8
+ * Replaces `<kendo-dropdownlist>`.
9
+ *
10
+ * @example
11
+ * ```html
12
+ * <mj-dropdown
13
+ * [Data]="items"
14
+ * TextField="name"
15
+ * ValueField="id"
16
+ * [(ngModel)]="selectedId"
17
+ * [ValuePrimitive]="true"
18
+ * [Filterable]="true"
19
+ * (FilterChange)="onFilter($event)">
20
+ * </mj-dropdown>
21
+ * ```
22
+ */
23
+ export declare class MJDropdownComponent implements ControlValueAccessor, OnDestroy {
24
+ Data: Record<string, unknown>[] | string[] | readonly unknown[] | null;
25
+ TextField: string;
26
+ ValueField: string;
27
+ Filterable: boolean;
28
+ ValuePrimitive: boolean;
29
+ Disabled: boolean;
30
+ Placeholder: string;
31
+ DefaultItem: Record<string, unknown> | string | null;
32
+ FilterChange: EventEmitter<string>;
33
+ ValueChange: EventEmitter<unknown>;
34
+ itemTemplate: TemplateRef<{
35
+ $implicit: unknown;
36
+ }> | null;
37
+ private triggerEl;
38
+ private filterInputEl;
39
+ readonly hostClass = true;
40
+ private cdr;
41
+ private static nextId;
42
+ DropdownId: number;
43
+ IsOpen: boolean;
44
+ IsDisabled: boolean;
45
+ HighlightedIndex: number;
46
+ SelectedValue: unknown;
47
+ TriggerWidth: number;
48
+ filterText: string;
49
+ Positions: ConnectedPosition[];
50
+ private onChange;
51
+ private onTouched;
52
+ get FilteredItems(): unknown[];
53
+ get HasValue(): boolean;
54
+ get DisplayText(): string;
55
+ Toggle(): void;
56
+ Open(): void;
57
+ Close(): void;
58
+ SelectItem(item: unknown | null, event?: Event): void;
59
+ IsItemSelected(item: unknown): boolean;
60
+ OnFilterInput(event: Event): void;
61
+ OnKeyDown(event: KeyboardEvent): void;
62
+ OnBlur(): void;
63
+ GetItemText(item: unknown): string;
64
+ GetItemValue(item: unknown): unknown;
65
+ TrackByIndex(index: number): number;
66
+ writeValue(value: unknown): void;
67
+ registerOnChange(fn: (value: unknown) => void): void;
68
+ registerOnTouched(fn: () => void): void;
69
+ setDisabledState(isDisabled: boolean): void;
70
+ ngOnDestroy(): void;
71
+ private getSelectedIndex;
72
+ static ɵfac: i0.ɵɵFactoryDeclaration<MJDropdownComponent, never>;
73
+ static ɵcmp: i0.ɵɵComponentDeclaration<MJDropdownComponent, "mj-dropdown", never, { "Data": { "alias": "Data"; "required": false; }; "TextField": { "alias": "TextField"; "required": false; }; "ValueField": { "alias": "ValueField"; "required": false; }; "Filterable": { "alias": "Filterable"; "required": false; }; "ValuePrimitive": { "alias": "ValuePrimitive"; "required": false; }; "Disabled": { "alias": "Disabled"; "required": false; }; "Placeholder": { "alias": "Placeholder"; "required": false; }; "DefaultItem": { "alias": "DefaultItem"; "required": false; }; }, { "FilterChange": "FilterChange"; "ValueChange": "ValueChange"; }, ["itemTemplate"], never, true, never>;
74
+ }
75
+ //# sourceMappingURL=dropdown.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dropdown.component.d.ts","sourceRoot":"","sources":["../../../src/lib/dropdown/dropdown.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EAMZ,WAAW,EACX,SAAS,EAGV,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAqB,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAiB,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;;AAExE;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAsFa,mBAAoB,YAAW,oBAAoB,EAAE,SAAS;IAChE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,IAAI,CAAM;IAC5E,SAAS,SAAM;IACf,UAAU,SAAM;IAChB,UAAU,UAAS;IACnB,cAAc,UAAS;IACvB,QAAQ,UAAS;IACjB,WAAW,SAAe;IAC1B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,CAAQ;IAE3D,YAAY,uBAA8B;IAC1C,WAAW,wBAA+B;IAEpB,YAAY,EAAE,WAAW,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI,CAAQ;IAE1E,OAAO,CAAC,SAAS,CAA2B;IACxC,OAAO,CAAC,aAAa,CAA2C;IAEnD,QAAQ,CAAC,SAAS,QAAQ;IAEjE,OAAO,CAAC,GAAG,CAA6B;IACxC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAK;IAE1B,UAAU,SAAgC;IAC1C,MAAM,UAAS;IACf,UAAU,UAAS;IACnB,gBAAgB,SAAM;IACtB,aAAa,EAAE,OAAO,CAAQ;IAC9B,YAAY,SAAK;IAEjB,UAAU,SAAM;IAEhB,SAAS,EAAE,iBAAiB,EAAE,CAG5B;IAEF,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,SAAS,CAAwB;IAEzC,IAAI,aAAa,IAAI,OAAO,EAAE,CAK7B;IAED,IAAI,QAAQ,IAAI,OAAO,CAAuC;IAE9D,IAAI,WAAW,IAAI,MAAM,CAUxB;IAED,MAAM,IAAI,IAAI;IAKd,IAAI,IAAI,IAAI;IASZ,KAAK,IAAI,IAAI;IAQb,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAmBrD,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAQtC,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAMjC,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAwBrC,MAAM,IAAI,IAAI;IAEd,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM;IAOlC,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAMpC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAEnC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAChC,gBAAgB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IACpD,iBAAiB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IACvC,gBAAgB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAC3C,WAAW,IAAI,IAAI;IAEnB,OAAO,CAAC,gBAAgB;yCAnKb,mBAAmB;2CAAnB,mBAAmB;CAuK/B"}