igniteui-webcomponents 7.1.2 → 7.2.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 +51 -0
- package/components/banner/banner.d.ts +53 -17
- package/components/banner/banner.js +5 -0
- package/components/banner/banner.js.map +1 -1
- package/components/button/button-base.d.ts +80 -26
- package/components/button/button-base.js +64 -23
- package/components/button/button-base.js.map +1 -1
- package/components/button/button.d.ts +12 -3
- package/components/button/button.js +1 -1
- package/components/button/button.js.map +1 -1
- package/components/button/icon-button.d.ts +25 -9
- package/components/button/icon-button.js +2 -2
- package/components/button/icon-button.js.map +1 -1
- package/components/button-group/themes/shared/button/button.common.css.js +1 -1
- package/components/button-group/themes/shared/button/button.common.css.js.map +1 -1
- package/components/button-group/themes/shared/button/button.indigo.css.js +1 -1
- package/components/button-group/themes/shared/button/button.indigo.css.js.map +1 -1
- package/components/calendar/base.d.ts +5 -4
- package/components/calendar/base.js +3 -2
- package/components/calendar/base.js.map +1 -1
- package/components/calendar/calendar.js +17 -13
- package/components/calendar/calendar.js.map +1 -1
- package/components/calendar/days-view/days-view.d.ts +1 -0
- package/components/calendar/days-view/days-view.js +7 -4
- package/components/calendar/days-view/days-view.js.map +1 -1
- package/components/calendar/helpers.d.ts +1 -1
- package/components/calendar/helpers.js.map +1 -1
- package/components/chat/chat-message.js +8 -8
- package/components/chat/chat-message.js.map +1 -1
- package/components/chat/chat-state.d.ts +3 -1
- package/components/chat/chat-state.js +3 -2
- package/components/chat/chat-state.js.map +1 -1
- package/components/chat/chat.d.ts +5 -1
- package/components/chat/chat.js +14 -4
- package/components/chat/chat.js.map +1 -1
- package/components/checkbox/checkbox.js +1 -0
- package/components/checkbox/checkbox.js.map +1 -1
- package/components/checkbox/switch.js +1 -0
- package/components/checkbox/switch.js.map +1 -1
- package/components/combo/combo.d.ts +1 -0
- package/components/combo/combo.js +7 -0
- package/components/combo/combo.js.map +1 -1
- package/components/combo/controllers/navigation.js +3 -0
- package/components/combo/controllers/navigation.js.map +1 -1
- package/components/common/controllers/command.d.ts +62 -0
- package/components/common/controllers/command.js +25 -0
- package/components/common/controllers/command.js.map +1 -0
- package/components/common/controllers/id-resolver.d.ts +31 -0
- package/components/common/controllers/id-resolver.js +136 -0
- package/components/common/controllers/id-resolver.js.map +1 -0
- package/components/common/i18n/EN/calendar.resources.d.ts +16 -14
- package/components/common/i18n/EN/calendar.resources.js +1 -1
- package/components/common/i18n/EN/calendar.resources.js.map +1 -1
- package/components/common/i18n/EN/chat.resources.d.ts +10 -8
- package/components/common/i18n/EN/chat.resources.js.map +1 -1
- package/components/common/i18n/EN/date-picker.resources.d.ts +8 -0
- package/components/common/i18n/EN/date-picker.resources.js +8 -0
- package/components/common/i18n/EN/date-picker.resources.js.map +1 -0
- package/components/common/i18n/EN/date-range-picker.resources.d.ts +9 -7
- package/components/common/i18n/EN/date-range-picker.resources.js +1 -1
- package/components/common/i18n/EN/date-range-picker.resources.js.map +1 -1
- package/components/common/i18n/i18n-controller.d.ts +14 -11
- package/components/common/i18n/i18n-controller.js +33 -41
- package/components/common/i18n/i18n-controller.js.map +1 -1
- package/components/common/i18n/utils.d.ts +8 -2
- package/components/common/i18n/utils.js +52 -44
- package/components/common/i18n/utils.js.map +1 -1
- package/components/common/mixins/alert.d.ts +47 -9
- package/components/common/mixins/alert.js +55 -12
- package/components/common/mixins/alert.js.map +1 -1
- package/components/common/mixins/forms/associated.js +11 -0
- package/components/common/mixins/forms/associated.js.map +1 -1
- package/components/common/mixins/forms/form-transformers.d.ts +1 -1
- package/components/common/mixins/forms/form-transformers.js.map +1 -1
- package/components/common/mixins/forms/types.d.ts +5 -0
- package/components/common/mixins/forms/types.js.map +1 -1
- package/components/common/mixins/mask-behavior.d.ts +73 -0
- package/components/common/mixins/mask-behavior.js +159 -0
- package/components/common/mixins/mask-behavior.js.map +1 -0
- package/components/common/templates/input-shell.d.ts +24 -0
- package/components/common/templates/input-shell.js +43 -0
- package/components/common/templates/input-shell.js.map +1 -0
- package/components/common/templates/masked-input.d.ts +39 -0
- package/components/common/templates/masked-input.js +37 -0
- package/components/common/templates/masked-input.js.map +1 -0
- package/components/common/util.d.ts +11 -0
- package/components/common/util.js +20 -0
- package/components/common/util.js.map +1 -1
- package/components/date-picker/date-picker.d.ts +6 -4
- package/components/date-picker/date-picker.js +16 -5
- package/components/date-picker/date-picker.js.map +1 -1
- package/components/date-range-picker/date-range-input.d.ts +60 -0
- package/components/date-range-picker/date-range-input.js +251 -0
- package/components/date-range-picker/date-range-input.js.map +1 -0
- package/components/date-range-picker/date-range-mask-parser.d.ts +106 -0
- package/components/date-range-picker/date-range-mask-parser.js +121 -0
- package/components/date-range-picker/date-range-mask-parser.js.map +1 -0
- package/components/date-range-picker/date-range-picker.d.ts +17 -11
- package/components/date-range-picker/date-range-picker.js +89 -61
- package/components/date-range-picker/date-range-picker.js.map +1 -1
- package/components/date-range-picker/predefined-ranges-area.d.ts +4 -4
- package/components/date-range-picker/predefined-ranges-area.js +8 -4
- package/components/date-range-picker/predefined-ranges-area.js.map +1 -1
- package/components/date-range-picker/validators.d.ts +5 -19
- package/components/date-range-picker/validators.js +20 -16
- package/components/date-range-picker/validators.js.map +1 -1
- package/components/date-time-input/date-time-input.base.d.ts +155 -0
- package/components/date-time-input/date-time-input.base.js +275 -0
- package/components/date-time-input/date-time-input.base.js.map +1 -0
- package/components/date-time-input/date-time-input.d.ts +33 -122
- package/components/date-time-input/date-time-input.js +45 -258
- package/components/date-time-input/date-time-input.js.map +1 -1
- package/components/date-time-input/datetime-mask-parser.d.ts +11 -1
- package/components/date-time-input/datetime-mask-parser.js +5 -5
- package/components/date-time-input/datetime-mask-parser.js.map +1 -1
- package/components/dialog/dialog.d.ts +88 -31
- package/components/dialog/dialog.js +29 -31
- package/components/dialog/dialog.js.map +1 -1
- package/components/file-input/file-input.d.ts +1 -1
- package/components/input/input-base.d.ts +2 -10
- package/components/input/input-base.js +11 -57
- package/components/input/input-base.js.map +1 -1
- package/components/input/input.d.ts +1 -1
- package/components/input/input.js +1 -0
- package/components/input/input.js.map +1 -1
- package/components/input/themes/dark/input.shared.css.d.ts +1 -0
- package/components/input/themes/dark/input.shared.css.js +3 -0
- package/components/input/themes/dark/input.shared.css.js.map +1 -0
- 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.common.css.js +1 -1
- package/components/input/themes/shared/input.common.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/input/themes/themes.js +4 -3
- package/components/input/themes/themes.js.map +1 -1
- package/components/mask-input/mask-input.d.ts +9 -4
- package/components/mask-input/mask-input.js +30 -36
- package/components/mask-input/mask-input.js.map +1 -1
- package/components/nav-drawer/nav-drawer.d.ts +93 -17
- package/components/nav-drawer/nav-drawer.js +148 -21
- package/components/nav-drawer/nav-drawer.js.map +1 -1
- package/components/nav-drawer/themes/container.base.css.js +1 -1
- package/components/nav-drawer/themes/container.base.css.js.map +1 -1
- package/components/nav-drawer/themes/shared/container/nav-drawer.common.css.js +1 -1
- package/components/nav-drawer/themes/shared/container/nav-drawer.common.css.js.map +1 -1
- package/components/nav-drawer/themes/shared/container/nav-drawer.fluent.css.js +1 -1
- package/components/nav-drawer/themes/shared/container/nav-drawer.fluent.css.js.map +1 -1
- package/components/nav-drawer/themes/shared/container/nav-drawer.indigo.css.js +1 -1
- package/components/nav-drawer/themes/shared/container/nav-drawer.indigo.css.js.map +1 -1
- package/components/radio/radio.js +1 -0
- package/components/radio/radio.js.map +1 -1
- package/components/snackbar/snackbar.d.ts +9 -5
- package/components/snackbar/snackbar.js +6 -8
- package/components/snackbar/snackbar.js.map +1 -1
- package/components/snackbar/themes/snackbar.base.css.js +1 -1
- package/components/snackbar/themes/snackbar.base.css.js.map +1 -1
- package/components/stepper/step.d.ts +1 -1
- package/components/stepper/step.js +4 -4
- package/components/stepper/step.js.map +1 -1
- package/components/stepper/stepper.js +5 -0
- package/components/stepper/stepper.js.map +1 -1
- package/components/stepper/themes/step/step.base.css.js +1 -1
- package/components/stepper/themes/step/step.base.css.js.map +1 -1
- package/components/stepper/themes/stepper/stepper.base.css.js +1 -1
- package/components/stepper/themes/stepper/stepper.base.css.js.map +1 -1
- package/components/toast/themes/toast.base.css.js +1 -1
- package/components/toast/themes/toast.base.css.js.map +1 -1
- package/components/toast/toast.d.ts +9 -2
- package/components/toast/toast.js +0 -2
- package/components/toast/toast.js.map +1 -1
- package/components/types.d.ts +4 -0
- package/components/types.js.map +1 -1
- package/custom-elements.json +34882 -28909
- package/igniteui-webcomponents.css-data.json +1 -1
- package/igniteui-webcomponents.html-data.json +1 -1
- package/index.d.ts +5 -2
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/package.json +3 -3
- package/skills/igniteui-wc-choose-components/SKILL.md +23 -6
- package/skills/igniteui-wc-choose-components/reference/mcp-setup.md +82 -0
- package/skills/igniteui-wc-generate-from-image-design/references/component-mapping.md +4 -2
- package/web-types.json +2 -2
- package/components/mask-input/mask-input-base.d.ts +0 -51
- package/components/mask-input/mask-input-base.js +0 -146
- package/components/mask-input/mask-input-base.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"date-time-input.js","sourceRoot":"","sources":["../../../src/components/date-time-input/date-time-input.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,IAAI,EAAuB,MAAM,KAAK,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EACL,cAAc,EACd,SAAS,EACT,SAAS,EACT,UAAU,EACV,OAAO,EACP,OAAO,GACR,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,6BAA6B,EAAE,MAAM,6CAA6C,CAAC;AAC5F,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAC3D,OAAO,EAAE,MAAM,IAAI,MAAM,EAAE,MAAM,4CAA4C,CAAC;AAC9E,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EACL,yBAAyB,GAE1B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,+BAA+B,MAAM,iDAAiD,CAAC;AAC9F,OAAO,EACL,QAAQ,EAER,8BAA8B,GAC/B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,cAAc,EACd,SAAS,EACT,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAS1D,MAAM,KAAK,GAAG,QAAQ,CACpB,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,eAAe,EACf,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,SAAS,CACV,CAAC;AA2BF,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,iBAAiB,CAGtE,yBAAyB,CAAC;aACH,YAAO,GAAG,qBAAqB,AAAxB,CAAyB;aACzC,WAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,AAAnB,CAAoB;IAGjC,MAAM,CAAC,QAAQ;QACpB,iBAAiB,CACf,yBAAyB,EACzB,+BAA+B,CAChC,CAAC;IACJ,CAAC;IAgCD,IAAuB,YAAY;QACjC,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAOD,IAAY,eAAe;QACzB,OAAO,IAAI,CAAC,QAAQ;YAClB,CAAC,CAAC,IAAI,CAAC,oBAAoB,EAAE;YAC7B,CAAC,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;IACjC,CAAC;IAED,IAAY,eAAe;QACzB,OAAO,EAAE,GAAG,8BAA8B,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAClE,CAAC;IAWD,IAAW,WAAW,CAAC,GAAW;QAChC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,CAAC,YAAY,GAAG,GAAG,CAAC;YACxB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAChD,CAAC;IAQD,IAAW,KAAK,CAAC,KAAuC;QACtD,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,KAAoB,CAAC,CAAC;QAC3D,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;IAC/B,CAAC;IAOD,IAAW,GAAG,CAAC,KAAuC;QACpD,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAOD,IAAW,GAAG,CAAC,KAAuC;QACpD,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,EAAE,CAAC;IACnB,CAAC;IAED,IAAW,GAAG;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAQD,IAAW,aAAa,CAAC,KAAa;QACpC,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;IAC9B,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,CACL,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,qBAAqB,CACvE,CAAC;IACJ,CAAC;IAqBD,IAAW,MAAM,CAAC,KAAa;QAC7B,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,KAAK,CAAC;IACtC,CAAC;IAED,IAAW,MAAM;QACf,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;IACrC,CAAC;IAMD;QACE,KAAK,EAAE,CAAC;QA/JkB,YAAO,GAAG,IAAI,kBAAkB,EAAE,CAAC;QAGvD,0BAAqB,GAAG,EAAE,CAAC;QAK3B,cAAS,GAAgB,IAAI,CAAC;QAC9B,SAAI,GAAgB,IAAI,CAAC;QACzB,SAAI,GAAgB,IAAI,CAAC;QAEhB,oBAAe,GAAG,iBAAiB,CAAC,IAAI,EAAE;YACzD,SAAS,EAAE,EAAE;YACb,gBAAgB,EAAE,IAAI,CAAC,qBAAqB;SAC7C,CAAC,CAAC;QAEyB,YAAO,GAAG,oBAAoB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAE1C,WAAM,GAAG,iBAAiB,CAAC,IAAI,EAAE;YAC3D,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;QAEyB,eAAU,GAAG,oBAAoB,CAAC,IAAI,EAAE;YAClE,YAAY,EAAE,IAAI;YAClB,YAAY,EAAE,6BAA6B;SAC5C,CAAC,CAAC;QAiHI,aAAQ,GAAG,IAAI,CAAC;QAsBrB,cAAc,CAAC,IAAI,EAAE;YACnB,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ;YACzB,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;SAClC,CAAC;aACC,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,mBAAmB,CAAC;aAC7C,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;aACjD,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;aACrD,GAAG,CAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;aAC5D,GAAG,CAAC,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC;IAEkB,MAAM,CAAC,KAA2B;QACnD,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACrC,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAChC,CAAC;QAED,IAAI,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACtD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;IAMkB,iBAAiB,CAAC,IAAY;QAC/C,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAE7C,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QACpD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEkB,wBAAwB;QACzC,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAMO,eAAe;QACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IACjE,CAAC;IAEO,qBAAqB;QAC3B,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAC9B,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAES,gBAAgB;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAES,gBAAgB;QACxB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;IAGa,AAAN,KAAK,CAAC,YAAY,CAAC,KAAiB;QAC1C,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC;QAC5C,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACnD,IAAI,CAAC,eAAe,EAAE,CAAC;QAEvB,MAAM,IAAI,CAAC,cAAc,CAAC;QAC1B,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;IAES,KAAK,CAAC,YAAY;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;QAE5B,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;YAC3C,MAAM,IAAI,CAAC,cAAc,CAAC;YAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;aAAM,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YACnD,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;IACH,CAAC;IAEkB,WAAW;QAC5B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QAGtB,IAAI,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACnD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAE7D,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;QAGD,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;YACpD,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,KAAK,CAAC,WAAW,EAAE,CAAC;IACtB,CAAC;IAMS,mBAAmB;QAC3B,IAAI,CAAC,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAKS,cAAc,CAAC,SAAiB;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,gCAAgC,CACpD,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,EACxB,SAAS,CACV,CAAC;QACF,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAOO,gCAAgC,CACtC,UAAkB,EAClB,SAAiB;QAEjB,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;QAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAEzC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YAEpB,MAAM,IAAI,GAAG,SAAS,CAAC,QAAQ,CAC7B,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,GAAG,SAAS,CAClE,CAAC;YACF,OAAO,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QACxB,CAAC;QAGD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CACzB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,GAAG,SAAS,CACpE,CAAC;QACF,OAAO,IAAI,EAAE,KAAK,IAAI,UAAU,CAAC,MAAM,CAAC;IAC1C,CAAC;IAKS,KAAK,CAAC,aAAa,CAAC,SAAwB;QACpD,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACrD,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,MAAM,IAAI,CAAC,cAAc,CAAC;QAC1B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAC7E,CAAC;IAUS,kBAAkB;QAC1B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,YAAY,GAAG,iBAAiB,CACnC,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,aAAa,CACnB,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,YAAY,CAC1B,IAAY,EACZ,EAAE,KAAK,EAAE,GAAG,EAAiB;QAE7B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;QAEzE,IAAI,CAAC,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;QAEjC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,IAAI,KAAK,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;YACtC,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QAED,MAAM,IAAI,CAAC,cAAc,CAAC;QAC1B,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACzD,CAAC;IAKO,YAAY,CAClB,QAA8B,EAC9B,KAAyB,EACzB,WAAoB;QAEpB,MAAM,IAAI,GAAG,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC;QAC9C,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC;QAE5C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAK,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;QACjE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC7E,CAAC;IAKO,mBAAmB,CACzB,QAAkB,EAClB,KAAyB,EACzB,WAAoB;QAGpB,MAAM,cAAc,GAClB,KAAK,IAAI,IAAI,CAAC,eAAe,CAAC,QAAgC,CAAC,IAAI,CAAC,CAAC;QAEvE,MAAM,UAAU,GAAG,WAAW;YAC5B,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;YAC3B,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAE7B,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAClD,CAAC;IAKO,aAAa,CAAC,QAAkB,EAAE,KAAa;QACrD,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,QAAgC,CAAC;QAGlD,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,EAAE,CAAC;YAGV,IAAI,GAAG,cAAc,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QACpE,CAAC;QAGD,IAAI,SAA6B,CAAC;QAClC,IAAI,QAAQ,KAAK,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9D,IAAI,UAAU,EAAE,CAAC;gBACf,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CACrC,UAAU,CAAC,KAAK,EAChB,UAAU,CAAC,GAAG,CACf,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;YACf,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS;YACT,YAAY,EAAE,IAAI,CAAC,KAAK;SACzB,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC;IACjB,CAAC;IAKO,2BAA2B;QACjC,IAAI,CAAC,qBAAqB,GAAG,gBAAgB,EAAE,CAAC,uBAAuB,CACrE,IAAI,CAAC,MAAM,CACZ,CAAC;IACJ,CAAC;IAKO,UAAU,CAAC,YAAoB;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;QAGjC,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,QAAQ,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;YACvD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;QACvC,CAAC;IACH,CAAC;IAMO,iBAAiB;QACvB,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAClD,CAAC;IAES,sBAAsB;QAC9B,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAEnC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAOO,oBAAoB;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAClE,EAAE,IAA4B,CAAC;IACnC,CAAC;IAMO,mBAAmB;QACzB,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI;YACtD,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI;YACjD,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,IAAI,CAAyB,CAAC;IACnE,CAAC;IAKO,eAAe;QACrB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAMO,oBAAoB;QAC1B,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,CAAC;IAOM,MAAM,CAAC,QAAmB,EAAE,KAAc;QAC/C,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,CAAC;IAGM,QAAQ,CAAC,QAAmB,EAAE,KAAc;QACjD,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAC3C,CAAC;IAGM,KAAK;QACV,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAOM,YAAY;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;IACrC,CAAC;IAOM,YAAY;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;IACrC,CAAC;IAIkB,YAAY;QAC7B,OAAO,IAAI,CAAA;;;eAGA,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;eACxC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;iBAClB,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;uBACjB,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS;oBAC7C,IAAI,CAAC,QAAQ;oBACb,IAAI,CAAC,QAAQ;gBACjB,IAAI,CAAC,WAAW;iBACf,IAAI,CAAC,YAAY;iBACjB,IAAI,CAAC,YAAY;iBACjB,IAAI,CAAC,YAAY;mBACf,IAAI,CAAC,iBAAiB;iBACxB,IAAI,CAAC,YAAY;eACnB,IAAI,CAAC,iBAAiB;4BACT,IAAI,CAAC,uBAAuB;0BAC9B,IAAI,CAAC,qBAAqB;qBAC/B,IAAI,CAAC,gBAAgB;qBACrB,IAAI,CAAC,gBAAgB;qBACrB,IAAI,CAAC,iBAAiB;;KAEtC,CAAC;IACJ,CAAC;;AA1iBD;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;4DAOvC;AAYD;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;sDAItC;AAWD;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;oDAItC;AAWD;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;oDAItC;AAYD;IADC,QAAQ,CAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;8DAGzC;AAaM;IADN,QAAQ,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;4DACG;AAO3B;IADN,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;2DAC7B;AAOvB;IADC,QAAQ,EAAE;uDAGV;AAkFa;IADb,YAAY,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;6DAehC","sourcesContent":["import { getDateFormatter } from 'igniteui-i18n-core';\nimport { html, type PropertyValues } from 'lit';\nimport { eventOptions, property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { live } from 'lit/directives/live.js';\nimport { addThemingController } from '../../theming/theming-controller.js';\nimport { convertToDate, isValidDate } from '../calendar/helpers.js';\nimport {\n addKeybindings,\n arrowDown,\n arrowLeft,\n arrowRight,\n arrowUp,\n ctrlKey,\n} from '../common/controllers/key-bindings.js';\nimport { addSlotController, setSlots } from '../common/controllers/slot.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport {\n addI18nController,\n formatDisplayDate,\n getDefaultDateTimeFormat,\n} from '../common/i18n/i18n-controller.js';\nimport type { AbstractConstructor } from '../common/mixins/constructor.js';\nimport { EventEmitterMixin } from '../common/mixins/event-emitter.js';\nimport { FormValueDateTimeTransformers } from '../common/mixins/forms/form-transformers.js';\nimport { createFormValueState } from '../common/mixins/forms/form-value.js';\nimport { partMap } from '../common/part-map.js';\nimport type { IgcInputComponentEventMap } from '../input/input-base.js';\nimport { styles } from '../input/themes/input.base.css.js';\nimport { styles as shared } from '../input/themes/shared/input.common.css.js';\nimport { all } from '../input/themes/themes.js';\nimport {\n IgcMaskInputBaseComponent,\n type MaskSelection,\n} from '../mask-input/mask-input-base.js';\nimport IgcValidationContainerComponent from '../validation-container/validation-container.js';\nimport {\n DatePart,\n type DatePartDeltas,\n DEFAULT_DATE_PARTS_SPIN_DELTAS,\n} from './date-part.js';\nimport {\n createDatePart,\n DateParts,\n DateTimeMaskParser,\n} from './datetime-mask-parser.js';\nimport { dateTimeInputValidators } from './validators.js';\n\nexport interface IgcDateTimeInputComponentEventMap extends Omit<\n IgcInputComponentEventMap,\n 'igcChange'\n> {\n igcChange: CustomEvent<Date | null>;\n}\n\nconst Slots = setSlots(\n 'prefix',\n 'suffix',\n 'helper-text',\n 'value-missing',\n 'range-overflow',\n 'range-underflow',\n 'custom-error',\n 'invalid'\n);\n\n/**\n * A date time input is an input field that lets you set and edit the date and time in a chosen input element\n * using customizable display and input formats.\n *\n * @element igc-date-time-input\n *\n * @slot prefix - Renders content before the input.\n * @slot suffix - Renders content after input.\n * @slot helper-text - Renders content below the input.\n * @slot value-missing - Renders content when the required validation fails.\n * @slot range-overflow - Renders content when the max validation fails.\n * @slot range-underflow - Renders content when the min 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 input receives user input.\n * @fires igcChange - Emitted when the control's checked state changes.\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 IgcDateTimeInputComponent extends EventEmitterMixin<\n IgcDateTimeInputComponentEventMap,\n AbstractConstructor<IgcMaskInputBaseComponent>\n>(IgcMaskInputBaseComponent) {\n public static readonly tagName = 'igc-date-time-input';\n public static styles = [styles, shared];\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(\n IgcDateTimeInputComponent,\n IgcValidationContainerComponent\n );\n }\n\n //#region Private state and properties\n\n protected override readonly _parser = new DateTimeMaskParser();\n\n // Format and mask state\n private _defaultDisplayFormat = '';\n private _displayFormat?: string;\n private _inputFormat?: string;\n\n // Value tracking\n private _oldValue: Date | null = null;\n private _min: Date | null = null;\n private _max: Date | null = null;\n\n private readonly _i18nController = addI18nController(this, {\n defaultEN: {},\n onResourceChange: this._handleResourceChange,\n });\n\n protected override readonly _themes = addThemingController(this, all);\n\n protected override readonly _slots = addSlotController(this, {\n slots: Slots,\n });\n\n protected override readonly _formValue = createFormValueState(this, {\n initialValue: null,\n transformers: FormValueDateTimeTransformers,\n });\n\n protected override get __validators() {\n return dateTimeInputValidators;\n }\n\n /**\n * Determines which date/time part is currently targeted based on cursor position.\n * When focused, returns the part under the cursor.\n * When unfocused, returns a default part based on available parts.\n */\n private get _targetDatePart(): DatePart | undefined {\n return this._focused\n ? this._getDatePartAtCursor()\n : this._getDefaultDatePart();\n }\n\n private get _datePartDeltas(): DatePartDeltas {\n return { ...DEFAULT_DATE_PARTS_SPIN_DELTAS, ...this.spinDelta };\n }\n\n //#endregion\n\n //#region Public attributes and properties\n\n /**\n * The date format to apply on the input.\n * @attr input-format\n */\n @property({ attribute: 'input-format' })\n public set inputFormat(val: string) {\n if (val) {\n this._applyMask(val);\n this._inputFormat = val;\n this._updateMaskDisplay();\n }\n }\n\n public get inputFormat(): string {\n return this._inputFormat || this._parser.mask;\n }\n\n /* @tsTwoWayProperty(true, \"igcChange\", \"detail\", false) */\n /**\n * The value of the input.\n * @attr\n */\n @property({ converter: convertToDate })\n public set value(value: Date | string | null | undefined) {\n this._formValue.setValueAndFormState(value as Date | null);\n this._updateMaskDisplay();\n }\n\n public get value(): Date | null {\n return this._formValue.value;\n }\n\n /**\n * The minimum value required for the input to remain valid.\n * @attr\n */\n @property({ converter: convertToDate })\n public set min(value: Date | string | null | undefined) {\n this._min = convertToDate(value);\n this._validate();\n }\n\n public get min(): Date | null {\n return this._min;\n }\n\n /**\n * The maximum value required for the input to remain valid.\n * @attr\n */\n @property({ converter: convertToDate })\n public set max(value: Date | string | null | undefined) {\n this._max = convertToDate(value);\n this._validate();\n }\n\n public get max(): Date | null {\n return this._max;\n }\n\n /**\n * Format to display the value in when not editing.\n * Defaults to the locale format if not set.\n * @attr display-format\n */\n @property({ attribute: 'display-format' })\n public set displayFormat(value: string) {\n this._displayFormat = value;\n }\n\n public get displayFormat(): string {\n return (\n this._displayFormat ?? this._inputFormat ?? this._defaultDisplayFormat\n );\n }\n\n /**\n * Delta values used to increment or decrement each date part on step actions.\n * All values default to `1`.\n */\n @property({ attribute: false })\n public spinDelta?: DatePartDeltas;\n\n /**\n * Sets whether to loop over the currently spun segment.\n * @attr spin-loop\n */\n @property({ type: Boolean, attribute: 'spin-loop' })\n public spinLoop = true;\n\n /**\n * Gets/Sets the locale used for formatting the display value.\n * @attr locale\n */\n @property()\n public set locale(value: string) {\n this._i18nController.locale = value;\n }\n\n public get locale(): string {\n return this._i18nController.locale;\n }\n\n //#endregion\n\n //#region Lifecycle Hooks\n\n constructor() {\n super();\n\n addKeybindings(this, {\n skip: () => this.readOnly,\n bindingDefaults: { repeat: true },\n })\n .set([ctrlKey, ';'], this._setCurrentDateTime)\n .set(arrowUp, this._keyboardSpin.bind(this, 'up'))\n .set(arrowDown, this._keyboardSpin.bind(this, 'down'))\n .set([ctrlKey, arrowLeft], this._navigateParts.bind(this, 0))\n .set([ctrlKey, arrowRight], this._navigateParts.bind(this, 1));\n }\n\n protected override update(props: PropertyValues<this>): void {\n if (props.has('displayFormat')) {\n this._updateDefaultDisplayFormat();\n }\n\n if (props.has('locale')) {\n this._initializeDefaultMask();\n }\n\n if (props.has('displayFormat') || props.has('locale')) {\n this._updateMaskDisplay();\n }\n\n super.update(props);\n }\n\n //#endregion\n\n //#region Overrides\n\n protected override _resolvePartNames(base: string) {\n const result = super._resolvePartNames(base);\n // Apply `filled` part when the mask is not empty\n result.filled = result.filled || !this._isEmptyMask;\n return result;\n }\n\n protected override _updateSetRangeTextValue(): void {\n this._updateValueFromMask();\n }\n\n //#endregion\n\n //#region Event handlers\n\n private _emitInputEvent(): void {\n this._setTouchedState();\n this.emitEvent('igcInput', { detail: this.value?.toString() });\n }\n\n private _handleResourceChange(): void {\n this._initializeDefaultMask();\n this._updateMaskDisplay();\n }\n\n protected _handleDragLeave(): void {\n if (!this._focused) {\n this._updateMaskDisplay();\n }\n }\n\n protected _handleDragEnter(): void {\n if (!this._focused) {\n this._maskedValue = this._buildMaskedValue();\n }\n }\n\n @eventOptions({ passive: false })\n private async _handleWheel(event: WheelEvent): Promise<void> {\n if (!this._focused || this.readOnly) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n const { start, end } = this._inputSelection;\n event.deltaY > 0 ? this.stepDown() : this.stepUp();\n this._emitInputEvent();\n\n await this.updateComplete;\n this.setSelectionRange(start, end);\n }\n\n protected async _handleFocus(): Promise<void> {\n this._focused = true;\n\n if (this.readOnly) {\n return;\n }\n\n this._oldValue = this.value;\n\n if (!this.value) {\n this._maskedValue = this._parser.emptyMask;\n await this.updateComplete;\n this.select();\n } else if (this.displayFormat !== this.inputFormat) {\n this._updateMaskDisplay();\n }\n }\n\n protected override _handleBlur(): void {\n this._focused = false;\n\n // Handle incomplete mask input\n if (!(this._isMaskComplete() || this._isEmptyMask)) {\n const parsedDate = this._parser.parseDate(this._maskedValue);\n\n if (parsedDate) {\n this.value = parsedDate;\n } else {\n this.clear();\n }\n } else {\n this._updateMaskDisplay();\n }\n\n // Emit change event if value changed\n if (!this.readOnly && this._oldValue !== this.value) {\n this.emitEvent('igcChange', { detail: this.value });\n }\n\n super._handleBlur();\n }\n\n //#endregion\n\n //#region Keybindings\n\n protected _setCurrentDateTime(): void {\n this.value = new Date();\n this._emitInputEvent();\n }\n\n /**\n * Navigates to the previous or next date part.\n */\n protected _navigateParts(direction: number): void {\n const position = this._calculatePartNavigationPosition(\n this._input?.value ?? '',\n direction\n );\n this.setSelectionRange(position, position);\n }\n\n /**\n * Calculates the new cursor position when navigating between date parts.\n * direction = 0: navigate to start of previous part\n * direction = 1: navigate to start of next part\n */\n private _calculatePartNavigationPosition(\n inputValue: string,\n direction: number\n ): number {\n const cursorPos = this._maskSelection.start;\n const dateParts = this._parser.dateParts;\n\n if (direction === 0) {\n // Navigate backwards: find last literal before cursor\n const part = dateParts.findLast(\n (part) => part.type === DateParts.Literal && part.end < cursorPos\n );\n return part?.end ?? 0;\n }\n\n // Navigate forwards: find first literal after cursor\n const part = dateParts.find(\n (part) => part.type === DateParts.Literal && part.start > cursorPos\n );\n return part?.start ?? inputValue.length;\n }\n\n /**\n * Handles keyboard-triggered spinning (arrow up/down).\n */\n protected async _keyboardSpin(direction: 'up' | 'down'): Promise<void> {\n direction === 'up' ? this.stepUp() : this.stepDown();\n this._emitInputEvent();\n await this.updateComplete;\n this.setSelectionRange(this._maskSelection.start, this._maskSelection.end);\n }\n\n //#endregion\n\n //#region Internal API\n\n /**\n * Updates the displayed mask value based on focus state.\n * When focused, shows the editable mask. When unfocused, shows formatted display value.\n */\n protected _updateMaskDisplay(): void {\n if (this._focused) {\n this._maskedValue = this._buildMaskedValue();\n return;\n }\n\n if (!isValidDate(this.value)) {\n this._maskedValue = '';\n return;\n }\n\n this._maskedValue = formatDisplayDate(\n this.value,\n this.locale,\n this.displayFormat\n );\n }\n\n protected async _updateInput(\n text: string,\n { start, end }: MaskSelection\n ): Promise<void> {\n const result = this._parser.replace(this._maskedValue, text, start, end);\n\n this._maskedValue = result.value;\n\n this._updateValueFromMask();\n this.requestUpdate();\n\n if (start !== this.inputFormat.length) {\n this._emitInputEvent();\n }\n\n await this.updateComplete;\n this._input?.setSelectionRange(result.end, result.end);\n }\n\n /**\n * Common logic for stepping up or down a date part.\n */\n private _performStep(\n datePart: DatePart | undefined,\n delta: number | undefined,\n isDecrement: boolean\n ): void {\n const part = datePart || this._targetDatePart;\n const { start, end } = this._inputSelection;\n\n this.value = this._calculateSpunValue(part!, delta, isDecrement);\n this.updateComplete.then(() => this._input?.setSelectionRange(start, end));\n }\n\n /**\n * Calculates the new date value after spinning a date part.\n */\n private _calculateSpunValue(\n datePart: DatePart,\n delta: number | undefined,\n isDecrement: boolean\n ): Date {\n // Default to 1 if delta is 0 or undefined\n const effectiveDelta =\n delta || this._datePartDeltas[datePart as keyof DatePartDeltas] || 1;\n\n const spinAmount = isDecrement\n ? -Math.abs(effectiveDelta)\n : Math.abs(effectiveDelta);\n\n return this._spinDatePart(datePart, spinAmount);\n }\n\n /**\n * Spins a specific date part by the given delta.\n */\n private _spinDatePart(datePart: DatePart, delta: number): Date {\n if (!isValidDate(this.value)) {\n return new Date();\n }\n\n const newDate = new Date(this.value.getTime());\n const partType = datePart as unknown as DateParts;\n\n // Get the part instance from the parser, or create one for explicit spin operations\n let part = this._parser.getPartByType(partType);\n if (!part) {\n // For explicit spin operations (e.g., stepDown(DatePart.Minutes)),\n // create a temporary part even if not in the format\n part = createDatePart(partType, { start: 0, end: 0, format: '' });\n }\n\n // For AM/PM, we need to extract the current AM/PM value from the mask\n let amPmValue: string | undefined;\n if (datePart === DatePart.AmPm) {\n const formatPart = this._parser.getPartByType(DateParts.AmPm);\n if (formatPart) {\n amPmValue = this._maskedValue.substring(\n formatPart.start,\n formatPart.end\n );\n }\n }\n\n part.spin(delta, {\n date: newDate,\n spinLoop: this.spinLoop,\n amPmValue,\n originalDate: this.value,\n });\n\n return newDate;\n }\n\n /**\n * Updates the default display format based on current locale.\n */\n private _updateDefaultDisplayFormat(): void {\n this._defaultDisplayFormat = getDateFormatter().getLocaleDateTimeFormat(\n this.locale\n );\n }\n\n /**\n * Applies a mask pattern to the input, parsing the format string into date parts.\n */\n private _applyMask(formatString: string): void {\n const previous = this._parser.mask;\n this._parser.mask = formatString;\n\n // Update placeholder if not set or if it matches the old format\n if (!this.placeholder || previous === this.placeholder) {\n this.placeholder = this._parser.mask;\n }\n }\n\n /**\n * Builds the masked value string from the current date value.\n * Returns empty mask if no value, or existing masked value if incomplete.\n */\n private _buildMaskedValue(): string {\n return isValidDate(this.value)\n ? this._parser.formatDate(this.value)\n : this._maskedValue || this._parser.emptyMask;\n }\n\n protected _initializeDefaultMask(): void {\n this._updateDefaultDisplayFormat();\n\n if (!this._inputFormat) {\n this._applyMask(getDefaultDateTimeFormat(this.locale));\n }\n }\n\n /**\n * Gets the date part at the current cursor position.\n * Uses inclusive end to handle cursor at the end of the last part.\n * Returns undefined if cursor is not within a valid date part.\n */\n private _getDatePartAtCursor(): DatePart | undefined {\n return this._parser.getDatePartForCursor(this._inputSelection.start)\n ?.type as DatePart | undefined;\n }\n\n /**\n * Gets the default date part to target when the input is not focused.\n * Prioritizes: Date > Hours > First available part\n */\n private _getDefaultDatePart(): DatePart | undefined {\n return (this._parser.getPartByType(DateParts.Date)?.type ??\n this._parser.getPartByType(DateParts.Hours)?.type ??\n this._parser.getFirstDatePart()?.type) as DatePart | undefined;\n }\n\n /**\n * Checks if all mask positions are filled (no prompt characters remain).\n */\n private _isMaskComplete(): boolean {\n return !this._maskedValue.includes(this.prompt);\n }\n\n /**\n * Updates the internal value based on the current masked input.\n * Only sets a value if the mask is complete and parses to a valid date.\n */\n private _updateValueFromMask(): void {\n if (!this._isMaskComplete()) {\n this.value = null;\n return;\n }\n\n const parsedDate = this._parser.parseDate(this._maskedValue);\n this.value = isValidDate(parsedDate) ? parsedDate : null;\n }\n\n //#endregion\n\n //#region Public API\n\n /** Increments a date/time portion. */\n public stepUp(datePart?: DatePart, delta?: number): void {\n this._performStep(datePart, delta, false);\n }\n\n /** Decrements a date/time portion. */\n public stepDown(datePart?: DatePart, delta?: number): void {\n this._performStep(datePart, delta, true);\n }\n\n /** Clears the input element of user input. */\n public clear(): void {\n this._maskedValue = '';\n this.value = null;\n }\n\n /* blazorSuppress */\n /**\n * Checks whether the current format includes date parts (day, month, year).\n * @internal\n */\n public hasDateParts(): boolean {\n return this._parser.hasDateParts();\n }\n\n /* blazorSuppress */\n /**\n * Checks whether the current format includes time parts (hours, minutes, seconds).\n * @internal\n */\n public hasTimeParts(): boolean {\n return this._parser.hasTimeParts();\n }\n\n //#endregion\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=${this.placeholder || this._parser.emptyMask}\n ?readonly=${this.readOnly}\n ?disabled=${this.disabled}\n @blur=${this._handleBlur}\n @focus=${this._handleFocus}\n @input=${this._handleInput}\n @wheel=${this._handleWheel}\n @keydown=${this._setMaskSelection}\n @click=${this._handleClick}\n @cut=${this._setMaskSelection}\n @compositionstart=${this._handleCompositionStart}\n @compositionend=${this._handleCompositionEnd}\n @dragenter=${this._handleDragEnter}\n @dragleave=${this._handleDragLeave}\n @dragstart=${this._setMaskSelection}\n />\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-date-time-input': IgcDateTimeInputComponent;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"date-time-input.js","sourceRoot":"","sources":["../../../src/components/date-time-input/date-time-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { property } from 'lit/decorators.js';\nimport { addThemingController } from '../../theming/theming-controller.js';\nimport { convertToDate, isValidDate } from '../calendar/helpers.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport { formatDisplayDate } from '../common/i18n/i18n-controller.js';\nimport { FormValueDateTimeTransformers } from '../common/mixins/forms/form-transformers.js';\nimport { createFormValueState } from '../common/mixins/forms/form-value.js';\nimport { equal } from '../common/util.js';\nimport { styles } from '../input/themes/input.base.css.js';\nimport { styles as shared } from '../input/themes/shared/input.common.css.js';\nimport { all } from '../input/themes/themes.js';\nimport IgcValidationContainerComponent from '../validation-container/validation-container.js';\nimport {\n DatePart,\n type DatePartDeltas,\n DEFAULT_DATE_PARTS_SPIN_DELTAS,\n} from './date-part.js';\nimport {\n IgcDateTimeInputBaseComponent,\n type IgcDateTimeInputComponentEventMap,\n} from './date-time-input.base.js';\nimport {\n createDatePart,\n DateParts,\n DateTimeMaskParser,\n} from './datetime-mask-parser.js';\nimport { dateTimeInputValidators } from './validators.js';\n\n/**\n * A date time input is an input field that lets you set and edit the date and time in a chosen input element\n * using customizable display and input formats.\n *\n * @element igc-date-time-input\n *\n * @slot prefix - Renders content before the input.\n * @slot suffix - Renders content after input.\n * @slot helper-text - Renders content below the input.\n * @slot value-missing - Renders content when the required validation fails.\n * @slot range-overflow - Renders content when the max validation fails.\n * @slot range-underflow - Renders content when the min 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 input receives user input.\n * @fires igcChange - Emitted when the control's checked state changes.\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 interface IgcDateTimeInputEventMap extends Omit<\n IgcDateTimeInputComponentEventMap,\n 'igcChange'\n> {\n igcChange: CustomEvent<Date | null>;\n}\n\nexport default class IgcDateTimeInputComponent extends IgcDateTimeInputBaseComponent {\n public static readonly tagName = 'igc-date-time-input';\n public static styles = [styles, shared];\n\n /* blazorSuppress */\n public static register(): void {\n registerComponent(\n IgcDateTimeInputComponent,\n IgcValidationContainerComponent\n );\n }\n\n //#region Private state and properties\n\n protected override readonly _themes = addThemingController(this, all);\n protected override readonly _parser = new DateTimeMaskParser();\n protected override readonly _formValue = createFormValueState(this, {\n initialValue: null,\n transformers: FormValueDateTimeTransformers,\n });\n\n protected override get __validators() {\n return dateTimeInputValidators;\n }\n\n protected override get _datePartDeltas(): DatePartDeltas {\n return { ...DEFAULT_DATE_PARTS_SPIN_DELTAS, ...this.spinDelta };\n }\n\n protected _oldValue: Date | null = null;\n\n //#endregion\n\n //#region Public attributes and properties\n\n /* @tsTwoWayProperty(true, \"igcChange\", \"detail\", false) */\n /**\n * The value of the input.\n * @attr\n */\n @property({ converter: convertToDate })\n public set value(value: Date | string | null | undefined) {\n this._formValue.setValueAndFormState(value as Date | null);\n this._updateMaskDisplay();\n }\n\n public get value(): Date | null {\n return this._formValue.value;\n }\n\n //#endregion\n\n //#region Event handlers\n\n protected async _handleFocus(): Promise<void> {\n this._focused = true;\n\n if (this.readOnly) {\n return;\n }\n\n this._oldValue = this.value;\n\n if (!this.value) {\n this._maskedValue = this._parser.emptyMask;\n await this.updateComplete;\n this.select();\n } else if (this.displayFormat !== this.inputFormat) {\n this._updateMaskDisplay();\n }\n }\n\n protected override _handleBlur(): void {\n this._focused = false;\n\n // Handle incomplete mask input\n if (!(this._isMaskComplete() || this._isEmptyMask)) {\n const parsedDate = this._parser.parseDate(this._maskedValue);\n\n if (parsedDate) {\n this.value = parsedDate;\n } else {\n this.clear();\n }\n } else {\n this._updateMaskDisplay();\n }\n\n // Emit change event if value changed\n if (!this.readOnly && !equal(this._oldValue, this.value)) {\n this.emitEvent('igcChange', { detail: this.value });\n }\n\n super._handleBlur();\n }\n\n //#endregion\n\n //#region Navigation\n\n /**\n * Calculates the new cursor position when navigating between date parts.\n * direction = 0: navigate to start of previous part\n * direction = 1: navigate to start of next part\n */\n protected override _calculatePartNavigationPosition(\n inputValue: string,\n direction: number\n ): number {\n const cursorPos = this._maskSelection.start;\n const dateParts = this._parser.dateParts;\n\n if (direction === 0) {\n // Navigate backwards: find last literal before cursor\n const part = dateParts.findLast(\n (part) => part.type === DateParts.Literal && part.end < cursorPos\n );\n return part?.end ?? 0;\n }\n\n // Navigate forwards: find first literal after cursor\n const part = dateParts.find(\n (part) => part.type === DateParts.Literal && part.start > cursorPos\n );\n return part?.start ?? inputValue.length;\n }\n\n //#endregion\n\n //#region Internal API\n\n /**\n * Gets the date part at the current cursor position.\n * Uses inclusive end to handle cursor at the end of the last part.\n * Returns undefined if cursor is not within a valid date part.\n */\n protected override _getDatePartAtCursor(): DatePart | undefined {\n return this._parser.getDatePartForCursor(this._inputSelection.start)\n ?.type as DatePart | undefined;\n }\n\n /**\n * Gets the default date part to target when the input is not focused.\n * Prioritizes: Date > Hours > First available part\n */\n protected override _getDefaultDatePart(): DatePart | undefined {\n return (this._parser.getPartByType(DateParts.Date)?.type ??\n this._parser.getPartByType(DateParts.Hours)?.type ??\n this._parser.getFirstDatePart()?.type) as DatePart | undefined;\n }\n\n /**\n * Builds the masked value string from the current date value.\n * Returns empty mask if no value, or existing masked value if incomplete.\n */\n protected override _buildMaskedValue(): string {\n return isValidDate(this.value)\n ? this._parser.formatDate(this.value)\n : this._maskedValue || this._parser.emptyMask;\n }\n\n /**\n * Builds the formatted display value shown when the input is not focused.\n */\n protected override _buildDisplayValue(): string {\n return isValidDate(this.value)\n ? formatDisplayDate(this.value, this.locale, this.displayFormat)\n : '';\n }\n\n /**\n * Commits a value produced by spinning a date part.\n */\n protected override _commitSpunValue(value: unknown): void {\n this.value = value as Date;\n }\n\n /**\n * Sets the value to the current date/time.\n */\n protected override _setCurrentDateTime(): void {\n this.value = new Date();\n this._emitInputEvent();\n }\n\n /**\n * Emits an `igcInput` event whose `detail` is the parsed value as an ISO\n * string (preserving the legacy contract for this component).\n */\n protected override _emitInputEvent(): void {\n this._setTouchedState();\n this.emitEvent('igcInput', { detail: this.value?.toISOString() });\n }\n\n /**\n * Calculates the new date value after spinning a date part.\n */\n protected override _calculateSpunValue(\n datePart: DatePart,\n delta: number | undefined,\n isDecrement: boolean\n ): Date {\n // Default to 1 if delta is 0 or undefined\n const effectiveDelta =\n delta || this._datePartDeltas[datePart as keyof DatePartDeltas] || 1;\n\n const spinAmount = isDecrement\n ? -Math.abs(effectiveDelta)\n : Math.abs(effectiveDelta);\n\n return this._spinDatePart(datePart, spinAmount);\n }\n\n /**\n * Spins a specific date part by the given delta.\n */\n protected _spinDatePart(datePart: DatePart, delta: number): Date {\n if (!isValidDate(this.value)) {\n return new Date();\n }\n\n const newDate = new Date(this.value.getTime());\n const partType = datePart as unknown as DateParts;\n\n // Get the part instance from the parser, or create one for explicit spin operations\n let part = this._parser.getPartByType(partType);\n if (!part) {\n // For explicit spin operations (e.g., stepDown(DatePart.Minutes)),\n // create a temporary part even if not in the format\n part = createDatePart(partType, { start: 0, end: 0, format: '' });\n }\n\n // For AM/PM, we need to extract the current AM/PM value from the mask\n let amPmValue: string | undefined;\n if (datePart === DatePart.AmPm) {\n const formatPart = this._parser.getPartByType(DateParts.AmPm);\n if (formatPart) {\n amPmValue = this._maskedValue.substring(\n formatPart.start,\n formatPart.end\n );\n }\n }\n\n part.spin(delta, {\n date: newDate,\n spinLoop: this.spinLoop,\n amPmValue,\n originalDate: this.value,\n });\n\n return newDate;\n }\n\n /**\n * Updates the internal value based on the current masked input.\n * Only sets a value if the mask is complete and parses to a valid date.\n */\n protected override _syncValueFromMask(): void {\n if (!this._isMaskComplete()) {\n this.value = null;\n return;\n }\n\n const parsedDate = this._parser.parseDate(this._maskedValue);\n this.value = isValidDate(parsedDate) ? parsedDate : null;\n }\n\n //#endregion\n\n //#region Public API\n\n /** Increments a date/time portion. */\n public override stepUp(datePart?: DatePart, delta?: number): void {\n super.stepUp(datePart, delta);\n }\n\n /** Decrements a date/time portion. */\n public override stepDown(datePart?: DatePart, delta?: number): void {\n super.stepDown(datePart, delta);\n }\n\n /** Clears the input element of user input. */\n public override clear(): void {\n this._maskedValue = '';\n this.value = null;\n }\n\n /* blazorSuppress */\n /**\n * Checks whether the current format includes date parts (day, month, year).\n * @internal\n */\n public override hasDateParts(): boolean {\n return this._parser.hasDateParts();\n }\n\n /* blazorSuppress */\n /**\n * Checks whether the current format includes time parts (hours, minutes, seconds).\n * @internal\n */\n public override hasTimeParts(): boolean {\n return this._parser.hasTimeParts();\n }\n\n //#endregion\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-date-time-input': IgcDateTimeInputComponent;\n }\n}\n"]}
|
|
@@ -20,6 +20,12 @@ export interface DateTimeMaskOptions {
|
|
|
20
20
|
/** The prompt character for unfilled positions */
|
|
21
21
|
promptCharacter?: string;
|
|
22
22
|
}
|
|
23
|
+
/** Maps format characters to their corresponding DatePartType */
|
|
24
|
+
export declare const FORMAT_CHAR_TO_DATE_PART: Map<string, DatePartType>;
|
|
25
|
+
/** Set of valid date/time format characters */
|
|
26
|
+
export declare const DATE_FORMAT_CHARS: Set<string>;
|
|
27
|
+
/** Default date/time format */
|
|
28
|
+
export declare const DEFAULT_DATETIME_FORMAT = "MM/dd/yyyy";
|
|
23
29
|
/**
|
|
24
30
|
* A specialized mask parser for date/time input fields.
|
|
25
31
|
* Extends MaskParser to handle date-specific format patterns and validation.
|
|
@@ -133,6 +139,10 @@ export declare class DateTimeMaskParser extends MaskParser {
|
|
|
133
139
|
/**
|
|
134
140
|
* Converts a date format string to a mask format string.
|
|
135
141
|
* Date format chars become '0' (numeric) or 'L' (alpha for AM/PM).
|
|
142
|
+
* This is a static utility that can be reused by other parsers.
|
|
143
|
+
*
|
|
144
|
+
* @param dateFormat - The date format string to convert (e.g., 'MM/dd/yyyy')
|
|
145
|
+
* @returns The mask format string (e.g., '00/00/0000')
|
|
136
146
|
*/
|
|
137
|
-
|
|
147
|
+
static convertDateFormatToMaskFormat(dateFormat: string): string;
|
|
138
148
|
}
|
|
@@ -2,7 +2,7 @@ import { asNumber, clamp } from '../common/util.js';
|
|
|
2
2
|
import { MaskParser } from '../mask-input/mask-parser.js';
|
|
3
3
|
import { createDatePart, DatePartType } from './date-part.js';
|
|
4
4
|
export { createDatePart, DatePartType as DateParts };
|
|
5
|
-
const FORMAT_CHAR_TO_DATE_PART = new Map([
|
|
5
|
+
export const FORMAT_CHAR_TO_DATE_PART = new Map([
|
|
6
6
|
['d', DatePartType.Date],
|
|
7
7
|
['D', DatePartType.Date],
|
|
8
8
|
['M', DatePartType.Month],
|
|
@@ -16,7 +16,7 @@ const FORMAT_CHAR_TO_DATE_PART = new Map([
|
|
|
16
16
|
['t', DatePartType.AmPm],
|
|
17
17
|
['T', DatePartType.AmPm],
|
|
18
18
|
]);
|
|
19
|
-
const DATE_FORMAT_CHARS = new Set(FORMAT_CHAR_TO_DATE_PART.keys());
|
|
19
|
+
export const DATE_FORMAT_CHARS = new Set(FORMAT_CHAR_TO_DATE_PART.keys());
|
|
20
20
|
const CENTURY_THRESHOLD = 50;
|
|
21
21
|
const CENTURY_BASE = 2000;
|
|
22
22
|
const DEFAULT_DATE_VALUES = {
|
|
@@ -27,7 +27,7 @@ const DEFAULT_DATE_VALUES = {
|
|
|
27
27
|
minutes: 0,
|
|
28
28
|
seconds: 0,
|
|
29
29
|
};
|
|
30
|
-
const DEFAULT_DATETIME_FORMAT = 'MM/dd/yyyy';
|
|
30
|
+
export const DEFAULT_DATETIME_FORMAT = 'MM/dd/yyyy';
|
|
31
31
|
export class DateTimeMaskParser extends MaskParser {
|
|
32
32
|
get dateParts() {
|
|
33
33
|
return this._dateParts;
|
|
@@ -206,14 +206,14 @@ export class DateTimeMaskParser extends MaskParser {
|
|
|
206
206
|
}
|
|
207
207
|
_parseMaskLiterals() {
|
|
208
208
|
const dateFormat = this._options.format;
|
|
209
|
-
const maskFormat =
|
|
209
|
+
const maskFormat = DateTimeMaskParser.convertDateFormatToMaskFormat(dateFormat);
|
|
210
210
|
const originalFormat = this._options.format;
|
|
211
211
|
this._options.format = maskFormat;
|
|
212
212
|
super._parseMaskLiterals();
|
|
213
213
|
this._options.format = originalFormat;
|
|
214
214
|
this._parseDateFormat();
|
|
215
215
|
}
|
|
216
|
-
|
|
216
|
+
static convertDateFormatToMaskFormat(dateFormat) {
|
|
217
217
|
let result = '';
|
|
218
218
|
for (const char of dateFormat) {
|
|
219
219
|
if (DATE_FORMAT_CHARS.has(char)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"datetime-mask-parser.js","sourceRoot":"","sources":["../../../src/components/date-time-input/datetime-mask-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { asNumber, clamp } from '../common/util.js';\nimport { MaskParser } from '../mask-input/mask-parser.js';\nimport { createDatePart, DatePartType, type IDatePart } from './date-part.js';\n\n//#region Types and Enums\n\n/**\n * Types of date/time parts that can appear in a format string.\n * Re-exported from date-part.ts for backward compatibility.\n */\n/**\n * Re-export createDatePart factory for creating standalone parts.\n */\nexport { createDatePart, DatePartType as DateParts };\n\n/**\n * Information about a parsed date part within a format string.\n * This is a type alias for IDatePart for backward compatibility.\n */\nexport type DatePartInfo = IDatePart;\n\n/** Options for the DateTimeMaskParser */\nexport interface DateTimeMaskOptions {\n /** The date/time format string (e.g., 'MM/dd/yyyy', 'HH:mm:ss') */\n format?: string;\n /** The prompt character for unfilled positions */\n promptCharacter?: string;\n}\n\n//#endregion\n\n//#region Constants\n\n/** Maps format characters to their corresponding DatePartType */\nconst FORMAT_CHAR_TO_DATE_PART = new Map<string, DatePartType>([\n ['d', DatePartType.Date],\n ['D', DatePartType.Date],\n ['M', DatePartType.Month],\n ['y', DatePartType.Year],\n ['Y', DatePartType.Year],\n ['h', DatePartType.Hours],\n ['H', DatePartType.Hours],\n ['m', DatePartType.Minutes],\n ['s', DatePartType.Seconds],\n ['S', DatePartType.Seconds],\n ['t', DatePartType.AmPm],\n ['T', DatePartType.AmPm],\n]);\n\n/** Set of valid date/time format characters */\nconst DATE_FORMAT_CHARS = new Set(FORMAT_CHAR_TO_DATE_PART.keys());\n\n/** Century threshold for two-digit year interpretation */\nconst CENTURY_THRESHOLD = 50;\nconst CENTURY_BASE = 2000;\n\n/** Default values for missing date parts */\nconst DEFAULT_DATE_VALUES = {\n year: 2000,\n month: 0,\n date: 1,\n hours: 0,\n minutes: 0,\n seconds: 0,\n} as const;\n\n/** Default date/time format */\nconst DEFAULT_DATETIME_FORMAT = 'MM/dd/yyyy';\n\n//#endregion\n\n/**\n * A specialized mask parser for date/time input fields.\n * Extends MaskParser to handle date-specific format patterns and validation.\n *\n * @example\n * ```ts\n * const parser = new DateTimeMaskParser({ format: 'MM/dd/yyyy' });\n * parser.apply('12252023'); // Returns '12/25/2023'\n * parser.parseDate('12/25/2023'); // Returns Date object\n * ```\n */\nexport class DateTimeMaskParser extends MaskParser {\n /** Parsed date parts from the format string */\n private _dateParts!: IDatePart[];\n\n /**\n * Gets the parsed date parts from the format string.\n * Each part contains type, position, and format information.\n */\n public get dateParts(): ReadonlyArray<IDatePart> {\n return this._dateParts;\n }\n\n constructor(options?: DateTimeMaskOptions) {\n const format = options?.format || DEFAULT_DATETIME_FORMAT;\n\n super(\n options?.promptCharacter\n ? { format, promptCharacter: options.promptCharacter }\n : { format }\n );\n }\n\n /**\n * Sets a new date/time format and re-parses the date parts.\n */\n public override set mask(value: string) {\n super.mask = value;\n this._parseDateFormat();\n }\n\n public override get mask(): string {\n return super.mask;\n }\n\n //#region Date Format Parsing\n\n /**\n * Parses the format string into IDatePart objects.\n * This identifies each date/time component and its position.\n */\n private _parseDateFormat(): void {\n const format = this.mask;\n const builders: Array<{\n type: DatePartType;\n start: number;\n end: number;\n format: string;\n }> = [];\n const chars = Array.from(format);\n const length = chars.length;\n\n let currentBuilder: (typeof builders)[0] | null = null;\n let position = 0;\n\n for (let i = 0; i < length; i++, position++) {\n const char = chars[i];\n const partType = FORMAT_CHAR_TO_DATE_PART.get(char);\n\n if (partType) {\n // Date/time format character\n if (currentBuilder?.format.includes(char)) {\n // Continue building the same part\n currentBuilder.end = position + 1;\n currentBuilder.format += char;\n } else {\n // Start a new part\n if (currentBuilder) {\n builders.push(currentBuilder);\n }\n currentBuilder = {\n type: partType,\n start: position,\n end: position + 1,\n format: char,\n };\n }\n } else {\n // Literal character\n if (currentBuilder) {\n builders.push(currentBuilder);\n currentBuilder = null;\n }\n builders.push({\n type: DatePartType.Literal,\n start: position,\n end: position + 1,\n format: char,\n });\n }\n }\n\n // Don't forget the last part\n if (currentBuilder) {\n builders.push(currentBuilder);\n }\n\n // Normalize year format for editing (except 'yy')\n this._normalizeYearFormatBuilder(builders);\n\n // Create immutable date parts from builders using factory\n this._dateParts = builders.map((b) =>\n createDatePart(b.type, { start: b.start, end: b.end, format: b.format })\n );\n }\n\n /**\n * Normalizes year format to 'yyyy' for editing (except for 'yy').\n * Also updates the end position to account for the expanded format.\n */\n private _normalizeYearFormatBuilder(\n builders: Array<{ type: DatePartType; end: number; format: string }>\n ): void {\n const yearBuilder = builders.find((b) => b.type === DatePartType.Year);\n if (yearBuilder && yearBuilder.format.length !== 2) {\n const expansion = 4 - yearBuilder.format.length;\n yearBuilder.end += expansion;\n yearBuilder.format = 'yyyy';\n }\n }\n\n //#endregion\n\n //#region Date Parsing\n\n /**\n * Parses a masked string into a Date object.\n * Returns null if the string cannot be parsed into a valid date.\n *\n * @param masked - The masked input string to parse\n * @returns A Date object or null if parsing fails\n */\n public parseDate(masked: string): Date | null {\n const parts = this._extractDateValues(masked);\n\n // Convert to zero-based month (only if month is in format)\n if (parts[DatePartType.Month] !== undefined) {\n parts[DatePartType.Month]! -= 1;\n }\n\n // Apply century threshold for two-digit years (only if year is in format)\n if (\n parts[DatePartType.Year] !== undefined &&\n parts[DatePartType.Year]! < CENTURY_THRESHOLD\n ) {\n parts[DatePartType.Year]! += CENTURY_BASE;\n }\n\n if (!this._validateDateParts(parts)) {\n return null;\n }\n\n // Handle AM/PM conversion\n this._applyAmPmConversion(parts, masked);\n\n return this._createDateFromParts(parts);\n }\n\n /**\n * Extracts numeric values from the masked string for each date part.\n */\n private _extractDateValues(\n masked: string\n ): Partial<Record<DatePartType, number>> {\n const parts: Partial<Record<DatePartType, number>> = {};\n const prompt = this.prompt;\n\n for (const datePart of this._dateParts) {\n if (datePart.type === DatePartType.Literal) continue;\n\n const isMonthOrDate =\n datePart.type === DatePartType.Date ||\n datePart.type === DatePartType.Month;\n\n const raw = masked.substring(datePart.start, datePart.end);\n const cleaned = raw.replaceAll(prompt, '');\n const value = asNumber(cleaned);\n\n parts[datePart.type] = clamp(\n value,\n isMonthOrDate ? 1 : 0,\n Number.MAX_SAFE_INTEGER\n );\n }\n\n return parts;\n }\n\n /**\n * Validates that parsed date parts are within valid ranges.\n * Only validates parts that are present in the format.\n * Uses the validate() method on each date part instance.\n */\n private _validateDateParts(\n parts: Partial<Record<DatePartType, number>>\n ): boolean {\n // Build validation context for date-dependent validation\n const context = {\n year: parts[DatePartType.Year],\n month: parts[DatePartType.Month],\n };\n\n // Validate each parsed value using its corresponding part instance\n for (const datePart of this._dateParts) {\n if (datePart.type === DatePartType.Literal) continue;\n\n const value = parts[datePart.type];\n if (value === undefined) continue;\n\n if (!datePart.validate(value, context)) {\n return false;\n }\n }\n\n // Additional check: validate date against month/year context\n // (the part's validate method needs both year and month for proper validation)\n if (\n parts[DatePartType.Date] !== undefined &&\n parts[DatePartType.Month] !== undefined &&\n parts[DatePartType.Year] !== undefined\n ) {\n if (\n parts[DatePartType.Date]! >\n this._daysInMonth(parts[DatePartType.Year]!, parts[DatePartType.Month]!)\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Applies AM/PM conversion to hours if format includes AM/PM.\n */\n private _applyAmPmConversion(\n parts: Partial<Record<DatePartType, number>>,\n masked: string\n ): void {\n const amPmPart = this._dateParts.find((p) => p.type === DatePartType.AmPm);\n if (!amPmPart) return;\n\n parts[DatePartType.Hours]! %= 12;\n\n const amPmValue = masked\n .substring(amPmPart.start, amPmPart.end)\n .replaceAll(this.prompt, '');\n\n if (amPmValue.toLowerCase() === 'pm') {\n parts[DatePartType.Hours]! += 12;\n }\n }\n\n /**\n * Creates a Date object from parsed parts with defaults for missing values.\n */\n private _createDateFromParts(\n parts: Partial<Record<DatePartType, number>>\n ): Date {\n const d = DEFAULT_DATE_VALUES;\n return new Date(\n parts[DatePartType.Year] ?? d.year,\n parts[DatePartType.Month] ?? d.month,\n parts[DatePartType.Date] ?? d.date,\n parts[DatePartType.Hours] ?? d.hours,\n parts[DatePartType.Minutes] ?? d.minutes,\n parts[DatePartType.Seconds] ?? d.seconds\n );\n }\n\n /**\n * Gets the number of days in a specific month/year.\n */\n private _daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n }\n\n //#endregion\n\n //#region Date Formatting\n\n /**\n * Formats a Date object into a masked string according to the current format.\n *\n * @param date - The date to format\n * @returns The formatted masked string\n */\n public formatDate(date: Date | null): string {\n return date\n ? this._dateParts.map((part) => part.getValue(date)).join('')\n : this.emptyMask;\n }\n\n //#endregion\n\n //#region Part Queries\n\n /**\n * Finds the date part at a given cursor position.\n * Uses exclusive end (position < end) for precise character targeting.\n *\n * @param position - The cursor position to check\n * @returns The DatePartInfo at that position, or undefined if not found\n */\n public getDatePartAtPosition(position: number): DatePartInfo | undefined {\n return this._dateParts.find(\n (p) =>\n p.type !== DatePartType.Literal &&\n position >= p.start &&\n position < p.end\n );\n }\n\n /**\n * Finds the date part for a cursor position, using inclusive end.\n * This handles the edge case where cursor is at the end of the mask\n * (position equals the end of the last part).\n *\n * @param position - The cursor position to check\n * @returns The DatePartInfo at that position, or undefined if not found\n */\n public getDatePartForCursor(position: number): DatePartInfo | undefined {\n return this._dateParts.find(\n (p) =>\n p.type !== DatePartType.Literal &&\n position >= p.start &&\n position <= p.end\n );\n }\n\n /**\n * Checks if the format includes any date parts (day, month, year).\n */\n public hasDateParts(): boolean {\n return this._dateParts.some(\n (p) =>\n p.type === DatePartType.Date ||\n p.type === DatePartType.Month ||\n p.type === DatePartType.Year\n );\n }\n\n /**\n * Checks if the format includes any time parts (hours, minutes, seconds).\n */\n public hasTimeParts(): boolean {\n return this._dateParts.some(\n (p) =>\n p.type === DatePartType.Hours ||\n p.type === DatePartType.Minutes ||\n p.type === DatePartType.Seconds\n );\n }\n\n /**\n * Gets the first non-literal date part (useful for default selection).\n */\n public getFirstDatePart(): DatePartInfo | undefined {\n return this._dateParts.find((p) => p.type !== DatePartType.Literal);\n }\n\n /**\n * Gets a specific type of date part.\n */\n public getPartByType(type: DatePartType): DatePartInfo | undefined {\n return this._dateParts.find((p) => p.type === type);\n }\n\n //#endregion\n\n //#region Override for Date-Specific Mask\n\n /**\n * Builds the internal mask pattern from the date format.\n * Converts date format characters to mask pattern characters.\n */\n protected override _parseMaskLiterals(): void {\n // First, convert date format to mask format\n const dateFormat = this._options.format;\n const maskFormat = this._convertToMaskFormat(dateFormat);\n\n // Temporarily set the converted format for the base class parsing\n const originalFormat = this._options.format;\n this._options.format = maskFormat;\n\n super._parseMaskLiterals();\n\n // Restore the original date format\n this._options.format = originalFormat;\n\n // Parse date-specific format structure\n this._parseDateFormat();\n }\n\n /**\n * Converts a date format string to a mask format string.\n * Date format chars become '0' (numeric) or 'L' (alpha for AM/PM).\n */\n private _convertToMaskFormat(dateFormat: string): string {\n let result = '';\n\n for (const char of dateFormat) {\n if (DATE_FORMAT_CHARS.has(char)) {\n // AM/PM markers are alphabetic, others are numeric\n result += char === 't' || char === 'T' ? 'L' : '0';\n } else {\n result += char;\n }\n }\n\n return result;\n }\n\n //#endregion\n}\n"]}
|
|
1
|
+
{"version":3,"file":"datetime-mask-parser.js","sourceRoot":"","sources":["../../../src/components/date-time-input/datetime-mask-parser.ts"],"names":[],"mappings":"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","sourcesContent":["import { asNumber, clamp } from '../common/util.js';\nimport { MaskParser } from '../mask-input/mask-parser.js';\nimport { createDatePart, DatePartType, type IDatePart } from './date-part.js';\n\n//#region Types and Enums\n\n/**\n * Types of date/time parts that can appear in a format string.\n * Re-exported from date-part.ts for backward compatibility.\n */\n/**\n * Re-export createDatePart factory for creating standalone parts.\n */\nexport { createDatePart, DatePartType as DateParts };\n\n/**\n * Information about a parsed date part within a format string.\n * This is a type alias for IDatePart for backward compatibility.\n */\nexport type DatePartInfo = IDatePart;\n\n/** Options for the DateTimeMaskParser */\nexport interface DateTimeMaskOptions {\n /** The date/time format string (e.g., 'MM/dd/yyyy', 'HH:mm:ss') */\n format?: string;\n /** The prompt character for unfilled positions */\n promptCharacter?: string;\n}\n\n//#endregion\n\n//#region Constants\n\n/** Maps format characters to their corresponding DatePartType */\nexport const FORMAT_CHAR_TO_DATE_PART = new Map<string, DatePartType>([\n ['d', DatePartType.Date],\n ['D', DatePartType.Date],\n ['M', DatePartType.Month],\n ['y', DatePartType.Year],\n ['Y', DatePartType.Year],\n ['h', DatePartType.Hours],\n ['H', DatePartType.Hours],\n ['m', DatePartType.Minutes],\n ['s', DatePartType.Seconds],\n ['S', DatePartType.Seconds],\n ['t', DatePartType.AmPm],\n ['T', DatePartType.AmPm],\n]);\n\n/** Set of valid date/time format characters */\nexport const DATE_FORMAT_CHARS = new Set(FORMAT_CHAR_TO_DATE_PART.keys());\n\n/** Century threshold for two-digit year interpretation */\nconst CENTURY_THRESHOLD = 50;\nconst CENTURY_BASE = 2000;\n\n/** Default values for missing date parts */\nconst DEFAULT_DATE_VALUES = {\n year: 2000,\n month: 0,\n date: 1,\n hours: 0,\n minutes: 0,\n seconds: 0,\n} as const;\n\n/** Default date/time format */\nexport const DEFAULT_DATETIME_FORMAT = 'MM/dd/yyyy';\n\n//#endregion\n\n/**\n * A specialized mask parser for date/time input fields.\n * Extends MaskParser to handle date-specific format patterns and validation.\n *\n * @example\n * ```ts\n * const parser = new DateTimeMaskParser({ format: 'MM/dd/yyyy' });\n * parser.apply('12252023'); // Returns '12/25/2023'\n * parser.parseDate('12/25/2023'); // Returns Date object\n * ```\n */\nexport class DateTimeMaskParser extends MaskParser {\n /** Parsed date parts from the format string */\n private _dateParts!: IDatePart[];\n\n /**\n * Gets the parsed date parts from the format string.\n * Each part contains type, position, and format information.\n */\n public get dateParts(): ReadonlyArray<IDatePart> {\n return this._dateParts;\n }\n\n constructor(options?: DateTimeMaskOptions) {\n const format = options?.format || DEFAULT_DATETIME_FORMAT;\n\n super(\n options?.promptCharacter\n ? { format, promptCharacter: options.promptCharacter }\n : { format }\n );\n }\n\n /**\n * Sets a new date/time format and re-parses the date parts.\n */\n public override set mask(value: string) {\n super.mask = value;\n this._parseDateFormat();\n }\n\n public override get mask(): string {\n return super.mask;\n }\n\n //#region Date Format Parsing\n\n /**\n * Parses the format string into IDatePart objects.\n * This identifies each date/time component and its position.\n */\n private _parseDateFormat(): void {\n const format = this.mask;\n const builders: Array<{\n type: DatePartType;\n start: number;\n end: number;\n format: string;\n }> = [];\n const chars = Array.from(format);\n const length = chars.length;\n\n let currentBuilder: (typeof builders)[0] | null = null;\n let position = 0;\n\n for (let i = 0; i < length; i++, position++) {\n const char = chars[i];\n const partType = FORMAT_CHAR_TO_DATE_PART.get(char);\n\n if (partType) {\n // Date/time format character\n if (currentBuilder?.format.includes(char)) {\n // Continue building the same part\n currentBuilder.end = position + 1;\n currentBuilder.format += char;\n } else {\n // Start a new part\n if (currentBuilder) {\n builders.push(currentBuilder);\n }\n currentBuilder = {\n type: partType,\n start: position,\n end: position + 1,\n format: char,\n };\n }\n } else {\n // Literal character\n if (currentBuilder) {\n builders.push(currentBuilder);\n currentBuilder = null;\n }\n builders.push({\n type: DatePartType.Literal,\n start: position,\n end: position + 1,\n format: char,\n });\n }\n }\n\n // Don't forget the last part\n if (currentBuilder) {\n builders.push(currentBuilder);\n }\n\n // Normalize year format for editing (except 'yy')\n this._normalizeYearFormatBuilder(builders);\n\n // Create immutable date parts from builders using factory\n this._dateParts = builders.map((b) =>\n createDatePart(b.type, { start: b.start, end: b.end, format: b.format })\n );\n }\n\n /**\n * Normalizes year format to 'yyyy' for editing (except for 'yy').\n * Also updates the end position to account for the expanded format.\n */\n private _normalizeYearFormatBuilder(\n builders: Array<{ type: DatePartType; end: number; format: string }>\n ): void {\n const yearBuilder = builders.find((b) => b.type === DatePartType.Year);\n if (yearBuilder && yearBuilder.format.length !== 2) {\n const expansion = 4 - yearBuilder.format.length;\n yearBuilder.end += expansion;\n yearBuilder.format = 'yyyy';\n }\n }\n\n //#endregion\n\n //#region Date Parsing\n\n /**\n * Parses a masked string into a Date object.\n * Returns null if the string cannot be parsed into a valid date.\n *\n * @param masked - The masked input string to parse\n * @returns A Date object or null if parsing fails\n */\n public parseDate(masked: string): Date | null {\n const parts = this._extractDateValues(masked);\n\n // Convert to zero-based month (only if month is in format)\n if (parts[DatePartType.Month] !== undefined) {\n parts[DatePartType.Month]! -= 1;\n }\n\n // Apply century threshold for two-digit years (only if year is in format)\n if (\n parts[DatePartType.Year] !== undefined &&\n parts[DatePartType.Year]! < CENTURY_THRESHOLD\n ) {\n parts[DatePartType.Year]! += CENTURY_BASE;\n }\n\n if (!this._validateDateParts(parts)) {\n return null;\n }\n\n // Handle AM/PM conversion\n this._applyAmPmConversion(parts, masked);\n\n return this._createDateFromParts(parts);\n }\n\n /**\n * Extracts numeric values from the masked string for each date part.\n */\n private _extractDateValues(\n masked: string\n ): Partial<Record<DatePartType, number>> {\n const parts: Partial<Record<DatePartType, number>> = {};\n const prompt = this.prompt;\n\n for (const datePart of this._dateParts) {\n if (datePart.type === DatePartType.Literal) continue;\n\n const isMonthOrDate =\n datePart.type === DatePartType.Date ||\n datePart.type === DatePartType.Month;\n\n const raw = masked.substring(datePart.start, datePart.end);\n const cleaned = raw.replaceAll(prompt, '');\n const value = asNumber(cleaned);\n\n parts[datePart.type] = clamp(\n value,\n isMonthOrDate ? 1 : 0,\n Number.MAX_SAFE_INTEGER\n );\n }\n\n return parts;\n }\n\n /**\n * Validates that parsed date parts are within valid ranges.\n * Only validates parts that are present in the format.\n * Uses the validate() method on each date part instance.\n */\n private _validateDateParts(\n parts: Partial<Record<DatePartType, number>>\n ): boolean {\n // Build validation context for date-dependent validation\n const context = {\n year: parts[DatePartType.Year],\n month: parts[DatePartType.Month],\n };\n\n // Validate each parsed value using its corresponding part instance\n for (const datePart of this._dateParts) {\n if (datePart.type === DatePartType.Literal) continue;\n\n const value = parts[datePart.type];\n if (value === undefined) continue;\n\n if (!datePart.validate(value, context)) {\n return false;\n }\n }\n\n // Additional check: validate date against month/year context\n // (the part's validate method needs both year and month for proper validation)\n if (\n parts[DatePartType.Date] !== undefined &&\n parts[DatePartType.Month] !== undefined &&\n parts[DatePartType.Year] !== undefined\n ) {\n if (\n parts[DatePartType.Date]! >\n this._daysInMonth(parts[DatePartType.Year]!, parts[DatePartType.Month]!)\n ) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Applies AM/PM conversion to hours if format includes AM/PM.\n */\n private _applyAmPmConversion(\n parts: Partial<Record<DatePartType, number>>,\n masked: string\n ): void {\n const amPmPart = this._dateParts.find((p) => p.type === DatePartType.AmPm);\n if (!amPmPart) return;\n\n parts[DatePartType.Hours]! %= 12;\n\n const amPmValue = masked\n .substring(amPmPart.start, amPmPart.end)\n .replaceAll(this.prompt, '');\n\n if (amPmValue.toLowerCase() === 'pm') {\n parts[DatePartType.Hours]! += 12;\n }\n }\n\n /**\n * Creates a Date object from parsed parts with defaults for missing values.\n */\n private _createDateFromParts(\n parts: Partial<Record<DatePartType, number>>\n ): Date {\n const d = DEFAULT_DATE_VALUES;\n return new Date(\n parts[DatePartType.Year] ?? d.year,\n parts[DatePartType.Month] ?? d.month,\n parts[DatePartType.Date] ?? d.date,\n parts[DatePartType.Hours] ?? d.hours,\n parts[DatePartType.Minutes] ?? d.minutes,\n parts[DatePartType.Seconds] ?? d.seconds\n );\n }\n\n /**\n * Gets the number of days in a specific month/year.\n */\n private _daysInMonth(year: number, month: number): number {\n return new Date(year, month + 1, 0).getDate();\n }\n\n //#endregion\n\n //#region Date Formatting\n\n /**\n * Formats a Date object into a masked string according to the current format.\n *\n * @param date - The date to format\n * @returns The formatted masked string\n */\n public formatDate(date: Date | null): string {\n return date\n ? this._dateParts.map((part) => part.getValue(date)).join('')\n : this.emptyMask;\n }\n\n //#endregion\n\n //#region Part Queries\n\n /**\n * Finds the date part at a given cursor position.\n * Uses exclusive end (position < end) for precise character targeting.\n *\n * @param position - The cursor position to check\n * @returns The DatePartInfo at that position, or undefined if not found\n */\n public getDatePartAtPosition(position: number): DatePartInfo | undefined {\n return this._dateParts.find(\n (p) =>\n p.type !== DatePartType.Literal &&\n position >= p.start &&\n position < p.end\n );\n }\n\n /**\n * Finds the date part for a cursor position, using inclusive end.\n * This handles the edge case where cursor is at the end of the mask\n * (position equals the end of the last part).\n *\n * @param position - The cursor position to check\n * @returns The DatePartInfo at that position, or undefined if not found\n */\n public getDatePartForCursor(position: number): DatePartInfo | undefined {\n return this._dateParts.find(\n (p) =>\n p.type !== DatePartType.Literal &&\n position >= p.start &&\n position <= p.end\n );\n }\n\n /**\n * Checks if the format includes any date parts (day, month, year).\n */\n public hasDateParts(): boolean {\n return this._dateParts.some(\n (p) =>\n p.type === DatePartType.Date ||\n p.type === DatePartType.Month ||\n p.type === DatePartType.Year\n );\n }\n\n /**\n * Checks if the format includes any time parts (hours, minutes, seconds).\n */\n public hasTimeParts(): boolean {\n return this._dateParts.some(\n (p) =>\n p.type === DatePartType.Hours ||\n p.type === DatePartType.Minutes ||\n p.type === DatePartType.Seconds\n );\n }\n\n /**\n * Gets the first non-literal date part (useful for default selection).\n */\n public getFirstDatePart(): DatePartInfo | undefined {\n return this._dateParts.find((p) => p.type !== DatePartType.Literal);\n }\n\n /**\n * Gets a specific type of date part.\n */\n public getPartByType(type: DatePartType): DatePartInfo | undefined {\n return this._dateParts.find((p) => p.type === type);\n }\n\n //#endregion\n\n //#region Override for Date-Specific Mask\n\n /**\n * Builds the internal mask pattern from the date format.\n * Converts date format characters to mask pattern characters.\n */\n protected override _parseMaskLiterals(): void {\n // First, convert date format to mask format\n const dateFormat = this._options.format;\n const maskFormat =\n DateTimeMaskParser.convertDateFormatToMaskFormat(dateFormat);\n\n // Temporarily set the converted format for the base class parsing\n const originalFormat = this._options.format;\n this._options.format = maskFormat;\n\n super._parseMaskLiterals();\n\n // Restore the original date format\n this._options.format = originalFormat;\n\n // Parse date-specific format structure\n this._parseDateFormat();\n }\n //#endregion\n\n //#region Static Utilities\n\n /**\n * Converts a date format string to a mask format string.\n * Date format chars become '0' (numeric) or 'L' (alpha for AM/PM).\n * This is a static utility that can be reused by other parsers.\n *\n * @param dateFormat - The date format string to convert (e.g., 'MM/dd/yyyy')\n * @returns The mask format string (e.g., '00/00/0000')\n */\n public static convertDateFormatToMaskFormat(dateFormat: string): string {\n let result = '';\n\n for (const char of dateFormat) {\n if (DATE_FORMAT_CHARS.has(char)) {\n // AM/PM markers are alphabetic, others are numeric\n result += char === 't' || char === 'T' ? 'L' : '0';\n } else {\n result += char;\n }\n }\n\n return result;\n }\n\n //#endregion\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LitElement } from 'lit';
|
|
1
|
+
import { LitElement, type PropertyValues } from 'lit';
|
|
2
2
|
import type { Constructor } from '../common/mixins/constructor.js';
|
|
3
3
|
export interface IgcDialogComponentEventMap {
|
|
4
4
|
igcClosing: CustomEvent<void>;
|
|
@@ -6,22 +6,41 @@ export interface IgcDialogComponentEventMap {
|
|
|
6
6
|
}
|
|
7
7
|
declare const IgcDialogComponent_base: Constructor<import("../common/mixins/event-emitter.js").EventEmitterInterface<IgcDialogComponentEventMap>> & Constructor<LitElement>;
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
9
|
+
* A modal dialog component built on the native `<dialog>` element.
|
|
10
|
+
*
|
|
11
|
+
* The dialog traps focus while open and blocks interaction with the rest
|
|
12
|
+
* of the page (modal semantics). It supports animated open/close
|
|
13
|
+
* transitions, an optional backdrop overlay, and multiple content areas
|
|
14
|
+
* through named slots.
|
|
15
|
+
*
|
|
16
|
+
* The component integrates with the
|
|
17
|
+
* [Invoker Commands API](https://developer.mozilla.org/en-US/docs/Web/API/Invoker_Commands_API):
|
|
18
|
+
* an Ignite button or a native `<button>` with `command="--show"` / `"--hide"` / `"--toggle"`
|
|
19
|
+
* and `commandfor` pointing to this element will call the corresponding method
|
|
20
|
+
* declaratively without any JavaScript.
|
|
10
21
|
*
|
|
11
22
|
* @element igc-dialog
|
|
12
23
|
*
|
|
13
|
-
* @fires igcClosing -
|
|
14
|
-
*
|
|
24
|
+
* @fires igcClosing - Emitted just before the dialog closes. Cancelable —
|
|
25
|
+
* call `event.preventDefault()` to abort the closing sequence.
|
|
26
|
+
* @fires igcClosed - Emitted after the dialog has fully closed and its
|
|
27
|
+
* exit animation has completed.
|
|
15
28
|
*
|
|
16
|
-
* @slot -
|
|
17
|
-
*
|
|
18
|
-
* @slot
|
|
19
|
-
*
|
|
29
|
+
* @slot - General-purpose content area. Also the target for any
|
|
30
|
+
* `<form method="dialog">` placed inside the dialog.
|
|
31
|
+
* @slot title - Content rendered in the dialog header. Falls back to the
|
|
32
|
+
* `title` attribute when empty.
|
|
33
|
+
* @slot message - A dedicated message/body area rendered above the default
|
|
34
|
+
* slot. Hidden when no content is assigned.
|
|
35
|
+
* @slot footer - Content rendered in the dialog footer. When empty, a
|
|
36
|
+
* default "OK" close button is shown (unless `hide-default-action` is set).
|
|
20
37
|
*
|
|
21
|
-
* @csspart base - The
|
|
22
|
-
* @csspart title - The
|
|
23
|
-
* @csspart
|
|
24
|
-
* @csspart
|
|
38
|
+
* @csspart base - The native `<dialog>` element.
|
|
39
|
+
* @csspart title - The `<header>` element wrapping the title slot.
|
|
40
|
+
* @csspart content - The `<section>` element wrapping the message and default slots.
|
|
41
|
+
* @csspart footer - The `<footer>` element wrapping the footer slot.
|
|
42
|
+
* @csspart backdrop - The decorative backdrop overlay element.
|
|
43
|
+
* @csspart animating - Applied to the backdrop while an animation is running.
|
|
25
44
|
*/
|
|
26
45
|
export default class IgcDialogComponent extends IgcDialogComponent_base {
|
|
27
46
|
static readonly tagName = "igc-dialog";
|
|
@@ -37,50 +56,88 @@ export default class IgcDialogComponent extends IgcDialogComponent_base {
|
|
|
37
56
|
private _animating;
|
|
38
57
|
private get _dialog();
|
|
39
58
|
/**
|
|
40
|
-
*
|
|
59
|
+
* When set, pressing the `Escape` key will not close the dialog.
|
|
60
|
+
*
|
|
61
|
+
* By default the browser closes a modal dialog on `Escape`. Enable this
|
|
62
|
+
* option when the dialog guards unsaved work and should require an explicit
|
|
63
|
+
* user action to dismiss.
|
|
41
64
|
* @attr keep-open-on-escape
|
|
65
|
+
* @default false
|
|
42
66
|
*/
|
|
43
67
|
keepOpenOnEscape: boolean;
|
|
44
68
|
/**
|
|
45
|
-
*
|
|
69
|
+
* When set, clicking on the backdrop area outside the dialog surface
|
|
70
|
+
* will close it (emitting close events).
|
|
71
|
+
*
|
|
72
|
+
* Has no effect when the dialog is not yet open.
|
|
46
73
|
* @attr close-on-outside-click
|
|
74
|
+
* @default false
|
|
47
75
|
*/
|
|
48
76
|
closeOnOutsideClick: boolean;
|
|
49
77
|
/**
|
|
50
|
-
*
|
|
78
|
+
* When set, the built-in "OK" close button in the footer is not rendered.
|
|
51
79
|
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
80
|
+
* Has no effect when content is projected into the `footer` slot, since
|
|
81
|
+
* the slot content replaces the default button entirely.
|
|
54
82
|
* @attr hide-default-action
|
|
83
|
+
* @default false
|
|
55
84
|
*/
|
|
56
85
|
hideDefaultAction: boolean;
|
|
57
86
|
/**
|
|
58
|
-
* Whether the dialog is
|
|
59
|
-
*
|
|
87
|
+
* Whether the dialog is open.
|
|
88
|
+
*
|
|
89
|
+
* Setting this property programmatically will open or close the dialog
|
|
90
|
+
* without animation and without emitting close events.
|
|
91
|
+
* Prefer the `show()`, `hide()`, and `toggle()` methods for animated
|
|
92
|
+
* transitions.
|
|
93
|
+
* @attr open
|
|
94
|
+
* @default false
|
|
60
95
|
*/
|
|
61
96
|
open: boolean;
|
|
62
97
|
/**
|
|
63
|
-
*
|
|
64
|
-
*
|
|
98
|
+
* The title displayed in the dialog header.
|
|
99
|
+
*
|
|
100
|
+
* Overridden by any content projected into the `title` slot.
|
|
101
|
+
* @attr title
|
|
65
102
|
*/
|
|
66
103
|
title: string;
|
|
67
|
-
/**
|
|
68
|
-
|
|
104
|
+
/**
|
|
105
|
+
* The return value of the dialog.
|
|
106
|
+
*
|
|
107
|
+
* Automatically set to the `value` of the submitter element when a
|
|
108
|
+
* `<form method="dialog">` inside the dialog is submitted. Can also
|
|
109
|
+
* be set programmatically before calling `hide()`.
|
|
110
|
+
*/
|
|
111
|
+
returnValue?: string;
|
|
69
112
|
constructor();
|
|
70
|
-
protected
|
|
71
|
-
protected _handleOpenState(): void;
|
|
72
|
-
private _emitClosing;
|
|
73
|
-
private _hide;
|
|
74
|
-
private _closeWithEvent;
|
|
113
|
+
protected updated(properties: PropertyValues<this>): void;
|
|
75
114
|
protected _handleFormSubmit(event: SubmitEvent): void;
|
|
76
115
|
private _handleCancel;
|
|
77
116
|
private _handleClose;
|
|
78
117
|
private _handleClick;
|
|
79
|
-
|
|
118
|
+
private _hide;
|
|
119
|
+
private _emitClosing;
|
|
120
|
+
private _closeWithEvent;
|
|
121
|
+
/**
|
|
122
|
+
* Opens the dialog with an animated fade-in transition.
|
|
123
|
+
*
|
|
124
|
+
* Returns `true` when the dialog was successfully opened, or `false` if
|
|
125
|
+
* it was already open.
|
|
126
|
+
*/
|
|
80
127
|
show(): Promise<boolean>;
|
|
81
|
-
/**
|
|
128
|
+
/**
|
|
129
|
+
* Closes the dialog with an animated fade-out transition.
|
|
130
|
+
*
|
|
131
|
+
* Returns `true` when the dialog was successfully closed, or `false` if
|
|
132
|
+
* it was already closed.
|
|
133
|
+
*/
|
|
82
134
|
hide(): Promise<boolean>;
|
|
83
|
-
/**
|
|
135
|
+
/**
|
|
136
|
+
* Toggles the dialog open or closed depending on its current state.
|
|
137
|
+
*
|
|
138
|
+
* Equivalent to calling `show()` when closed and `hide()` when open.
|
|
139
|
+
* Returns `true` when the transition completed successfully.
|
|
140
|
+
*/
|
|
84
141
|
toggle(): Promise<boolean>;
|
|
85
142
|
protected _renderBackdrop(): import("lit-html").TemplateResult<1>;
|
|
86
143
|
protected _renderHeader(): import("lit-html").TemplateResult<1>;
|
|
@@ -11,8 +11,8 @@ import { addAnimationController } from '../../animations/player.js';
|
|
|
11
11
|
import { fadeIn, fadeOut } from '../../animations/presets/fade/index.js';
|
|
12
12
|
import { addThemingController } from '../../theming/theming-controller.js';
|
|
13
13
|
import IgcButtonComponent from '../button/button.js';
|
|
14
|
+
import { addCommandController } from '../common/controllers/command.js';
|
|
14
15
|
import { addSlotController, setSlots } from '../common/controllers/slot.js';
|
|
15
|
-
import { watch } from '../common/decorators/watch.js';
|
|
16
16
|
import { registerComponent } from '../common/definitions/register.js';
|
|
17
17
|
import { EventEmitterMixin } from '../common/mixins/event-emitter.js';
|
|
18
18
|
import { partMap } from '../common/part-map.js';
|
|
@@ -44,35 +44,16 @@ export default class IgcDialogComponent extends EventEmitterMixin(LitElement) {
|
|
|
44
44
|
this.hideDefaultAction = false;
|
|
45
45
|
this.open = false;
|
|
46
46
|
addThemingController(this, all);
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
this.
|
|
47
|
+
addCommandController(this)
|
|
48
|
+
.set('--show', this.show)
|
|
49
|
+
.set('--hide', this.hide)
|
|
50
|
+
.set('--toggle', this.toggle);
|
|
51
|
+
}
|
|
52
|
+
updated(properties) {
|
|
53
|
+
if (properties.has('open')) {
|
|
54
|
+
this.open ? this._dialog?.showModal() : this._dialog?.close();
|
|
51
55
|
}
|
|
52
56
|
}
|
|
53
|
-
_handleOpenState() {
|
|
54
|
-
this.open ? this._dialog?.showModal() : this._dialog?.close();
|
|
55
|
-
}
|
|
56
|
-
_emitClosing() {
|
|
57
|
-
return this.emitEvent('igcClosing', { cancelable: true });
|
|
58
|
-
}
|
|
59
|
-
async _hide(emitEvent = false) {
|
|
60
|
-
if (!this.open || (emitEvent && !this._emitClosing())) {
|
|
61
|
-
return false;
|
|
62
|
-
}
|
|
63
|
-
this._animating = true;
|
|
64
|
-
await this._player.playExclusive(fadeOut());
|
|
65
|
-
this.open = false;
|
|
66
|
-
this._animating = false;
|
|
67
|
-
if (emitEvent) {
|
|
68
|
-
await this.updateComplete;
|
|
69
|
-
this.emitEvent('igcClosed');
|
|
70
|
-
}
|
|
71
|
-
return true;
|
|
72
|
-
}
|
|
73
|
-
_closeWithEvent() {
|
|
74
|
-
this._hide(true);
|
|
75
|
-
}
|
|
76
57
|
_handleFormSubmit(event) {
|
|
77
58
|
const form = event.target;
|
|
78
59
|
if (form.method === 'dialog') {
|
|
@@ -105,6 +86,26 @@ export default class IgcDialogComponent extends EventEmitterMixin(LitElement) {
|
|
|
105
86
|
}
|
|
106
87
|
}
|
|
107
88
|
}
|
|
89
|
+
async _hide(emitEvent = false) {
|
|
90
|
+
if (!this.open || (emitEvent && !this._emitClosing())) {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
this._animating = true;
|
|
94
|
+
await this._player.playExclusive(fadeOut());
|
|
95
|
+
this.open = false;
|
|
96
|
+
this._animating = false;
|
|
97
|
+
if (emitEvent) {
|
|
98
|
+
await this.updateComplete;
|
|
99
|
+
this.emitEvent('igcClosed');
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
_emitClosing() {
|
|
104
|
+
return this.emitEvent('igcClosing', { cancelable: true });
|
|
105
|
+
}
|
|
106
|
+
_closeWithEvent() {
|
|
107
|
+
this._hide(true);
|
|
108
|
+
}
|
|
108
109
|
async show() {
|
|
109
110
|
if (this.open) {
|
|
110
111
|
return false;
|
|
@@ -202,9 +203,6 @@ __decorate([
|
|
|
202
203
|
__decorate([
|
|
203
204
|
property({ attribute: false })
|
|
204
205
|
], IgcDialogComponent.prototype, "returnValue", void 0);
|
|
205
|
-
__decorate([
|
|
206
|
-
watch('open', { waitUntilFirstUpdate: true })
|
|
207
|
-
], IgcDialogComponent.prototype, "_handleOpenState", null);
|
|
208
206
|
function hasSubmitter(submitter) {
|
|
209
207
|
return submitter != null;
|
|
210
208
|
}
|