@memberjunction/ng-ui-components 0.0.1 → 5.24.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,445 @@
1
+ import { Component, Input, Output, EventEmitter, forwardRef, HostBinding, ViewChild, ContentChild, inject, ChangeDetectorRef } from '@angular/core';
2
+ import { NgTemplateOutlet } from '@angular/common';
3
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
+ import { OverlayModule } from '@angular/cdk/overlay';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/cdk/overlay";
7
+ const _c0 = ["mjDropdownItem"];
8
+ const _c1 = ["trigger"];
9
+ const _c2 = ["filterInput"];
10
+ const _c3 = a0 => ({ $implicit: a0 });
11
+ function MJDropdownComponent_ng_template_6_Conditional_1_Template(rf, ctx) { if (rf & 1) {
12
+ const _r2 = i0.ɵɵgetCurrentView();
13
+ i0.ɵɵelementStart(0, "div", 7)(1, "input", 11, 1);
14
+ i0.ɵɵlistener("input", function MJDropdownComponent_ng_template_6_Conditional_1_Template_input_input_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnFilterInput($event)); })("keydown", function MJDropdownComponent_ng_template_6_Conditional_1_Template_input_keydown_1_listener($event) { i0.ɵɵrestoreView(_r2); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.OnKeyDown($event)); });
15
+ i0.ɵɵelementEnd()();
16
+ } if (rf & 2) {
17
+ const ctx_r2 = i0.ɵɵnextContext(2);
18
+ i0.ɵɵadvance();
19
+ i0.ɵɵproperty("value", ctx_r2.filterText);
20
+ } }
21
+ function MJDropdownComponent_ng_template_6_Conditional_2_Template(rf, ctx) { if (rf & 1) {
22
+ const _r4 = i0.ɵɵgetCurrentView();
23
+ i0.ɵɵelementStart(0, "div", 12);
24
+ i0.ɵɵlistener("click", function MJDropdownComponent_ng_template_6_Conditional_2_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r4); const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.SelectItem(null, $event)); });
25
+ i0.ɵɵtext(1);
26
+ i0.ɵɵelementEnd();
27
+ } if (rf & 2) {
28
+ const ctx_r2 = i0.ɵɵnextContext(2);
29
+ i0.ɵɵclassProp("mj-dropdown-option--selected", ctx_r2.SelectedValue == null)("mj-dropdown-option--highlighted", ctx_r2.HighlightedIndex === -1);
30
+ i0.ɵɵattribute("aria-selected", ctx_r2.SelectedValue == null);
31
+ i0.ɵɵadvance();
32
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.GetItemText(ctx_r2.DefaultItem), " ");
33
+ } }
34
+ function MJDropdownComponent_ng_template_6_For_4_Conditional_1_ng_container_0_Template(rf, ctx) { if (rf & 1) {
35
+ i0.ɵɵelementContainer(0);
36
+ } }
37
+ function MJDropdownComponent_ng_template_6_For_4_Conditional_1_Template(rf, ctx) { if (rf & 1) {
38
+ i0.ɵɵtemplate(0, MJDropdownComponent_ng_template_6_For_4_Conditional_1_ng_container_0_Template, 1, 0, "ng-container", 14);
39
+ } if (rf & 2) {
40
+ const item_r6 = i0.ɵɵnextContext().$implicit;
41
+ const ctx_r2 = i0.ɵɵnextContext(2);
42
+ i0.ɵɵproperty("ngTemplateOutlet", ctx_r2.itemTemplate)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c3, item_r6));
43
+ } }
44
+ function MJDropdownComponent_ng_template_6_For_4_Conditional_2_Template(rf, ctx) { if (rf & 1) {
45
+ i0.ɵɵtext(0);
46
+ } if (rf & 2) {
47
+ const item_r6 = i0.ɵɵnextContext().$implicit;
48
+ const ctx_r2 = i0.ɵɵnextContext(2);
49
+ i0.ɵɵtextInterpolate1(" ", ctx_r2.GetItemText(item_r6), " ");
50
+ } }
51
+ function MJDropdownComponent_ng_template_6_For_4_Template(rf, ctx) { if (rf & 1) {
52
+ const _r5 = i0.ɵɵgetCurrentView();
53
+ i0.ɵɵelementStart(0, "div", 13);
54
+ i0.ɵɵlistener("click", function MJDropdownComponent_ng_template_6_For_4_Template_div_click_0_listener($event) { const item_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r2 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r2.SelectItem(item_r6, $event)); });
55
+ i0.ɵɵconditionalCreate(1, MJDropdownComponent_ng_template_6_For_4_Conditional_1_Template, 1, 4, "ng-container")(2, MJDropdownComponent_ng_template_6_For_4_Conditional_2_Template, 1, 1);
56
+ i0.ɵɵelementEnd();
57
+ } if (rf & 2) {
58
+ const item_r6 = ctx.$implicit;
59
+ const $index_r7 = ctx.$index;
60
+ const ctx_r2 = i0.ɵɵnextContext(2);
61
+ i0.ɵɵclassProp("mj-dropdown-option--selected", ctx_r2.IsItemSelected(item_r6))("mj-dropdown-option--highlighted", ctx_r2.HighlightedIndex === $index_r7);
62
+ i0.ɵɵattribute("aria-selected", ctx_r2.IsItemSelected(item_r6));
63
+ i0.ɵɵadvance();
64
+ i0.ɵɵconditional(ctx_r2.itemTemplate ? 1 : 2);
65
+ } }
66
+ function MJDropdownComponent_ng_template_6_Conditional_5_Template(rf, ctx) { if (rf & 1) {
67
+ i0.ɵɵelementStart(0, "div", 10);
68
+ i0.ɵɵtext(1, "No data found");
69
+ i0.ɵɵelementEnd();
70
+ } }
71
+ function MJDropdownComponent_ng_template_6_Template(rf, ctx) { if (rf & 1) {
72
+ i0.ɵɵelementStart(0, "div", 6);
73
+ i0.ɵɵconditionalCreate(1, MJDropdownComponent_ng_template_6_Conditional_1_Template, 3, 1, "div", 7);
74
+ i0.ɵɵconditionalCreate(2, MJDropdownComponent_ng_template_6_Conditional_2_Template, 2, 6, "div", 8);
75
+ i0.ɵɵrepeaterCreate(3, MJDropdownComponent_ng_template_6_For_4_Template, 3, 6, "div", 9, i0.ɵɵcomponentInstance().TrackByIndex, true);
76
+ i0.ɵɵconditionalCreate(5, MJDropdownComponent_ng_template_6_Conditional_5_Template, 2, 0, "div", 10);
77
+ i0.ɵɵelementEnd();
78
+ } if (rf & 2) {
79
+ const ctx_r2 = i0.ɵɵnextContext();
80
+ i0.ɵɵadvance();
81
+ i0.ɵɵconditional(ctx_r2.Filterable ? 1 : -1);
82
+ i0.ɵɵadvance();
83
+ i0.ɵɵconditional(ctx_r2.DefaultItem != null ? 2 : -1);
84
+ i0.ɵɵadvance();
85
+ i0.ɵɵrepeater(ctx_r2.FilteredItems);
86
+ i0.ɵɵadvance(2);
87
+ i0.ɵɵconditional(ctx_r2.FilteredItems.length === 0 ? 5 : -1);
88
+ } }
89
+ /**
90
+ * mj-dropdown — Dropdown select component using CDK Overlay.
91
+ *
92
+ * Replaces `<kendo-dropdownlist>`.
93
+ *
94
+ * @example
95
+ * ```html
96
+ * <mj-dropdown
97
+ * [Data]="items"
98
+ * TextField="name"
99
+ * ValueField="id"
100
+ * [(ngModel)]="selectedId"
101
+ * [ValuePrimitive]="true"
102
+ * [Filterable]="true"
103
+ * (FilterChange)="onFilter($event)">
104
+ * </mj-dropdown>
105
+ * ```
106
+ */
107
+ export class MJDropdownComponent {
108
+ Data = [];
109
+ TextField = '';
110
+ ValueField = '';
111
+ Filterable = false;
112
+ ValuePrimitive = false;
113
+ Disabled = false;
114
+ Placeholder = 'Select...';
115
+ DefaultItem = null;
116
+ FilterChange = new EventEmitter();
117
+ ValueChange = new EventEmitter();
118
+ itemTemplate = null;
119
+ triggerEl;
120
+ filterInputEl;
121
+ hostClass = true;
122
+ cdr = inject(ChangeDetectorRef);
123
+ static nextId = 0;
124
+ DropdownId = MJDropdownComponent.nextId++;
125
+ IsOpen = false;
126
+ IsDisabled = false;
127
+ HighlightedIndex = -1;
128
+ SelectedValue = null;
129
+ TriggerWidth = 0;
130
+ filterText = '';
131
+ Positions = [
132
+ { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },
133
+ { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' }
134
+ ];
135
+ onChange = () => { };
136
+ onTouched = () => { };
137
+ get FilteredItems() {
138
+ const data = (this.Data ?? []);
139
+ if (!this.Filterable || !this.filterText)
140
+ return data;
141
+ const search = this.filterText.toLowerCase();
142
+ return data.filter(item => this.GetItemText(item).toLowerCase().includes(search));
143
+ }
144
+ get HasValue() { return this.SelectedValue != null; }
145
+ get DisplayText() {
146
+ if (this.SelectedValue == null) {
147
+ if (this.DefaultItem != null)
148
+ return this.GetItemText(this.DefaultItem);
149
+ return this.Placeholder;
150
+ }
151
+ if (this.ValuePrimitive && this.ValueField) {
152
+ const found = (this.Data ?? []).find(item => this.GetItemValue(item) === this.SelectedValue);
153
+ return found ? this.GetItemText(found) : String(this.SelectedValue);
154
+ }
155
+ return this.GetItemText(this.SelectedValue);
156
+ }
157
+ Toggle() {
158
+ if (this.IsDisabled)
159
+ return;
160
+ this.IsOpen ? this.Close() : this.Open();
161
+ }
162
+ Open() {
163
+ if (this.IsDisabled || this.IsOpen)
164
+ return;
165
+ this.TriggerWidth = this.triggerEl?.nativeElement.offsetWidth ?? 200;
166
+ this.IsOpen = true;
167
+ this.HighlightedIndex = this.getSelectedIndex();
168
+ this.cdr.detectChanges();
169
+ if (this.Filterable)
170
+ setTimeout(() => this.filterInputEl?.nativeElement.focus(), 0);
171
+ }
172
+ Close() {
173
+ if (!this.IsOpen)
174
+ return;
175
+ this.IsOpen = false;
176
+ this.filterText = '';
177
+ this.HighlightedIndex = -1;
178
+ this.cdr.detectChanges();
179
+ }
180
+ SelectItem(item, event) {
181
+ event?.stopPropagation();
182
+ if (item == null) {
183
+ this.SelectedValue = null;
184
+ this.onChange(null);
185
+ this.ValueChange.emit(null);
186
+ }
187
+ else if (this.ValuePrimitive && this.ValueField) {
188
+ const value = this.GetItemValue(item);
189
+ this.SelectedValue = value;
190
+ this.onChange(value);
191
+ this.ValueChange.emit(value);
192
+ }
193
+ else {
194
+ this.SelectedValue = item;
195
+ this.onChange(item);
196
+ this.ValueChange.emit(item);
197
+ }
198
+ this.Close();
199
+ }
200
+ IsItemSelected(item) {
201
+ if (this.SelectedValue == null)
202
+ return false;
203
+ if (this.ValuePrimitive && this.ValueField)
204
+ return this.GetItemValue(item) === this.SelectedValue;
205
+ if (this.ValueField && typeof item === 'object' && typeof this.SelectedValue === 'object')
206
+ return this.GetItemValue(item) === this.GetItemValue(this.SelectedValue);
207
+ return item === this.SelectedValue;
208
+ }
209
+ OnFilterInput(event) {
210
+ this.filterText = event.target.value;
211
+ this.HighlightedIndex = 0;
212
+ this.FilterChange.emit(this.filterText);
213
+ }
214
+ OnKeyDown(event) {
215
+ const items = this.FilteredItems;
216
+ switch (event.key) {
217
+ case 'ArrowDown':
218
+ event.preventDefault();
219
+ if (!this.IsOpen)
220
+ this.Open();
221
+ else
222
+ this.HighlightedIndex = Math.min(this.HighlightedIndex + 1, items.length - 1);
223
+ break;
224
+ case 'ArrowUp':
225
+ event.preventDefault();
226
+ if (this.IsOpen)
227
+ this.HighlightedIndex = Math.max(this.HighlightedIndex - 1, 0);
228
+ break;
229
+ case 'Enter':
230
+ event.preventDefault();
231
+ if (this.IsOpen && this.HighlightedIndex >= 0 && this.HighlightedIndex < items.length)
232
+ this.SelectItem(items[this.HighlightedIndex]);
233
+ else if (!this.IsOpen)
234
+ this.Open();
235
+ break;
236
+ case 'Escape':
237
+ event.preventDefault();
238
+ this.Close();
239
+ break;
240
+ case 'Home':
241
+ if (this.IsOpen) {
242
+ event.preventDefault();
243
+ this.HighlightedIndex = 0;
244
+ }
245
+ break;
246
+ case 'End':
247
+ if (this.IsOpen) {
248
+ event.preventDefault();
249
+ this.HighlightedIndex = items.length - 1;
250
+ }
251
+ break;
252
+ }
253
+ }
254
+ OnBlur() { this.onTouched(); }
255
+ GetItemText(item) {
256
+ if (item == null)
257
+ return '';
258
+ if (typeof item === 'string')
259
+ return item;
260
+ if (this.TextField && typeof item === 'object')
261
+ return String(item[this.TextField] ?? '');
262
+ return String(item);
263
+ }
264
+ GetItemValue(item) {
265
+ if (typeof item === 'string')
266
+ return item;
267
+ if (this.ValueField && typeof item === 'object' && item != null)
268
+ return item[this.ValueField];
269
+ return item;
270
+ }
271
+ TrackByIndex(index) { return index; }
272
+ writeValue(value) { this.SelectedValue = value; }
273
+ registerOnChange(fn) { this.onChange = fn; }
274
+ registerOnTouched(fn) { this.onTouched = fn; }
275
+ setDisabledState(isDisabled) { this.IsDisabled = isDisabled || this.Disabled; }
276
+ ngOnDestroy() { this.Close(); }
277
+ getSelectedIndex() {
278
+ if (this.SelectedValue == null)
279
+ return -1;
280
+ return this.FilteredItems.findIndex(item => this.IsItemSelected(item));
281
+ }
282
+ static ɵfac = function MJDropdownComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || MJDropdownComponent)(); };
283
+ static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: MJDropdownComponent, selectors: [["mj-dropdown"]], contentQueries: function MJDropdownComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
284
+ i0.ɵɵcontentQuery(dirIndex, _c0, 5);
285
+ } if (rf & 2) {
286
+ let _t;
287
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.itemTemplate = _t.first);
288
+ } }, viewQuery: function MJDropdownComponent_Query(rf, ctx) { if (rf & 1) {
289
+ i0.ɵɵviewQuery(_c1, 5)(_c2, 5);
290
+ } if (rf & 2) {
291
+ let _t;
292
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.triggerEl = _t.first);
293
+ i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.filterInputEl = _t.first);
294
+ } }, hostVars: 2, hostBindings: function MJDropdownComponent_HostBindings(rf, ctx) { if (rf & 2) {
295
+ i0.ɵɵclassProp("mj-dropdown-host", ctx.hostClass);
296
+ } }, inputs: { Data: "Data", TextField: "TextField", ValueField: "ValueField", Filterable: "Filterable", ValuePrimitive: "ValuePrimitive", Disabled: "Disabled", Placeholder: "Placeholder", DefaultItem: "DefaultItem" }, outputs: { FilterChange: "FilterChange", ValueChange: "ValueChange" }, features: [i0.ɵɵProvidersFeature([{
297
+ provide: NG_VALUE_ACCESSOR,
298
+ useExisting: forwardRef(() => MJDropdownComponent),
299
+ multi: true
300
+ }])], decls: 7, vars: 13, consts: [["trigger", "", "overlayOrigin", "cdkOverlayOrigin"], ["filterInput", ""], ["cdkOverlayOrigin", "", "role", "combobox", "aria-haspopup", "listbox", "tabindex", "0", 1, "mj-dropdown", 3, "click", "keydown", "blur"], [1, "mj-dropdown-value"], [1, "fa-solid", "fa-chevron-down", "mj-dropdown-arrow"], ["cdkConnectedOverlay", "", "cdkConnectedOverlayBackdropClass", "mj-dropdown-backdrop", 3, "backdropClick", "detach", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayOpen", "cdkConnectedOverlayPositions", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHasBackdrop"], ["role", "listbox", 1, "mj-dropdown-panel"], [1, "mj-dropdown-filter-wrap"], ["role", "option", 1, "mj-dropdown-option", "mj-dropdown-option--default", 3, "mj-dropdown-option--selected", "mj-dropdown-option--highlighted"], ["role", "option", 1, "mj-dropdown-option", 3, "mj-dropdown-option--selected", "mj-dropdown-option--highlighted"], [1, "mj-dropdown-no-data"], ["type", "text", "placeholder", "Search...", 1, "mj-input", "mj-dropdown-filter", 3, "input", "keydown", "value"], ["role", "option", 1, "mj-dropdown-option", "mj-dropdown-option--default", 3, "click"], ["role", "option", 1, "mj-dropdown-option", 3, "click"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"]], template: function MJDropdownComponent_Template(rf, ctx) { if (rf & 1) {
301
+ const _r1 = i0.ɵɵgetCurrentView();
302
+ i0.ɵɵelementStart(0, "div", 2, 0);
303
+ i0.ɵɵlistener("click", function MJDropdownComponent_Template_div_click_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.Toggle()); })("keydown", function MJDropdownComponent_Template_div_keydown_0_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.OnKeyDown($event)); })("blur", function MJDropdownComponent_Template_div_blur_0_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.OnBlur()); });
304
+ i0.ɵɵelementStart(3, "span", 3);
305
+ i0.ɵɵtext(4);
306
+ i0.ɵɵelementEnd();
307
+ i0.ɵɵelement(5, "i", 4);
308
+ i0.ɵɵelementEnd();
309
+ i0.ɵɵtemplate(6, MJDropdownComponent_ng_template_6_Template, 6, 3, "ng-template", 5);
310
+ i0.ɵɵlistener("backdropClick", function MJDropdownComponent_Template_ng_template_backdropClick_6_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.Close()); })("detach", function MJDropdownComponent_Template_ng_template_detach_6_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.Close()); });
311
+ } if (rf & 2) {
312
+ const overlayOrigin_r8 = i0.ɵɵreference(2);
313
+ i0.ɵɵclassProp("mj-dropdown--open", ctx.IsOpen)("mj-dropdown--disabled", ctx.IsDisabled);
314
+ i0.ɵɵattribute("aria-expanded", ctx.IsOpen);
315
+ i0.ɵɵadvance(3);
316
+ i0.ɵɵclassProp("mj-dropdown-placeholder", !ctx.HasValue);
317
+ i0.ɵɵadvance();
318
+ i0.ɵɵtextInterpolate1(" ", ctx.DisplayText, " ");
319
+ i0.ɵɵadvance(2);
320
+ i0.ɵɵproperty("cdkConnectedOverlayOrigin", overlayOrigin_r8)("cdkConnectedOverlayOpen", ctx.IsOpen)("cdkConnectedOverlayPositions", ctx.Positions)("cdkConnectedOverlayWidth", ctx.TriggerWidth)("cdkConnectedOverlayHasBackdrop", true);
321
+ } }, dependencies: [NgTemplateOutlet, OverlayModule, i1.CdkConnectedOverlay, i1.CdkOverlayOrigin], encapsulation: 2 });
322
+ }
323
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJDropdownComponent, [{
324
+ type: Component,
325
+ args: [{
326
+ selector: 'mj-dropdown',
327
+ standalone: true,
328
+ imports: [NgTemplateOutlet, OverlayModule],
329
+ template: `
330
+ <div
331
+ class="mj-dropdown"
332
+ #trigger
333
+ cdkOverlayOrigin
334
+ #overlayOrigin="cdkOverlayOrigin"
335
+ [class.mj-dropdown--open]="IsOpen"
336
+ [class.mj-dropdown--disabled]="IsDisabled"
337
+ role="combobox"
338
+ [attr.aria-expanded]="IsOpen"
339
+ aria-haspopup="listbox"
340
+ tabindex="0"
341
+ (click)="Toggle()"
342
+ (keydown)="OnKeyDown($event)"
343
+ (blur)="OnBlur()">
344
+ <span class="mj-dropdown-value" [class.mj-dropdown-placeholder]="!HasValue">
345
+ {{ DisplayText }}
346
+ </span>
347
+ <i class="fa-solid fa-chevron-down mj-dropdown-arrow"></i>
348
+ </div>
349
+
350
+ <ng-template
351
+ cdkConnectedOverlay
352
+ [cdkConnectedOverlayOrigin]="overlayOrigin"
353
+ [cdkConnectedOverlayOpen]="IsOpen"
354
+ [cdkConnectedOverlayPositions]="Positions"
355
+ [cdkConnectedOverlayWidth]="TriggerWidth"
356
+ [cdkConnectedOverlayHasBackdrop]="true"
357
+ cdkConnectedOverlayBackdropClass="mj-dropdown-backdrop"
358
+ (backdropClick)="Close()"
359
+ (detach)="Close()">
360
+ <div class="mj-dropdown-panel" role="listbox">
361
+ @if (Filterable) {
362
+ <div class="mj-dropdown-filter-wrap">
363
+ <input
364
+ #filterInput
365
+ class="mj-input mj-dropdown-filter"
366
+ type="text"
367
+ placeholder="Search..."
368
+ [value]="filterText"
369
+ (input)="OnFilterInput($event)"
370
+ (keydown)="OnKeyDown($event)" />
371
+ </div>
372
+ }
373
+ @if (DefaultItem != null) {
374
+ <div
375
+ class="mj-dropdown-option mj-dropdown-option--default"
376
+ [class.mj-dropdown-option--selected]="SelectedValue == null"
377
+ [class.mj-dropdown-option--highlighted]="HighlightedIndex === -1"
378
+ role="option"
379
+ [attr.aria-selected]="SelectedValue == null"
380
+ (click)="SelectItem(null, $event)">
381
+ {{ GetItemText(DefaultItem) }}
382
+ </div>
383
+ }
384
+ @for (item of FilteredItems; track TrackByIndex($index)) {
385
+ <div
386
+ class="mj-dropdown-option"
387
+ [class.mj-dropdown-option--selected]="IsItemSelected(item)"
388
+ [class.mj-dropdown-option--highlighted]="HighlightedIndex === $index"
389
+ role="option"
390
+ [attr.aria-selected]="IsItemSelected(item)"
391
+ (click)="SelectItem(item, $event)">
392
+ @if (itemTemplate) {
393
+ <ng-container *ngTemplateOutlet="itemTemplate; context: { $implicit: item }"></ng-container>
394
+ } @else {
395
+ {{ GetItemText(item) }}
396
+ }
397
+ </div>
398
+ }
399
+ @if (FilteredItems.length === 0) {
400
+ <div class="mj-dropdown-no-data">No data found</div>
401
+ }
402
+ </div>
403
+ </ng-template>
404
+ `,
405
+ providers: [{
406
+ provide: NG_VALUE_ACCESSOR,
407
+ useExisting: forwardRef(() => MJDropdownComponent),
408
+ multi: true
409
+ }]
410
+ }]
411
+ }], null, { Data: [{
412
+ type: Input
413
+ }], TextField: [{
414
+ type: Input
415
+ }], ValueField: [{
416
+ type: Input
417
+ }], Filterable: [{
418
+ type: Input
419
+ }], ValuePrimitive: [{
420
+ type: Input
421
+ }], Disabled: [{
422
+ type: Input
423
+ }], Placeholder: [{
424
+ type: Input
425
+ }], DefaultItem: [{
426
+ type: Input
427
+ }], FilterChange: [{
428
+ type: Output
429
+ }], ValueChange: [{
430
+ type: Output
431
+ }], itemTemplate: [{
432
+ type: ContentChild,
433
+ args: ['mjDropdownItem']
434
+ }], triggerEl: [{
435
+ type: ViewChild,
436
+ args: ['trigger']
437
+ }], filterInputEl: [{
438
+ type: ViewChild,
439
+ args: ['filterInput']
440
+ }], hostClass: [{
441
+ type: HostBinding,
442
+ args: ['class.mj-dropdown-host']
443
+ }] }); })();
444
+ (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(MJDropdownComponent, { className: "MJDropdownComponent", filePath: "lib/dropdown/dropdown.component.ts", lineNumber: 124 }); })();
445
+ //# sourceMappingURL=dropdown.component.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dropdown.component.js","sourceRoot":"","sources":["../../../src/lib/dropdown/dropdown.component.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Input,\n Output,\n EventEmitter,\n forwardRef,\n HostBinding,\n ElementRef,\n ViewChild,\n ContentChild,\n TemplateRef,\n OnDestroy,\n inject,\n ChangeDetectorRef\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { NG_VALUE_ACCESSOR, ControlValueAccessor } from '@angular/forms';\nimport { OverlayModule, ConnectedPosition } from '@angular/cdk/overlay';\n\n/**\n * mj-dropdown — Dropdown select component using CDK Overlay.\n *\n * Replaces `<kendo-dropdownlist>`.\n *\n * @example\n * ```html\n * <mj-dropdown\n * [Data]=\"items\"\n * TextField=\"name\"\n * ValueField=\"id\"\n * [(ngModel)]=\"selectedId\"\n * [ValuePrimitive]=\"true\"\n * [Filterable]=\"true\"\n * (FilterChange)=\"onFilter($event)\">\n * </mj-dropdown>\n * ```\n */\n@Component({\n selector: 'mj-dropdown',\n standalone: true,\n imports: [NgTemplateOutlet, OverlayModule],\n template: `\n <div\n class=\"mj-dropdown\"\n #trigger\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n [class.mj-dropdown--open]=\"IsOpen\"\n [class.mj-dropdown--disabled]=\"IsDisabled\"\n role=\"combobox\"\n [attr.aria-expanded]=\"IsOpen\"\n aria-haspopup=\"listbox\"\n tabindex=\"0\"\n (click)=\"Toggle()\"\n (keydown)=\"OnKeyDown($event)\"\n (blur)=\"OnBlur()\">\n <span class=\"mj-dropdown-value\" [class.mj-dropdown-placeholder]=\"!HasValue\">\n {{ DisplayText }}\n </span>\n <i class=\"fa-solid fa-chevron-down mj-dropdown-arrow\"></i>\n </div>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"IsOpen\"\n [cdkConnectedOverlayPositions]=\"Positions\"\n [cdkConnectedOverlayWidth]=\"TriggerWidth\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n cdkConnectedOverlayBackdropClass=\"mj-dropdown-backdrop\"\n (backdropClick)=\"Close()\"\n (detach)=\"Close()\">\n <div class=\"mj-dropdown-panel\" role=\"listbox\">\n @if (Filterable) {\n <div class=\"mj-dropdown-filter-wrap\">\n <input\n #filterInput\n class=\"mj-input mj-dropdown-filter\"\n type=\"text\"\n placeholder=\"Search...\"\n [value]=\"filterText\"\n (input)=\"OnFilterInput($event)\"\n (keydown)=\"OnKeyDown($event)\" />\n </div>\n }\n @if (DefaultItem != null) {\n <div\n class=\"mj-dropdown-option mj-dropdown-option--default\"\n [class.mj-dropdown-option--selected]=\"SelectedValue == null\"\n [class.mj-dropdown-option--highlighted]=\"HighlightedIndex === -1\"\n role=\"option\"\n [attr.aria-selected]=\"SelectedValue == null\"\n (click)=\"SelectItem(null, $event)\">\n {{ GetItemText(DefaultItem) }}\n </div>\n }\n @for (item of FilteredItems; track TrackByIndex($index)) {\n <div\n class=\"mj-dropdown-option\"\n [class.mj-dropdown-option--selected]=\"IsItemSelected(item)\"\n [class.mj-dropdown-option--highlighted]=\"HighlightedIndex === $index\"\n role=\"option\"\n [attr.aria-selected]=\"IsItemSelected(item)\"\n (click)=\"SelectItem(item, $event)\">\n @if (itemTemplate) {\n <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item }\"></ng-container>\n } @else {\n {{ GetItemText(item) }}\n }\n </div>\n }\n @if (FilteredItems.length === 0) {\n <div class=\"mj-dropdown-no-data\">No data found</div>\n }\n </div>\n </ng-template>\n `,\n providers: [{\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MJDropdownComponent),\n multi: true\n }]\n})\nexport class MJDropdownComponent implements ControlValueAccessor, OnDestroy {\n @Input() Data: Record<string, unknown>[] | string[] | readonly unknown[] | null = [];\n @Input() TextField = '';\n @Input() ValueField = '';\n @Input() Filterable = false;\n @Input() ValuePrimitive = false;\n @Input() Disabled = false;\n @Input() Placeholder = 'Select...';\n @Input() DefaultItem: Record<string, unknown> | string | null = null;\n\n @Output() FilterChange = new EventEmitter<string>();\n @Output() ValueChange = new EventEmitter<unknown>();\n\n @ContentChild('mjDropdownItem') itemTemplate: TemplateRef<{ $implicit: unknown }> | null = null;\n\n @ViewChild('trigger') private triggerEl!: ElementRef<HTMLElement>;\n @ViewChild('filterInput') private filterInputEl: ElementRef<HTMLInputElement> | undefined;\n\n @HostBinding('class.mj-dropdown-host') readonly hostClass = true;\n\n private cdr = inject(ChangeDetectorRef);\n private static nextId = 0;\n\n DropdownId = MJDropdownComponent.nextId++;\n IsOpen = false;\n IsDisabled = false;\n HighlightedIndex = -1;\n SelectedValue: unknown = null;\n TriggerWidth = 0;\n\n filterText = '';\n\n Positions: ConnectedPosition[] = [\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' }\n ];\n\n private onChange: (value: unknown) => void = () => {};\n private onTouched: () => void = () => {};\n\n get FilteredItems(): unknown[] {\n const data = (this.Data ?? []) as unknown[];\n if (!this.Filterable || !this.filterText) return data;\n const search = this.filterText.toLowerCase();\n return data.filter(item => this.GetItemText(item).toLowerCase().includes(search));\n }\n\n get HasValue(): boolean { return this.SelectedValue != null; }\n\n get DisplayText(): string {\n if (this.SelectedValue == null) {\n if (this.DefaultItem != null) return this.GetItemText(this.DefaultItem);\n return this.Placeholder;\n }\n if (this.ValuePrimitive && this.ValueField) {\n const found = ((this.Data ?? []) as unknown[]).find(item => this.GetItemValue(item) === this.SelectedValue);\n return found ? this.GetItemText(found) : String(this.SelectedValue);\n }\n return this.GetItemText(this.SelectedValue as Record<string, unknown> | string);\n }\n\n Toggle(): void {\n if (this.IsDisabled) return;\n this.IsOpen ? this.Close() : this.Open();\n }\n\n Open(): void {\n if (this.IsDisabled || this.IsOpen) return;\n this.TriggerWidth = this.triggerEl?.nativeElement.offsetWidth ?? 200;\n this.IsOpen = true;\n this.HighlightedIndex = this.getSelectedIndex();\n this.cdr.detectChanges();\n if (this.Filterable) setTimeout(() => this.filterInputEl?.nativeElement.focus(), 0);\n }\n\n Close(): void {\n if (!this.IsOpen) return;\n this.IsOpen = false;\n this.filterText = '';\n this.HighlightedIndex = -1;\n this.cdr.detectChanges();\n }\n\n SelectItem(item: unknown | null, event?: Event): void {\n event?.stopPropagation();\n if (item == null) {\n this.SelectedValue = null;\n this.onChange(null);\n this.ValueChange.emit(null);\n } else if (this.ValuePrimitive && this.ValueField) {\n const value = this.GetItemValue(item);\n this.SelectedValue = value;\n this.onChange(value);\n this.ValueChange.emit(value);\n } else {\n this.SelectedValue = item;\n this.onChange(item);\n this.ValueChange.emit(item);\n }\n this.Close();\n }\n\n IsItemSelected(item: unknown): boolean {\n if (this.SelectedValue == null) return false;\n if (this.ValuePrimitive && this.ValueField) return this.GetItemValue(item) === this.SelectedValue;\n if (this.ValueField && typeof item === 'object' && typeof this.SelectedValue === 'object')\n return this.GetItemValue(item) === this.GetItemValue(this.SelectedValue);\n return item === this.SelectedValue;\n }\n\n OnFilterInput(event: Event): void {\n this.filterText = (event.target as HTMLInputElement).value;\n this.HighlightedIndex = 0;\n this.FilterChange.emit(this.filterText);\n }\n\n OnKeyDown(event: KeyboardEvent): void {\n const items = this.FilteredItems;\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n if (!this.IsOpen) this.Open();\n else this.HighlightedIndex = Math.min(this.HighlightedIndex + 1, items.length - 1);\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (this.IsOpen) this.HighlightedIndex = Math.max(this.HighlightedIndex - 1, 0);\n break;\n case 'Enter':\n event.preventDefault();\n if (this.IsOpen && this.HighlightedIndex >= 0 && this.HighlightedIndex < items.length)\n this.SelectItem(items[this.HighlightedIndex]);\n else if (!this.IsOpen) this.Open();\n break;\n case 'Escape': event.preventDefault(); this.Close(); break;\n case 'Home': if (this.IsOpen) { event.preventDefault(); this.HighlightedIndex = 0; } break;\n case 'End': if (this.IsOpen) { event.preventDefault(); this.HighlightedIndex = items.length - 1; } break;\n }\n }\n\n OnBlur(): void { this.onTouched(); }\n\n GetItemText(item: unknown): string {\n if (item == null) return '';\n if (typeof item === 'string') return item;\n if (this.TextField && typeof item === 'object') return String((item as Record<string, unknown>)[this.TextField] ?? '');\n return String(item);\n }\n\n GetItemValue(item: unknown): unknown {\n if (typeof item === 'string') return item;\n if (this.ValueField && typeof item === 'object' && item != null) return (item as Record<string, unknown>)[this.ValueField];\n return item;\n }\n\n TrackByIndex(index: number): number { return index; }\n\n writeValue(value: unknown): void { this.SelectedValue = value; }\n registerOnChange(fn: (value: unknown) => 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 private getSelectedIndex(): number {\n if (this.SelectedValue == null) return -1;\n return this.FilteredItems.findIndex(item => this.IsItemSelected(item));\n }\n}\n"]}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * MJ Dropdown Styles
3
+ */
4
+
5
+ .mj-dropdown-host { display: block; width: 100%; }
6
+
7
+ .mj-dropdown {
8
+ display: flex;
9
+ align-items: center;
10
+ justify-content: space-between;
11
+ gap: 8px;
12
+ padding: 8px 12px;
13
+ min-height: 38px;
14
+ background: var(--mj-bg-surface);
15
+ border: 1px solid var(--mj-border-default);
16
+ border-radius: var(--mj-radius-sm);
17
+ font-family: var(--mj-font-family);
18
+ font-size: var(--mj-text-sm);
19
+ color: var(--mj-text-primary);
20
+ cursor: pointer;
21
+ transition: var(--mj-transition-colors), box-shadow var(--mj-transition-base);
22
+ outline: none;
23
+ user-select: none;
24
+
25
+ &:hover:not(.mj-dropdown--disabled) { border-color: var(--mj-border-strong); }
26
+ &:focus-visible:not(.mj-dropdown--disabled) { border-color: var(--mj-brand-primary); box-shadow: var(--mj-focus-ring); }
27
+ &.mj-dropdown--open { border-color: var(--mj-brand-primary); box-shadow: var(--mj-focus-ring); }
28
+ &.mj-dropdown--disabled { opacity: 0.5; cursor: not-allowed; background: var(--mj-bg-surface-sunken); }
29
+ }
30
+
31
+ .mj-dropdown-value { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
32
+ .mj-dropdown-placeholder { color: var(--mj-text-disabled); }
33
+ .mj-dropdown-arrow {
34
+ font-size: 0.75rem; color: var(--mj-text-muted); transition: transform var(--mj-transition-fast); flex-shrink: 0;
35
+ .mj-dropdown--open & { transform: rotate(180deg); }
36
+ }
37
+ .mj-dropdown-backdrop { background: transparent; }
38
+
39
+ .mj-dropdown-panel {
40
+ width: 100%;
41
+ box-sizing: border-box;
42
+ background: var(--mj-bg-surface-elevated);
43
+ border: 1px solid var(--mj-border-default);
44
+ border-radius: var(--mj-radius-sm);
45
+ box-shadow: var(--mj-shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, 0.1));
46
+ max-height: 300px;
47
+ overflow-y: auto;
48
+ z-index: 1000;
49
+ padding: 4px 0;
50
+ }
51
+
52
+ .mj-dropdown-filter-wrap { padding: 8px; border-bottom: 1px solid var(--mj-border-default); }
53
+ .mj-dropdown-filter { width: 100%; min-height: 32px; padding: 6px 8px; }
54
+
55
+ .mj-dropdown-option {
56
+ display: flex; align-items: center; padding: 8px 12px;
57
+ font-size: var(--mj-text-sm); color: var(--mj-text-primary);
58
+ cursor: pointer; transition: background var(--mj-transition-fast); min-height: 36px;
59
+ &:hover, &.mj-dropdown-option--highlighted { background: var(--mj-bg-surface-hover); }
60
+ &.mj-dropdown-option--selected {
61
+ background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));
62
+ color: var(--mj-brand-primary); font-weight: var(--mj-font-semibold);
63
+ }
64
+ }
65
+
66
+ .mj-dropdown-no-data { padding: 16px 12px; color: var(--mj-text-muted); text-align: center; font-size: var(--mj-text-sm); }
67
+
68
+ @media (max-width: 767px) { .mj-dropdown-panel { max-height: 50vh; } }
@@ -0,0 +1,64 @@
1
+ /**
2
+ * MJ Status Chip Styles
3
+ *
4
+ * Replaces kendo-chip for simple status badges/labels.
5
+ */
6
+
7
+ .status-chip {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ gap: 4px;
11
+ padding: 2px 10px;
12
+ font-size: 0.75rem;
13
+ font-weight: var(--mj-font-semibold);
14
+ border-radius: var(--mj-radius-full);
15
+ white-space: nowrap;
16
+ line-height: 1.5;
17
+
18
+ /* Default neutral */
19
+ background: var(--mj-bg-surface-card);
20
+ color: var(--mj-text-secondary);
21
+ border: 1px solid var(--mj-border-default);
22
+
23
+ /* Color variants via data-color attribute */
24
+ &[data-color="success"] {
25
+ background: var(--mj-status-success-bg);
26
+ color: var(--mj-status-success-text);
27
+ border-color: var(--mj-status-success-border);
28
+ }
29
+
30
+ &[data-color="error"] {
31
+ background: var(--mj-status-error-bg);
32
+ color: var(--mj-status-error-text);
33
+ border-color: var(--mj-status-error-border);
34
+ }
35
+
36
+ &[data-color="warning"] {
37
+ background: var(--mj-status-warning-bg);
38
+ color: var(--mj-status-warning-text);
39
+ border-color: var(--mj-status-warning-border);
40
+ }
41
+
42
+ &[data-color="info"] {
43
+ background: var(--mj-status-info-bg);
44
+ color: var(--mj-status-info-text);
45
+ border-color: var(--mj-status-info-border);
46
+ }
47
+
48
+ &[data-color="primary"] {
49
+ background: color-mix(in srgb, var(--mj-brand-primary) 10%, var(--mj-bg-surface));
50
+ color: var(--mj-brand-primary);
51
+ border-color: var(--mj-brand-primary);
52
+ }
53
+
54
+ /* Removable chip */
55
+ &.removable {
56
+ cursor: pointer;
57
+
58
+ i { font-size: 0.625rem; margin-left: 2px; }
59
+
60
+ &:hover {
61
+ opacity: 0.8;
62
+ }
63
+ }
64
+ }