@memberjunction/ng-ui-components 6.1.0-edge.5 → 6.1.0-edge.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib/alert/alert.component.d.ts.map +1 -1
- package/dist/lib/alert/alert.component.js +1 -1
- package/dist/lib/applied-filters/applied-filters.component.js +1 -1
- package/dist/lib/bottom-sheet/bottom-sheet.component.js +1 -1
- package/dist/lib/combobox/combobox.component.d.ts +32 -1
- package/dist/lib/combobox/combobox.component.d.ts.map +1 -1
- package/dist/lib/combobox/combobox.component.js +73 -28
- package/dist/lib/combobox/combobox.component.js.map +1 -1
- package/dist/lib/confirm-dialog/confirm-dialog.component.d.ts.map +1 -1
- package/dist/lib/datepicker/datepicker.component.d.ts +25 -1
- package/dist/lib/datepicker/datepicker.component.d.ts.map +1 -1
- package/dist/lib/datepicker/datepicker.component.js +59 -28
- package/dist/lib/datepicker/datepicker.component.js.map +1 -1
- package/dist/lib/dialog/dialog.component.js +1 -1
- package/dist/lib/dialog/dialog.component.js.map +1 -1
- package/dist/lib/dialog/dialog.service.d.ts.map +1 -1
- package/dist/lib/dialog/dialog.service.js +18 -19
- package/dist/lib/dialog/dialog.service.js.map +1 -1
- package/dist/lib/dropdown/dropdown.component.d.ts +36 -1
- package/dist/lib/dropdown/dropdown.component.d.ts.map +1 -1
- package/dist/lib/dropdown/dropdown.component.js +91 -40
- package/dist/lib/dropdown/dropdown.component.js.map +1 -1
- package/dist/lib/empty-state/empty-state.component.js +1 -1
- package/dist/lib/filter-popover/filter-popover.component.js +27 -28
- package/dist/lib/filter-popover/filter-popover.component.js.map +1 -1
- package/dist/lib/left-nav/left-nav-content.component.js +1 -1
- package/dist/lib/left-nav/left-nav.component.js +72 -73
- package/dist/lib/left-nav/left-nav.component.js.map +1 -1
- package/dist/lib/numeric-input/numeric-input.component.d.ts +22 -1
- package/dist/lib/numeric-input/numeric-input.component.d.ts.map +1 -1
- package/dist/lib/numeric-input/numeric-input.component.js +30 -3
- package/dist/lib/numeric-input/numeric-input.component.js.map +1 -1
- package/dist/lib/page-body/page-body.component.js +1 -1
- package/dist/lib/page-body-interior/page-body-interior.component.js +1 -1
- package/dist/lib/page-header/page-header.component.js +1 -1
- package/dist/lib/page-header-interior/page-header-interior.component.js +1 -1
- package/dist/lib/page-search/page-search.component.js +1 -1
- package/dist/lib/refresh-button/refresh-button.component.js +1 -1
- package/dist/lib/slide-panel/slide-panel.component.js +1 -1
- package/dist/lib/stat-badge/stat-badge.component.js +1 -1
- package/dist/lib/switch/switch.component.d.ts +22 -1
- package/dist/lib/switch/switch.component.d.ts.map +1 -1
- package/dist/lib/switch/switch.component.js +30 -3
- package/dist/lib/switch/switch.component.js.map +1 -1
- package/dist/lib/tab-nav/tab-nav.component.js +1 -1
- package/dist/lib/view-toggle/view-toggle.component.js +1 -1
- package/dist/lib/window/window.component.js +1 -1
- package/dist/lib/window/window.component.js.map +1 -1
- package/dist/lib/workspace-tabs/workspace-card.component.js +1 -1
- package/dist/lib/workspace-tabs/workspace-tab-strip.component.js +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert.component.d.ts","sourceRoot":"","sources":["../../../src/lib/alert/alert.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,YAAY,EAA8B,MAAM,eAAe,CAAC;;AAEtG;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtE,mEAAmE;AACnE,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;AAStC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,qBA0Ha,gBAAgB;IAC3B,uEAAuE;IAC9D,OAAO,EAAE,cAAc,CAAU;IAE1C,wEAAwE;IAC/D,IAAI,EAAE,WAAW,CAAQ;IAElC,+BAA+B;IACtB,KAAK,SAAM;IAEpB,2EAA2E;IAClE,OAAO,SAAM;IAEtB;;;OAGG;IACM,IAAI,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEpC,qGAAqG;IAC7D,WAAW,UAAS;IAE5D;;;;OAIG;IACM,IAAI,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEpC,+CAA+C;IACrC,SAAS,qBAA4B;IAE/C,SAAS,CAAC,WAAW,UAAS;IAI9B,IAAyC,MAAM,IAAI,OAAO,CAAoC;IAC9F,IAA4C,SAAS,IAAI,OAAO,CAAuC;IACvG,IAA4C,SAAS,IAAI,OAAO,CAAuC;IACvG,IAA0C,OAAO,IAAI,OAAO,CAAqC;IACjG,IAAuC,OAAO,IAAI,OAAO,CAA+B;IACxF,IAA8C,QAAQ,IAAI,OAAO,CAA6B;IAE9F;;;OAGG;IACH,IACI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAK5B;IAED;;;OAGG;IACH,IAAI,YAAY,IAAI,MAAM,CAKzB;IAED,kDAAkD;IAClD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM;IAI7D,OAAO,IAAI,IAAI;yCAvEJ,gBAAgB;2CAAhB,gBAAgB;
|
|
1
|
+
{"version":3,"file":"alert.component.d.ts","sourceRoot":"","sources":["../../../src/lib/alert/alert.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,YAAY,EAA8B,MAAM,eAAe,CAAC;;AAEtG;;;;;;;;GAQG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAEtE,mEAAmE;AACnE,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,IAAI,CAAC;AAStC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,qBA0Ha,gBAAgB;IAC3B,uEAAuE;IAC9D,OAAO,EAAE,cAAc,CAAU;IAE1C,wEAAwE;IAC/D,IAAI,EAAE,WAAW,CAAQ;IAElC,+BAA+B;IACtB,KAAK,SAAM;IAEpB,2EAA2E;IAClE,OAAO,SAAM;IAEtB;;;OAGG;IACM,IAAI,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEpC,qGAAqG;IAC7D,WAAW,UAAS;IAE5D;;;;OAIG;IACM,IAAI,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEpC,+CAA+C;IACrC,SAAS,qBAA4B;IAE/C,SAAS,CAAC,WAAW,UAAS;IAI9B,IAAyC,MAAM,IAAI,OAAO,CAAoC;IAC9F,IAA4C,SAAS,IAAI,OAAO,CAAuC;IACvG,IAA4C,SAAS,IAAI,OAAO,CAAuC;IACvG,IAA0C,OAAO,IAAI,OAAO,CAAqC;IACjG,IAAuC,OAAO,IAAI,OAAO,CAA+B;IACxF,IAA8C,QAAQ,IAAI,OAAO,CAA6B;IAE9F;;;OAGG;IACH,IACI,QAAQ,IAAI,MAAM,GAAG,IAAI,CAK5B;IAED;;;OAGG;IACH,IAAI,YAAY,IAAI,MAAM,CAKzB;IAED,kDAAkD;IAClD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM;IAI7D,OAAO,IAAI,IAAI;yCAvEJ,gBAAgB;2CAAhB,gBAAgB;0CA4E495L,OAAQ;CADhg6L"}
|
|
@@ -164,7 +164,7 @@ export class MJAlertComponent {
|
|
|
164
164
|
i0.ɵɵconditionalCreate(0, MJAlertComponent_Conditional_0_Template, 8, 4);
|
|
165
165
|
} if (rf & 2) {
|
|
166
166
|
i0.ɵɵconditional(!ctx.isDismissed ? 0 : -1);
|
|
167
|
-
} }, styles: ["[_nghost-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: var(--mj-space-3);\n padding: var(--mj-space-3) var(--mj-space-4);\n margin-bottom: var(--mj-space-4);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n font-size: var(--mj-text-sm);\n line-height: 1.45;\n }\n \n\n\n
|
|
167
|
+
} }, styles: ["[_nghost-%COMP%] {\n display: flex;\n align-items: flex-start;\n gap: var(--mj-space-3);\n padding: var(--mj-space-3) var(--mj-space-4);\n margin-bottom: var(--mj-space-4);\n border: 1px solid var(--mj-border-default);\n border-radius: var(--mj-radius-md);\n font-size: var(--mj-text-sm);\n line-height: 1.45;\n }\n \n\n\n [_nghost-%COMP%]:last-child { margin-bottom: 0; }\n .mj-alert--dismissed[_nghost-%COMP%] { display: none; }\n\n .mj-alert__icon[_ngcontent-%COMP%] {\n flex-shrink: 0;\n font-size: 1rem;\n margin-top: 0.1em;\n }\n .mj-alert__content[_ngcontent-%COMP%] { flex: 1; min-width: 0; }\n .mj-alert__title[_ngcontent-%COMP%] { font-weight: var(--mj-font-semibold); }\n .mj-alert__title[_ngcontent-%COMP%] + .mj-alert__message[_ngcontent-%COMP%] { margin-top: var(--mj-space-1); }\n .mj-alert__message[_ngcontent-%COMP%] { color: inherit; opacity: 0.9; }\n\n .mj-alert__actions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n flex-shrink: 0;\n }\n .mj-alert__actions[_ngcontent-%COMP%]:empty { display: none; }\n\n .mj-alert__dismiss[_ngcontent-%COMP%] {\n flex-shrink: 0;\n border: none;\n background: transparent;\n color: inherit;\n opacity: 0.6;\n cursor: pointer;\n padding: 0;\n width: 20px; height: 20px;\n display: flex; align-items: center; justify-content: center;\n border-radius: var(--mj-radius-sm);\n transition: opacity var(--mj-transition-fast), background var(--mj-transition-fast);\n }\n .mj-alert__dismiss[_ngcontent-%COMP%]:hover { opacity: 1; background: color-mix(in srgb, currentColor 12%, transparent); }\n\n \n .mj-alert--sm[_nghost-%COMP%] {\n padding: var(--mj-space-2) var(--mj-space-3);\n font-size: var(--mj-text-xs);\n gap: var(--mj-space-2);\n }\n .mj-alert--sm[_nghost-%COMP%] .mj-alert__icon[_ngcontent-%COMP%] { font-size: 0.875rem; }\n\n \n\n\n\n\n\n\n .mj-alert--info[_nghost-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-info) 12%, var(--mj-bg-surface));\n border-color: var(--mj-status-info-border);\n color: var(--mj-status-info-text);\n }\n .mj-alert--info[_nghost-%COMP%] .mj-alert__icon[_ngcontent-%COMP%] { color: var(--mj-status-info); }\n\n .mj-alert--success[_nghost-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-success) 12%, var(--mj-bg-surface));\n border-color: var(--mj-status-success-border);\n color: var(--mj-status-success-text);\n }\n .mj-alert--success[_nghost-%COMP%] .mj-alert__icon[_ngcontent-%COMP%] { color: var(--mj-status-success); }\n\n .mj-alert--warning[_nghost-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-warning) 12%, var(--mj-bg-surface));\n border-color: var(--mj-status-warning-border);\n color: var(--mj-status-warning-text);\n }\n .mj-alert--warning[_nghost-%COMP%] .mj-alert__icon[_ngcontent-%COMP%] { color: var(--mj-status-warning); }\n\n .mj-alert--error[_nghost-%COMP%] {\n background: color-mix(in srgb, var(--mj-status-error) 12%, var(--mj-bg-surface));\n border-color: var(--mj-status-error-border);\n color: var(--mj-status-error-text);\n }\n .mj-alert--error[_nghost-%COMP%] .mj-alert__icon[_ngcontent-%COMP%] { color: var(--mj-status-error); }"] });
|
|
168
168
|
}
|
|
169
169
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJAlertComponent, [{
|
|
170
170
|
type: Component,
|
|
@@ -86,7 +86,7 @@ export class MJAppliedFiltersComponent {
|
|
|
86
86
|
i0.ɵɵconditionalCreate(0, MJAppliedFiltersComponent_Conditional_0_Template, 7, 2, "div", 0);
|
|
87
87
|
} if (rf & 2) {
|
|
88
88
|
i0.ɵɵconditional(ctx.Filters.length > 0 ? 0 : -1);
|
|
89
|
-
} }, styles: ["[_nghost-%COMP%] {\n display: block;\n }\n\n .mj-applied-filters[_ngcontent-%COMP%] {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-3) var(--mj-space-5);\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .mj-applied-filters__lead[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-right: 2px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-muted);\n }\n\n .mj-applied-filters__token[_ngcontent-%COMP%] {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n gap: 7px;\n height: 30px;\n padding: 0 5px 0 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n background: var(--mj-bg-surface);\n font-size: 12.5px;\n }\n\n .mj-applied-filters__k[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n }\n\n .mj-applied-filters__v[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 600;\n }\n\n .mj-applied-filters__x[_ngcontent-%COMP%] {\n width: 19px;\n height: 19px;\n flex-shrink: 0;\n border: none;\n background: transparent;\n border-radius: 50%;\n display: grid;\n place-items: center;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: inherit;\n }\n .mj-applied-filters__x[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n }\n\n .mj-applied-filters__clear[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-left: 4px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-family: inherit;\n font-size: 12.5px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n .mj-applied-filters__clear[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n }\n\n \n\n
|
|
89
|
+
} }, styles: ["[_nghost-%COMP%] {\n display: block;\n }\n\n .mj-applied-filters[_ngcontent-%COMP%] {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n gap: var(--mj-space-2);\n padding: var(--mj-space-3) var(--mj-space-5);\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-subtle);\n }\n\n .mj-applied-filters__lead[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-right: 2px;\n font-size: 11px;\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.05em;\n color: var(--mj-text-muted);\n }\n\n .mj-applied-filters__token[_ngcontent-%COMP%] {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n gap: 7px;\n height: 30px;\n padding: 0 5px 0 12px;\n border: 1px solid var(--mj-border-default);\n border-radius: 999px;\n background: var(--mj-bg-surface);\n font-size: 12.5px;\n }\n\n .mj-applied-filters__k[_ngcontent-%COMP%] {\n color: var(--mj-text-muted);\n }\n\n .mj-applied-filters__v[_ngcontent-%COMP%] {\n color: var(--mj-text-primary);\n font-weight: 600;\n }\n\n .mj-applied-filters__x[_ngcontent-%COMP%] {\n width: 19px;\n height: 19px;\n flex-shrink: 0;\n border: none;\n background: transparent;\n border-radius: 50%;\n display: grid;\n place-items: center;\n cursor: pointer;\n color: var(--mj-text-muted);\n font-size: 11px;\n font-family: inherit;\n }\n .mj-applied-filters__x[_ngcontent-%COMP%]:hover {\n background: var(--mj-bg-surface-sunken);\n color: var(--mj-text-primary);\n }\n\n .mj-applied-filters__clear[_ngcontent-%COMP%] {\n flex-shrink: 0;\n margin-left: 4px;\n border: none;\n background: transparent;\n cursor: pointer;\n font-family: inherit;\n font-size: 12.5px;\n font-weight: 600;\n color: var(--mj-brand-primary);\n }\n .mj-applied-filters__clear[_ngcontent-%COMP%]:hover {\n text-decoration: underline;\n }\n\n \n\n @media (max-width: 700px) {\n .mj-applied-filters[_ngcontent-%COMP%] {\n overflow-x: auto;\n flex-wrap: nowrap;\n scrollbar-width: none;\n -webkit-overflow-scrolling: touch;\n padding-left: var(--mj-space-4);\n padding-right: var(--mj-space-4);\n }\n .mj-applied-filters[_ngcontent-%COMP%]::-webkit-scrollbar {\n display: none;\n }\n }"] });
|
|
90
90
|
}
|
|
91
91
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJAppliedFiltersComponent, [{
|
|
92
92
|
type: Component,
|
|
@@ -274,7 +274,7 @@ export class MJBottomSheetComponent {
|
|
|
274
274
|
i0.ɵɵconditionalCreate(0, MJBottomSheetComponent_Conditional_0_Template, 7, 8);
|
|
275
275
|
} if (rf & 2) {
|
|
276
276
|
i0.ɵɵconditional(ctx.IsRendered ? 0 : -1);
|
|
277
|
-
} }, styles: ["\n\n\n\n
|
|
277
|
+
} }, styles: ["\n\n\n\n.mj-bottom-sheet-scrim[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n z-index: 9998;\n background: var(--mj-bg-overlay);\n opacity: 0;\n transition: opacity 0.24s ease;\n}\n\n.mj-bottom-sheet-scrim--open[_ngcontent-%COMP%] {\n opacity: 1;\n}\n\n.mj-bottom-sheet[_ngcontent-%COMP%] {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 9999;\n display: flex;\n flex-direction: column;\n max-height: 85vh;\n background: var(--mj-bg-surface);\n border-top-left-radius: 16px;\n border-top-right-radius: 16px;\n box-shadow: var(--mj-shadow-lg);\n transform: translateY(100%);\n transition: transform 0.24s ease;\n outline: none;\n}\n\n.mj-bottom-sheet--open[_ngcontent-%COMP%] {\n transform: translateY(0);\n}\n\n\n\n\n.mj-bottom-sheet--settled[_ngcontent-%COMP%] {\n transform: none;\n}\n\n.mj-bottom-sheet-grab[_ngcontent-%COMP%] {\n width: 36px;\n height: 4px;\n border-radius: 2px;\n background: var(--mj-border-strong);\n margin: 10px auto 2px;\n flex-shrink: 0;\n}\n\n.mj-bottom-sheet-header[_ngcontent-%COMP%] {\n flex-shrink: 0;\n padding: 8px 16px 10px;\n font-size: var(--mj-text-base, 15px);\n font-weight: 600;\n color: var(--mj-text-primary);\n}\n\n.mj-bottom-sheet-content[_ngcontent-%COMP%] {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n -webkit-overflow-scrolling: touch;\n padding-bottom: var(--mj-space-6);\n}\n\n@media (prefers-reduced-motion: reduce) {\n .mj-bottom-sheet-scrim[_ngcontent-%COMP%], \n .mj-bottom-sheet[_ngcontent-%COMP%] {\n transition: none;\n }\n}"], changeDetection: 0 });
|
|
278
278
|
}
|
|
279
279
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJBottomSheetComponent, [{
|
|
280
280
|
type: Component,
|
|
@@ -31,7 +31,14 @@ export declare class MJComboboxComponent implements ControlValueAccessor, OnDest
|
|
|
31
31
|
ValueField: string;
|
|
32
32
|
Filterable: boolean;
|
|
33
33
|
ValuePrimitive: boolean;
|
|
34
|
-
|
|
34
|
+
/**
|
|
35
|
+
* Host-driven disable. Composed with Angular Forms' `setDisabledState()` into `IsDisabled`
|
|
36
|
+
* (the actual gate) — see `syncDisabled`. A setter, not a bare field, because this input is
|
|
37
|
+
* routinely bound to an expression that changes over the control's lifetime, and the gate has
|
|
38
|
+
* to follow it every time.
|
|
39
|
+
*/
|
|
40
|
+
set Disabled(value: boolean);
|
|
41
|
+
get Disabled(): boolean;
|
|
35
42
|
Placeholder: string;
|
|
36
43
|
AllowCustom: boolean;
|
|
37
44
|
ValueChange: EventEmitter<unknown>;
|
|
@@ -44,6 +51,10 @@ export declare class MJComboboxComponent implements ControlValueAccessor, OnDest
|
|
|
44
51
|
readonly hostClass = true;
|
|
45
52
|
private cdr;
|
|
46
53
|
IsOpen: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* The single gate on `Toggle()` / `Open()` — true when EITHER the `Disabled` input or Angular
|
|
56
|
+
* Forms says so. Never assign it directly; go through `syncDisabled()`.
|
|
57
|
+
*/
|
|
47
58
|
IsDisabled: boolean;
|
|
48
59
|
HighlightedIndex: number;
|
|
49
60
|
SelectedValue: unknown;
|
|
@@ -62,6 +73,26 @@ export declare class MJComboboxComponent implements ControlValueAccessor, OnDest
|
|
|
62
73
|
Toggle(): void;
|
|
63
74
|
Open(): void;
|
|
64
75
|
Close(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Panel state only — no change detection. Split out of `Close()` because `syncDisabled()` can
|
|
78
|
+
* run from an @Input setter, i.e. DURING the parent's change-detection pass, where a nested
|
|
79
|
+
* `detectChanges()` re-enters CD and trips NG0100 on the parent's own bindings.
|
|
80
|
+
*/
|
|
81
|
+
private resetPanelState;
|
|
82
|
+
/** Backing field for the `Disabled` input. */
|
|
83
|
+
private disabledInput;
|
|
84
|
+
/** The forms-driven disabled state, kept SEPARATE so neither source can stomp the other. */
|
|
85
|
+
private formDisabled;
|
|
86
|
+
/**
|
|
87
|
+
* Recompute the gate from both of its sources. Called whenever either changes.
|
|
88
|
+
*
|
|
89
|
+
* `IsDisabled` is derived state, and the only thing that assigned it was `setDisabledState()`.
|
|
90
|
+
* The forms-driven half was in fact fine — `setUpControl` also wires `registerOnDisabledChange`,
|
|
91
|
+
* so that hook fires on every `control.disable()`/`enable()`, not just at registration. What had
|
|
92
|
+
* no recompute path at all was the `Disabled` @Input: a plain field, so the gate froze at
|
|
93
|
+
* whatever the first compose produced and every later change to the input was dropped.
|
|
94
|
+
*/
|
|
95
|
+
private syncDisabled;
|
|
65
96
|
SelectItem(item: unknown, event?: Event): void;
|
|
66
97
|
/** Commit the current input text as a value (for AllowCustom or matching item) */
|
|
67
98
|
private CommitValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.component.d.ts","sourceRoot":"","sources":["../../../src/lib/combobox/combobox.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EAGZ,UAAU,EAGV,WAAW,EACX,SAAS,EAGV,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAqB,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAiB,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;;AAExE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAqFa,mBAAoB,YAAW,oBAAoB,EAAE,SAAS;IACzE,IACI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,IAAI,EAM/E;IACD,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,IAAI,CAAuB;IACnG,OAAO,CAAC,KAAK,CAAwE;IAC5E,SAAS,SAAM;IACf,UAAU,SAAM;IAChB,UAAU,UAAQ;IAClB,cAAc,UAAS;
|
|
1
|
+
{"version":3,"file":"combobox.component.d.ts","sourceRoot":"","sources":["../../../src/lib/combobox/combobox.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EAGZ,UAAU,EAGV,WAAW,EACX,SAAS,EAGV,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAqB,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAiB,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;;AAExE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAqFa,mBAAoB,YAAW,oBAAoB,EAAE,SAAS;IACzE,IACI,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,IAAI,EAM/E;IACD,IAAI,IAAI,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,SAAS,OAAO,EAAE,GAAG,IAAI,CAAuB;IACnG,OAAO,CAAC,KAAK,CAAwE;IAC5E,SAAS,SAAM;IACf,UAAU,SAAM;IAChB,UAAU,UAAQ;IAClB,cAAc,UAAS;IAChC;;;;;OAKG;IACH,IACI,QAAQ,CAAC,KAAK,EAAE,OAAO,EAG1B;IACD,IAAI,QAAQ,IAAI,OAAO,CAEtB;IACQ,WAAW,SAAM;IACjB,WAAW,UAAS;IAEnB,WAAW,wBAA+B;IAC1C,YAAY,uBAA8B;IAEpB,YAAY,EAAE,WAAW,CAAC;QAAE,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,GAAG,IAAI,CAAQ;IAE1E,OAAO,CAAC,SAAS,CAA2B;IACzC,UAAU,EAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAE5B,QAAQ,CAAC,SAAS,QAAQ;IAEjE,OAAO,CAAC,GAAG,CAA6B;IAExC,MAAM,UAAS;IACf;;;OAGG;IACH,UAAU,UAAS;IACnB,gBAAgB,SAAM;IACtB,aAAa,EAAE,OAAO,CAAQ;IAC9B,YAAY,SAAK;IACjB,SAAS,SAAM;IAEf,SAAS,EAAE,iBAAiB,EAAE,CAG5B;IAEF,OAAO,CAAC,QAAQ,CAAsC;IACtD,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,UAAU,CAAS;IAE3B,IAAI,aAAa,IAAI,OAAO,EAAE,CAK7B;IAED,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAQ3B,OAAO,IAAI,IAAI;IAIf,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAKrC,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAY3B,WAAW,IAAI,IAAI;IAWnB,MAAM,IAAI,IAAI;IAKd,IAAI,IAAI,IAAI;IAQZ,KAAK,IAAI,IAAI;IAMb;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAKvB,8CAA8C;IAC9C,OAAO,CAAC,aAAa,CAAS;IAC9B,4FAA4F;IAC5F,OAAO,CAAC,YAAY,CAAS;IAE7B;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY;IAQpB,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,KAAK,GAAG,IAAI;IAc9C,kFAAkF;IAClF,OAAO,CAAC,WAAW;IAiCnB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAQtC,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IA6BrC,WAAW,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM;IAOlC,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO;IAMpC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAEnC,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAKhC,gBAAgB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;IACpD,iBAAiB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IACvC,gBAAgB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAC3C,WAAW,IAAI,IAAI;IAEnB,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,gBAAgB;yCA1Rb,mBAAmB;2CAAnB,mBAAmB;CA8R/B"}
|
|
@@ -9,9 +9,9 @@ const _c1 = ["trigger"];
|
|
|
9
9
|
const _c2 = ["comboInput"];
|
|
10
10
|
const _c3 = a0 => ({ $implicit: a0 });
|
|
11
11
|
function MJComboboxComponent_Conditional_5_Template(rf, ctx) { if (rf & 1) {
|
|
12
|
-
const
|
|
12
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
13
13
|
i0.ɵɵelementStart(0, "button", 8);
|
|
14
|
-
i0.ɵɵlistener("mousedown", function MJComboboxComponent_Conditional_5_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(
|
|
14
|
+
i0.ɵɵlistener("mousedown", function MJComboboxComponent_Conditional_5_Template_button_mousedown_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.OnClear($event)); });
|
|
15
15
|
i0.ɵɵelement(1, "i", 9);
|
|
16
16
|
i0.ɵɵelementEnd();
|
|
17
17
|
} }
|
|
@@ -21,31 +21,31 @@ function MJComboboxComponent_ng_template_8_For_2_Conditional_1_ng_container_0_Te
|
|
|
21
21
|
function MJComboboxComponent_ng_template_8_For_2_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
22
22
|
i0.ɵɵtemplate(0, MJComboboxComponent_ng_template_8_For_2_Conditional_1_ng_container_0_Template, 1, 0, "ng-container", 14);
|
|
23
23
|
} if (rf & 2) {
|
|
24
|
-
const
|
|
25
|
-
const
|
|
26
|
-
i0.ɵɵproperty("ngTemplateOutlet",
|
|
24
|
+
const item_r4 = i0.ɵɵnextContext().$implicit;
|
|
25
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
26
|
+
i0.ɵɵproperty("ngTemplateOutlet", ctx_r1.ItemTemplate)("ngTemplateOutletContext", i0.ɵɵpureFunction1(2, _c3, item_r4));
|
|
27
27
|
} }
|
|
28
28
|
function MJComboboxComponent_ng_template_8_For_2_Conditional_2_Template(rf, ctx) { if (rf & 1) {
|
|
29
29
|
i0.ɵɵtext(0);
|
|
30
30
|
} if (rf & 2) {
|
|
31
|
-
const
|
|
32
|
-
const
|
|
33
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
31
|
+
const item_r4 = i0.ɵɵnextContext().$implicit;
|
|
32
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
33
|
+
i0.ɵɵtextInterpolate1(" ", ctx_r1.GetItemText(item_r4), " ");
|
|
34
34
|
} }
|
|
35
35
|
function MJComboboxComponent_ng_template_8_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
36
|
-
const
|
|
36
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
37
37
|
i0.ɵɵelementStart(0, "div", 13);
|
|
38
|
-
i0.ɵɵlistener("mousedown", function MJComboboxComponent_ng_template_8_For_2_Template_div_mousedown_0_listener($event) { const
|
|
38
|
+
i0.ɵɵlistener("mousedown", function MJComboboxComponent_ng_template_8_For_2_Template_div_mousedown_0_listener($event) { const item_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r1 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r1.SelectItem(item_r4, $event)); });
|
|
39
39
|
i0.ɵɵconditionalCreate(1, MJComboboxComponent_ng_template_8_For_2_Conditional_1_Template, 1, 4, "ng-container")(2, MJComboboxComponent_ng_template_8_For_2_Conditional_2_Template, 1, 1);
|
|
40
40
|
i0.ɵɵelementEnd();
|
|
41
41
|
} if (rf & 2) {
|
|
42
|
-
const
|
|
43
|
-
const $
|
|
44
|
-
const
|
|
45
|
-
i0.ɵɵclassProp("mj-dropdown-option--selected",
|
|
46
|
-
i0.ɵɵattribute("aria-selected",
|
|
42
|
+
const item_r4 = ctx.$implicit;
|
|
43
|
+
const $index_r5 = ctx.$index;
|
|
44
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
45
|
+
i0.ɵɵclassProp("mj-dropdown-option--selected", ctx_r1.IsItemSelected(item_r4))("mj-dropdown-option--highlighted", ctx_r1.HighlightedIndex === $index_r5);
|
|
46
|
+
i0.ɵɵattribute("aria-selected", ctx_r1.IsItemSelected(item_r4));
|
|
47
47
|
i0.ɵɵadvance();
|
|
48
|
-
i0.ɵɵconditional(
|
|
48
|
+
i0.ɵɵconditional(ctx_r1.ItemTemplate ? 1 : 2);
|
|
49
49
|
} }
|
|
50
50
|
function MJComboboxComponent_ng_template_8_Conditional_3_Template(rf, ctx) { if (rf & 1) {
|
|
51
51
|
i0.ɵɵelementStart(0, "div", 12);
|
|
@@ -58,11 +58,11 @@ function MJComboboxComponent_ng_template_8_Template(rf, ctx) { if (rf & 1) {
|
|
|
58
58
|
i0.ɵɵconditionalCreate(3, MJComboboxComponent_ng_template_8_Conditional_3_Template, 2, 0, "div", 12);
|
|
59
59
|
i0.ɵɵelementEnd();
|
|
60
60
|
} if (rf & 2) {
|
|
61
|
-
const
|
|
61
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
62
62
|
i0.ɵɵadvance();
|
|
63
|
-
i0.ɵɵrepeater(
|
|
63
|
+
i0.ɵɵrepeater(ctx_r1.FilteredItems);
|
|
64
64
|
i0.ɵɵadvance(2);
|
|
65
|
-
i0.ɵɵconditional(
|
|
65
|
+
i0.ɵɵconditional(ctx_r1.FilteredItems.length === 0 ? 3 : -1);
|
|
66
66
|
} }
|
|
67
67
|
/**
|
|
68
68
|
* mj-combobox — Editable dropdown with filtering and optional custom values.
|
|
@@ -99,7 +99,19 @@ export class MJComboboxComponent {
|
|
|
99
99
|
ValueField = '';
|
|
100
100
|
Filterable = true;
|
|
101
101
|
ValuePrimitive = false;
|
|
102
|
-
|
|
102
|
+
/**
|
|
103
|
+
* Host-driven disable. Composed with Angular Forms' `setDisabledState()` into `IsDisabled`
|
|
104
|
+
* (the actual gate) — see `syncDisabled`. A setter, not a bare field, because this input is
|
|
105
|
+
* routinely bound to an expression that changes over the control's lifetime, and the gate has
|
|
106
|
+
* to follow it every time.
|
|
107
|
+
*/
|
|
108
|
+
set Disabled(value) {
|
|
109
|
+
this.disabledInput = value;
|
|
110
|
+
this.syncDisabled();
|
|
111
|
+
}
|
|
112
|
+
get Disabled() {
|
|
113
|
+
return this.disabledInput;
|
|
114
|
+
}
|
|
103
115
|
Placeholder = '';
|
|
104
116
|
AllowCustom = false;
|
|
105
117
|
ValueChange = new EventEmitter();
|
|
@@ -110,6 +122,10 @@ export class MJComboboxComponent {
|
|
|
110
122
|
hostClass = true;
|
|
111
123
|
cdr = inject(ChangeDetectorRef);
|
|
112
124
|
IsOpen = false;
|
|
125
|
+
/**
|
|
126
|
+
* The single gate on `Toggle()` / `Open()` — true when EITHER the `Disabled` input or Angular
|
|
127
|
+
* Forms says so. Never assign it directly; go through `syncDisabled()`.
|
|
128
|
+
*/
|
|
113
129
|
IsDisabled = false;
|
|
114
130
|
HighlightedIndex = -1;
|
|
115
131
|
SelectedValue = null;
|
|
@@ -183,9 +199,39 @@ export class MJComboboxComponent {
|
|
|
183
199
|
Close() {
|
|
184
200
|
if (!this.IsOpen)
|
|
185
201
|
return;
|
|
202
|
+
this.resetPanelState();
|
|
203
|
+
this.cdr.detectChanges();
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Panel state only — no change detection. Split out of `Close()` because `syncDisabled()` can
|
|
207
|
+
* run from an @Input setter, i.e. DURING the parent's change-detection pass, where a nested
|
|
208
|
+
* `detectChanges()` re-enters CD and trips NG0100 on the parent's own bindings.
|
|
209
|
+
*/
|
|
210
|
+
resetPanelState() {
|
|
186
211
|
this.IsOpen = false;
|
|
187
212
|
this.HighlightedIndex = -1;
|
|
188
|
-
|
|
213
|
+
}
|
|
214
|
+
/** Backing field for the `Disabled` input. */
|
|
215
|
+
disabledInput = false;
|
|
216
|
+
/** The forms-driven disabled state, kept SEPARATE so neither source can stomp the other. */
|
|
217
|
+
formDisabled = false;
|
|
218
|
+
/**
|
|
219
|
+
* Recompute the gate from both of its sources. Called whenever either changes.
|
|
220
|
+
*
|
|
221
|
+
* `IsDisabled` is derived state, and the only thing that assigned it was `setDisabledState()`.
|
|
222
|
+
* The forms-driven half was in fact fine — `setUpControl` also wires `registerOnDisabledChange`,
|
|
223
|
+
* so that hook fires on every `control.disable()`/`enable()`, not just at registration. What had
|
|
224
|
+
* no recompute path at all was the `Disabled` @Input: a plain field, so the gate froze at
|
|
225
|
+
* whatever the first compose produced and every later change to the input was dropped.
|
|
226
|
+
*/
|
|
227
|
+
syncDisabled() {
|
|
228
|
+
const disabled = this.disabledInput || this.formDisabled;
|
|
229
|
+
if (disabled === this.IsDisabled)
|
|
230
|
+
return;
|
|
231
|
+
this.IsDisabled = disabled;
|
|
232
|
+
if (disabled)
|
|
233
|
+
this.resetPanelState();
|
|
234
|
+
this.cdr.markForCheck();
|
|
189
235
|
}
|
|
190
236
|
SelectItem(item, event) {
|
|
191
237
|
event?.preventDefault();
|
|
@@ -297,7 +343,7 @@ export class MJComboboxComponent {
|
|
|
297
343
|
}
|
|
298
344
|
registerOnChange(fn) { this.onChange = fn; }
|
|
299
345
|
registerOnTouched(fn) { this.onTouched = fn; }
|
|
300
|
-
setDisabledState(isDisabled) { this.
|
|
346
|
+
setDisabledState(isDisabled) { this.formDisabled = isDisabled; this.syncDisabled(); }
|
|
301
347
|
ngOnDestroy() { this.Close(); }
|
|
302
348
|
getDisplayText() {
|
|
303
349
|
if (this.SelectedValue == null)
|
|
@@ -334,19 +380,18 @@ export class MJComboboxComponent {
|
|
|
334
380
|
useExisting: forwardRef(() => MJComboboxComponent),
|
|
335
381
|
multi: true
|
|
336
382
|
}])], decls: 9, vars: 15, consts: [["trigger", "", "overlayOrigin", "cdkOverlayOrigin"], ["comboInput", ""], ["cdkOverlayOrigin", "", "role", "combobox", "aria-haspopup", "listbox", 1, "mj-combobox"], ["type", "text", "autocomplete", "off", 1, "mj-input", "mj-combobox-input", 3, "input", "focus", "keydown", "blur", "placeholder", "value", "disabled"], ["type", "button", "tabindex", "-1", "aria-label", "Clear", 1, "mj-combobox-clear"], ["type", "button", "tabindex", "-1", 1, "mj-combobox-toggle", 3, "mousedown", "disabled"], [1, "fa-solid", "fa-chevron-down"], ["cdkConnectedOverlay", "", "cdkConnectedOverlayBackdropClass", "mj-dropdown-backdrop", 3, "backdropClick", "detach", "cdkConnectedOverlayOrigin", "cdkConnectedOverlayOpen", "cdkConnectedOverlayPositions", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHasBackdrop"], ["type", "button", "tabindex", "-1", "aria-label", "Clear", 1, "mj-combobox-clear", 3, "mousedown"], [1, "fa-solid", "fa-times"], ["role", "listbox", 1, "mj-dropdown-panel"], ["role", "option", 1, "mj-dropdown-option", 3, "mj-dropdown-option--selected", "mj-dropdown-option--highlighted"], [1, "mj-dropdown-no-data"], ["role", "option", 1, "mj-dropdown-option", 3, "mousedown"], [4, "ngTemplateOutlet", "ngTemplateOutletContext"]], template: function MJComboboxComponent_Template(rf, ctx) { if (rf & 1) {
|
|
337
|
-
const _r1 = i0.ɵɵgetCurrentView();
|
|
338
383
|
i0.ɵɵelementStart(0, "div", 2, 0)(3, "input", 3, 1);
|
|
339
|
-
i0.ɵɵlistener("input", function MJComboboxComponent_Template_input_input_3_listener($event) {
|
|
384
|
+
i0.ɵɵlistener("input", function MJComboboxComponent_Template_input_input_3_listener($event) { return ctx.OnInput($event); })("focus", function MJComboboxComponent_Template_input_focus_3_listener() { return ctx.OnFocus(); })("keydown", function MJComboboxComponent_Template_input_keydown_3_listener($event) { return ctx.OnKeyDown($event); })("blur", function MJComboboxComponent_Template_input_blur_3_listener() { return ctx.OnInputBlur(); });
|
|
340
385
|
i0.ɵɵelementEnd();
|
|
341
386
|
i0.ɵɵconditionalCreate(5, MJComboboxComponent_Conditional_5_Template, 2, 0, "button", 4);
|
|
342
387
|
i0.ɵɵelementStart(6, "button", 5);
|
|
343
|
-
i0.ɵɵlistener("mousedown", function MJComboboxComponent_Template_button_mousedown_6_listener($event) {
|
|
388
|
+
i0.ɵɵlistener("mousedown", function MJComboboxComponent_Template_button_mousedown_6_listener($event) { return ctx.OnToggleMouseDown($event); });
|
|
344
389
|
i0.ɵɵelement(7, "i", 6);
|
|
345
390
|
i0.ɵɵelementEnd()();
|
|
346
391
|
i0.ɵɵtemplate(8, MJComboboxComponent_ng_template_8_Template, 4, 1, "ng-template", 7);
|
|
347
|
-
i0.ɵɵlistener("backdropClick", function MJComboboxComponent_Template_ng_template_backdropClick_8_listener() {
|
|
392
|
+
i0.ɵɵlistener("backdropClick", function MJComboboxComponent_Template_ng_template_backdropClick_8_listener() { return ctx.Close(); })("detach", function MJComboboxComponent_Template_ng_template_detach_8_listener() { return ctx.Close(); });
|
|
348
393
|
} if (rf & 2) {
|
|
349
|
-
const
|
|
394
|
+
const overlayOrigin_r6 = i0.ɵɵreference(2);
|
|
350
395
|
i0.ɵɵclassProp("mj-combobox--open", ctx.IsOpen)("mj-combobox--disabled", ctx.IsDisabled);
|
|
351
396
|
i0.ɵɵattribute("aria-expanded", ctx.IsOpen);
|
|
352
397
|
i0.ɵɵadvance(3);
|
|
@@ -356,7 +401,7 @@ export class MJComboboxComponent {
|
|
|
356
401
|
i0.ɵɵadvance();
|
|
357
402
|
i0.ɵɵproperty("disabled", ctx.IsDisabled);
|
|
358
403
|
i0.ɵɵadvance(2);
|
|
359
|
-
i0.ɵɵproperty("cdkConnectedOverlayOrigin",
|
|
404
|
+
i0.ɵɵproperty("cdkConnectedOverlayOrigin", overlayOrigin_r6)("cdkConnectedOverlayOpen", ctx.IsOpen)("cdkConnectedOverlayPositions", ctx.Positions)("cdkConnectedOverlayWidth", ctx.TriggerWidth)("cdkConnectedOverlayHasBackdrop", true);
|
|
360
405
|
} }, dependencies: [NgTemplateOutlet, OverlayModule, i1.CdkConnectedOverlay, i1.CdkOverlayOrigin], encapsulation: 2 });
|
|
361
406
|
}
|
|
362
407
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(MJComboboxComponent, [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combobox.component.js","sourceRoot":"","sources":["../../../src/lib/combobox/combobox.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-combobox — Editable dropdown with filtering and optional custom values.\n *\n * Replaces `<kendo-combobox>`. Unlike mj-dropdown, the trigger is a text input\n * that filters the list as you type. When AllowCustom is true, typed text that\n * doesn't match any item is emitted as the value.\n *\n * @example\n * ```html\n * <mj-combobox\n * [Data]=\"categories\"\n * TextField=\"text\"\n * ValueField=\"value\"\n * [(ngModel)]=\"selectedCategory\"\n * [ValuePrimitive]=\"true\"\n * [AllowCustom]=\"true\"\n * [Filterable]=\"true\"\n * Placeholder=\"Select or enter new...\">\n * </mj-combobox>\n * ```\n */\n@Component({\n selector: 'mj-combobox',\n standalone: true,\n imports: [NgTemplateOutlet, OverlayModule],\n template: `\n <div\n class=\"mj-combobox\"\n #trigger\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n [class.mj-combobox--open]=\"IsOpen\"\n [class.mj-combobox--disabled]=\"IsDisabled\"\n role=\"combobox\"\n [attr.aria-expanded]=\"IsOpen\"\n aria-haspopup=\"listbox\">\n <input\n #comboInput\n class=\"mj-input mj-combobox-input\"\n type=\"text\"\n [placeholder]=\"Placeholder\"\n [value]=\"InputText\"\n [disabled]=\"IsDisabled\"\n (input)=\"OnInput($event)\"\n (focus)=\"OnFocus()\"\n (keydown)=\"OnKeyDown($event)\"\n (blur)=\"OnInputBlur()\"\n autocomplete=\"off\" />\n @if (InputText && !IsDisabled) {\n <button\n class=\"mj-combobox-clear\"\n type=\"button\"\n tabindex=\"-1\"\n (mousedown)=\"OnClear($event)\"\n aria-label=\"Clear\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n <button\n class=\"mj-combobox-toggle\"\n type=\"button\"\n tabindex=\"-1\"\n [disabled]=\"IsDisabled\"\n (mousedown)=\"OnToggleMouseDown($event)\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\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 @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 (mousedown)=\"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(() => MJComboboxComponent),\n multi: true\n }]\n})\nexport class MJComboboxComponent implements ControlValueAccessor, OnDestroy {\n @Input()\n set Data(value: Record<string, unknown>[] | string[] | readonly unknown[] | null) {\n this._data = value;\n // Re-resolve display text when data arrives after writeValue\n if (this.SelectedValue != null && !this.InputText) {\n this.InputText = this.getDisplayText();\n }\n }\n get Data(): Record<string, unknown>[] | string[] | readonly unknown[] | null { return this._data; }\n private _data: Record<string, unknown>[] | string[] | readonly unknown[] | null = [];\n @Input() TextField = '';\n @Input() ValueField = '';\n @Input() Filterable = true;\n @Input() ValuePrimitive = false;\n @Input() Disabled = false;\n @Input() Placeholder = '';\n @Input() AllowCustom = false;\n\n @Output() ValueChange = new EventEmitter<unknown>();\n @Output() FilterChange = new EventEmitter<string>();\n\n @ContentChild('mjComboboxItem') ItemTemplate: TemplateRef<{ $implicit: unknown }> | null = null;\n\n @ViewChild('trigger') private triggerEl!: ElementRef<HTMLElement>;\n @ViewChild('comboInput') ComboInput!: ElementRef<HTMLInputElement>;\n\n @HostBinding('class.mj-combobox-host') readonly hostClass = true;\n\n private cdr = inject(ChangeDetectorRef);\n\n IsOpen = false;\n IsDisabled = false;\n HighlightedIndex = -1;\n SelectedValue: unknown = null;\n TriggerWidth = 0;\n InputText = '';\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 private isBlurring = false;\n\n get FilteredItems(): unknown[] {\n const data = (this.Data ?? []) as unknown[];\n if (!this.Filterable || !this.InputText) return data;\n const search = this.InputText.toLowerCase();\n return data.filter(item => this.GetItemText(item).toLowerCase().includes(search));\n }\n\n OnInput(event: Event): void {\n this.InputText = (event.target as HTMLInputElement).value;\n this.HighlightedIndex = 0;\n this.FilterChange.emit(this.InputText);\n if (!this.IsOpen) this.Open();\n this.cdr.detectChanges();\n }\n\n OnFocus(): void {\n if (!this.IsOpen) this.Open();\n }\n\n OnToggleMouseDown(event: Event): void {\n event.preventDefault(); // Prevent blur on the input\n this.Toggle();\n }\n\n OnClear(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.isBlurring = false;\n this.InputText = '';\n this.SelectedValue = null;\n this.onChange(null);\n this.ValueChange.emit(null);\n this.Close();\n this.cdr.detectChanges();\n }\n\n OnInputBlur(): void {\n this.isBlurring = true;\n setTimeout(() => {\n if (!this.isBlurring) return;\n this.isBlurring = false;\n this.CommitValue();\n this.Close();\n this.onTouched();\n }, 150);\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 }\n\n Close(): void {\n if (!this.IsOpen) return;\n this.IsOpen = false;\n this.HighlightedIndex = -1;\n this.cdr.detectChanges();\n }\n\n SelectItem(item: unknown, event?: Event): void {\n event?.preventDefault();\n event?.stopPropagation();\n this.isBlurring = false;\n\n const value = this.ValuePrimitive && this.ValueField ? this.GetItemValue(item) : item;\n this.SelectedValue = value;\n this.InputText = this.GetItemText(item);\n this.onChange(value);\n this.ValueChange.emit(value);\n this.Close();\n this.cdr.detectChanges();\n }\n\n /** Commit the current input text as a value (for AllowCustom or matching item) */\n private CommitValue(): void {\n if (!this.InputText.trim()) {\n // Empty input — clear the value\n if (this.SelectedValue != null) {\n this.SelectedValue = null;\n this.onChange(null);\n this.ValueChange.emit(null);\n }\n return;\n }\n\n // Try to find a matching item\n const data = (this.Data ?? []) as unknown[];\n const match = data.find(item => this.GetItemText(item).toLowerCase() === this.InputText.toLowerCase());\n if (match) {\n const value = this.ValuePrimitive && this.ValueField ? this.GetItemValue(match) : match;\n if (value !== this.SelectedValue) {\n this.SelectedValue = value;\n this.InputText = this.GetItemText(match);\n this.onChange(value);\n this.ValueChange.emit(value);\n }\n } else if (this.AllowCustom) {\n // No match but custom values allowed — emit the typed text\n this.SelectedValue = this.InputText;\n this.onChange(this.InputText);\n this.ValueChange.emit(this.InputText);\n } else {\n // No match and no custom — revert to previous display\n this.InputText = this.getDisplayText();\n }\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 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 {\n this.CommitValue();\n this.Close();\n }\n break;\n case 'Escape':\n event.preventDefault();\n this.InputText = this.getDisplayText();\n this.Close();\n break;\n }\n }\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 {\n this.SelectedValue = value;\n this.InputText = this.getDisplayText();\n }\n\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 getDisplayText(): string {\n if (this.SelectedValue == null) return '';\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 if (typeof this.SelectedValue === 'string') return this.SelectedValue;\n return this.GetItemText(this.SelectedValue as Record<string, unknown>);\n }\n\n private getSelectedIndex(): number {\n if (this.SelectedValue == null) return -1;\n return this.FilteredItems.findIndex(item => this.IsItemSelected(item));\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"combobox.component.js","sourceRoot":"","sources":["../../../src/lib/combobox/combobox.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-combobox — Editable dropdown with filtering and optional custom values.\n *\n * Replaces `<kendo-combobox>`. Unlike mj-dropdown, the trigger is a text input\n * that filters the list as you type. When AllowCustom is true, typed text that\n * doesn't match any item is emitted as the value.\n *\n * @example\n * ```html\n * <mj-combobox\n * [Data]=\"categories\"\n * TextField=\"text\"\n * ValueField=\"value\"\n * [(ngModel)]=\"selectedCategory\"\n * [ValuePrimitive]=\"true\"\n * [AllowCustom]=\"true\"\n * [Filterable]=\"true\"\n * Placeholder=\"Select or enter new...\">\n * </mj-combobox>\n * ```\n */\n@Component({\n selector: 'mj-combobox',\n standalone: true,\n imports: [NgTemplateOutlet, OverlayModule],\n template: `\n <div\n class=\"mj-combobox\"\n #trigger\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n [class.mj-combobox--open]=\"IsOpen\"\n [class.mj-combobox--disabled]=\"IsDisabled\"\n role=\"combobox\"\n [attr.aria-expanded]=\"IsOpen\"\n aria-haspopup=\"listbox\">\n <input\n #comboInput\n class=\"mj-input mj-combobox-input\"\n type=\"text\"\n [placeholder]=\"Placeholder\"\n [value]=\"InputText\"\n [disabled]=\"IsDisabled\"\n (input)=\"OnInput($event)\"\n (focus)=\"OnFocus()\"\n (keydown)=\"OnKeyDown($event)\"\n (blur)=\"OnInputBlur()\"\n autocomplete=\"off\" />\n @if (InputText && !IsDisabled) {\n <button\n class=\"mj-combobox-clear\"\n type=\"button\"\n tabindex=\"-1\"\n (mousedown)=\"OnClear($event)\"\n aria-label=\"Clear\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n }\n <button\n class=\"mj-combobox-toggle\"\n type=\"button\"\n tabindex=\"-1\"\n [disabled]=\"IsDisabled\"\n (mousedown)=\"OnToggleMouseDown($event)\">\n <i class=\"fa-solid fa-chevron-down\"></i>\n </button>\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 @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 (mousedown)=\"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(() => MJComboboxComponent),\n multi: true\n }]\n})\nexport class MJComboboxComponent implements ControlValueAccessor, OnDestroy {\n @Input()\n set Data(value: Record<string, unknown>[] | string[] | readonly unknown[] | null) {\n this._data = value;\n // Re-resolve display text when data arrives after writeValue\n if (this.SelectedValue != null && !this.InputText) {\n this.InputText = this.getDisplayText();\n }\n }\n get Data(): Record<string, unknown>[] | string[] | readonly unknown[] | null { return this._data; }\n private _data: Record<string, unknown>[] | string[] | readonly unknown[] | null = [];\n @Input() TextField = '';\n @Input() ValueField = '';\n @Input() Filterable = true;\n @Input() ValuePrimitive = false;\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) {\n this.disabledInput = value;\n this.syncDisabled();\n }\n get Disabled(): boolean {\n return this.disabledInput;\n }\n @Input() Placeholder = '';\n @Input() AllowCustom = false;\n\n @Output() ValueChange = new EventEmitter<unknown>();\n @Output() FilterChange = new EventEmitter<string>();\n\n @ContentChild('mjComboboxItem') ItemTemplate: TemplateRef<{ $implicit: unknown }> | null = null;\n\n @ViewChild('trigger') private triggerEl!: ElementRef<HTMLElement>;\n @ViewChild('comboInput') ComboInput!: ElementRef<HTMLInputElement>;\n\n @HostBinding('class.mj-combobox-host') readonly hostClass = true;\n\n private cdr = inject(ChangeDetectorRef);\n\n IsOpen = false;\n /**\n * The single gate on `Toggle()` / `Open()` — true when EITHER the `Disabled` input or Angular\n * Forms says so. Never assign it directly; go through `syncDisabled()`.\n */\n IsDisabled = false;\n HighlightedIndex = -1;\n SelectedValue: unknown = null;\n TriggerWidth = 0;\n InputText = '';\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 private isBlurring = false;\n\n get FilteredItems(): unknown[] {\n const data = (this.Data ?? []) as unknown[];\n if (!this.Filterable || !this.InputText) return data;\n const search = this.InputText.toLowerCase();\n return data.filter(item => this.GetItemText(item).toLowerCase().includes(search));\n }\n\n OnInput(event: Event): void {\n this.InputText = (event.target as HTMLInputElement).value;\n this.HighlightedIndex = 0;\n this.FilterChange.emit(this.InputText);\n if (!this.IsOpen) this.Open();\n this.cdr.detectChanges();\n }\n\n OnFocus(): void {\n if (!this.IsOpen) this.Open();\n }\n\n OnToggleMouseDown(event: Event): void {\n event.preventDefault(); // Prevent blur on the input\n this.Toggle();\n }\n\n OnClear(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n this.isBlurring = false;\n this.InputText = '';\n this.SelectedValue = null;\n this.onChange(null);\n this.ValueChange.emit(null);\n this.Close();\n this.cdr.detectChanges();\n }\n\n OnInputBlur(): void {\n this.isBlurring = true;\n setTimeout(() => {\n if (!this.isBlurring) return;\n this.isBlurring = false;\n this.CommitValue();\n this.Close();\n this.onTouched();\n }, 150);\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 }\n\n Close(): void {\n if (!this.IsOpen) return;\n this.resetPanelState();\n this.cdr.detectChanges();\n }\n\n /**\n * Panel state only — no change detection. Split out of `Close()` because `syncDisabled()` can\n * run from an @Input setter, i.e. DURING the parent's change-detection pass, where a nested\n * `detectChanges()` re-enters CD and trips NG0100 on the parent's own bindings.\n */\n private resetPanelState(): void {\n this.IsOpen = false;\n this.HighlightedIndex = -1;\n }\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 private syncDisabled(): void {\n const disabled = this.disabledInput || this.formDisabled;\n if (disabled === this.IsDisabled) return;\n this.IsDisabled = disabled;\n if (disabled) this.resetPanelState();\n this.cdr.markForCheck();\n }\n\n SelectItem(item: unknown, event?: Event): void {\n event?.preventDefault();\n event?.stopPropagation();\n this.isBlurring = false;\n\n const value = this.ValuePrimitive && this.ValueField ? this.GetItemValue(item) : item;\n this.SelectedValue = value;\n this.InputText = this.GetItemText(item);\n this.onChange(value);\n this.ValueChange.emit(value);\n this.Close();\n this.cdr.detectChanges();\n }\n\n /** Commit the current input text as a value (for AllowCustom or matching item) */\n private CommitValue(): void {\n if (!this.InputText.trim()) {\n // Empty input — clear the value\n if (this.SelectedValue != null) {\n this.SelectedValue = null;\n this.onChange(null);\n this.ValueChange.emit(null);\n }\n return;\n }\n\n // Try to find a matching item\n const data = (this.Data ?? []) as unknown[];\n const match = data.find(item => this.GetItemText(item).toLowerCase() === this.InputText.toLowerCase());\n if (match) {\n const value = this.ValuePrimitive && this.ValueField ? this.GetItemValue(match) : match;\n if (value !== this.SelectedValue) {\n this.SelectedValue = value;\n this.InputText = this.GetItemText(match);\n this.onChange(value);\n this.ValueChange.emit(value);\n }\n } else if (this.AllowCustom) {\n // No match but custom values allowed — emit the typed text\n this.SelectedValue = this.InputText;\n this.onChange(this.InputText);\n this.ValueChange.emit(this.InputText);\n } else {\n // No match and no custom — revert to previous display\n this.InputText = this.getDisplayText();\n }\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 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 {\n this.CommitValue();\n this.Close();\n }\n break;\n case 'Escape':\n event.preventDefault();\n this.InputText = this.getDisplayText();\n this.Close();\n break;\n }\n }\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 {\n this.SelectedValue = value;\n this.InputText = this.getDisplayText();\n }\n\n registerOnChange(fn: (value: unknown) => 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 private getDisplayText(): string {\n if (this.SelectedValue == null) return '';\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 if (typeof this.SelectedValue === 'string') return this.SelectedValue;\n return this.GetItemText(this.SelectedValue as Record<string, unknown>);\n }\n\n private getSelectedIndex(): number {\n if (this.SelectedValue == null) return -1;\n return this.FilteredItems.findIndex(item => this.IsItemSelected(item));\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"confirm-dialog.component.d.ts","sourceRoot":"","sources":["../../../src/lib/confirm-dialog/confirm-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAmC,MAAM,eAAe,CAAC;;AAIzF;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAS5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,qBA+Ea,wBAAwB;IACnC,oEAAoE;IAC3D,OAAO,UAAS;IACzB,sFAAsF;IAC5E,aAAa,wBAA+B;IAEtD,6CAA6C;IACpC,KAAK,SAAa;IAE3B,qFAAqF;IAC5E,OAAO,SAAmB;IAEnC,2EAA2E;IAClE,aAAa,SAAM;IAE5B,4FAA4F;IACnF,IAAI,EAAE,mBAAmB,CAAa;IAE/C,gCAAgC;IACvB,WAAW,SAAa;IAEjC,4BAA4B;IACnB,UAAU,SAAY;IAE/B;;;OAGG;IACM,IAAI,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEpC;;;;OAIG;IACqC,UAAU,UAAS;IAE3D,gFAAgF;IACtE,SAAS,qBAA4B;IAE/C,yFAAyF;IAC/E,SAAS,qBAA4B;IAE/C,kFAAkF;IAClF,IAAI,cAAc,IAAI,SAAS,GAAG,QAAQ,CAEzC;IAED;;;OAGG;IACH,IAAI,YAAY,IAAI,MAAM,CAKzB;IAED,SAAS,IAAI,IAAI;IAIjB,QAAQ,IAAI,IAAI;IAKhB,gFAAgF;IAChF,SAAS,IAAI,IAAI;IAOjB,OAAO,CAAC,KAAK;yCA5EF,wBAAwB;2CAAxB,wBAAwB;
|
|
1
|
+
{"version":3,"file":"confirm-dialog.component.d.ts","sourceRoot":"","sources":["../../../src/lib/confirm-dialog/confirm-dialog.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,YAAY,EAAmC,MAAM,eAAe,CAAC;;AAIzF;;;;;;;;GAQG;AACH,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAS5E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,qBA+Ea,wBAAwB;IACnC,oEAAoE;IAC3D,OAAO,UAAS;IACzB,sFAAsF;IAC5E,aAAa,wBAA+B;IAEtD,6CAA6C;IACpC,KAAK,SAAa;IAE3B,qFAAqF;IAC5E,OAAO,SAAmB;IAEnC,2EAA2E;IAClE,aAAa,SAAM;IAE5B,4FAA4F;IACnF,IAAI,EAAE,mBAAmB,CAAa;IAE/C,gCAAgC;IACvB,WAAW,SAAa;IAEjC,4BAA4B;IACnB,UAAU,SAAY;IAE/B;;;OAGG;IACM,IAAI,EAAE,MAAM,GAAG,IAAI,CAAQ;IAEpC;;;;OAIG;IACqC,UAAU,UAAS;IAE3D,gFAAgF;IACtE,SAAS,qBAA4B;IAE/C,yFAAyF;IAC/E,SAAS,qBAA4B;IAE/C,kFAAkF;IAClF,IAAI,cAAc,IAAI,SAAS,GAAG,QAAQ,CAEzC;IAED;;;OAGG;IACH,IAAI,YAAY,IAAI,MAAM,CAKzB;IAED,SAAS,IAAI,IAAI;IAIjB,QAAQ,IAAI,IAAI;IAKhB,gFAAgF;IAChF,SAAS,IAAI,IAAI;IAOjB,OAAO,CAAC,KAAK;yCA5EF,wBAAwB;2CAAxB,wBAAwB;yCAiFum+L,OAAQ;CADnp+L"}
|
|
@@ -11,7 +11,14 @@ export declare class MJDatepickerComponent implements ControlValueAccessor, OnDe
|
|
|
11
11
|
Max: Date | null;
|
|
12
12
|
Format: string;
|
|
13
13
|
Placeholder: string;
|
|
14
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Host-driven disable. Composed with Angular Forms' `setDisabledState()` into `IsDisabled`
|
|
16
|
+
* (the actual gate) — see `syncDisabled`. A setter, not a bare field, because this input is
|
|
17
|
+
* routinely bound to an expression that changes over the control's lifetime, and the gate has
|
|
18
|
+
* to follow it every time.
|
|
19
|
+
*/
|
|
20
|
+
set Disabled(value: boolean);
|
|
21
|
+
get Disabled(): boolean;
|
|
15
22
|
ValueChange: EventEmitter<Date | null>;
|
|
16
23
|
private triggerEl;
|
|
17
24
|
readonly hostClass = true;
|
|
@@ -30,6 +37,23 @@ export declare class MJDatepickerComponent implements ControlValueAccessor, OnDe
|
|
|
30
37
|
Toggle(): void;
|
|
31
38
|
Open(): void;
|
|
32
39
|
Close(): void;
|
|
40
|
+
/** Backing field for the `Disabled` input. */
|
|
41
|
+
private disabledInput;
|
|
42
|
+
/** The forms-driven disabled state, kept SEPARATE so neither source can stomp the other. */
|
|
43
|
+
private formDisabled;
|
|
44
|
+
/**
|
|
45
|
+
* Recompute the gate from both of its sources. Called whenever either changes.
|
|
46
|
+
*
|
|
47
|
+
* `IsDisabled` is derived state, and the only thing that assigned it was `setDisabledState()`.
|
|
48
|
+
* The forms-driven half was in fact fine — `setUpControl` also wires `registerOnDisabledChange`,
|
|
49
|
+
* so that hook fires on every `control.disable()`/`enable()`, not just at registration. What had
|
|
50
|
+
* no recompute path at all was the `Disabled` @Input: a plain field, so the gate froze at
|
|
51
|
+
* whatever the first compose produced and every later change to the input was dropped.
|
|
52
|
+
*
|
|
53
|
+
* Closes the calendar directly rather than via `Close()`: this can run from an @Input setter,
|
|
54
|
+
* i.e. DURING the parent's CD pass, where a nested `detectChanges()` trips NG0100.
|
|
55
|
+
*/
|
|
56
|
+
private syncDisabled;
|
|
33
57
|
PreviousMonth(): void;
|
|
34
58
|
NextMonth(): void;
|
|
35
59
|
SelectDate(day: CalendarDay): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datepicker.component.d.ts","sourceRoot":"","sources":["../../../src/lib/datepicker/datepicker.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAkD,SAAS,EAA6B,MAAM,eAAe,CAAC;AAC7J,OAAO,EAAqB,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAiB,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAgE,MAAM,4BAA4B,CAAC;;AAEvH;;GAEG;AACH,qBAkDa,qBAAsB,YAAW,oBAAoB,EAAE,SAAS;IAClE,GAAG,EAAE,IAAI,GAAG,IAAI,CAAQ;IACxB,GAAG,EAAE,IAAI,GAAG,IAAI,CAAQ;IACxB,MAAM,SAAgB;IACtB,WAAW,SAAM;
|
|
1
|
+
{"version":3,"file":"datepicker.component.d.ts","sourceRoot":"","sources":["../../../src/lib/datepicker/datepicker.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAkD,SAAS,EAA6B,MAAM,eAAe,CAAC;AAC7J,OAAO,EAAqB,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAiB,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,EAAE,WAAW,EAAgE,MAAM,4BAA4B,CAAC;;AAEvH;;GAEG;AACH,qBAkDa,qBAAsB,YAAW,oBAAoB,EAAE,SAAS;IAClE,GAAG,EAAE,IAAI,GAAG,IAAI,CAAQ;IACxB,GAAG,EAAE,IAAI,GAAG,IAAI,CAAQ;IACxB,MAAM,SAAgB;IACtB,WAAW,SAAM;IAC1B;;;;;OAKG;IACH,IACI,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAsD;IACjF,IAAI,QAAQ,IAAI,OAAO,CAA+B;IAC5C,WAAW,4BAAmC;IAClC,OAAO,CAAC,SAAS,CAA2B;IACzB,QAAQ,CAAC,SAAS,QAAQ;IACnE,OAAO,CAAC,GAAG,CAA6B;IAExC,MAAM,UAAS;IAAC,UAAU,UAAS;IAAC,YAAY,SAAM;IACtD,KAAK,EAAE,WAAW,EAAE,EAAE,CAAM;IAAC,QAAQ,WAAa;IAClD,SAAS,EAAE,iBAAiB,EAAE,CAG5B;IACF,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,YAAY,CAAqB;IACzC,OAAO,CAAC,QAAQ,CAA0C;IAC1D,OAAO,CAAC,SAAS,CAAwB;IAEzC,IAAI,cAAc,IAAI,MAAM,CAA6C;IAEzE,MAAM,IAAI,IAAI;IACd,IAAI,IAAI,IAAI;IAKZ,KAAK,IAAI,IAAI;IAEb,8CAA8C;IAC9C,OAAO,CAAC,aAAa,CAAS;IAC9B,4FAA4F;IAC5F,OAAO,CAAC,YAAY,CAAS;IAE7B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,YAAY;IAOpB,aAAa,IAAI,IAAI;IACrB,SAAS,IAAI,IAAI;IAEjB,UAAU,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI;IAKlC,WAAW,IAAI,IAAI;IAKnB,aAAa,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO;IAIxC,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO;IAKvC,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAKjC,MAAM,IAAI,IAAI;IACd,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAIrC,UAAU,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI;IAI7C,gBAAgB,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI;IACxD,iBAAiB,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IACvC,gBAAgB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAC3C,WAAW,IAAI,IAAI;yCAvGR,qBAAqB;2CAArB,qBAAqB;CAwGjC"}
|