igniteui-webcomponents 6.0.1 → 6.1.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.
- package/CHANGELOG.md +32 -0
- package/components/button/button-base.d.ts +5 -6
- package/components/button/button-base.js +15 -29
- package/components/button/button-base.js.map +1 -1
- package/components/button/themes/button/light/button.shared.css.js +1 -1
- package/components/button/themes/button/light/button.shared.css.js.map +1 -1
- package/components/button-group/toggle-button.d.ts +2 -2
- package/components/button-group/toggle-button.js +4 -6
- package/components/button-group/toggle-button.js.map +1 -1
- package/components/calendar/calendar.d.ts +1 -1
- package/components/calendar/calendar.js +12 -9
- package/components/calendar/calendar.js.map +1 -1
- package/components/calendar/days-view/days-view.d.ts +1 -1
- package/components/calendar/days-view/days-view.js +8 -9
- package/components/calendar/days-view/days-view.js.map +1 -1
- package/components/calendar/helpers.d.ts +12 -1
- package/components/calendar/helpers.js +35 -10
- package/components/calendar/helpers.js.map +1 -1
- package/components/calendar/model.d.ts +15 -1
- package/components/calendar/model.js +26 -5
- package/components/calendar/model.js.map +1 -1
- package/components/calendar/months-view/months-view.d.ts +1 -1
- package/components/calendar/months-view/months-view.js +6 -6
- package/components/calendar/months-view/months-view.js.map +1 -1
- package/components/calendar/years-view/years-view.d.ts +1 -1
- package/components/calendar/years-view/years-view.js +6 -6
- package/components/calendar/years-view/years-view.js.map +1 -1
- package/components/carousel/carousel-indicator-container.d.ts +2 -2
- package/components/carousel/carousel-indicator-container.js +8 -9
- package/components/carousel/carousel-indicator-container.js.map +1 -1
- package/components/carousel/carousel.d.ts +7 -8
- package/components/carousel/carousel.js +24 -20
- package/components/carousel/carousel.js.map +1 -1
- package/components/checkbox/checkbox-base.d.ts +8 -10
- package/components/checkbox/checkbox-base.js +20 -23
- package/components/checkbox/checkbox-base.js.map +1 -1
- package/components/checkbox/checkbox.d.ts +3 -3
- package/components/checkbox/checkbox.js +18 -19
- package/components/checkbox/checkbox.js.map +1 -1
- package/components/checkbox/switch.d.ts +2 -2
- package/components/checkbox/switch.js +15 -19
- package/components/checkbox/switch.js.map +1 -1
- package/components/chip/chip.js +3 -3
- package/components/chip/chip.js.map +1 -1
- package/components/combo/combo.d.ts +2 -2
- package/components/combo/combo.js +12 -11
- package/components/combo/combo.js.map +1 -1
- package/components/combo/themes/combo.base.css.js +1 -1
- package/components/combo/themes/combo.base.css.js.map +1 -1
- package/components/combo/themes/shared/combo.fluent.css.js +1 -1
- package/components/combo/themes/shared/combo.fluent.css.js.map +1 -1
- package/components/common/controllers/focus-ring.d.ts +21 -11
- package/components/common/controllers/focus-ring.js +16 -14
- package/components/common/controllers/focus-ring.js.map +1 -1
- package/components/common/controllers/key-bindings.d.ts +40 -33
- package/components/common/controllers/key-bindings.js +83 -71
- package/components/common/controllers/key-bindings.js.map +1 -1
- package/components/common/definitions/defineAllComponents.js +2 -0
- package/components/common/definitions/defineAllComponents.js.map +1 -1
- package/components/common/i18n/date-range-picker.resources.d.ts +11 -0
- package/components/common/i18n/date-range-picker.resources.js +12 -0
- package/components/common/i18n/date-range-picker.resources.js.map +1 -0
- package/components/common/mixins/combo-box.js +8 -2
- package/components/common/mixins/combo-box.js.map +1 -1
- package/components/common/mixins/forms/form-value.d.ts +15 -1
- package/components/common/mixins/forms/form-value.js +25 -4
- package/components/common/mixins/forms/form-value.js.map +1 -1
- package/components/common/mixins/option.d.ts +3 -2
- package/components/common/mixins/option.js.map +1 -1
- package/components/common/part-map.d.ts +17 -0
- package/components/common/part-map.js +46 -0
- package/components/common/part-map.js.map +1 -0
- package/components/common/util.d.ts +5 -6
- package/components/common/util.js +17 -22
- package/components/common/util.js.map +1 -1
- package/components/common/validators.js +3 -7
- package/components/common/validators.js.map +1 -1
- package/components/date-picker/date-picker.d.ts +3 -3
- package/components/date-picker/date-picker.js +13 -14
- package/components/date-picker/date-picker.js.map +1 -1
- package/components/date-picker/themes/dark/date-picker.bootstrap.css.js +1 -1
- package/components/date-picker/themes/dark/date-picker.bootstrap.css.js.map +1 -1
- package/components/date-picker/themes/dark/date-picker.fluent.css.js +1 -1
- package/components/date-picker/themes/dark/date-picker.fluent.css.js.map +1 -1
- package/components/date-picker/themes/dark/date-picker.indigo.css.js +1 -1
- package/components/date-picker/themes/dark/date-picker.indigo.css.js.map +1 -1
- package/components/date-picker/themes/dark/date-picker.material.css.js +1 -1
- package/components/date-picker/themes/dark/date-picker.material.css.js.map +1 -1
- package/components/date-picker/themes/light/date-picker.bootstrap.css.js +1 -1
- package/components/date-picker/themes/light/date-picker.bootstrap.css.js.map +1 -1
- package/components/date-picker/themes/light/date-picker.fluent.css.js +1 -1
- package/components/date-picker/themes/light/date-picker.fluent.css.js.map +1 -1
- package/components/date-picker/themes/light/date-picker.indigo.css.js +1 -1
- package/components/date-picker/themes/light/date-picker.indigo.css.js.map +1 -1
- package/components/date-picker/themes/light/date-picker.material.css.js +1 -1
- package/components/date-picker/themes/light/date-picker.material.css.js.map +1 -1
- package/components/date-picker/themes/shared/date-picker.bootstrap.css.js +1 -1
- package/components/date-picker/themes/shared/date-picker.bootstrap.css.js.map +1 -1
- package/components/date-picker/themes/shared/date-picker.common.css.js +1 -1
- package/components/date-picker/themes/shared/date-picker.common.css.js.map +1 -1
- package/components/date-picker/themes/shared/date-picker.fluent.css.js +1 -1
- package/components/date-picker/themes/shared/date-picker.fluent.css.js.map +1 -1
- package/components/date-picker/themes/shared/date-picker.indigo.css.js +1 -1
- package/components/date-picker/themes/shared/date-picker.indigo.css.js.map +1 -1
- package/components/date-picker/themes/shared/date-picker.material.css.d.ts +1 -0
- package/components/date-picker/themes/shared/date-picker.material.css.js +3 -0
- package/components/date-picker/themes/shared/date-picker.material.css.js.map +1 -0
- package/components/date-picker/themes/themes.js +3 -2
- package/components/date-picker/themes/themes.js.map +1 -1
- package/components/date-range-picker/date-range-picker.base.css.d.ts +1 -0
- package/components/date-range-picker/date-range-picker.base.css.js +3 -0
- package/components/date-range-picker/date-range-picker.base.css.js.map +1 -0
- package/components/date-range-picker/date-range-picker.d.ts +365 -0
- package/components/date-range-picker/date-range-picker.js +810 -0
- package/components/date-range-picker/date-range-picker.js.map +1 -0
- package/components/date-range-picker/predefined-ranges-area.base.css.d.ts +1 -0
- package/components/date-range-picker/predefined-ranges-area.base.css.js +3 -0
- package/components/date-range-picker/predefined-ranges-area.base.css.js.map +1 -0
- package/components/date-range-picker/predefined-ranges-area.d.ts +36 -0
- package/components/date-range-picker/predefined-ranges-area.js +115 -0
- package/components/date-range-picker/predefined-ranges-area.js.map +1 -0
- package/components/date-range-picker/themes/dark/date-range-picker.bootstrap.css.d.ts +1 -0
- package/components/date-range-picker/themes/dark/date-range-picker.bootstrap.css.js +3 -0
- package/components/date-range-picker/themes/dark/date-range-picker.bootstrap.css.js.map +1 -0
- package/components/date-range-picker/themes/dark/date-range-picker.fluent.css.d.ts +1 -0
- package/components/date-range-picker/themes/dark/date-range-picker.fluent.css.js +3 -0
- package/components/date-range-picker/themes/dark/date-range-picker.fluent.css.js.map +1 -0
- package/components/date-range-picker/themes/dark/date-range-picker.indigo.css.d.ts +1 -0
- package/components/date-range-picker/themes/dark/date-range-picker.indigo.css.js +3 -0
- package/components/date-range-picker/themes/dark/date-range-picker.indigo.css.js.map +1 -0
- package/components/date-range-picker/themes/dark/date-range-picker.material.css.d.ts +1 -0
- package/components/date-range-picker/themes/dark/date-range-picker.material.css.js +3 -0
- package/components/date-range-picker/themes/dark/date-range-picker.material.css.js.map +1 -0
- package/components/date-range-picker/themes/light/date-range-picker.bootstrap.css.d.ts +1 -0
- package/components/date-range-picker/themes/light/date-range-picker.bootstrap.css.js +3 -0
- package/components/date-range-picker/themes/light/date-range-picker.bootstrap.css.js.map +1 -0
- package/components/date-range-picker/themes/light/date-range-picker.fluent.css.d.ts +1 -0
- package/components/date-range-picker/themes/light/date-range-picker.fluent.css.js +3 -0
- package/components/date-range-picker/themes/light/date-range-picker.fluent.css.js.map +1 -0
- package/components/date-range-picker/themes/light/date-range-picker.indigo.css.d.ts +1 -0
- package/components/date-range-picker/themes/light/date-range-picker.indigo.css.js +3 -0
- package/components/date-range-picker/themes/light/date-range-picker.indigo.css.js.map +1 -0
- package/components/date-range-picker/themes/light/date-range-picker.material.css.d.ts +1 -0
- package/components/date-range-picker/themes/light/date-range-picker.material.css.js +3 -0
- package/components/date-range-picker/themes/light/date-range-picker.material.css.js.map +1 -0
- package/components/date-range-picker/themes/light/date-range-picker.shared.css.d.ts +1 -0
- package/components/date-range-picker/themes/light/date-range-picker.shared.css.js +3 -0
- package/components/date-range-picker/themes/light/date-range-picker.shared.css.js.map +1 -0
- package/components/date-range-picker/themes/ranges-themes.d.ts +2 -0
- package/components/date-range-picker/themes/ranges-themes.js +14 -0
- package/components/date-range-picker/themes/ranges-themes.js.map +1 -0
- package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.d.ts +1 -0
- package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.js +3 -0
- package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.js.map +1 -0
- package/components/date-range-picker/themes/shared/date-range-picker.common.css.d.ts +1 -0
- package/components/date-range-picker/themes/shared/date-range-picker.common.css.js +3 -0
- package/components/date-range-picker/themes/shared/date-range-picker.common.css.js.map +1 -0
- package/components/date-range-picker/themes/shared/date-range-picker.fluent.css.d.ts +1 -0
- package/components/date-range-picker/themes/shared/date-range-picker.fluent.css.js +3 -0
- package/components/date-range-picker/themes/shared/date-range-picker.fluent.css.js.map +1 -0
- package/components/date-range-picker/themes/shared/date-range-picker.indigo.css.d.ts +1 -0
- package/components/date-range-picker/themes/shared/date-range-picker.indigo.css.js +3 -0
- package/components/date-range-picker/themes/shared/date-range-picker.indigo.css.js.map +1 -0
- package/components/date-range-picker/themes/shared/date-range-picker.material.css.d.ts +1 -0
- package/components/date-range-picker/themes/shared/date-range-picker.material.css.js +3 -0
- package/components/date-range-picker/themes/shared/date-range-picker.material.css.js.map +1 -0
- package/components/date-range-picker/themes/shared/predefined-ranges-area.common.css.d.ts +1 -0
- package/components/date-range-picker/themes/shared/predefined-ranges-area.common.css.js +3 -0
- package/components/date-range-picker/themes/shared/predefined-ranges-area.common.css.js.map +1 -0
- package/components/date-range-picker/themes/shared/predefined-ranges-area.indigo.css.d.ts +1 -0
- package/components/date-range-picker/themes/shared/predefined-ranges-area.indigo.css.js +3 -0
- package/components/date-range-picker/themes/shared/predefined-ranges-area.indigo.css.js.map +1 -0
- package/components/date-range-picker/themes/themes.d.ts +2 -0
- package/components/date-range-picker/themes/themes.js +50 -0
- package/components/date-range-picker/themes/themes.js.map +1 -0
- package/components/date-range-picker/validators.d.ts +26 -0
- package/components/date-range-picker/validators.js +57 -0
- package/components/date-range-picker/validators.js.map +1 -0
- package/components/date-time-input/date-time-input.d.ts +2 -2
- package/components/date-time-input/date-time-input.js +7 -9
- package/components/date-time-input/date-time-input.js.map +1 -1
- package/components/date-time-input/date-util.d.ts +7 -0
- package/components/date-time-input/date-util.js +11 -0
- package/components/date-time-input/date-util.js.map +1 -1
- package/components/dialog/dialog.js +11 -10
- package/components/dialog/dialog.js.map +1 -1
- package/components/dialog/themes/dialog.base.css.js +1 -1
- package/components/dialog/themes/dialog.base.css.js.map +1 -1
- package/components/dialog/themes/shared/dialog.indigo.css.js +1 -1
- package/components/dialog/themes/shared/dialog.indigo.css.js.map +1 -1
- package/components/dropdown/dropdown.js.map +1 -1
- package/components/file-input/file-input.d.ts +11 -5
- package/components/file-input/file-input.js +23 -19
- package/components/file-input/file-input.js.map +1 -1
- package/components/file-input/themes/file-input.base.css.js +1 -1
- package/components/file-input/themes/file-input.base.css.js.map +1 -1
- package/components/input/input-base.d.ts +0 -1
- package/components/input/input-base.js +5 -4
- package/components/input/input-base.js.map +1 -1
- package/components/input/input.d.ts +2 -3
- package/components/input/input.js +10 -9
- package/components/input/input.js.map +1 -1
- package/components/input/themes/dark/input.bootstrap.css.js +1 -1
- package/components/input/themes/dark/input.bootstrap.css.js.map +1 -1
- package/components/input/themes/dark/input.indigo.css.js +1 -1
- package/components/input/themes/dark/input.indigo.css.js.map +1 -1
- package/components/input/themes/light/input.bootstrap.css.js +1 -1
- package/components/input/themes/light/input.bootstrap.css.js.map +1 -1
- package/components/input/themes/light/input.indigo.css.js +1 -1
- package/components/input/themes/light/input.indigo.css.js.map +1 -1
- package/components/input/themes/light/input.shared.css.js +1 -1
- package/components/input/themes/light/input.shared.css.js.map +1 -1
- package/components/input/themes/shared/input.bootstrap.css.js +1 -1
- package/components/input/themes/shared/input.bootstrap.css.js.map +1 -1
- package/components/input/themes/shared/input.common.css.js +1 -1
- package/components/input/themes/shared/input.common.css.js.map +1 -1
- package/components/input/themes/shared/input.fluent.css.js +1 -1
- package/components/input/themes/shared/input.fluent.css.js.map +1 -1
- package/components/input/themes/shared/input.indigo.css.js +1 -1
- package/components/input/themes/shared/input.indigo.css.js.map +1 -1
- package/components/input/themes/shared/input.material.css.js +1 -1
- package/components/input/themes/shared/input.material.css.js.map +1 -1
- package/components/mask-input/mask-input.d.ts +2 -3
- package/components/mask-input/mask-input.js +13 -12
- package/components/mask-input/mask-input.js.map +1 -1
- package/components/mask-input/mask-parser.d.ts +100 -14
- package/components/mask-input/mask-parser.js +134 -117
- package/components/mask-input/mask-parser.js.map +1 -1
- package/components/nav-drawer/nav-drawer-item.js +2 -6
- package/components/nav-drawer/nav-drawer-item.js.map +1 -1
- package/components/nav-drawer/nav-drawer.js +5 -6
- package/components/nav-drawer/nav-drawer.js.map +1 -1
- package/components/progress/base.js +6 -5
- package/components/progress/base.js.map +1 -1
- package/components/progress/circular-progress.js +7 -15
- package/components/progress/circular-progress.js.map +1 -1
- package/components/progress/linear-progress.js +5 -5
- package/components/progress/linear-progress.js.map +1 -1
- package/components/radio/radio.d.ts +11 -12
- package/components/radio/radio.js +39 -44
- package/components/radio/radio.js.map +1 -1
- package/components/radio/utils.js +6 -3
- package/components/radio/utils.js.map +1 -1
- package/components/rating/rating.d.ts +2 -2
- package/components/rating/rating.js +4 -4
- package/components/rating/rating.js.map +1 -1
- package/components/resize-container/resize-container.js +4 -4
- package/components/resize-container/resize-container.js.map +1 -1
- package/components/select/select.d.ts +2 -2
- package/components/select/select.js +11 -10
- package/components/select/select.js.map +1 -1
- package/components/select/themes/shared/select.fluent.css.js +1 -1
- package/components/select/themes/shared/select.fluent.css.js.map +1 -1
- package/components/slider/range-slider.js +1 -1
- package/components/slider/range-slider.js.map +1 -1
- package/components/slider/slider-base.js +1 -1
- package/components/slider/slider-base.js.map +1 -1
- package/components/slider/slider.d.ts +2 -3
- package/components/slider/slider.js +7 -7
- package/components/slider/slider.js.map +1 -1
- package/components/stepper/step.js +3 -3
- package/components/stepper/step.js.map +1 -1
- package/components/tabs/tabs.js +8 -6
- package/components/tabs/tabs.js.map +1 -1
- package/components/textarea/textarea.d.ts +2 -2
- package/components/textarea/textarea.js +7 -6
- package/components/textarea/textarea.js.map +1 -1
- package/components/textarea/themes/dark/textarea.bootstrap.css.js +1 -1
- package/components/textarea/themes/dark/textarea.bootstrap.css.js.map +1 -1
- package/components/textarea/themes/dark/textarea.indigo.css.js +1 -1
- package/components/textarea/themes/dark/textarea.indigo.css.js.map +1 -1
- package/components/textarea/themes/light/textarea.bootstrap.css.js +1 -1
- package/components/textarea/themes/light/textarea.bootstrap.css.js.map +1 -1
- package/components/textarea/themes/light/textarea.indigo.css.js +1 -1
- package/components/textarea/themes/light/textarea.indigo.css.js.map +1 -1
- package/components/textarea/themes/light/textarea.shared.css.js +1 -1
- package/components/textarea/themes/light/textarea.shared.css.js.map +1 -1
- package/components/textarea/themes/shared/textarea.bootstrap.css.js +1 -1
- package/components/textarea/themes/shared/textarea.bootstrap.css.js.map +1 -1
- package/components/textarea/themes/shared/textarea.fluent.css.js +1 -1
- package/components/textarea/themes/shared/textarea.fluent.css.js.map +1 -1
- package/components/textarea/themes/shared/textarea.indigo.css.js +1 -1
- package/components/textarea/themes/shared/textarea.indigo.css.js.map +1 -1
- package/components/textarea/themes/shared/textarea.material.css.js +1 -1
- package/components/textarea/themes/shared/textarea.material.css.js.map +1 -1
- package/components/textarea/themes/textarea.base.css.js +1 -1
- package/components/textarea/themes/textarea.base.css.js.map +1 -1
- package/components/tile-manager/tile-manager.js +5 -4
- package/components/tile-manager/tile-manager.js.map +1 -1
- package/components/tile-manager/tile.js +6 -5
- package/components/tile-manager/tile.js.map +1 -1
- package/components/tooltip/tooltip.d.ts +24 -9
- package/components/tooltip/tooltip.js +22 -19
- package/components/tooltip/tooltip.js.map +1 -1
- package/components/tree/tree-item.js +5 -3
- package/components/tree/tree-item.js.map +1 -1
- package/components/validation-container/validation-container.js +4 -11
- package/components/validation-container/validation-container.js.map +1 -1
- package/custom-elements.json +21432 -17768
- package/igniteui-webcomponents.css-data.json +1 -1
- package/igniteui-webcomponents.html-data.json +1 -1
- package/index.d.ts +4 -1
- package/index.js +1 -0
- package/index.js.map +1 -1
- package/package.json +3 -2
- package/web-types.json +2 -2
|
@@ -11,11 +11,22 @@ import { live } from 'lit/directives/live.js';
|
|
|
11
11
|
import { watch } from '../common/decorators/watch.js';
|
|
12
12
|
import { registerComponent } from '../common/definitions/register.js';
|
|
13
13
|
import { createFormValueState, } from '../common/mixins/forms/form-value.js';
|
|
14
|
-
import {
|
|
14
|
+
import { partMap } from '../common/part-map.js';
|
|
15
|
+
import { isEmpty } from '../common/util.js';
|
|
15
16
|
import IgcValidationContainerComponent from '../validation-container/validation-container.js';
|
|
16
17
|
import { IgcMaskInputBaseComponent, } from './mask-input-base.js';
|
|
17
18
|
import { maskValidators } from './validators.js';
|
|
18
19
|
class IgcMaskInputComponent extends IgcMaskInputBaseComponent {
|
|
20
|
+
constructor() {
|
|
21
|
+
super(...arguments);
|
|
22
|
+
this._formValue = createFormValueState(this, {
|
|
23
|
+
initialValue: '',
|
|
24
|
+
transformers: {
|
|
25
|
+
setFormValue: (value) => this._isRawMode ? value || null : this.maskedValue || null,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
this.valueMode = 'raw';
|
|
29
|
+
}
|
|
19
30
|
static register() {
|
|
20
31
|
registerComponent(IgcMaskInputComponent, IgcValidationContainerComponent);
|
|
21
32
|
}
|
|
@@ -49,16 +60,6 @@ class IgcMaskInputComponent extends IgcMaskInputBaseComponent {
|
|
|
49
60
|
this.maskedValue = this.parser.apply(this._formValue.value);
|
|
50
61
|
}
|
|
51
62
|
}
|
|
52
|
-
constructor() {
|
|
53
|
-
super();
|
|
54
|
-
this.valueMode = 'raw';
|
|
55
|
-
this._formValue = createFormValueState(this, {
|
|
56
|
-
initialValue: '',
|
|
57
|
-
transformers: {
|
|
58
|
-
setFormValue: (value) => this._isRawMode ? value || null : this.maskedValue || null,
|
|
59
|
-
},
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
63
|
promptChange() {
|
|
63
64
|
this.parser.prompt = this.prompt;
|
|
64
65
|
if (this.value) {
|
|
@@ -125,7 +126,7 @@ class IgcMaskInputComponent extends IgcMaskInputBaseComponent {
|
|
|
125
126
|
return html `
|
|
126
127
|
<input
|
|
127
128
|
type="text"
|
|
128
|
-
part=${
|
|
129
|
+
part=${partMap(this.resolvePartNames('input'))}
|
|
129
130
|
name=${ifDefined(this.name)}
|
|
130
131
|
.value=${live(this.maskedValue)}
|
|
131
132
|
.placeholder=${live(this.placeholder ?? this.parser.escapedMask)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mask-input.js","sourceRoot":"","sources":["../../../src/components/mask-input/mask-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { live } from 'lit/directives/live.js';\n\nimport { watch } from '../common/decorators/watch.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport {\n type FormValue,\n createFormValueState,\n} from '../common/mixins/forms/form-value.js';\nimport { isEmpty, partNameMap } from '../common/util.js';\nimport type { MaskInputValueMode } from '../types.js';\nimport IgcValidationContainerComponent from '../validation-container/validation-container.js';\nimport {\n IgcMaskInputBaseComponent,\n type MaskRange,\n} from './mask-input-base.js';\nimport { maskValidators } from './validators.js';\n\n/**\n * A masked input is an input field where a developer can control user input and format the visible value,\n * based on configurable rules\n *\n * @element igc-mask-input\n *\n * @slot prefix - Renders content before the input\n * @slot suffix - Renders content after the input\n * @slot helper-text - Renders content below the input\n * @slot value-missing - Renders content when the required validation fails.\n * @slot bad-input - Renders content when a required mask pattern validation fails.\n * @slot custom-error - Renders content when setCustomValidity(message) is set.\n * @slot invalid - Renders content when the component is in invalid state (validity.valid = false).\n *\n * @fires igcInput - Emitted when the control receives user input\n * @fires igcChange - Emitted when an alteration of the control's value is committed by the user\n *\n * @csspart container - The main wrapper that holds all main input elements\n * @csspart input - The native input element\n * @csspart label - The native label element\n * @csspart prefix - The prefix wrapper\n * @csspart suffix - The suffix wrapper\n * @csspart helper-text - The helper text wrapper\n */\nexport default class IgcMaskInputComponent extends IgcMaskInputBaseComponent {\n public static readonly tagName = 'igc-mask-input';\n\n /* blazorSuppress */\n public static register() {\n registerComponent(IgcMaskInputComponent, IgcValidationContainerComponent);\n }\n\n protected override get __validators() {\n return maskValidators;\n }\n\n protected override _formValue: FormValue<string>;\n\n protected get _isRawMode() {\n return this.valueMode === 'raw';\n }\n\n /**\n * Dictates the behavior when retrieving the value of the control:\n *\n * - `raw` will return the clean user input.\n * - `withFormatting` will return the value with all literals and prompts.\n * @attr value-mode\n */\n @property({ attribute: 'value-mode' })\n public valueMode: MaskInputValueMode = 'raw';\n\n /**\n * The value of the input.\n *\n * Regardless of the currently set `value-mode`, an empty value will return an empty string.\n * @attr\n */\n public get value(): string {\n const value = this._formValue.value;\n\n if (this._isRawMode) {\n return value;\n }\n return value ? this.maskedValue : value;\n }\n\n /* @tsTwoWayProperty(true, \"igcChange\", \"detail\", false) */\n @property()\n public set value(string: string) {\n const value = string ?? '';\n this.maskedValue = this.parser.apply(value);\n this.updateMaskedValue();\n this._formValue.setValueAndFormState(value);\n this._validate();\n }\n\n /**\n * The mask pattern to apply on the input.\n * @attr\n */\n @property()\n public get mask(): string {\n return this._mask;\n }\n\n /** The mask pattern to apply on the input. */\n public set mask(value: string) {\n this._mask = value;\n this.parser.mask = value;\n if (this.value) {\n this.maskedValue = this.parser.apply(this._formValue.value);\n }\n }\n\n constructor() {\n super();\n\n this._formValue = createFormValueState(this, {\n initialValue: '',\n transformers: {\n setFormValue: (value) =>\n this._isRawMode ? value || null : this.maskedValue || null,\n },\n });\n }\n\n @watch('prompt')\n protected promptChange() {\n this.parser.prompt = this.prompt;\n if (this.value) {\n this.maskedValue = this.parser.apply(this._formValue.value);\n }\n }\n\n protected override _restoreDefaultValue(): void {\n const value = this.defaultValue as string;\n\n this.maskedValue = this.parser.apply(value);\n this.updateMaskedValue();\n this._formValue.setValueAndFormState(value);\n this._updateValidity();\n }\n\n protected async updateInput(string: string, range: MaskRange) {\n const { value, end } = this.parser.replace(\n this.maskedValue,\n string,\n range.start,\n range.end\n );\n\n this.maskedValue = value;\n this._formValue.setValueAndFormState(this.parser.parse(value));\n this._validate();\n this.requestUpdate();\n\n if (range.start !== this.mask.length) {\n this.emitEvent('igcInput', { detail: this.value });\n }\n await this.updateComplete;\n\n this.input.setSelectionRange(end, end);\n }\n\n protected handleDragEnter() {\n if (!this.focused && !this._formValue.value) {\n this.maskedValue = this.emptyMask;\n }\n }\n\n protected handleDragLeave() {\n if (!this.focused) {\n this.updateMaskedValue();\n }\n }\n\n protected async handleFocus() {\n this.focused = true;\n\n if (this.readOnly) {\n return;\n }\n\n if (!this._formValue.value) {\n // In case of empty value, select the whole mask\n this.maskedValue = this.emptyMask;\n\n await this.updateComplete;\n this.select();\n }\n }\n\n protected handleBlur() {\n this.focused = false;\n this.updateMaskedValue();\n this.invalid = !this.checkValidity();\n }\n\n protected handleChange() {\n this.emitEvent('igcChange', { detail: this.value });\n }\n\n protected updateMaskedValue() {\n if (this.maskedValue === this.emptyMask) {\n this.maskedValue = '';\n }\n }\n\n protected override _updateSetRangeTextValue() {\n this.value = this.parser.parse(this.maskedValue);\n }\n\n protected override renderInput() {\n return html`\n <input\n type=\"text\"\n part=${partNameMap(this.resolvePartNames('input'))}\n name=${ifDefined(this.name)}\n .value=${live(this.maskedValue)}\n .placeholder=${live(this.placeholder ?? this.parser.escapedMask)}\n ?readonly=${this.readOnly}\n ?disabled=${this.disabled}\n @dragenter=${this.handleDragEnter}\n @dragleave=${this.handleDragLeave}\n @dragstart=${this.handleDragStart}\n @blur=${this.handleBlur}\n @focus=${this.handleFocus}\n @cut=${this.handleCut}\n @change=${this.handleChange}\n @click=${this.handleClick}\n @compositionstart=${this.handleCompositionStart}\n @compositionend=${this.handleCompositionEnd}\n @input=${this.handleInput}\n aria-describedby=${ifDefined(\n isEmpty(this._helperText) ? nothing : 'helper-text'\n )}\n aria-invalid=${this.invalid ? 'true' : 'false'}\n @keydown=${this.handleKeydown}\n />\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-mask-input': IgcMaskInputComponent;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"mask-input.js","sourceRoot":"","sources":["../../../src/components/mask-input/mask-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { live } from 'lit/directives/live.js';\n\nimport { watch } from '../common/decorators/watch.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport {\n type FormValueOf,\n createFormValueState,\n} from '../common/mixins/forms/form-value.js';\nimport { partMap } from '../common/part-map.js';\nimport { isEmpty } from '../common/util.js';\nimport type { MaskInputValueMode } from '../types.js';\nimport IgcValidationContainerComponent from '../validation-container/validation-container.js';\nimport {\n IgcMaskInputBaseComponent,\n type MaskRange,\n} from './mask-input-base.js';\nimport { maskValidators } from './validators.js';\n\n/**\n * A masked input is an input field where a developer can control user input and format the visible value,\n * based on configurable rules\n *\n * @element igc-mask-input\n *\n * @slot prefix - Renders content before the input\n * @slot suffix - Renders content after the input\n * @slot helper-text - Renders content below the input\n * @slot value-missing - Renders content when the required validation fails.\n * @slot bad-input - Renders content when a required mask pattern validation fails.\n * @slot custom-error - Renders content when setCustomValidity(message) is set.\n * @slot invalid - Renders content when the component is in invalid state (validity.valid = false).\n *\n * @fires igcInput - Emitted when the control receives user input\n * @fires igcChange - Emitted when an alteration of the control's value is committed by the user\n *\n * @csspart container - The main wrapper that holds all main input elements\n * @csspart input - The native input element\n * @csspart label - The native label element\n * @csspart prefix - The prefix wrapper\n * @csspart suffix - The suffix wrapper\n * @csspart helper-text - The helper text wrapper\n */\nexport default class IgcMaskInputComponent extends IgcMaskInputBaseComponent {\n public static readonly tagName = 'igc-mask-input';\n\n /* blazorSuppress */\n public static register() {\n registerComponent(IgcMaskInputComponent, IgcValidationContainerComponent);\n }\n\n protected override get __validators() {\n return maskValidators;\n }\n\n protected override readonly _formValue: FormValueOf<string> =\n createFormValueState(this, {\n initialValue: '',\n transformers: {\n setFormValue: (value) =>\n this._isRawMode ? value || null : this.maskedValue || null,\n },\n });\n\n protected get _isRawMode() {\n return this.valueMode === 'raw';\n }\n\n /**\n * Dictates the behavior when retrieving the value of the control:\n *\n * - `raw` will return the clean user input.\n * - `withFormatting` will return the value with all literals and prompts.\n * @attr value-mode\n */\n @property({ attribute: 'value-mode' })\n public valueMode: MaskInputValueMode = 'raw';\n\n /**\n * The value of the input.\n *\n * Regardless of the currently set `value-mode`, an empty value will return an empty string.\n * @attr\n */\n public get value(): string {\n const value = this._formValue.value;\n\n if (this._isRawMode) {\n return value;\n }\n return value ? this.maskedValue : value;\n }\n\n /* @tsTwoWayProperty(true, \"igcChange\", \"detail\", false) */\n @property()\n public set value(string: string) {\n const value = string ?? '';\n this.maskedValue = this.parser.apply(value);\n this.updateMaskedValue();\n this._formValue.setValueAndFormState(value);\n this._validate();\n }\n\n /**\n * The mask pattern to apply on the input.\n * @attr\n */\n @property()\n public get mask(): string {\n return this._mask;\n }\n\n /** The mask pattern to apply on the input. */\n public set mask(value: string) {\n this._mask = value;\n this.parser.mask = value;\n if (this.value) {\n this.maskedValue = this.parser.apply(this._formValue.value);\n }\n }\n\n @watch('prompt')\n protected promptChange() {\n this.parser.prompt = this.prompt;\n if (this.value) {\n this.maskedValue = this.parser.apply(this._formValue.value);\n }\n }\n\n protected override _restoreDefaultValue(): void {\n const value = this.defaultValue as string;\n\n this.maskedValue = this.parser.apply(value);\n this.updateMaskedValue();\n this._formValue.setValueAndFormState(value);\n this._updateValidity();\n }\n\n protected async updateInput(string: string, range: MaskRange) {\n const { value, end } = this.parser.replace(\n this.maskedValue,\n string,\n range.start,\n range.end\n );\n\n this.maskedValue = value;\n this._formValue.setValueAndFormState(this.parser.parse(value));\n this._validate();\n this.requestUpdate();\n\n if (range.start !== this.mask.length) {\n this.emitEvent('igcInput', { detail: this.value });\n }\n await this.updateComplete;\n\n this.input.setSelectionRange(end, end);\n }\n\n protected handleDragEnter() {\n if (!this.focused && !this._formValue.value) {\n this.maskedValue = this.emptyMask;\n }\n }\n\n protected handleDragLeave() {\n if (!this.focused) {\n this.updateMaskedValue();\n }\n }\n\n protected async handleFocus() {\n this.focused = true;\n\n if (this.readOnly) {\n return;\n }\n\n if (!this._formValue.value) {\n // In case of empty value, select the whole mask\n this.maskedValue = this.emptyMask;\n\n await this.updateComplete;\n this.select();\n }\n }\n\n protected handleBlur() {\n this.focused = false;\n this.updateMaskedValue();\n this.invalid = !this.checkValidity();\n }\n\n protected handleChange() {\n this.emitEvent('igcChange', { detail: this.value });\n }\n\n protected updateMaskedValue() {\n if (this.maskedValue === this.emptyMask) {\n this.maskedValue = '';\n }\n }\n\n protected override _updateSetRangeTextValue() {\n this.value = this.parser.parse(this.maskedValue);\n }\n\n protected override renderInput() {\n return html`\n <input\n type=\"text\"\n part=${partMap(this.resolvePartNames('input'))}\n name=${ifDefined(this.name)}\n .value=${live(this.maskedValue)}\n .placeholder=${live(this.placeholder ?? this.parser.escapedMask)}\n ?readonly=${this.readOnly}\n ?disabled=${this.disabled}\n @dragenter=${this.handleDragEnter}\n @dragleave=${this.handleDragLeave}\n @dragstart=${this.handleDragStart}\n @blur=${this.handleBlur}\n @focus=${this.handleFocus}\n @cut=${this.handleCut}\n @change=${this.handleChange}\n @click=${this.handleClick}\n @compositionstart=${this.handleCompositionStart}\n @compositionend=${this.handleCompositionEnd}\n @input=${this.handleInput}\n aria-describedby=${ifDefined(\n isEmpty(this._helperText) ? nothing : 'helper-text'\n )}\n aria-invalid=${this.invalid ? 'true' : 'false'}\n @keydown=${this.handleKeydown}\n />\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-mask-input': IgcMaskInputComponent;\n }\n}\n"]}
|
|
@@ -1,32 +1,118 @@
|
|
|
1
|
+
/** Options for the {@link MaskParser} */
|
|
1
2
|
interface MaskOptions {
|
|
3
|
+
/**
|
|
4
|
+
* The mask format string (e.g., '00/00/0000' for dates, 'AAA-000' for custom IDs).
|
|
5
|
+
*
|
|
6
|
+
* Supported flags: a, A, C, L, 0, 9, #, &, ?.
|
|
7
|
+
*
|
|
8
|
+
* Use `'\'` to escape a flag character if it should be treated as a literal.
|
|
9
|
+
* @default 'CCCCCCCCCC'
|
|
10
|
+
*/
|
|
2
11
|
format: string;
|
|
12
|
+
/**
|
|
13
|
+
* The character used to prompt for input in unfilled mask positions.
|
|
14
|
+
* Must be a single character.
|
|
15
|
+
* @default '_'
|
|
16
|
+
*/
|
|
3
17
|
promptCharacter: string;
|
|
4
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Result type for the replace operation, containing the new masked value and the
|
|
21
|
+
* ideal cursor position.
|
|
22
|
+
*/
|
|
23
|
+
type MaskReplaceResult = {
|
|
24
|
+
value: string;
|
|
25
|
+
end: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* A class for parsing and applying masks to strings, typically for input fields.
|
|
29
|
+
* It handles mask definitions, literals, character validation, and cursor positioning.
|
|
30
|
+
*/
|
|
5
31
|
export declare class MaskParser {
|
|
6
|
-
protected
|
|
7
|
-
|
|
8
|
-
protected
|
|
32
|
+
protected readonly _options: MaskOptions;
|
|
33
|
+
/** Stores literal characters and their original positions in the mask (e.g., '(', ')', '-'). */
|
|
34
|
+
protected readonly _literals: Map<number, string>;
|
|
35
|
+
/** A Set of positions where literals occur in the `_escapedMask`. */
|
|
36
|
+
protected _literalPositions: Set<number>;
|
|
37
|
+
/** The mask format after processing escape characters */
|
|
9
38
|
protected _escapedMask: string;
|
|
10
|
-
|
|
39
|
+
/**
|
|
40
|
+
* Returns a set of the all the literal positions in the mask.
|
|
41
|
+
* These positions are fixed characters that are not part of the input.
|
|
42
|
+
*/
|
|
43
|
+
get literalPositions(): Set<number>;
|
|
44
|
+
/**
|
|
45
|
+
* Returns the escaped mask string.
|
|
46
|
+
* This is the mask after processing any escape sequences.
|
|
47
|
+
*/
|
|
11
48
|
get escapedMask(): string;
|
|
49
|
+
/**
|
|
50
|
+
* Gets the unescaped mask string (the original format string).
|
|
51
|
+
* If the mask has no escape sequences, then `mask === escapedMask`.
|
|
52
|
+
*/
|
|
12
53
|
get mask(): string;
|
|
54
|
+
/**
|
|
55
|
+
* Sets the mask of the parser.
|
|
56
|
+
* When the mask is set, it triggers a re-parsing of the mask literals and escaped mask.
|
|
57
|
+
*/
|
|
13
58
|
set mask(value: string);
|
|
59
|
+
/**
|
|
60
|
+
* Gets the prompt character used for unfilled mask positions.
|
|
61
|
+
*/
|
|
14
62
|
get prompt(): string;
|
|
63
|
+
/**
|
|
64
|
+
* Sets the prompt character. Only the first character of the provided string is used.
|
|
65
|
+
*/
|
|
15
66
|
set prompt(value: string);
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
protected
|
|
67
|
+
constructor(options?: MaskOptions);
|
|
68
|
+
/**
|
|
69
|
+
* Parses the mask format string to identify literal characters and
|
|
70
|
+
* create the escaped mask. This method is called whenever the mask format changes.
|
|
71
|
+
*/
|
|
72
|
+
protected _parseMaskLiterals(): void;
|
|
73
|
+
/**
|
|
74
|
+
* Gets an array of positions in the escaped mask that correspond to
|
|
75
|
+
* required input flags (e.g., '0', 'L') and are not literal characters.
|
|
76
|
+
*
|
|
77
|
+
* These positions must be filled for the masked string to be valid.
|
|
78
|
+
*/
|
|
79
|
+
protected _getRequiredNonLiteralPositions(): number[];
|
|
80
|
+
/**
|
|
81
|
+
* Finds the closest non-literal position in the mask *before* the given start position.
|
|
82
|
+
* Useful for backward navigation (e.g., backspace).
|
|
83
|
+
*
|
|
84
|
+
* @remarks
|
|
85
|
+
* If no non-literal is found before `start`, return `start`.
|
|
86
|
+
*/
|
|
22
87
|
getPreviousNonLiteralPosition(start: number): number;
|
|
88
|
+
/**
|
|
89
|
+
* Finds the closest non-literal position in the mask *after* the given start position.
|
|
90
|
+
* Useful for forward navigation (e.g., arrow keys, delete key or initial cursor placement).
|
|
91
|
+
*
|
|
92
|
+
* @remarks
|
|
93
|
+
* If no non-literal is found after `start`, return `start`.
|
|
94
|
+
*/
|
|
23
95
|
getNextNonLiteralPosition(start: number): number;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
96
|
+
/**
|
|
97
|
+
* Replaces a segment of the masked string with new input, simulating typing or pasting.
|
|
98
|
+
* It handles clearing the selected range and inserting new characters according to the mask.
|
|
99
|
+
*/
|
|
100
|
+
replace(maskString: string, value: string, start: number, end: number): MaskReplaceResult;
|
|
101
|
+
/**
|
|
102
|
+
* Parses the masked string, extracting only the valid input characters.
|
|
103
|
+
* This effectively "unmasks" the string, removing prompts and literals.
|
|
104
|
+
*/
|
|
28
105
|
parse(masked?: string): string;
|
|
106
|
+
/**
|
|
107
|
+
* Checks if the masked string is valid, specifically if all required mask positions are filled
|
|
108
|
+
* with valid, non-prompt characters.
|
|
109
|
+
*/
|
|
29
110
|
isValidString(input?: string): boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Applies the mask format to an input string. This attempts to fit the input
|
|
113
|
+
* into the mask from left to right, filling valid positions and skipping invalid
|
|
114
|
+
* input characters.
|
|
115
|
+
*/
|
|
30
116
|
apply(input?: string): string;
|
|
31
117
|
}
|
|
32
118
|
export {};
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
const
|
|
2
|
-
const
|
|
1
|
+
const MASK_FLAGS = new Set('aACL09#&?');
|
|
2
|
+
const MASK_REQUIRED_FLAGS = new Set('0#LA&');
|
|
3
|
+
const MASK_PATTERNS = new Map([
|
|
3
4
|
['C', /(?!^$)/u],
|
|
4
5
|
['&', /[^\p{Separator}]/u],
|
|
5
|
-
['a', /[\p{Letter}\
|
|
6
|
-
['A', /[\p{Letter}\
|
|
6
|
+
['a', /[\p{Letter}\p{Number}\p{Separator}]/u],
|
|
7
|
+
['A', /[\p{Letter}\p{Number}]/u],
|
|
7
8
|
['?', /[\p{Letter}\p{Separator}]/u],
|
|
8
9
|
['L', /\p{Letter}/u],
|
|
9
|
-
['0', /\
|
|
10
|
-
['9', /[\
|
|
11
|
-
['#', /[\
|
|
10
|
+
['0', /\p{Number}/u],
|
|
11
|
+
['9', /[\p{Number}\p{Separator}]/u],
|
|
12
|
+
['#', /[\p{Number}\-+]/u],
|
|
12
13
|
]);
|
|
13
|
-
|
|
14
|
-
const replaceIMENumbers = (string) => {
|
|
14
|
+
function replaceIMENumbers(string) {
|
|
15
15
|
return string.replace(/[0123456789]/g, (num) => ({
|
|
16
16
|
'1': '1',
|
|
17
17
|
'2': '2',
|
|
@@ -24,171 +24,188 @@ const replaceIMENumbers = (string) => {
|
|
|
24
24
|
'9': '9',
|
|
25
25
|
'0': '0',
|
|
26
26
|
})[num]);
|
|
27
|
+
}
|
|
28
|
+
function validate(char, flag) {
|
|
29
|
+
return MASK_PATTERNS.get(flag)?.test(char) ?? false;
|
|
30
|
+
}
|
|
31
|
+
const MaskDefaultOptions = {
|
|
32
|
+
format: 'CCCCCCCCCC',
|
|
33
|
+
promptCharacter: '_',
|
|
27
34
|
};
|
|
28
35
|
export class MaskParser {
|
|
29
|
-
constructor(options = { format: 'CCCCCCCCCC', promptCharacter: '_' }) {
|
|
30
|
-
this.literals = new Map();
|
|
31
|
-
this._escapedMask = '';
|
|
32
|
-
this.options = options;
|
|
33
|
-
this.parseMaskLiterals();
|
|
34
|
-
}
|
|
35
36
|
get literalPositions() {
|
|
36
|
-
return
|
|
37
|
+
return this._literalPositions;
|
|
37
38
|
}
|
|
38
39
|
get escapedMask() {
|
|
39
40
|
return this._escapedMask;
|
|
40
41
|
}
|
|
41
42
|
get mask() {
|
|
42
|
-
return this.
|
|
43
|
+
return this._options.format;
|
|
43
44
|
}
|
|
44
45
|
set mask(value) {
|
|
45
|
-
this.
|
|
46
|
-
this.
|
|
46
|
+
this._options.format = value || this._options.format;
|
|
47
|
+
this._parseMaskLiterals();
|
|
47
48
|
}
|
|
48
49
|
get prompt() {
|
|
49
|
-
return this.
|
|
50
|
+
return this._options.promptCharacter;
|
|
50
51
|
}
|
|
51
52
|
set prompt(value) {
|
|
52
|
-
this.
|
|
53
|
+
this._options.promptCharacter = value
|
|
53
54
|
? value.substring(0, 1)
|
|
54
|
-
: this.
|
|
55
|
+
: this._options.promptCharacter;
|
|
55
56
|
}
|
|
56
|
-
|
|
57
|
-
this.
|
|
58
|
-
this.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
57
|
+
constructor(options) {
|
|
58
|
+
this._literals = new Map();
|
|
59
|
+
this._literalPositions = new Set();
|
|
60
|
+
this._escapedMask = '';
|
|
61
|
+
this._options = { ...MaskDefaultOptions, ...options };
|
|
62
|
+
this._parseMaskLiterals();
|
|
63
|
+
}
|
|
64
|
+
_parseMaskLiterals() {
|
|
65
|
+
const mask = this.mask;
|
|
66
|
+
const length = mask.length;
|
|
67
|
+
const escapedMaskChars = [];
|
|
68
|
+
let currentPos = 0;
|
|
69
|
+
this._literals.clear();
|
|
70
|
+
for (let i = 0; i < length; i++) {
|
|
71
|
+
const [current, next] = [mask.charAt(i), mask.charAt(i + 1)];
|
|
72
|
+
if (current === '\\' && MASK_FLAGS.has(next)) {
|
|
73
|
+
this._literals.set(currentPos, next);
|
|
74
|
+
escapedMaskChars.push(next);
|
|
64
75
|
i++;
|
|
65
76
|
}
|
|
66
|
-
else if (
|
|
67
|
-
|
|
77
|
+
else if (MASK_FLAGS.has(current)) {
|
|
78
|
+
escapedMaskChars.push(current);
|
|
68
79
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
return char === this.prompt;
|
|
73
|
-
}
|
|
74
|
-
replaceCharAt(string, pos, char) {
|
|
75
|
-
return `${string.substring(0, pos)}${char}${string.substring(pos + 1)}`;
|
|
76
|
-
}
|
|
77
|
-
validate(char, maskedChar) {
|
|
78
|
-
const regex = REGEX.get(maskedChar);
|
|
79
|
-
return regex ? regex.test(char) : false;
|
|
80
|
-
}
|
|
81
|
-
getNonLiteralPositions(mask = '') {
|
|
82
|
-
const positions = this.literalPositions;
|
|
83
|
-
const result = [];
|
|
84
|
-
const iter = Array.from(mask).entries();
|
|
85
|
-
for (const [pos, _] of iter) {
|
|
86
|
-
if (!positions.includes(pos)) {
|
|
87
|
-
result.push(pos);
|
|
80
|
+
else {
|
|
81
|
+
this._literals.set(currentPos, current);
|
|
82
|
+
escapedMaskChars.push(current);
|
|
88
83
|
}
|
|
84
|
+
currentPos++;
|
|
89
85
|
}
|
|
90
|
-
|
|
86
|
+
this._escapedMask = escapedMaskChars.join('');
|
|
87
|
+
this._literalPositions = new Set(this._literals.keys());
|
|
91
88
|
}
|
|
92
|
-
|
|
93
|
-
const
|
|
89
|
+
_getRequiredNonLiteralPositions() {
|
|
90
|
+
const literalPositions = this.literalPositions;
|
|
91
|
+
const escapedMask = this._escapedMask;
|
|
92
|
+
const length = escapedMask.length;
|
|
94
93
|
const result = [];
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
if (
|
|
98
|
-
result.push(
|
|
94
|
+
for (let i = 0; i < length; i++) {
|
|
95
|
+
const char = escapedMask[i];
|
|
96
|
+
if (MASK_REQUIRED_FLAGS.has(char) && !literalPositions.has(i)) {
|
|
97
|
+
result.push(i);
|
|
99
98
|
}
|
|
100
99
|
}
|
|
101
100
|
return result;
|
|
102
101
|
}
|
|
103
102
|
getPreviousNonLiteralPosition(start) {
|
|
104
|
-
const
|
|
103
|
+
const literalPositions = this.literalPositions;
|
|
105
104
|
for (let i = start; i > 0; i--) {
|
|
106
|
-
if (!
|
|
105
|
+
if (!literalPositions.has(i)) {
|
|
107
106
|
return i;
|
|
107
|
+
}
|
|
108
108
|
}
|
|
109
109
|
return start;
|
|
110
110
|
}
|
|
111
111
|
getNextNonLiteralPosition(start) {
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
112
|
+
const literalPositions = this.literalPositions;
|
|
113
|
+
const length = this._escapedMask.length;
|
|
114
|
+
for (let i = start; i < length; i++) {
|
|
115
|
+
if (!literalPositions.has(i)) {
|
|
115
116
|
return i;
|
|
117
|
+
}
|
|
116
118
|
}
|
|
117
119
|
return start;
|
|
118
120
|
}
|
|
119
121
|
replace(maskString, value, start, end) {
|
|
120
|
-
|
|
121
|
-
const
|
|
122
|
-
const
|
|
123
|
-
const
|
|
122
|
+
const literalPositions = this.literalPositions;
|
|
123
|
+
const escapedMask = this._escapedMask;
|
|
124
|
+
const length = this._escapedMask.length;
|
|
125
|
+
const prompt = this.prompt;
|
|
126
|
+
const endBoundary = Math.min(end, length);
|
|
127
|
+
const maskedChars = Array.from(maskString || this.apply(''));
|
|
128
|
+
const inputChars = Array.from(replaceIMENumbers(value));
|
|
129
|
+
const inputLength = inputChars.length;
|
|
130
|
+
for (let i = start; i < endBoundary; i++) {
|
|
131
|
+
if (!literalPositions.has(i)) {
|
|
132
|
+
maskedChars[i] = prompt;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
124
135
|
let cursor = start;
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
136
|
+
let inputIndex = 0;
|
|
137
|
+
let maskPosition = start;
|
|
138
|
+
for (; maskPosition < length && inputIndex < inputLength; maskPosition++) {
|
|
139
|
+
if (literalPositions.has(maskPosition)) {
|
|
140
|
+
cursor = maskPosition + 1;
|
|
131
141
|
continue;
|
|
132
142
|
}
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
143
|
+
const char = inputChars[inputIndex];
|
|
144
|
+
if (validate(char, escapedMask[maskPosition]) && char !== prompt) {
|
|
145
|
+
maskedChars[maskPosition] = char;
|
|
146
|
+
cursor = maskPosition + 1;
|
|
147
|
+
inputIndex++;
|
|
137
148
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
char = chars.shift();
|
|
149
|
+
else {
|
|
150
|
+
inputIndex++;
|
|
151
|
+
maskPosition--;
|
|
142
152
|
}
|
|
143
|
-
masked = this.replaceCharAt(masked, i, char);
|
|
144
153
|
}
|
|
145
|
-
|
|
154
|
+
while (cursor < length && literalPositions.has(cursor)) {
|
|
155
|
+
cursor++;
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
value: maskedChars.join(''),
|
|
159
|
+
end: cursor,
|
|
160
|
+
};
|
|
146
161
|
}
|
|
147
162
|
parse(masked = '') {
|
|
148
|
-
const
|
|
149
|
-
const
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
163
|
+
const literalPositions = this.literalPositions;
|
|
164
|
+
const prompt = this.prompt;
|
|
165
|
+
const length = masked.length;
|
|
166
|
+
let result = '';
|
|
167
|
+
for (let i = 0; i < length; i++) {
|
|
168
|
+
const char = masked[i];
|
|
169
|
+
if (!literalPositions.has(i) && char !== prompt) {
|
|
170
|
+
result += char;
|
|
171
|
+
}
|
|
155
172
|
}
|
|
156
|
-
return result
|
|
173
|
+
return result;
|
|
157
174
|
}
|
|
158
175
|
isValidString(input = '') {
|
|
159
|
-
const
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
return required.every((pos) => {
|
|
164
|
-
const char = input.charAt(pos);
|
|
165
|
-
return (this.validate(char, this._escapedMask.charAt(pos)) &&
|
|
166
|
-
!this.isPromptChar(char));
|
|
176
|
+
const prompt = this.prompt;
|
|
177
|
+
return this._getRequiredNonLiteralPositions().every((position) => {
|
|
178
|
+
const char = input.charAt(position);
|
|
179
|
+
return (validate(char, this._escapedMask.charAt(position)) && char !== prompt);
|
|
167
180
|
});
|
|
168
181
|
}
|
|
169
182
|
apply(input = '') {
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
|
|
183
|
+
const literals = this._literals;
|
|
184
|
+
const prompt = this.prompt;
|
|
185
|
+
const escapedMask = this._escapedMask;
|
|
186
|
+
const length = escapedMask.length;
|
|
187
|
+
const inputLength = input.length;
|
|
188
|
+
const result = new Array(escapedMask.length).fill(prompt);
|
|
189
|
+
for (const [position, literal] of literals.entries()) {
|
|
190
|
+
result[position] = literal;
|
|
173
191
|
}
|
|
174
192
|
if (!input) {
|
|
175
|
-
return
|
|
193
|
+
return result.join('');
|
|
176
194
|
}
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
output[nonLiteralPositions[position]] = char;
|
|
195
|
+
let inputIndex = 0;
|
|
196
|
+
for (let i = 0; i < length; i++) {
|
|
197
|
+
if (inputIndex >= inputLength) {
|
|
198
|
+
break;
|
|
199
|
+
}
|
|
200
|
+
if (literals.has(i)) {
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
if (validate(input.charAt(inputIndex), escapedMask.charAt(i))) {
|
|
204
|
+
result[i] = input.charAt(inputIndex);
|
|
205
|
+
}
|
|
206
|
+
inputIndex++;
|
|
190
207
|
}
|
|
191
|
-
return
|
|
208
|
+
return result.join('');
|
|
192
209
|
}
|
|
193
210
|
}
|
|
194
211
|
//# sourceMappingURL=mask-parser.js.map
|