@memberjunction/ng-ui-components 6.1.0-edge.4 → 6.1.0-edge.6

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 (52) hide show
  1. package/README.md +9 -1
  2. package/dist/lib/alert/alert.component.d.ts.map +1 -1
  3. package/dist/lib/alert/alert.component.js +1 -1
  4. package/dist/lib/applied-filters/applied-filters.component.js +1 -1
  5. package/dist/lib/bottom-sheet/bottom-sheet.component.js +1 -1
  6. package/dist/lib/combobox/combobox.component.d.ts +32 -1
  7. package/dist/lib/combobox/combobox.component.d.ts.map +1 -1
  8. package/dist/lib/combobox/combobox.component.js +73 -28
  9. package/dist/lib/combobox/combobox.component.js.map +1 -1
  10. package/dist/lib/confirm-dialog/confirm-dialog.component.d.ts.map +1 -1
  11. package/dist/lib/datepicker/datepicker.component.d.ts +25 -1
  12. package/dist/lib/datepicker/datepicker.component.d.ts.map +1 -1
  13. package/dist/lib/datepicker/datepicker.component.js +59 -28
  14. package/dist/lib/datepicker/datepicker.component.js.map +1 -1
  15. package/dist/lib/dialog/dialog.component.js +1 -1
  16. package/dist/lib/dialog/dialog.component.js.map +1 -1
  17. package/dist/lib/dialog/dialog.service.js +15 -16
  18. package/dist/lib/dialog/dialog.service.js.map +1 -1
  19. package/dist/lib/dropdown/dropdown.component.d.ts +103 -3
  20. package/dist/lib/dropdown/dropdown.component.d.ts.map +1 -1
  21. package/dist/lib/dropdown/dropdown.component.js +208 -52
  22. package/dist/lib/dropdown/dropdown.component.js.map +1 -1
  23. package/dist/lib/dropdown/dropdown.scss +16 -0
  24. package/dist/lib/empty-state/empty-state.component.js +1 -1
  25. package/dist/lib/filter-popover/filter-popover.component.js +27 -28
  26. package/dist/lib/filter-popover/filter-popover.component.js.map +1 -1
  27. package/dist/lib/left-nav/left-nav-content.component.js +1 -1
  28. package/dist/lib/left-nav/left-nav.component.js +72 -73
  29. package/dist/lib/left-nav/left-nav.component.js.map +1 -1
  30. package/dist/lib/numeric-input/numeric-input.component.d.ts +22 -1
  31. package/dist/lib/numeric-input/numeric-input.component.d.ts.map +1 -1
  32. package/dist/lib/numeric-input/numeric-input.component.js +30 -3
  33. package/dist/lib/numeric-input/numeric-input.component.js.map +1 -1
  34. package/dist/lib/page-body/page-body.component.js +1 -1
  35. package/dist/lib/page-body-interior/page-body-interior.component.js +1 -1
  36. package/dist/lib/page-header/page-header.component.js +1 -1
  37. package/dist/lib/page-header-interior/page-header-interior.component.js +1 -1
  38. package/dist/lib/page-search/page-search.component.js +1 -1
  39. package/dist/lib/refresh-button/refresh-button.component.js +1 -1
  40. package/dist/lib/slide-panel/slide-panel.component.js +1 -1
  41. package/dist/lib/stat-badge/stat-badge.component.js +1 -1
  42. package/dist/lib/switch/switch.component.d.ts +22 -1
  43. package/dist/lib/switch/switch.component.d.ts.map +1 -1
  44. package/dist/lib/switch/switch.component.js +30 -3
  45. package/dist/lib/switch/switch.component.js.map +1 -1
  46. package/dist/lib/tab-nav/tab-nav.component.js +1 -1
  47. package/dist/lib/view-toggle/view-toggle.component.js +1 -1
  48. package/dist/lib/window/window.component.js +1 -1
  49. package/dist/lib/window/window.component.js.map +1 -1
  50. package/dist/lib/workspace-tabs/workspace-card.component.js +1 -1
  51. package/dist/lib/workspace-tabs/workspace-tab-strip.component.js +1 -1
  52. package/package.json +8 -8
@@ -11,45 +11,45 @@ function MJDatepickerComponent_ng_template_7_For_10_Template(rf, ctx) { if (rf &
11
11
  i0.ɵɵtext(1);
12
12
  i0.ɵɵelementEnd();
13
13
  } if (rf & 2) {
14
- const day_r4 = ctx.$implicit;
14
+ const day_r3 = ctx.$implicit;
15
15
  i0.ɵɵadvance();
16
- i0.ɵɵtextInterpolate(day_r4);
16
+ i0.ɵɵtextInterpolate(day_r3);
17
17
  } }
18
18
  function MJDatepickerComponent_ng_template_7_For_12_For_2_Template(rf, ctx) { if (rf & 1) {
19
- const _r5 = i0.ɵɵgetCurrentView();
19
+ const _r4 = i0.ɵɵgetCurrentView();
20
20
  i0.ɵɵelementStart(0, "button", 20);
21
- i0.ɵɵlistener("click", function MJDatepickerComponent_ng_template_7_For_12_For_2_Template_button_click_0_listener() { const day_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r2.SelectDate(day_r6)); });
21
+ i0.ɵɵlistener("click", function MJDatepickerComponent_ng_template_7_For_12_For_2_Template_button_click_0_listener() { const day_r5 = i0.ɵɵrestoreView(_r4).$implicit; const ctx_r1 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r1.SelectDate(day_r5)); });
22
22
  i0.ɵɵtext(1);
23
23
  i0.ɵɵelementEnd();
24
24
  } if (rf & 2) {
25
- const day_r6 = ctx.$implicit;
26
- const ctx_r2 = i0.ɵɵnextContext(3);
27
- i0.ɵɵclassProp("mj-calendar-day--selected", ctx_r2.IsSelectedDay(day_r6))("mj-calendar-day--today", day_r6.isToday)("mj-calendar-day--other-month", !day_r6.isCurrentMonth);
28
- i0.ɵɵproperty("disabled", ctx_r2.IsOutOfRange(day_r6));
29
- i0.ɵɵattribute("aria-selected", ctx_r2.IsSelectedDay(day_r6));
25
+ const day_r5 = ctx.$implicit;
26
+ const ctx_r1 = i0.ɵɵnextContext(3);
27
+ i0.ɵɵclassProp("mj-calendar-day--selected", ctx_r1.IsSelectedDay(day_r5))("mj-calendar-day--today", day_r5.isToday)("mj-calendar-day--other-month", !day_r5.isCurrentMonth);
28
+ i0.ɵɵproperty("disabled", ctx_r1.IsOutOfRange(day_r5));
29
+ i0.ɵɵattribute("aria-selected", ctx_r1.IsSelectedDay(day_r5));
30
30
  i0.ɵɵadvance();
31
- i0.ɵɵtextInterpolate(day_r6.dayNumber);
31
+ i0.ɵɵtextInterpolate(day_r5.dayNumber);
32
32
  } }
33
33
  function MJDatepickerComponent_ng_template_7_For_12_Template(rf, ctx) { if (rf & 1) {
34
34
  i0.ɵɵelementStart(0, "div", 16);
35
35
  i0.ɵɵrepeaterCreate(1, MJDatepickerComponent_ng_template_7_For_12_For_2_Template, 2, 9, "button", 19, _forTrack0);
36
36
  i0.ɵɵelementEnd();
37
37
  } if (rf & 2) {
38
- const week_r7 = ctx.$implicit;
38
+ const week_r6 = ctx.$implicit;
39
39
  i0.ɵɵadvance();
40
- i0.ɵɵrepeater(week_r7);
40
+ i0.ɵɵrepeater(week_r6);
41
41
  } }
42
42
  function MJDatepickerComponent_ng_template_7_Template(rf, ctx) { if (rf & 1) {
43
- const _r2 = i0.ɵɵgetCurrentView();
43
+ const _r1 = i0.ɵɵgetCurrentView();
44
44
  i0.ɵɵelementStart(0, "div", 7)(1, "div", 8)(2, "button", 9);
45
- i0.ɵɵlistener("click", function MJDatepickerComponent_ng_template_7_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.PreviousMonth()); });
45
+ i0.ɵɵlistener("click", function MJDatepickerComponent_ng_template_7_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.PreviousMonth()); });
46
46
  i0.ɵɵelement(3, "i", 10);
47
47
  i0.ɵɵelementEnd();
48
48
  i0.ɵɵelementStart(4, "span", 11);
49
49
  i0.ɵɵtext(5);
50
50
  i0.ɵɵelementEnd();
51
51
  i0.ɵɵelementStart(6, "button", 12);
52
- i0.ɵɵlistener("click", function MJDatepickerComponent_ng_template_7_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.NextMonth()); });
52
+ i0.ɵɵlistener("click", function MJDatepickerComponent_ng_template_7_Template_button_click_6_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.NextMonth()); });
53
53
  i0.ɵɵelement(7, "i", 13);
54
54
  i0.ɵɵelementEnd()();
55
55
  i0.ɵɵelementStart(8, "div", 14);
@@ -57,17 +57,17 @@ function MJDatepickerComponent_ng_template_7_Template(rf, ctx) { if (rf & 1) {
57
57
  i0.ɵɵelementEnd();
58
58
  i0.ɵɵrepeaterCreate(11, MJDatepickerComponent_ng_template_7_For_12_Template, 3, 0, "div", 16, i0.ɵɵrepeaterTrackByIndex);
59
59
  i0.ɵɵelementStart(13, "div", 17)(14, "button", 18);
60
- i0.ɵɵlistener("click", function MJDatepickerComponent_ng_template_7_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r2.SelectToday()); });
60
+ i0.ɵɵlistener("click", function MJDatepickerComponent_ng_template_7_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.SelectToday()); });
61
61
  i0.ɵɵtext(15, "Today");
62
62
  i0.ɵɵelementEnd()()();
63
63
  } if (rf & 2) {
64
- const ctx_r2 = i0.ɵɵnextContext();
64
+ const ctx_r1 = i0.ɵɵnextContext();
65
65
  i0.ɵɵadvance(5);
66
- i0.ɵɵtextInterpolate(ctx_r2.MonthYearLabel);
66
+ i0.ɵɵtextInterpolate(ctx_r1.MonthYearLabel);
67
67
  i0.ɵɵadvance(4);
68
- i0.ɵɵrepeater(ctx_r2.WeekDays);
68
+ i0.ɵɵrepeater(ctx_r1.WeekDays);
69
69
  i0.ɵɵadvance(2);
70
- i0.ɵɵrepeater(ctx_r2.Weeks);
70
+ i0.ɵɵrepeater(ctx_r1.Weeks);
71
71
  } }
72
72
  /**
73
73
  * mj-datepicker — Date picker with calendar popup. Replaces `<kendo-datepicker>`.
@@ -77,7 +77,14 @@ export class MJDatepickerComponent {
77
77
  Max = null;
78
78
  Format = 'MM/dd/yyyy';
79
79
  Placeholder = '';
80
- Disabled = false;
80
+ /**
81
+ * Host-driven disable. Composed with Angular Forms' `setDisabledState()` into `IsDisabled`
82
+ * (the actual gate) — see `syncDisabled`. A setter, not a bare field, because this input is
83
+ * routinely bound to an expression that changes over the control's lifetime, and the gate has
84
+ * to follow it every time.
85
+ */
86
+ set Disabled(value) { this.disabledInput = value; this.syncDisabled(); }
87
+ get Disabled() { return this.disabledInput; }
81
88
  ValueChange = new EventEmitter();
82
89
  triggerEl;
83
90
  hostClass = true;
@@ -108,6 +115,31 @@ export class MJDatepickerComponent {
108
115
  }
109
116
  Close() { if (!this.IsOpen)
110
117
  return; this.IsOpen = false; this.cdr.detectChanges(); }
118
+ /** Backing field for the `Disabled` input. */
119
+ disabledInput = false;
120
+ /** The forms-driven disabled state, kept SEPARATE so neither source can stomp the other. */
121
+ formDisabled = false;
122
+ /**
123
+ * Recompute the gate from both of its sources. Called whenever either changes.
124
+ *
125
+ * `IsDisabled` is derived state, and the only thing that assigned it was `setDisabledState()`.
126
+ * The forms-driven half was in fact fine — `setUpControl` also wires `registerOnDisabledChange`,
127
+ * so that hook fires on every `control.disable()`/`enable()`, not just at registration. What had
128
+ * no recompute path at all was the `Disabled` @Input: a plain field, so the gate froze at
129
+ * whatever the first compose produced and every later change to the input was dropped.
130
+ *
131
+ * Closes the calendar directly rather than via `Close()`: this can run from an @Input setter,
132
+ * i.e. DURING the parent's CD pass, where a nested `detectChanges()` trips NG0100.
133
+ */
134
+ syncDisabled() {
135
+ const disabled = this.disabledInput || this.formDisabled;
136
+ if (disabled === this.IsDisabled)
137
+ return;
138
+ this.IsDisabled = disabled;
139
+ if (disabled)
140
+ this.IsOpen = false;
141
+ this.cdr.markForCheck();
142
+ }
111
143
  PreviousMonth() { this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() - 1, 1); this.Weeks = BuildCalendarWeeks(this.viewDate); }
112
144
  NextMonth() { this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() + 1, 1); this.Weeks = BuildCalendarWeeks(this.viewDate); }
113
145
  SelectDate(day) {
@@ -172,7 +204,7 @@ export class MJDatepickerComponent {
172
204
  }
173
205
  registerOnChange(fn) { this.onChange = fn; }
174
206
  registerOnTouched(fn) { this.onTouched = fn; }
175
- setDisabledState(isDisabled) { this.IsDisabled = isDisabled || this.Disabled; }
207
+ setDisabledState(isDisabled) { this.formDisabled = isDisabled; this.syncDisabled(); }
176
208
  ngOnDestroy() { this.Close(); }
177
209
  static ɵfac = function MJDatepickerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJDatepickerComponent)(); };
178
210
  static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJDatepickerComponent, selectors: [["mj-datepicker"]], viewQuery: function MJDatepickerComponent_Query(rf, ctx) { if (rf & 1) {
@@ -183,25 +215,24 @@ export class MJDatepickerComponent {
183
215
  } }, hostVars: 2, hostBindings: function MJDatepickerComponent_HostBindings(rf, ctx) { if (rf & 2) {
184
216
  i0.ɵɵclassProp("mj-datepicker-host", ctx.hostClass);
185
217
  } }, inputs: { Min: "Min", Max: "Max", Format: "Format", Placeholder: "Placeholder", Disabled: "Disabled" }, outputs: { ValueChange: "ValueChange" }, features: [i0.ɵɵProvidersFeature([{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MJDatepickerComponent), multi: true }])], decls: 8, vars: 10, consts: [["trigger", "", "overlayOrigin", "cdkOverlayOrigin"], ["dateInput", ""], ["cdkOverlayOrigin", "", 1, "mj-datepicker"], ["type", "text", 1, "mj-input", "mj-datepicker-input", 3, "input", "blur", "keydown", "placeholder", "disabled", "value"], ["type", "button", "tabindex", "-1", "aria-label", "Open calendar", 1, "mj-datepicker-toggle", 3, "click", "disabled"], [1, "fa-solid", "fa-calendar"], ["cdkConnectedOverlay", "", "cdkConnectedOverlayBackdropClass", "mj-dropdown-backdrop", 3, "backdropClick", "detach", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayOpen", "cdkConnectedOverlayPositions", "cdkConnectedOverlayHasBackdrop"], ["role", "grid", "aria-label", "Calendar", 1, "mj-calendar"], [1, "mj-calendar-header"], ["type", "button", "aria-label", "Previous month", 1, "mj-calendar-nav", 3, "click"], [1, "fa-solid", "fa-chevron-left"], [1, "mj-calendar-title"], ["type", "button", "aria-label", "Next month", 1, "mj-calendar-nav", 3, "click"], [1, "fa-solid", "fa-chevron-right"], ["role", "row", 1, "mj-calendar-weekdays"], ["role", "columnheader", 1, "mj-calendar-weekday"], ["role", "row", 1, "mj-calendar-row"], [1, "mj-calendar-footer"], ["type", "button", 1, "mj-calendar-today", 3, "click"], ["type", "button", "role", "gridcell", 1, "mj-calendar-day", 3, "mj-calendar-day--selected", "mj-calendar-day--today", "mj-calendar-day--other-month", "disabled"], ["type", "button", "role", "gridcell", 1, "mj-calendar-day", 3, "click", "disabled"]], template: function MJDatepickerComponent_Template(rf, ctx) { if (rf & 1) {
186
- const _r1 = i0.ɵɵgetCurrentView();
187
218
  i0.ɵɵelementStart(0, "div", 2, 0)(3, "input", 3, 1);
188
- i0.ɵɵlistener("input", function MJDatepickerComponent_Template_input_input_3_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.OnInputChange($event)); })("blur", function MJDatepickerComponent_Template_input_blur_3_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.OnBlur()); })("keydown", function MJDatepickerComponent_Template_input_keydown_3_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.OnKeyDown($event)); });
219
+ i0.ɵɵlistener("input", function MJDatepickerComponent_Template_input_input_3_listener($event) { return ctx.OnInputChange($event); })("blur", function MJDatepickerComponent_Template_input_blur_3_listener() { return ctx.OnBlur(); })("keydown", function MJDatepickerComponent_Template_input_keydown_3_listener($event) { return ctx.OnKeyDown($event); });
189
220
  i0.ɵɵelementEnd();
190
221
  i0.ɵɵelementStart(5, "button", 4);
191
- i0.ɵɵlistener("click", function MJDatepickerComponent_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.Toggle()); });
222
+ i0.ɵɵlistener("click", function MJDatepickerComponent_Template_button_click_5_listener() { return ctx.Toggle(); });
192
223
  i0.ɵɵelement(6, "i", 5);
193
224
  i0.ɵɵelementEnd()();
194
225
  i0.ɵɵtemplate(7, MJDatepickerComponent_ng_template_7_Template, 16, 1, "ng-template", 6);
195
- i0.ɵɵlistener("backdropClick", function MJDatepickerComponent_Template_ng_template_backdropClick_7_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.Close()); })("detach", function MJDatepickerComponent_Template_ng_template_detach_7_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.Close()); });
226
+ i0.ɵɵlistener("backdropClick", function MJDatepickerComponent_Template_ng_template_backdropClick_7_listener() { return ctx.Close(); })("detach", function MJDatepickerComponent_Template_ng_template_detach_7_listener() { return ctx.Close(); });
196
227
  } if (rf & 2) {
197
- const overlayOrigin_r8 = i0.ɵɵreference(2);
228
+ const overlayOrigin_r7 = i0.ɵɵreference(2);
198
229
  i0.ɵɵclassProp("mj-datepicker--disabled", ctx.IsDisabled);
199
230
  i0.ɵɵadvance(3);
200
231
  i0.ɵɵproperty("placeholder", ctx.Placeholder)("disabled", ctx.IsDisabled)("value", ctx.DisplayValue);
201
232
  i0.ɵɵadvance(2);
202
233
  i0.ɵɵproperty("disabled", ctx.IsDisabled);
203
234
  i0.ɵɵadvance(2);
204
- i0.ɵɵproperty("cdkConnectedOverlayOrigin", overlayOrigin_r8)("cdkConnectedOverlayOpen", ctx.IsOpen)("cdkConnectedOverlayPositions", ctx.Positions)("cdkConnectedOverlayHasBackdrop", true);
235
+ i0.ɵɵproperty("cdkConnectedOverlayOrigin", overlayOrigin_r7)("cdkConnectedOverlayOpen", ctx.IsOpen)("cdkConnectedOverlayPositions", ctx.Positions)("cdkConnectedOverlayHasBackdrop", true);
205
236
  } }, dependencies: [OverlayModule, i1.CdkConnectedOverlay, i1.CdkOverlayOrigin], encapsulation: 2 });
206
237
  }
207
238
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJDatepickerComponent, [{
@@ -1 +1 @@
1
- {"version":3,"file":"datepicker.component.js","sourceRoot":"","sources":["../../../src/lib/datepicker/datepicker.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, forwardRef, HostBinding, ElementRef, ViewChild, OnDestroy, inject, ChangeDetectorRef } from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { OverlayModule, ConnectedPosition } from '@angular/cdk/overlay';\nimport { CalendarDay, WEEK_DAYS, BuildCalendarWeeks, FormatDate, GetMonthYearLabel } from '../calendar/calendar-utils';\n\n/**\n * mj-datepicker — Date picker with calendar popup. Replaces `<kendo-datepicker>`.\n */\n@Component({\n selector: 'mj-datepicker',\n standalone: true,\n imports: [OverlayModule],\n template: `\n <div class=\"mj-datepicker\" #trigger cdkOverlayOrigin #overlayOrigin=\"cdkOverlayOrigin\"\n [class.mj-datepicker--disabled]=\"IsDisabled\">\n <input #dateInput class=\"mj-input mj-datepicker-input\" type=\"text\"\n [placeholder]=\"Placeholder\" [disabled]=\"IsDisabled\" [value]=\"DisplayValue\"\n (input)=\"OnInputChange($event)\" (blur)=\"OnBlur()\" (keydown)=\"OnKeyDown($event)\" />\n <button type=\"button\" class=\"mj-datepicker-toggle\" tabindex=\"-1\" [disabled]=\"IsDisabled\"\n (click)=\"Toggle()\" aria-label=\"Open calendar\">\n <i class=\"fa-solid fa-calendar\"></i>\n </button>\n </div>\n <ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"IsOpen\" [cdkConnectedOverlayPositions]=\"Positions\"\n [cdkConnectedOverlayHasBackdrop]=\"true\" cdkConnectedOverlayBackdropClass=\"mj-dropdown-backdrop\"\n (backdropClick)=\"Close()\" (detach)=\"Close()\">\n <div class=\"mj-calendar\" role=\"grid\" aria-label=\"Calendar\">\n <div class=\"mj-calendar-header\">\n <button type=\"button\" (click)=\"PreviousMonth()\" aria-label=\"Previous month\" class=\"mj-calendar-nav\">\n <i class=\"fa-solid fa-chevron-left\"></i></button>\n <span class=\"mj-calendar-title\">{{ MonthYearLabel }}</span>\n <button type=\"button\" (click)=\"NextMonth()\" aria-label=\"Next month\" class=\"mj-calendar-nav\">\n <i class=\"fa-solid fa-chevron-right\"></i></button>\n </div>\n <div class=\"mj-calendar-weekdays\" role=\"row\">\n @for (day of WeekDays; track day) { <span class=\"mj-calendar-weekday\" role=\"columnheader\">{{ day }}</span> }\n </div>\n @for (week of Weeks; track $index) {\n <div class=\"mj-calendar-row\" role=\"row\">\n @for (day of week; track day.date.getTime()) {\n <button type=\"button\" class=\"mj-calendar-day\" role=\"gridcell\"\n [class.mj-calendar-day--selected]=\"IsSelectedDay(day)\"\n [class.mj-calendar-day--today]=\"day.isToday\"\n [class.mj-calendar-day--other-month]=\"!day.isCurrentMonth\"\n [disabled]=\"IsOutOfRange(day)\" [attr.aria-selected]=\"IsSelectedDay(day)\"\n (click)=\"SelectDate(day)\">{{ day.dayNumber }}</button>\n }\n </div>\n }\n <div class=\"mj-calendar-footer\">\n <button type=\"button\" class=\"mj-calendar-today\" (click)=\"SelectToday()\">Today</button>\n </div>\n </div>\n </ng-template>\n `,\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MJDatepickerComponent), multi: true }]\n})\nexport class MJDatepickerComponent implements ControlValueAccessor, OnDestroy {\n @Input() Min: Date | null = null;\n @Input() Max: Date | null = null;\n @Input() Format = 'MM/dd/yyyy';\n @Input() Placeholder = '';\n @Input() Disabled = false;\n @Output() ValueChange = new EventEmitter<Date | null>();\n @ViewChild('trigger') private triggerEl!: ElementRef<HTMLElement>;\n @HostBinding('class.mj-datepicker-host') readonly hostClass = true;\n private cdr = inject(ChangeDetectorRef);\n\n IsOpen = false; IsDisabled = false; DisplayValue = '';\n Weeks: CalendarDay[][] = []; WeekDays = WEEK_DAYS;\n Positions: ConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' }\n ];\n private viewDate = new Date();\n private selectedDate: Date | null = null;\n private onChange: (value: Date | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n get MonthYearLabel(): string { return GetMonthYearLabel(this.viewDate); }\n\n Toggle(): void { if (this.IsDisabled) return; this.IsOpen ? this.Close() : this.Open(); }\n Open(): void {\n if (this.IsDisabled || this.IsOpen) return;\n this.viewDate = this.selectedDate ? new Date(this.selectedDate) : new Date();\n this.Weeks = BuildCalendarWeeks(this.viewDate); this.IsOpen = true; this.cdr.detectChanges();\n }\n Close(): void { if (!this.IsOpen) return; this.IsOpen = false; this.cdr.detectChanges(); }\n PreviousMonth(): void { this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() - 1, 1); this.Weeks = BuildCalendarWeeks(this.viewDate); }\n NextMonth(): void { this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() + 1, 1); this.Weeks = BuildCalendarWeeks(this.viewDate); }\n\n SelectDate(day: CalendarDay): void {\n if (this.IsOutOfRange(day)) return;\n this.selectedDate = day.date; this.DisplayValue = FormatDate(day.date);\n this.onChange(day.date); this.ValueChange.emit(day.date); this.Close();\n }\n SelectToday(): void {\n const today = new Date(); today.setHours(0, 0, 0, 0);\n this.selectedDate = today; this.DisplayValue = FormatDate(today);\n this.onChange(today); this.ValueChange.emit(today); this.Close();\n }\n IsSelectedDay(day: CalendarDay): boolean {\n if (!this.selectedDate) return false;\n return day.date.getFullYear() === this.selectedDate.getFullYear() && day.date.getMonth() === this.selectedDate.getMonth() && day.date.getDate() === this.selectedDate.getDate();\n }\n IsOutOfRange(day: CalendarDay): boolean {\n if (this.Min && day.date < this.Min) return true;\n if (this.Max && day.date > this.Max) return true;\n return false;\n }\n OnInputChange(event: Event): void {\n const value = (event.target as HTMLInputElement).value; this.DisplayValue = value;\n const parsed = new Date(value);\n if (!isNaN(parsed.getTime())) { this.selectedDate = parsed; this.onChange(parsed); this.ValueChange.emit(parsed); }\n }\n OnBlur(): void { this.onTouched(); }\n OnKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape') this.Close();\n else if (event.key === 'Enter' && !this.IsOpen) this.Open();\n }\n writeValue(value: Date | string | null): void {\n if (value == null) { this.selectedDate = null; this.DisplayValue = ''; }\n else { const d = typeof value === 'string' ? new Date(value) : value; if (!isNaN(d.getTime())) { this.selectedDate = d; this.DisplayValue = FormatDate(d); } }\n }\n registerOnChange(fn: (value: Date | null) => void): void { this.onChange = fn; }\n registerOnTouched(fn: () => void): void { this.onTouched = fn; }\n setDisabledState(isDisabled: boolean): void { this.IsDisabled = isDisabled || this.Disabled; }\n ngOnDestroy(): void { this.Close(); }\n}\n"]}
1
+ {"version":3,"file":"datepicker.component.js","sourceRoot":"","sources":["../../../src/lib/datepicker/datepicker.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, forwardRef, HostBinding, ElementRef, ViewChild, OnDestroy, inject, ChangeDetectorRef } from '@angular/core';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { OverlayModule, ConnectedPosition } from '@angular/cdk/overlay';\nimport { CalendarDay, WEEK_DAYS, BuildCalendarWeeks, FormatDate, GetMonthYearLabel } from '../calendar/calendar-utils';\n\n/**\n * mj-datepicker — Date picker with calendar popup. Replaces `<kendo-datepicker>`.\n */\n@Component({\n selector: 'mj-datepicker',\n standalone: true,\n imports: [OverlayModule],\n template: `\n <div class=\"mj-datepicker\" #trigger cdkOverlayOrigin #overlayOrigin=\"cdkOverlayOrigin\"\n [class.mj-datepicker--disabled]=\"IsDisabled\">\n <input #dateInput class=\"mj-input mj-datepicker-input\" type=\"text\"\n [placeholder]=\"Placeholder\" [disabled]=\"IsDisabled\" [value]=\"DisplayValue\"\n (input)=\"OnInputChange($event)\" (blur)=\"OnBlur()\" (keydown)=\"OnKeyDown($event)\" />\n <button type=\"button\" class=\"mj-datepicker-toggle\" tabindex=\"-1\" [disabled]=\"IsDisabled\"\n (click)=\"Toggle()\" aria-label=\"Open calendar\">\n <i class=\"fa-solid fa-calendar\"></i>\n </button>\n </div>\n <ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"IsOpen\" [cdkConnectedOverlayPositions]=\"Positions\"\n [cdkConnectedOverlayHasBackdrop]=\"true\" cdkConnectedOverlayBackdropClass=\"mj-dropdown-backdrop\"\n (backdropClick)=\"Close()\" (detach)=\"Close()\">\n <div class=\"mj-calendar\" role=\"grid\" aria-label=\"Calendar\">\n <div class=\"mj-calendar-header\">\n <button type=\"button\" (click)=\"PreviousMonth()\" aria-label=\"Previous month\" class=\"mj-calendar-nav\">\n <i class=\"fa-solid fa-chevron-left\"></i></button>\n <span class=\"mj-calendar-title\">{{ MonthYearLabel }}</span>\n <button type=\"button\" (click)=\"NextMonth()\" aria-label=\"Next month\" class=\"mj-calendar-nav\">\n <i class=\"fa-solid fa-chevron-right\"></i></button>\n </div>\n <div class=\"mj-calendar-weekdays\" role=\"row\">\n @for (day of WeekDays; track day) { <span class=\"mj-calendar-weekday\" role=\"columnheader\">{{ day }}</span> }\n </div>\n @for (week of Weeks; track $index) {\n <div class=\"mj-calendar-row\" role=\"row\">\n @for (day of week; track day.date.getTime()) {\n <button type=\"button\" class=\"mj-calendar-day\" role=\"gridcell\"\n [class.mj-calendar-day--selected]=\"IsSelectedDay(day)\"\n [class.mj-calendar-day--today]=\"day.isToday\"\n [class.mj-calendar-day--other-month]=\"!day.isCurrentMonth\"\n [disabled]=\"IsOutOfRange(day)\" [attr.aria-selected]=\"IsSelectedDay(day)\"\n (click)=\"SelectDate(day)\">{{ day.dayNumber }}</button>\n }\n </div>\n }\n <div class=\"mj-calendar-footer\">\n <button type=\"button\" class=\"mj-calendar-today\" (click)=\"SelectToday()\">Today</button>\n </div>\n </div>\n </ng-template>\n `,\n providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MJDatepickerComponent), multi: true }]\n})\nexport class MJDatepickerComponent implements ControlValueAccessor, OnDestroy {\n @Input() Min: Date | null = null;\n @Input() Max: Date | null = null;\n @Input() Format = 'MM/dd/yyyy';\n @Input() Placeholder = '';\n /**\n * Host-driven disable. Composed with Angular Forms' `setDisabledState()` into `IsDisabled`\n * (the actual gate) — see `syncDisabled`. A setter, not a bare field, because this input is\n * routinely bound to an expression that changes over the control's lifetime, and the gate has\n * to follow it every time.\n */\n @Input()\n set Disabled(value: boolean) { this.disabledInput = value; this.syncDisabled(); }\n get Disabled(): boolean { return this.disabledInput; }\n @Output() ValueChange = new EventEmitter<Date | null>();\n @ViewChild('trigger') private triggerEl!: ElementRef<HTMLElement>;\n @HostBinding('class.mj-datepicker-host') readonly hostClass = true;\n private cdr = inject(ChangeDetectorRef);\n\n IsOpen = false; IsDisabled = false; DisplayValue = '';\n Weeks: CalendarDay[][] = []; WeekDays = WEEK_DAYS;\n Positions: ConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' }\n ];\n private viewDate = new Date();\n private selectedDate: Date | null = null;\n private onChange: (value: Date | null) => void = () => {};\n private onTouched: () => void = () => {};\n\n get MonthYearLabel(): string { return GetMonthYearLabel(this.viewDate); }\n\n Toggle(): void { if (this.IsDisabled) return; this.IsOpen ? this.Close() : this.Open(); }\n Open(): void {\n if (this.IsDisabled || this.IsOpen) return;\n this.viewDate = this.selectedDate ? new Date(this.selectedDate) : new Date();\n this.Weeks = BuildCalendarWeeks(this.viewDate); this.IsOpen = true; this.cdr.detectChanges();\n }\n Close(): void { if (!this.IsOpen) return; this.IsOpen = false; this.cdr.detectChanges(); }\n\n /** Backing field for the `Disabled` input. */\n private disabledInput = false;\n /** The forms-driven disabled state, kept SEPARATE so neither source can stomp the other. */\n private formDisabled = false;\n\n /**\n * Recompute the gate from both of its sources. Called whenever either changes.\n *\n * `IsDisabled` is derived state, and the only thing that assigned it was `setDisabledState()`.\n * The forms-driven half was in fact fine — `setUpControl` also wires `registerOnDisabledChange`,\n * so that hook fires on every `control.disable()`/`enable()`, not just at registration. What had\n * no recompute path at all was the `Disabled` @Input: a plain field, so the gate froze at\n * whatever the first compose produced and every later change to the input was dropped.\n *\n * Closes the calendar directly rather than via `Close()`: this can run from an @Input setter,\n * i.e. DURING the parent's CD pass, where a nested `detectChanges()` trips NG0100.\n */\n private syncDisabled(): void {\n const disabled = this.disabledInput || this.formDisabled;\n if (disabled === this.IsDisabled) return;\n this.IsDisabled = disabled;\n if (disabled) this.IsOpen = false;\n this.cdr.markForCheck();\n }\n PreviousMonth(): void { this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() - 1, 1); this.Weeks = BuildCalendarWeeks(this.viewDate); }\n NextMonth(): void { this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() + 1, 1); this.Weeks = BuildCalendarWeeks(this.viewDate); }\n\n SelectDate(day: CalendarDay): void {\n if (this.IsOutOfRange(day)) return;\n this.selectedDate = day.date; this.DisplayValue = FormatDate(day.date);\n this.onChange(day.date); this.ValueChange.emit(day.date); this.Close();\n }\n SelectToday(): void {\n const today = new Date(); today.setHours(0, 0, 0, 0);\n this.selectedDate = today; this.DisplayValue = FormatDate(today);\n this.onChange(today); this.ValueChange.emit(today); this.Close();\n }\n IsSelectedDay(day: CalendarDay): boolean {\n if (!this.selectedDate) return false;\n return day.date.getFullYear() === this.selectedDate.getFullYear() && day.date.getMonth() === this.selectedDate.getMonth() && day.date.getDate() === this.selectedDate.getDate();\n }\n IsOutOfRange(day: CalendarDay): boolean {\n if (this.Min && day.date < this.Min) return true;\n if (this.Max && day.date > this.Max) return true;\n return false;\n }\n OnInputChange(event: Event): void {\n const value = (event.target as HTMLInputElement).value; this.DisplayValue = value;\n const parsed = new Date(value);\n if (!isNaN(parsed.getTime())) { this.selectedDate = parsed; this.onChange(parsed); this.ValueChange.emit(parsed); }\n }\n OnBlur(): void { this.onTouched(); }\n OnKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape') this.Close();\n else if (event.key === 'Enter' && !this.IsOpen) this.Open();\n }\n writeValue(value: Date | string | null): void {\n if (value == null) { this.selectedDate = null; this.DisplayValue = ''; }\n else { const d = typeof value === 'string' ? new Date(value) : value; if (!isNaN(d.getTime())) { this.selectedDate = d; this.DisplayValue = FormatDate(d); } }\n }\n registerOnChange(fn: (value: Date | null) => void): void { this.onChange = fn; }\n registerOnTouched(fn: () => void): void { this.onTouched = fn; }\n setDisabledState(isDisabled: boolean): void { this.formDisabled = isDisabled; this.syncDisabled(); }\n ngOnDestroy(): void { this.Close(); }\n}\n"]}
@@ -37,7 +37,7 @@ function MJDialogComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
37
37
  i0.ɵɵdomElementStart(0, "div", 1);
38
38
  i0.ɵɵdomListener("click", function MJDialogComponent_Conditional_0_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnBackdropClick($event)); });
39
39
  i0.ɵɵdomElementStart(1, "div", 2);
40
- i0.ɵɵdomListener("click", function MJDialogComponent_Conditional_0_Template_div_click_1_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView($event.stopPropagation()); });
40
+ i0.ɵɵdomListener("click", function MJDialogComponent_Conditional_0_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
41
41
  i0.ɵɵconditionalCreate(2, MJDialogComponent_Conditional_0_Conditional_2_Template, 4, 2, "div", 3);
42
42
  i0.ɵɵdomElementStart(3, "div", 4);
43
43
  i0.ɵɵprojection(4);
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.component.js","sourceRoot":"","sources":["../../../src/lib/dialog/dialog.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n HostListener,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnDestroy,\n inject\n} from '@angular/core';\n\nexport type MjDialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'auto';\n\nconst SIZE_MAP: Record<MjDialogSize, string> = {\n sm: '400px',\n md: '600px',\n lg: '800px',\n xl: '1000px',\n auto: 'auto'\n};\n\n/**\n * mj-dialog — Modal dialog component using native `<dialog>` element.\n *\n * Replaces `<kendo-dialog>`.\n *\n * Supports both explicit width/height and size presets.\n * Content is projected, with an optional `<mj-dialog-actions>` for the footer.\n *\n * @example\n * ```html\n * <mj-dialog [Visible]=\"showDialog\" Title=\"Confirm\" (Close)=\"onClose()\">\n * <p>Are you sure?</p>\n * <mj-dialog-actions>\n * <button mjButton variant=\"primary\" (click)=\"onConfirm()\">Yes</button>\n * <button mjButton (click)=\"onClose()\">No</button>\n * </mj-dialog-actions>\n * </mj-dialog>\n * ```\n */\n@Component({\n selector: 'mj-dialog',\n standalone: true,\n template: `\n @if (Visible) {\n <div class=\"mj-dialog-backdrop\" (click)=\"OnBackdropClick($event)\">\n <div class=\"mj-dialog-container\"\n [attr.role]=\"Role\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"Title ? 'mj-dialog-title-' + dialogId : null\"\n [style.width]=\"resolvedWidth\"\n [style.height]=\"resolvedHeight\"\n [style.max-width]=\"'90vw'\"\n [style.max-height]=\"'90vh'\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Title bar -->\n @if (Title || Closeable) {\n <div class=\"mj-dialog-titlebar\">\n @if (Title) {\n <h2 class=\"mj-dialog-title\" [id]=\"'mj-dialog-title-' + dialogId\">{{ Title }}</h2>\n }\n <ng-content select=\"mj-dialog-titlebar\"></ng-content>\n @if (Closeable) {\n <button class=\"mj-dialog-close\" (click)=\"OnCloseClick()\" aria-label=\"Close dialog\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Body -->\n <div class=\"mj-dialog-body\">\n <ng-content></ng-content>\n </div>\n\n <!-- Actions (projected) -->\n <ng-content select=\"mj-dialog-actions\"></ng-content>\n </div>\n </div>\n }\n `\n})\nexport class MJDialogComponent implements OnDestroy {\n private _visible = false;\n private static nextId = 0;\n\n @Input()\n set Visible(value: boolean) {\n const wasVisible = this._visible;\n this._visible = value;\n if (value && !wasVisible) {\n this.onOpen();\n }\n if (!value && wasVisible) {\n this.onCloseInternal();\n }\n }\n get Visible(): boolean {\n return this._visible;\n }\n\n @Input() Title = '';\n @Input() Width: number | string | null = null;\n @Input() Height: number | string | null = null;\n @Input() Size: MjDialogSize = 'auto';\n @Input() Closeable = true;\n @Input() MinWidth: number | null = null;\n\n /**\n * ARIA role for the dialog container. Defaults to `'dialog'`; pass\n * `'alertdialog'` for confirmation / destructive prompts that interrupt the\n * user (per WAI-ARIA, an alertdialog conveys an urgent message requiring a\n * response). Backward compatible — existing callers keep `'dialog'`.\n */\n @Input() Role: 'dialog' | 'alertdialog' = 'dialog';\n\n @Output() Close = new EventEmitter<void>();\n\n DialogId = MJDialogComponent.nextId++;\n\n get dialogId(): number {\n return this.DialogId;\n }\n\n get resolvedWidth(): string {\n if (this.Width) {\n return typeof this.Width === 'number' ? `${this.Width}px` : this.Width;\n }\n return SIZE_MAP[this.Size] ?? 'auto';\n }\n\n get resolvedHeight(): string {\n if (this.Height) {\n return typeof this.Height === 'number' ? `${this.Height}px` : this.Height;\n }\n return 'auto';\n }\n\n @HostListener('document:keydown.escape')\n OnEscapeKey(): void {\n if (this.Visible && this.Closeable) {\n this.OnCloseClick();\n }\n }\n\n OnBackdropClick(event: Event): void {\n if (this.Closeable) {\n this.OnCloseClick();\n }\n }\n\n OnCloseClick(): void {\n this.Close.emit();\n }\n\n private onOpen(): void {\n document.body.style.overflow = 'hidden';\n }\n\n private onCloseInternal(): void {\n document.body.style.overflow = '';\n }\n\n ngOnDestroy(): void {\n document.body.style.overflow = '';\n }\n}\n\n/**\n * mj-dialog-titlebar — Custom titlebar content for mj-dialog.\n *\n * Replaces `<kendo-dialog-titlebar>`.\n *\n * @example\n * ```html\n * <mj-dialog [Visible]=\"show\" (Close)=\"onClose()\">\n * <mj-dialog-titlebar>\n * <i class=\"fa-solid fa-save\"></i> Custom Title\n * </mj-dialog-titlebar>\n * <p>Dialog content</p>\n * </mj-dialog>\n * ```\n */\n@Component({\n selector: 'mj-dialog-titlebar',\n standalone: true,\n template: `<ng-content></ng-content>`\n})\nexport class MJDialogTitlebarComponent {}\n\n/**\n * mj-dialog-actions — Footer action bar for mj-dialog.\n *\n * Replaces `<kendo-dialog-actions>`.\n *\n * @example\n * ```html\n * <mj-dialog-actions>\n * <button mjButton variant=\"primary\">Save</button>\n * <button mjButton>Cancel</button>\n * </mj-dialog-actions>\n * ```\n */\n@Component({\n selector: 'mj-dialog-actions',\n standalone: true,\n template: `\n <div class=\"mj-dialog-actions\">\n <ng-content></ng-content>\n </div>\n `\n})\nexport class MJDialogActionsComponent {}\n"]}
1
+ {"version":3,"file":"dialog.component.js","sourceRoot":"","sources":["../../../src/lib/dialog/dialog.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n HostListener,\n ElementRef,\n ViewChild,\n AfterViewInit,\n OnDestroy,\n inject\n} from '@angular/core';\n\nexport type MjDialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'auto';\n\nconst SIZE_MAP: Record<MjDialogSize, string> = {\n sm: '400px',\n md: '600px',\n lg: '800px',\n xl: '1000px',\n auto: 'auto'\n};\n\n/**\n * mj-dialog — Modal dialog component using native `<dialog>` element.\n *\n * Replaces `<kendo-dialog>`.\n *\n * Supports both explicit width/height and size presets.\n * Content is projected, with an optional `<mj-dialog-actions>` for the footer.\n *\n * @example\n * ```html\n * <mj-dialog [Visible]=\"showDialog\" Title=\"Confirm\" (Close)=\"onClose()\">\n * <p>Are you sure?</p>\n * <mj-dialog-actions>\n * <button mjButton variant=\"primary\" (click)=\"onConfirm()\">Yes</button>\n * <button mjButton (click)=\"onClose()\">No</button>\n * </mj-dialog-actions>\n * </mj-dialog>\n * ```\n */\n@Component({\n selector: 'mj-dialog',\n standalone: true,\n template: `\n @if (Visible) {\n <div class=\"mj-dialog-backdrop\" (click)=\"OnBackdropClick($event)\">\n <div class=\"mj-dialog-container\"\n [attr.role]=\"Role\"\n aria-modal=\"true\"\n [attr.aria-labelledby]=\"Title ? 'mj-dialog-title-' + dialogId : null\"\n [style.width]=\"resolvedWidth\"\n [style.height]=\"resolvedHeight\"\n [style.max-width]=\"'90vw'\"\n [style.max-height]=\"'90vh'\"\n (click)=\"$event.stopPropagation()\">\n\n <!-- Title bar -->\n @if (Title || Closeable) {\n <div class=\"mj-dialog-titlebar\">\n @if (Title) {\n <h2 class=\"mj-dialog-title\" [id]=\"'mj-dialog-title-' + dialogId\">{{ Title }}</h2>\n }\n <ng-content select=\"mj-dialog-titlebar\"></ng-content>\n @if (Closeable) {\n <button class=\"mj-dialog-close\" (click)=\"OnCloseClick()\" aria-label=\"Close dialog\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n </div>\n }\n\n <!-- Body -->\n <div class=\"mj-dialog-body\">\n <ng-content></ng-content>\n </div>\n\n <!-- Actions (projected) -->\n <ng-content select=\"mj-dialog-actions\"></ng-content>\n </div>\n </div>\n }\n `\n})\nexport class MJDialogComponent implements OnDestroy {\n private _visible = false;\n private static nextId = 0;\n\n @Input()\n set Visible(value: boolean) {\n const wasVisible = this._visible;\n this._visible = value;\n if (value && !wasVisible) {\n this.onOpen();\n }\n if (!value && wasVisible) {\n this.onCloseInternal();\n }\n }\n get Visible(): boolean {\n return this._visible;\n }\n\n @Input() Title = '';\n @Input() Width: number | string | null = null;\n @Input() Height: number | string | null = null;\n @Input() Size: MjDialogSize = 'auto';\n @Input() Closeable = true;\n @Input() MinWidth: number | null = null;\n\n /**\n * ARIA role for the dialog container. Defaults to `'dialog'`; pass\n * `'alertdialog'` for confirmation / destructive prompts that interrupt the\n * user (per WAI-ARIA, an alertdialog conveys an urgent message requiring a\n * response). Backward compatible — existing callers keep `'dialog'`.\n */\n @Input() Role: 'dialog' | 'alertdialog' = 'dialog';\n\n @Output() Close = new EventEmitter<void>();\n\n DialogId = MJDialogComponent.nextId++;\n\n get dialogId(): number {\n return this.DialogId;\n }\n\n get resolvedWidth(): string {\n if (this.Width) {\n return typeof this.Width === 'number' ? `${this.Width}px` : this.Width;\n }\n return SIZE_MAP[this.Size] ?? 'auto';\n }\n\n get resolvedHeight(): string {\n if (this.Height) {\n return typeof this.Height === 'number' ? `${this.Height}px` : this.Height;\n }\n return 'auto';\n }\n\n @HostListener('document:keydown.escape')\n OnEscapeKey(): void {\n if (this.Visible && this.Closeable) {\n this.OnCloseClick();\n }\n }\n\n OnBackdropClick(event: Event): void {\n if (this.Closeable) {\n this.OnCloseClick();\n }\n }\n\n OnCloseClick(): void {\n this.Close.emit();\n }\n\n private onOpen(): void {\n document.body.style.overflow = 'hidden';\n }\n\n private onCloseInternal(): void {\n document.body.style.overflow = '';\n }\n\n ngOnDestroy(): void {\n document.body.style.overflow = '';\n }\n}\n\n/**\n * mj-dialog-titlebar — Custom titlebar content for mj-dialog.\n *\n * Replaces `<kendo-dialog-titlebar>`.\n *\n * @example\n * ```html\n * <mj-dialog [Visible]=\"show\" (Close)=\"onClose()\">\n * <mj-dialog-titlebar>\n * <i class=\"fa-solid fa-save\"></i> Custom Title\n * </mj-dialog-titlebar>\n * <p>Dialog content</p>\n * </mj-dialog>\n * ```\n */\n@Component({\n selector: 'mj-dialog-titlebar',\n standalone: true,\n template: `<ng-content></ng-content>`\n})\nexport class MJDialogTitlebarComponent {}\n\n/**\n * mj-dialog-actions — Footer action bar for mj-dialog.\n *\n * Replaces `<kendo-dialog-actions>`.\n *\n * @example\n * ```html\n * <mj-dialog-actions>\n * <button mjButton variant=\"primary\">Save</button>\n * <button mjButton>Cancel</button>\n * </mj-dialog-actions>\n * ```\n */\n@Component({\n selector: 'mj-dialog-actions',\n standalone: true,\n template: `\n <div class=\"mj-dialog-actions\">\n <ng-content></ng-content>\n </div>\n `\n})\nexport class MJDialogActionsComponent {}\n"]}
@@ -8,48 +8,48 @@ import { Component, Input, Output, EventEmitter } from '@angular/core';
8
8
  import * as i0 from "@angular/core";
9
9
  const _forTrack0 = ($index, $item) => $item.text;
10
10
  function MJDialogContainerComponent_Conditional_2_Template(rf, ctx) { if (rf & 1) {
11
- const _r2 = i0.ɵɵgetCurrentView();
11
+ const _r1 = i0.ɵɵgetCurrentView();
12
12
  i0.ɵɵdomElementStart(0, "div", 3)(1, "h3", 6);
13
13
  i0.ɵɵtext(2);
14
14
  i0.ɵɵdomElementEnd();
15
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()); });
16
+ i0.ɵɵdomListener("click", function MJDialogContainerComponent_Conditional_2_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnCloseClick()); });
17
17
  i0.ɵɵdomElement(4, "i", 8);
18
18
  i0.ɵɵdomElementEnd()();
19
19
  } if (rf & 2) {
20
- const ctx_r2 = i0.ɵɵnextContext();
20
+ const ctx_r1 = i0.ɵɵnextContext();
21
21
  i0.ɵɵadvance(2);
22
- i0.ɵɵtextInterpolate(ctx_r2.Title);
22
+ i0.ɵɵtextInterpolate(ctx_r1.Title);
23
23
  } }
24
24
  function MJDialogContainerComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
25
25
  i0.ɵɵdomElementStart(0, "p");
26
26
  i0.ɵɵtext(1);
27
27
  i0.ɵɵdomElementEnd();
28
28
  } if (rf & 2) {
29
- const ctx_r2 = i0.ɵɵnextContext();
29
+ const ctx_r1 = i0.ɵɵnextContext();
30
30
  i0.ɵɵadvance();
31
- i0.ɵɵtextInterpolate(ctx_r2.StringContent);
31
+ i0.ɵɵtextInterpolate(ctx_r1.StringContent);
32
32
  } }
33
33
  function MJDialogContainerComponent_Conditional_7_For_2_Template(rf, ctx) { if (rf & 1) {
34
- const _r4 = i0.ɵɵgetCurrentView();
34
+ const _r3 = i0.ɵɵgetCurrentView();
35
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)); });
36
+ i0.ɵɵdomListener("click", function MJDialogContainerComponent_Conditional_7_For_2_Template_button_click_0_listener() { const action_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.OnActionClick(action_r4)); });
37
37
  i0.ɵɵtext(1);
38
38
  i0.ɵɵdomElementEnd();
39
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");
40
+ const action_r4 = ctx.$implicit;
41
+ i0.ɵɵclassProp("mj-btn--primary", action_r4.primary)("mj-btn--danger", action_r4.themeColor === "error");
42
42
  i0.ɵɵadvance();
43
- i0.ɵɵtextInterpolate1(" ", action_r5.text, " ");
43
+ i0.ɵɵtextInterpolate1(" ", action_r4.text, " ");
44
44
  } }
45
45
  function MJDialogContainerComponent_Conditional_7_Template(rf, ctx) { if (rf & 1) {
46
46
  i0.ɵɵdomElementStart(0, "div", 5);
47
47
  i0.ɵɵrepeaterCreate(1, MJDialogContainerComponent_Conditional_7_For_2_Template, 2, 5, "button", 9, _forTrack0);
48
48
  i0.ɵɵdomElementEnd();
49
49
  } if (rf & 2) {
50
- const ctx_r2 = i0.ɵɵnextContext();
50
+ const ctx_r1 = i0.ɵɵnextContext();
51
51
  i0.ɵɵadvance();
52
- i0.ɵɵrepeater(ctx_r2.Actions);
52
+ i0.ɵɵrepeater(ctx_r1.Actions);
53
53
  } }
54
54
  /**
55
55
  * Reference to an open dialog. Used to access content instance and subscribe to results.
@@ -95,11 +95,10 @@ export class MJDialogContainerComponent {
95
95
  }
96
96
  static ɵfac = function MJDialogContainerComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJDialogContainerComponent)(); };
97
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
98
  i0.ɵɵdomElementStart(0, "div", 1);
100
- i0.ɵɵdomListener("click", function MJDialogContainerComponent_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.OnBackdropClick()); });
99
+ i0.ɵɵdomListener("click", function MJDialogContainerComponent_Template_div_click_0_listener() { return ctx.OnBackdropClick(); });
101
100
  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()); });
101
+ i0.ɵɵdomListener("click", function MJDialogContainerComponent_Template_div_click_1_listener($event) { return $event.stopPropagation(); });
103
102
  i0.ɵɵconditionalCreate(2, MJDialogContainerComponent_Conditional_2_Template, 5, 1, "div", 3);
104
103
  i0.ɵɵdomElementStart(3, "div", 4);
105
104
  i0.ɵɵconditionalCreate(4, MJDialogContainerComponent_Conditional_4_Template, 2, 1, "p");
@@ -1 +1 @@
1
- {"version":3,"file":"dialog.service.js","sourceRoot":"","sources":["../../../src/lib/dialog/dialog.service.ts"],"names":[],"mappings":"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","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"]}
1
+ {"version":3,"file":"dialog.service.js","sourceRoot":"","sources":["../../../src/lib/dialog/dialog.service.ts"],"names":[],"mappings":"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","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"]}