@vsn-ux/ngx-gaia 0.9.8 → 0.9.10
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/DOCS.md +5 -0
- package/fesm2022/vsn-ux-ngx-gaia.mjs +29 -9
- package/fesm2022/vsn-ux-ngx-gaia.mjs.map +1 -1
- package/index.d.ts +5 -1
- package/package.json +1 -1
package/DOCS.md
CHANGED
|
@@ -221,6 +221,11 @@ Input directive for datepicker integration.
|
|
|
221
221
|
- `min: any` - Minimum date constraint
|
|
222
222
|
- `max: any` - Maximum date constraint
|
|
223
223
|
|
|
224
|
+
#### Outputs:
|
|
225
|
+
|
|
226
|
+
- `dateChange(value: any)` - Emitted when the input loses focus (blur) and the date has changed
|
|
227
|
+
- `dateInput(value: any)` - Emitted immediately when the user types in the text input and the parsed value changes
|
|
228
|
+
|
|
224
229
|
### `<ga-datepicker-toggle>`
|
|
225
230
|
|
|
226
231
|
Toggle button component for opening datepicker.
|
|
@@ -1067,7 +1067,7 @@ class GaDatepickerComponent {
|
|
|
1067
1067
|
return Array.from({ length: 25 }, (_, i) => startYear + i - 1);
|
|
1068
1068
|
});
|
|
1069
1069
|
selectDate(dateStruct) {
|
|
1070
|
-
if (this.isDateDisabled(dateStruct)) {
|
|
1070
|
+
if (this.isDateDisabled(dateStruct) || this.isSelected(dateStruct)) {
|
|
1071
1071
|
return;
|
|
1072
1072
|
}
|
|
1073
1073
|
const externalValue = this.valueAdapter.fromStruct(dateStruct);
|
|
@@ -1680,15 +1680,18 @@ class GaDatepickerInputDirective {
|
|
|
1680
1680
|
value = linkedSignal(() => this.valueInput());
|
|
1681
1681
|
dateStruct = computed(() => this.valueAdapter.toStruct(this.value()));
|
|
1682
1682
|
disabled = linkedSignal(() => !!this.disabledInput());
|
|
1683
|
-
lastEmittedStruct = signal(null);
|
|
1684
1683
|
lastValueValid = signal(false);
|
|
1684
|
+
lastDateChangeEmittedValue = signal(null);
|
|
1685
1685
|
onNgChangeFn;
|
|
1686
1686
|
onNgTouchedFn;
|
|
1687
1687
|
constructor() {
|
|
1688
1688
|
effect(() => {
|
|
1689
1689
|
this.valueInput(); // explicit call to track value input changes
|
|
1690
1690
|
this.lastValueValid.set(true);
|
|
1691
|
-
untracked(() =>
|
|
1691
|
+
untracked(() => {
|
|
1692
|
+
this.lastDateChangeEmittedValue.set(this.dateStruct());
|
|
1693
|
+
this.formatValue();
|
|
1694
|
+
});
|
|
1692
1695
|
});
|
|
1693
1696
|
}
|
|
1694
1697
|
onInput(event) {
|
|
@@ -1708,9 +1711,9 @@ class GaDatepickerInputDirective {
|
|
|
1708
1711
|
if (this.dateStruct()) {
|
|
1709
1712
|
this.formatValue();
|
|
1710
1713
|
}
|
|
1711
|
-
if (compareStructs(this.dateStruct(), this.
|
|
1714
|
+
if (compareStructs(this.dateStruct(), this.lastDateChangeEmittedValue()) !== 0) {
|
|
1712
1715
|
this.dateChange.emit(this.value());
|
|
1713
|
-
this.
|
|
1716
|
+
this.lastDateChangeEmittedValue.set(this.dateStruct());
|
|
1714
1717
|
}
|
|
1715
1718
|
this.onNgTouchedFn?.();
|
|
1716
1719
|
}
|
|
@@ -1735,6 +1738,7 @@ class GaDatepickerInputDirective {
|
|
|
1735
1738
|
// ControlValueAccessor implementation
|
|
1736
1739
|
writeValue(value) {
|
|
1737
1740
|
this.updateValue(value, { updateView: true });
|
|
1741
|
+
this.lastDateChangeEmittedValue.set(this.dateStruct());
|
|
1738
1742
|
}
|
|
1739
1743
|
registerOnChange(fn) {
|
|
1740
1744
|
this.onNgChangeFn = fn;
|
|
@@ -3797,6 +3801,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImpor
|
|
|
3797
3801
|
class GaSelectI18nDefault extends GaSelectI18n {
|
|
3798
3802
|
/** A label for the clear button */
|
|
3799
3803
|
clearLabel = 'Clear';
|
|
3804
|
+
/** A default label for the search input, unless placeholder is set */
|
|
3805
|
+
defaultSearchInputLabel = 'Search';
|
|
3800
3806
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: GaSelectI18nDefault, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
3801
3807
|
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: GaSelectI18nDefault });
|
|
3802
3808
|
}
|
|
@@ -3899,6 +3905,9 @@ class GaSelectComponent {
|
|
|
3899
3905
|
menuStatusIcon = computed(() => {
|
|
3900
3906
|
return this._isOpen() ? ChevronUp : ChevronDown;
|
|
3901
3907
|
});
|
|
3908
|
+
visibleOptions = computed(() => {
|
|
3909
|
+
return this.gaOptions().filter((option) => !option.hidden());
|
|
3910
|
+
});
|
|
3902
3911
|
selectedOptions = computed(() => {
|
|
3903
3912
|
return this.gaOptions().filter((option) => option.selected());
|
|
3904
3913
|
});
|
|
@@ -3931,8 +3940,19 @@ class GaSelectComponent {
|
|
|
3931
3940
|
effect(() => formFieldConnector.controlDisabled.set(this.disabled()));
|
|
3932
3941
|
}
|
|
3933
3942
|
effect(() => {
|
|
3934
|
-
this.
|
|
3935
|
-
|
|
3943
|
+
if (!this.isOpen()) {
|
|
3944
|
+
return;
|
|
3945
|
+
}
|
|
3946
|
+
const options = this.visibleOptions();
|
|
3947
|
+
untracked(() => {
|
|
3948
|
+
const firstOption = options.find((option) => !option.cdkOption.disabled);
|
|
3949
|
+
if (firstOption &&
|
|
3950
|
+
!options.some((option) => option.cdkOption.isActive())) {
|
|
3951
|
+
// if no active option, set the first enabled as active
|
|
3952
|
+
this.cdkListbox()._setActiveOption(firstOption.cdkOption);
|
|
3953
|
+
}
|
|
3954
|
+
this.connectedOverlay()?.overlayRef?.updatePosition();
|
|
3955
|
+
});
|
|
3936
3956
|
});
|
|
3937
3957
|
}
|
|
3938
3958
|
ngAfterContentInit() {
|
|
@@ -4145,7 +4165,7 @@ class GaSelectComponent {
|
|
|
4145
4165
|
useExisting: forwardRef(() => GaSelectComponent),
|
|
4146
4166
|
multi: true,
|
|
4147
4167
|
},
|
|
4148
|
-
], queries: [{ propertyName: "gaOptions", predicate: GaOptionComponent, descendants: true, read: GaOptionComponent, isSignal: true }, { propertyName: "cdkListbox", first: true, predicate: CdkListbox, descendants: true, isSignal: true }, { propertyName: "customSelectValue", first: true, predicate: GaSelectValueComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "inputSearch", first: true, predicate: ["inputSearch"], descendants: true, isSignal: true }, { propertyName: "content", first: true, predicate: ["ngContent"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "connectedOverlay", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }], hostDirectives: [{ directive: i1$1.CdkOverlayOrigin }, { directive: GaLabelledByFormFieldDirective, inputs: ["aria-labelledby", "aria-labelledby"] }], ngImport: i0, template: "@if (leftIcon()) {\n <ga-icon [icon]=\"leftIcon()!\" />\n}\n\n<div class=\"ga-select__main-area\">\n @if (hasValue() && (!textValue() || multiple())) {\n @if (customSelectValue()) {\n <div class=\"ga-select__value\">\n <ng-content select=\"ga-select-value\" />\n </div>\n } @else {\n <ga-select-default-value />\n }\n } @else if (!searchable()) {\n <div class=\"ga-select__placeholder\">\n {{ placeholder() }}\n </div>\n }\n\n @if (searchable()) {\n <input\n #inputSearch\n type=\"text\"\n class=\"ga-select__input\"\n aria-autocomplete=\"list\"\n [value]=\"textValue()\"\n (input)=\"open(); textValue.set(inputSearch.value)\"\n (click)=\"open(); $event.stopPropagation()\"\n [attr.aria-controls]=\"isOpen() ? cdkListbox().id : null\"\n [attr.aria-activedescendant]=\"isOpen() ? activeDescendantId() : null\"\n [placeholder]=\"hasValue() ? '' : placeholder()\"\n (keydown)=\"onInputKeyDown($event)\"\n tabindex=\"-1\"\n [disabled]=\"disabled()\"\n />\n }\n</div>\n\n<div class=\"ga-select__suffix\">\n @if (clearable() && hasValue()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"clearValue(); $event.stopPropagation()\"\n [attr.aria-label]=\"clearableLabel() ?? i18n.clearLabel\"\n style=\"font-size: 0\"\n >\n <ga-icon [icon]=\"icons.CircleX\" size=\"16\" />\n </button>\n }\n\n <ga-icon [icon]=\"menuStatusIcon()\" class=\"ga-select__action-icon\" />\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"repositionScrollStrategy\"\n (overlayOutsideClick)=\"close()\"\n (attach)=\"onOverlayAttach()\"\n (detach)=\"onOverlayDetach()\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n>\n <ng-content select=\"ga-select-dropdown\" />\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: GaIconModule }, { kind: "component", type: GaIconComponent, selector: "ga-icon", inputs: ["icon", "size", "color", "strokeWidth"] }, { kind: "ngmodule", type: GaButtonModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "component", type: GaSelectDefaultValueComponent, selector: "ga-select-default-value" }] });
|
|
4168
|
+
], queries: [{ propertyName: "gaOptions", predicate: GaOptionComponent, descendants: true, read: GaOptionComponent, isSignal: true }, { propertyName: "cdkListbox", first: true, predicate: CdkListbox, descendants: true, isSignal: true }, { propertyName: "customSelectValue", first: true, predicate: GaSelectValueComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "inputSearch", first: true, predicate: ["inputSearch"], descendants: true, isSignal: true }, { propertyName: "content", first: true, predicate: ["ngContent"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "connectedOverlay", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }], hostDirectives: [{ directive: i1$1.CdkOverlayOrigin }, { directive: GaLabelledByFormFieldDirective, inputs: ["aria-labelledby", "aria-labelledby"] }], ngImport: i0, template: "@if (leftIcon()) {\n <ga-icon [icon]=\"leftIcon()!\" />\n}\n\n<div class=\"ga-select__main-area\">\n @if (hasValue() && (!textValue() || multiple())) {\n @if (customSelectValue()) {\n <div class=\"ga-select__value\">\n <ng-content select=\"ga-select-value\" />\n </div>\n } @else {\n <ga-select-default-value />\n }\n } @else if (!searchable()) {\n <div class=\"ga-select__placeholder\">\n {{ placeholder() }}\n </div>\n }\n\n @if (searchable()) {\n <input\n #inputSearch\n type=\"text\"\n class=\"ga-select__input\"\n aria-autocomplete=\"list\"\n [value]=\"textValue()\"\n (input)=\"open(); textValue.set(inputSearch.value)\"\n (click)=\"open(); $event.stopPropagation()\"\n [attr.aria-controls]=\"isOpen() ? cdkListbox().id : null\"\n [attr.aria-activedescendant]=\"isOpen() ? activeDescendantId() : null\"\n [attr.aria-label]=\"placeholder() || i18n.defaultSearchInputLabel\"\n [placeholder]=\"hasValue() ? '' : placeholder()\"\n (keydown)=\"onInputKeyDown($event)\"\n tabindex=\"-1\"\n [disabled]=\"disabled()\"\n />\n }\n</div>\n\n<div class=\"ga-select__suffix\">\n @if (clearable() && hasValue()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"clearValue(); $event.stopPropagation()\"\n [attr.aria-label]=\"clearableLabel() ?? i18n.clearLabel\"\n style=\"font-size: 0\"\n >\n <ga-icon [icon]=\"icons.CircleX\" size=\"16\" />\n </button>\n }\n\n <ga-icon [icon]=\"menuStatusIcon()\" class=\"ga-select__action-icon\" />\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"repositionScrollStrategy\"\n (overlayOutsideClick)=\"close()\"\n (attach)=\"onOverlayAttach()\"\n (detach)=\"onOverlayDetach()\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n>\n <ng-content select=\"ga-select-dropdown\" />\n</ng-template>\n", dependencies: [{ kind: "ngmodule", type: GaIconModule }, { kind: "component", type: GaIconComponent, selector: "ga-icon", inputs: ["icon", "size", "color", "strokeWidth"] }, { kind: "ngmodule", type: GaButtonModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$1.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "component", type: GaSelectDefaultValueComponent, selector: "ga-select-default-value" }] });
|
|
4149
4169
|
}
|
|
4150
4170
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImport: i0, type: GaSelectComponent, decorators: [{
|
|
4151
4171
|
type: Component,
|
|
@@ -4188,7 +4208,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.4", ngImpor
|
|
|
4188
4208
|
'(keydown.space)': 'open(); $event.preventDefault()',
|
|
4189
4209
|
'(keydown.enter)': 'open(); $event.preventDefault()',
|
|
4190
4210
|
'(keydown.backspace)': 'clearValue(); $event.preventDefault()',
|
|
4191
|
-
}, template: "@if (leftIcon()) {\n <ga-icon [icon]=\"leftIcon()!\" />\n}\n\n<div class=\"ga-select__main-area\">\n @if (hasValue() && (!textValue() || multiple())) {\n @if (customSelectValue()) {\n <div class=\"ga-select__value\">\n <ng-content select=\"ga-select-value\" />\n </div>\n } @else {\n <ga-select-default-value />\n }\n } @else if (!searchable()) {\n <div class=\"ga-select__placeholder\">\n {{ placeholder() }}\n </div>\n }\n\n @if (searchable()) {\n <input\n #inputSearch\n type=\"text\"\n class=\"ga-select__input\"\n aria-autocomplete=\"list\"\n [value]=\"textValue()\"\n (input)=\"open(); textValue.set(inputSearch.value)\"\n (click)=\"open(); $event.stopPropagation()\"\n [attr.aria-controls]=\"isOpen() ? cdkListbox().id : null\"\n [attr.aria-activedescendant]=\"isOpen() ? activeDescendantId() : null\"\n [placeholder]=\"hasValue() ? '' : placeholder()\"\n (keydown)=\"onInputKeyDown($event)\"\n tabindex=\"-1\"\n [disabled]=\"disabled()\"\n />\n }\n</div>\n\n<div class=\"ga-select__suffix\">\n @if (clearable() && hasValue()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"clearValue(); $event.stopPropagation()\"\n [attr.aria-label]=\"clearableLabel() ?? i18n.clearLabel\"\n style=\"font-size: 0\"\n >\n <ga-icon [icon]=\"icons.CircleX\" size=\"16\" />\n </button>\n }\n\n <ga-icon [icon]=\"menuStatusIcon()\" class=\"ga-select__action-icon\" />\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"repositionScrollStrategy\"\n (overlayOutsideClick)=\"close()\"\n (attach)=\"onOverlayAttach()\"\n (detach)=\"onOverlayDetach()\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n>\n <ng-content select=\"ga-select-dropdown\" />\n</ng-template>\n" }]
|
|
4211
|
+
}, template: "@if (leftIcon()) {\n <ga-icon [icon]=\"leftIcon()!\" />\n}\n\n<div class=\"ga-select__main-area\">\n @if (hasValue() && (!textValue() || multiple())) {\n @if (customSelectValue()) {\n <div class=\"ga-select__value\">\n <ng-content select=\"ga-select-value\" />\n </div>\n } @else {\n <ga-select-default-value />\n }\n } @else if (!searchable()) {\n <div class=\"ga-select__placeholder\">\n {{ placeholder() }}\n </div>\n }\n\n @if (searchable()) {\n <input\n #inputSearch\n type=\"text\"\n class=\"ga-select__input\"\n aria-autocomplete=\"list\"\n [value]=\"textValue()\"\n (input)=\"open(); textValue.set(inputSearch.value)\"\n (click)=\"open(); $event.stopPropagation()\"\n [attr.aria-controls]=\"isOpen() ? cdkListbox().id : null\"\n [attr.aria-activedescendant]=\"isOpen() ? activeDescendantId() : null\"\n [attr.aria-label]=\"placeholder() || i18n.defaultSearchInputLabel\"\n [placeholder]=\"hasValue() ? '' : placeholder()\"\n (keydown)=\"onInputKeyDown($event)\"\n tabindex=\"-1\"\n [disabled]=\"disabled()\"\n />\n }\n</div>\n\n<div class=\"ga-select__suffix\">\n @if (clearable() && hasValue()) {\n <button\n type=\"button\"\n tabindex=\"-1\"\n (click)=\"clearValue(); $event.stopPropagation()\"\n [attr.aria-label]=\"clearableLabel() ?? i18n.clearLabel\"\n style=\"font-size: 0\"\n >\n <ga-icon [icon]=\"icons.CircleX\" size=\"16\" />\n </button>\n }\n\n <ga-icon [icon]=\"menuStatusIcon()\" class=\"ga-select__action-icon\" />\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen()\"\n [cdkConnectedOverlayPositions]=\"positions\"\n [cdkConnectedOverlayScrollStrategy]=\"repositionScrollStrategy\"\n (overlayOutsideClick)=\"close()\"\n (attach)=\"onOverlayAttach()\"\n (detach)=\"onOverlayDetach()\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n>\n <ng-content select=\"ga-select-dropdown\" />\n</ng-template>\n" }]
|
|
4192
4212
|
}], ctorParameters: () => [] });
|
|
4193
4213
|
|
|
4194
4214
|
class GaOptgroupComponent {
|