@edvisor/product-language 0.6.0 → 0.7.0-rc1
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/.babelrc +12 -0
- package/.eslintrc.json +147 -0
- package/.storybook/main.js +57 -0
- package/.storybook/manager.js +7 -0
- package/.storybook/preview.js +15 -0
- package/.storybook/tsconfig.json +30 -0
- package/jest.config.ts +15 -0
- package/jest.setup.ts +2 -0
- package/package.json +3 -12
- package/project.json +96 -0
- package/release-it.json +18 -0
- package/src/README.md +61 -0
- package/src/assets/svg/example_icon.svg +3 -0
- package/src/assets/svg/example_icon_white.svg +3 -0
- package/src/assets/svg/spinner.svg +3 -0
- package/src/assets/svg/spinner_white.svg +3 -0
- package/src/helpers/index.ts +4 -0
- package/src/helpers/playground.ts +26 -0
- package/src/helpers/talesOf.tsx +42 -0
- package/src/index.ts +2 -0
- package/src/lib/components/README.md +49 -0
- package/src/lib/components/alert-banner/alert-banner.tsx +34 -0
- package/src/lib/components/alert-banner/alert-level-flags.ts +77 -0
- package/src/lib/components/alert-banner/index.ts +1 -0
- package/src/lib/components/badge/badge-type-flags.ts +72 -0
- package/src/lib/components/badge/badge.test.tsx +29 -0
- package/src/lib/components/badge/badge.tsx +22 -0
- package/src/lib/components/badge/index.ts +1 -0
- package/src/lib/components/badge/stories/badge.stories.mdx +44 -0
- package/src/lib/components/badge/stories/components.tsx +49 -0
- package/{lib/components/card/atoms/card-frame.d.ts → src/lib/components/card/atoms/card-frame.tsx} +16 -7
- package/src/lib/components/card/atoms/index.ts +1 -0
- package/src/lib/components/card/card.test.tsx +162 -0
- package/src/lib/components/card/card.tsx +78 -0
- package/src/lib/components/card/components/card-alert-banner-slot.tsx +16 -0
- package/src/lib/components/card/components/card-controls-slot.tsx +19 -0
- package/src/lib/components/card/components/card-section-slot.tsx +51 -0
- package/src/lib/components/card/components/index.ts +3 -0
- package/src/lib/components/card/index.ts +3 -0
- package/src/lib/components/card/molecules/index.ts +1 -0
- package/src/lib/components/card/molecules/left-right-card.test.tsx +89 -0
- package/src/lib/components/card/molecules/left-right-card.tsx +63 -0
- package/src/lib/components/card/storybook/card.stories.mdx +100 -0
- package/src/lib/components/card/storybook/components.tsx +227 -0
- package/src/lib/components/checkbox/checkbox.test.tsx +39 -0
- package/src/lib/components/checkbox/checkbox.tsx +70 -0
- package/src/lib/components/checkbox/helpers.tsx +98 -0
- package/src/lib/components/checkbox/index.tsx +1 -0
- package/src/lib/components/checkbox/stories/checkbox.stories.mdx +57 -0
- package/src/lib/components/checkbox/stories/components.tsx +84 -0
- package/src/lib/components/date-picker/components/custom-calendar.tsx +193 -0
- package/src/lib/components/date-picker/components/index.ts +1 -0
- package/src/lib/components/date-picker/data-picker.test.tsx +220 -0
- package/src/lib/components/date-picker/date-picker.tsx +10 -0
- package/src/lib/components/date-picker/helpers/date-picker-factory.tsx +210 -0
- package/src/lib/components/date-picker/index.ts +1 -0
- package/src/lib/components/date-picker/storybook/components.tsx +259 -0
- package/src/lib/components/date-picker/storybook/date-picker.stories.mdx +133 -0
- package/src/lib/components/divider/divider-type-flags.tsx +37 -0
- package/src/lib/components/divider/divider.test.tsx +34 -0
- package/src/lib/components/divider/divider.tsx +37 -0
- package/src/lib/components/divider/index.tsx +1 -0
- package/src/lib/components/divider/stories/components.tsx +13 -0
- package/src/lib/components/divider/stories/divider.stories.mdx +44 -0
- package/src/lib/components/flag/flag-size-flags.tsx +55 -0
- package/src/lib/components/flag/flag.list.tsx +788 -0
- package/src/lib/components/flag/flag.test.tsx +65 -0
- package/src/lib/components/flag/flag.tsx +97 -0
- package/src/lib/components/flag/index.tsx +1 -0
- package/src/lib/components/flag/stories/components.tsx +403 -0
- package/src/lib/components/flag/stories/flag.stories.mdx +48 -0
- package/src/lib/components/flag/stories/playGround-select.tsx +145 -0
- package/src/lib/components/icon/icon-list.tsx +135 -0
- package/src/lib/components/icon/icon.test.tsx +47 -0
- package/src/lib/components/icon/icon.tsx +181 -0
- package/src/lib/components/icon/index.tsx +1 -0
- package/src/lib/components/icon/stories/components.tsx +282 -0
- package/src/lib/components/icon/stories/icon.stories.mdx +65 -0
- package/src/lib/components/index.ts +24 -0
- package/src/lib/components/input-field/components/index.ts +2 -0
- package/src/lib/components/input-field/components/labeled-input.tsx +57 -0
- package/src/lib/components/input-field/components/stepper.tsx +64 -0
- package/src/lib/components/input-field/index.ts +6 -0
- package/src/lib/components/input-field/input-field.test.tsx +107 -0
- package/src/lib/components/input-field/input-field.tsx +129 -0
- package/src/lib/components/input-field/input-number.tsx +41 -0
- package/src/lib/components/input-field/input-text.tsx +30 -0
- package/src/lib/components/input-field/storybook/components.tsx +339 -0
- package/src/lib/components/input-field/storybook/input-field.stories.mdx +113 -0
- package/src/lib/components/layout/flex.tsx +22 -0
- package/src/lib/components/layout/grid-layout.tsx +40 -0
- package/src/lib/components/layout/index.ts +3 -0
- package/src/lib/components/layout/left-right-layout.tsx +67 -0
- package/src/lib/components/link/index.ts +1 -0
- package/src/lib/components/link/link.test.tsx +29 -0
- package/src/lib/components/link/link.tsx +56 -0
- package/src/lib/components/link/storybook/link.stories.mdx +52 -0
- package/src/lib/components/molecules/avatar/avatar-size-flags.tsx +55 -0
- package/src/lib/components/molecules/avatar/avatar.test.tsx +114 -0
- package/src/lib/components/molecules/avatar/avatar.tsx +80 -0
- package/src/lib/components/molecules/avatar/index.tsx +1 -0
- package/src/lib/components/molecules/avatar/stories/avatar.stories.mdx +52 -0
- package/src/lib/components/molecules/avatar/stories/components.tsx +36 -0
- package/src/lib/components/molecules/button/button-flags.tsx +340 -0
- package/src/lib/components/molecules/button/button.test.tsx +77 -0
- package/src/lib/components/molecules/button/button.tsx +209 -0
- package/src/lib/components/molecules/button/index.tsx +1 -0
- package/src/lib/components/molecules/button/stories/button.stories.mdx +105 -0
- package/src/lib/components/molecules/button/stories/components.tsx +90 -0
- package/src/lib/components/molecules/index.ts +3 -0
- package/src/lib/components/molecules/input-checkbox/index.tsx +1 -0
- package/src/lib/components/molecules/input-checkbox/input-checkbox.test.tsx +34 -0
- package/src/lib/components/molecules/input-checkbox/input-checkbox.tsx +50 -0
- package/src/lib/components/molecules/input-checkbox/stories/components.tsx +53 -0
- package/src/lib/components/molecules/input-checkbox/stories/input-checkbox.stories.mdx +49 -0
- package/src/lib/components/organisms/choice-list/choice-list.test.tsx +36 -0
- package/src/lib/components/organisms/choice-list/choice-list.tsx +72 -0
- package/src/lib/components/organisms/choice-list/index.tsx +1 -0
- package/src/lib/components/organisms/choice-list/stories/choice-list.stories.mdx +57 -0
- package/src/lib/components/organisms/choice-list/stories/components.tsx +45 -0
- package/src/lib/components/organisms/index.ts +2 -0
- package/src/lib/components/organisms/multi-choice-list/index.tsx +1 -0
- package/src/lib/components/organisms/multi-choice-list/multi-choice-list.test.tsx +33 -0
- package/src/lib/components/organisms/multi-choice-list/multi-choice-list.tsx +53 -0
- package/src/lib/components/organisms/multi-choice-list/stories/components.tsx +124 -0
- package/src/lib/components/organisms/multi-choice-list/stories/multi-choice-list.stories.mdx +99 -0
- package/{lib/components/spinner/index.d.ts → src/lib/components/radio-button/index.tsx} +1 -1
- package/src/lib/components/radio-button/radio-button.tsx +135 -0
- package/src/lib/components/radio-button/radio.test.tsx +59 -0
- package/src/lib/components/radio-button/stories/components.tsx +36 -0
- package/src/lib/components/radio-button/stories/radio-button.stories.mdx +44 -0
- package/src/lib/components/range-slider/components/bar-chart.tsx +50 -0
- package/src/lib/components/range-slider/components/handle.tsx +58 -0
- package/src/lib/components/range-slider/components/rail.tsx +44 -0
- package/src/lib/components/range-slider/components/slider-component.tsx +92 -0
- package/src/lib/components/range-slider/components/slider-inputs.tsx +129 -0
- package/src/lib/components/range-slider/components/tick.tsx +51 -0
- package/src/lib/components/range-slider/components/track.tsx +67 -0
- package/src/lib/components/range-slider/index.tsx +2 -0
- package/src/lib/components/range-slider/range-slider.test.tsx +185 -0
- package/src/lib/components/range-slider/range-slider.tsx +131 -0
- package/src/lib/components/range-slider/slider.test.tsx +89 -0
- package/src/lib/components/range-slider/slider.tsx +80 -0
- package/src/lib/components/range-slider/stories/components.tsx +179 -0
- package/src/lib/components/range-slider/stories/range-slider.stories.mdx +84 -0
- package/src/lib/components/range-slider/types.ts +18 -0
- package/src/lib/components/select/components/menu-container.tsx +69 -0
- package/src/lib/components/select/components/menu-list.tsx +195 -0
- package/src/lib/components/select/components/menu-row.tsx +43 -0
- package/src/lib/components/select/components/menu.tsx +151 -0
- package/src/lib/components/select/components/option.tsx +91 -0
- package/src/lib/components/select/components/select-label.tsx +10 -0
- package/src/lib/components/select/components/value-component-multi.tsx +40 -0
- package/src/lib/components/select/components/value-component-single.tsx +27 -0
- package/src/lib/components/select/components/value.tsx +374 -0
- package/src/lib/components/select/index.tsx +3 -0
- package/src/lib/components/select/select.test.tsx +148 -0
- package/src/lib/components/select/select.tsx +337 -0
- package/src/lib/components/select/storybook/components.tsx +999 -0
- package/src/lib/components/select/storybook/radio-group.tsx +157 -0
- package/src/lib/components/select/storybook/select.stories.mdx +172 -0
- package/src/lib/components/select/types.ts +149 -0
- package/src/lib/components/select/utils.ts +101 -0
- package/src/lib/components/spinner/index.tsx +1 -0
- package/src/lib/components/spinner/spinner-size-flags.tsx +39 -0
- package/src/lib/components/spinner/spinner.test.tsx +31 -0
- package/src/lib/components/spinner/spinner.tsx +54 -0
- package/src/lib/components/spinner/stories/components.tsx +39 -0
- package/src/lib/components/spinner/stories/spinner.stories.mdx +35 -0
- package/src/lib/components/tabs/components/index.ts +1 -0
- package/src/lib/components/tabs/components/tab.tsx +62 -0
- package/src/lib/components/tabs/index.tsx +1 -0
- package/src/lib/components/tabs/storybook/components.tsx +282 -0
- package/src/lib/components/tabs/storybook/tabs.stories.mdx +97 -0
- package/src/lib/components/tabs/tabs.test.tsx +86 -0
- package/src/lib/components/tabs/tabs.tsx +101 -0
- package/src/lib/components/tag/components/close-button.tsx +85 -0
- package/src/lib/components/tag/components/index.ts +2 -0
- package/src/lib/components/tag/components/tag-label.tsx +45 -0
- package/src/lib/components/tag/index.tsx +1 -0
- package/src/lib/components/tag/stories/components.tsx +86 -0
- package/src/lib/components/tag/stories/tag.stories.mdx +42 -0
- package/src/lib/components/tag/tag.test.tsx +36 -0
- package/src/lib/components/tag/tag.tsx +33 -0
- package/src/lib/components/thumbnail/index.tsx +1 -0
- package/src/lib/components/thumbnail/stories/thumbnail.stories.mdx +44 -0
- package/src/lib/components/thumbnail/thumbnail-size-flags.tsx +41 -0
- package/src/lib/components/thumbnail/thumbnail.test.tsx +51 -0
- package/src/lib/components/thumbnail/thumbnail.tsx +44 -0
- package/src/lib/components/tree-view/components/tree-node.tsx +203 -0
- package/src/lib/components/tree-view/helper.tsx +171 -0
- package/src/lib/components/tree-view/index.ts +2 -0
- package/src/lib/components/tree-view/stories/components.tsx +640 -0
- package/src/lib/components/tree-view/stories/tree-view.stories.mdx +127 -0
- package/src/lib/components/tree-view/tree-view.test.tsx +146 -0
- package/src/lib/components/tree-view/tree-view.tsx +168 -0
- package/src/lib/components/tree-view/types.tsx +70 -0
- package/src/lib/components/typography/index.ts +1 -0
- package/src/lib/components/typography/storybook/components.tsx +288 -0
- package/src/lib/components/typography/storybook/typography.stories.mdx +90 -0
- package/src/lib/components/typography/typography.test.tsx +97 -0
- package/src/lib/components/typography/typography.tsx +99 -0
- package/src/lib/foundations/color-system/base-palette/base-palette.stories.tsx +123 -0
- package/src/lib/foundations/color-system/base-palette/base-palette.ts +93 -0
- package/src/lib/foundations/color-system/base-palette/index.ts +1 -0
- package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.mdx +85 -0
- package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.tsx +231 -0
- package/src/lib/foundations/color-system/color-guidelines/color-guidelines.ts +160 -0
- package/src/lib/foundations/color-system/color-guidelines/index.ts +1 -0
- package/src/lib/foundations/color-system/components/color-sample.tsx +99 -0
- package/src/lib/foundations/color-system/components/index.ts +1 -0
- package/src/lib/foundations/color-system/index.ts +1 -0
- package/src/lib/foundations/index.ts +4 -0
- package/src/lib/foundations/shadows/components.tsx +59 -0
- package/src/lib/foundations/shadows/index.ts +1 -0
- package/src/lib/foundations/shadows/shadows.stories.mdx +71 -0
- package/src/lib/foundations/shadows/shadows.tsx +47 -0
- package/src/lib/foundations/spacing/index.ts +1 -0
- package/src/lib/foundations/spacing/spacing-guidelines.ts +24 -0
- package/src/lib/foundations/spacing/spacing.stories.mdx +51 -0
- package/src/lib/foundations/spacing/spacing.ts +18 -0
- package/src/lib/foundations/typography/constants.ts +25 -0
- package/src/lib/foundations/typography/fonts.ts +205 -0
- package/src/lib/foundations/typography/index.tsx +1 -0
- package/src/lib/foundations/typography/text-aspect-flags.ts +61 -0
- package/src/lib/foundations/typography/typography.tsx +102 -0
- package/src/lib/helpers/generic-types.ts +44 -0
- package/src/lib/helpers/index.ts +8 -0
- package/src/lib/helpers/isReactElementOfType.test.tsx +108 -0
- package/src/lib/helpers/isReactElementOfType.ts +42 -0
- package/src/lib/helpers/nothing.tsx +22 -0
- package/{lib/helpers/numbers.d.ts → src/lib/helpers/numbers.ts} +67 -50
- package/src/lib/helpers/safe-navigation.ts +57 -0
- package/src/lib/helpers/slots.tsx +126 -0
- package/src/lib/helpers/strings.test.ts +47 -0
- package/src/lib/helpers/strings.ts +16 -0
- package/src/lib/helpers/useInputElementState.ts +56 -0
- package/tsconfig.json +35 -0
- package/tsconfig.lib.json +28 -0
- package/tsconfig.spec.json +21 -0
- package/index.d.ts +0 -2
- package/index.js +0 -9976
- package/lib/components/alert-banner/alert-banner.d.ts +0 -11
- package/lib/components/alert-banner/alert-level-flags.d.ts +0 -13
- package/lib/components/alert-banner/index.d.ts +0 -1
- package/lib/components/badge/badge-type-flags.d.ts +0 -18
- package/lib/components/badge/badge.d.ts +0 -5
- package/lib/components/badge/index.d.ts +0 -1
- package/lib/components/card/atoms/index.d.ts +0 -1
- package/lib/components/card/card.d.ts +0 -14
- package/lib/components/card/components/card-alert-banner-slot.d.ts +0 -6
- package/lib/components/card/components/card-controls-slot.d.ts +0 -5
- package/lib/components/card/components/card-section-slot.d.ts +0 -11
- package/lib/components/card/components/index.d.ts +0 -3
- package/lib/components/card/index.d.ts +0 -3
- package/lib/components/card/molecules/index.d.ts +0 -1
- package/lib/components/card/molecules/left-right-card.d.ts +0 -16
- package/lib/components/checkbox/checkbox.d.ts +0 -11
- package/lib/components/checkbox/helpers.d.ts +0 -12
- package/lib/components/checkbox/index.d.ts +0 -1
- package/lib/components/divider/divider-type-flags.d.ts +0 -9
- package/lib/components/divider/divider.d.ts +0 -7
- package/lib/components/divider/index.d.ts +0 -1
- package/lib/components/flag/flag-size-flags.d.ts +0 -12
- package/lib/components/flag/flag.d.ts +0 -9
- package/lib/components/flag/flag.list.d.ts +0 -782
- package/lib/components/flag/index.d.ts +0 -1
- package/lib/components/icon/icon-list.d.ts +0 -132
- package/lib/components/icon/icon.d.ts +0 -131
- package/lib/components/icon/index.d.ts +0 -1
- package/lib/components/index.d.ts +0 -20
- package/lib/components/input-field/components/index.d.ts +0 -2
- package/lib/components/input-field/components/labeled-input.d.ts +0 -10
- package/lib/components/input-field/components/stepper.d.ts +0 -7
- package/lib/components/input-field/index.d.ts +0 -3
- package/lib/components/input-field/input-field.d.ts +0 -25
- package/lib/components/input-field/input-number.d.ts +0 -18
- package/lib/components/input-field/input-text.d.ts +0 -14
- package/lib/components/layout/flex.d.ts +0 -16
- package/lib/components/layout/grid-layout.d.ts +0 -11
- package/lib/components/layout/index.d.ts +0 -3
- package/lib/components/layout/left-right-layout.d.ts +0 -34
- package/lib/components/link/index.d.ts +0 -1
- package/lib/components/link/link.d.ts +0 -14
- package/lib/components/molecules/avatar/avatar-size-flags.d.ts +0 -12
- package/lib/components/molecules/avatar/avatar.d.ts +0 -12
- package/lib/components/molecules/avatar/index.d.ts +0 -1
- package/lib/components/molecules/button/button-flags.d.ts +0 -44
- package/lib/components/molecules/button/button.d.ts +0 -12
- package/lib/components/molecules/button/index.d.ts +0 -1
- package/lib/components/molecules/index.d.ts +0 -3
- package/lib/components/molecules/input-checkbox/index.d.ts +0 -1
- package/lib/components/molecules/input-checkbox/input-checkbox.d.ts +0 -8
- package/lib/components/organisms/choice-list/choice-list.d.ts +0 -9
- package/lib/components/organisms/choice-list/index.d.ts +0 -1
- package/lib/components/organisms/index.d.ts +0 -2
- package/lib/components/organisms/multi-choice-list/index.d.ts +0 -1
- package/lib/components/organisms/multi-choice-list/multi-choice-list.d.ts +0 -11
- package/lib/components/radio-button/index.d.ts +0 -1
- package/lib/components/radio-button/radio-button.d.ts +0 -10
- package/lib/components/select/components/menu-container.d.ts +0 -3
- package/lib/components/select/components/menu-list.d.ts +0 -3
- package/lib/components/select/components/menu-row.d.ts +0 -9
- package/lib/components/select/components/menu.d.ts +0 -3
- package/lib/components/select/components/option.d.ts +0 -13
- package/lib/components/select/components/select-label.d.ts +0 -1
- package/lib/components/select/components/value-component-multi.d.ts +0 -4
- package/lib/components/select/components/value-component-single.d.ts +0 -4
- package/lib/components/select/components/value.d.ts +0 -4
- package/lib/components/select/index.d.ts +0 -3
- package/lib/components/select/select.d.ts +0 -10
- package/lib/components/select/types.d.ts +0 -133
- package/lib/components/select/utils.d.ts +0 -15
- package/lib/components/spinner/spinner-size-flags.d.ts +0 -10
- package/lib/components/spinner/spinner.d.ts +0 -9
- package/lib/components/tabs/components/index.d.ts +0 -1
- package/lib/components/tabs/components/tab.d.ts +0 -7
- package/lib/components/tabs/index.d.ts +0 -1
- package/lib/components/tabs/tabs.d.ts +0 -15
- package/lib/components/tag/components/close-button.d.ts +0 -8
- package/lib/components/tag/components/index.d.ts +0 -2
- package/lib/components/tag/components/tag-label.d.ts +0 -8
- package/lib/components/tag/index.d.ts +0 -1
- package/lib/components/tag/tag.d.ts +0 -10
- package/lib/components/thumbnail/index.d.ts +0 -1
- package/lib/components/thumbnail/thumbnail-size-flags.d.ts +0 -10
- package/lib/components/thumbnail/thumbnail.d.ts +0 -10
- package/lib/components/tree-view/components/tree-node.d.ts +0 -3
- package/lib/components/tree-view/helper.d.ts +0 -12
- package/lib/components/tree-view/index.d.ts +0 -2
- package/lib/components/tree-view/tree-view.d.ts +0 -3
- package/lib/components/tree-view/types.d.ts +0 -63
- package/lib/components/typography/index.d.ts +0 -1
- package/lib/components/typography/typography.d.ts +0 -24
- package/lib/foundations/color-system/base-palette/base-palette.d.ts +0 -76
- package/lib/foundations/color-system/base-palette/index.d.ts +0 -1
- package/lib/foundations/color-system/color-guidelines/color-guidelines.d.ts +0 -132
- package/lib/foundations/color-system/color-guidelines/index.d.ts +0 -1
- package/lib/foundations/color-system/components/color-sample.d.ts +0 -17
- package/lib/foundations/color-system/components/index.d.ts +0 -1
- package/lib/foundations/color-system/index.d.ts +0 -1
- package/lib/foundations/index.d.ts +0 -4
- package/lib/foundations/shadows/components.d.ts +0 -8
- package/lib/foundations/shadows/index.d.ts +0 -1
- package/lib/foundations/shadows/shadows.d.ts +0 -8
- package/lib/foundations/spacing/index.d.ts +0 -1
- package/lib/foundations/spacing/spacing-guidelines.d.ts +0 -22
- package/lib/foundations/spacing/spacing.d.ts +0 -18
- package/lib/foundations/typography/constants.d.ts +0 -22
- package/lib/foundations/typography/fonts.d.ts +0 -1
- package/lib/foundations/typography/index.d.ts +0 -1
- package/lib/foundations/typography/text-aspect-flags.d.ts +0 -19
- package/lib/foundations/typography/typography.d.ts +0 -24
- package/lib/helpers/generic-types.d.ts +0 -21
- package/lib/helpers/index.d.ts +0 -7
- package/lib/helpers/isReactElementOfType.d.ts +0 -8
- package/lib/helpers/nothing.d.ts +0 -10
- package/lib/helpers/safe-navigation.d.ts +0 -15
- package/lib/helpers/slots.d.ts +0 -17
- package/lib/helpers/strings.d.ts +0 -1
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { InputHTMLAttributes } from 'react'
|
|
2
|
+
import { DateObject } from 'react-multi-date-picker'
|
|
3
|
+
import styled from 'styled-components'
|
|
4
|
+
|
|
5
|
+
import { Margin } from '@foundations'
|
|
6
|
+
import { applyProps, FC, getSlot, isNothing, isDefined, Nothing, Slot, getOtherChildren, toArray, PropsWithChildren, first, isNil, isFunction, defaultTo, is, useInputElementState, isString } from '@helpers'
|
|
7
|
+
|
|
8
|
+
import { InputField as InputFieldBase } from '../../input-field'
|
|
9
|
+
import { IconMinor } from '../../icon'
|
|
10
|
+
import { CustomCalendar } from '../components'
|
|
11
|
+
|
|
12
|
+
const InputDatePicker = styled.div`
|
|
13
|
+
position: relative;
|
|
14
|
+
`
|
|
15
|
+
|
|
16
|
+
const Calendar = styled(CustomCalendar)`
|
|
17
|
+
position: absolute;
|
|
18
|
+
`
|
|
19
|
+
|
|
20
|
+
const InputField = styled(InputFieldBase)`
|
|
21
|
+
margin-bottom: ${Margin.xxs};
|
|
22
|
+
`
|
|
23
|
+
|
|
24
|
+
const DEFAULT_DATE_FORMAT = 'YYYY-MM-DD'
|
|
25
|
+
|
|
26
|
+
export type DateFormatter<T> = (props: { date: T | undefined, defaultFormatter: (date: T, format?: string) => string}) => string
|
|
27
|
+
|
|
28
|
+
type HTMLProps = Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'defaultValue' | 'onChange' | 'onClick' | 'min' | 'max'>
|
|
29
|
+
|
|
30
|
+
export type IDatePickerProps<T> = PropsWithChildren & HTMLProps & {
|
|
31
|
+
value?: T
|
|
32
|
+
defaultValue?: T
|
|
33
|
+
onChange?: (change: T) => void
|
|
34
|
+
onClick?: () => void
|
|
35
|
+
|
|
36
|
+
isAvailable?: (props: { date: T, isSameDate: (date: T, other: T) => boolean }) => boolean
|
|
37
|
+
|
|
38
|
+
isOpen?: boolean
|
|
39
|
+
defaultOpen?: boolean
|
|
40
|
+
|
|
41
|
+
label?: string
|
|
42
|
+
format?: string | DateFormatter<T>
|
|
43
|
+
min?: T
|
|
44
|
+
max?: T
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
class ControlsSlot extends Slot {}
|
|
48
|
+
|
|
49
|
+
export type IDatePickerSlots = {
|
|
50
|
+
Controls: typeof ControlsSlot
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function datePickerFactory<T>({
|
|
54
|
+
fromDate,
|
|
55
|
+
toDate,
|
|
56
|
+
empty,
|
|
57
|
+
}: {
|
|
58
|
+
fromDate: (date: Date | undefined) => T,
|
|
59
|
+
toDate: (obj: T) => Date,
|
|
60
|
+
empty: (obj: T) => boolean,
|
|
61
|
+
}): FC<IDatePickerProps<T>, IDatePickerSlots> {
|
|
62
|
+
|
|
63
|
+
const ConcreteDatePicker: FC<IDatePickerProps<T>, IDatePickerSlots> = (props) => {
|
|
64
|
+
const {
|
|
65
|
+
value: valueProp,
|
|
66
|
+
defaultValue,
|
|
67
|
+
onChange: onChangeProp,
|
|
68
|
+
onClick,
|
|
69
|
+
isAvailable = () => true,
|
|
70
|
+
isOpen,
|
|
71
|
+
defaultOpen,
|
|
72
|
+
label,
|
|
73
|
+
format,
|
|
74
|
+
children,
|
|
75
|
+
min,
|
|
76
|
+
max,
|
|
77
|
+
...HTMLInputProps
|
|
78
|
+
} = props
|
|
79
|
+
|
|
80
|
+
const [value, onChange] = useInputElementState<T>({
|
|
81
|
+
value: valueProp,
|
|
82
|
+
defaultValue,
|
|
83
|
+
onChange: onChangeProp,
|
|
84
|
+
})
|
|
85
|
+
const [open, setOpen] = useInputElementState<boolean>({
|
|
86
|
+
value: isOpen,
|
|
87
|
+
defaultValue: defaultOpen,
|
|
88
|
+
onChange: onClick,
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
const controls = getSlot(ControlsSlot, children)
|
|
92
|
+
const calendarChildren = getOtherChildren(children)
|
|
93
|
+
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
95
|
+
const handleChange = (selectedDates: DateObject | DateObject[] | null) => {
|
|
96
|
+
const date = first(toArray(selectedDates))
|
|
97
|
+
const change = fromDate(date?.toDate())
|
|
98
|
+
|
|
99
|
+
onChange(change)
|
|
100
|
+
|
|
101
|
+
if (isNil(props.isOpen)) {
|
|
102
|
+
// we don't want to override the user's custom open/close behaviour
|
|
103
|
+
setOpen(false)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return (
|
|
108
|
+
<InputDatePicker>
|
|
109
|
+
{!isNothing(controls) ? (
|
|
110
|
+
applyProps(controls.props.children, (childProps: { onClick: () => void, role: string }) => ({
|
|
111
|
+
...childProps,
|
|
112
|
+
onClick: isDefined(childProps.onClick) ? childProps.onClick : () => setOpen(!is(open)),
|
|
113
|
+
role: 'combobox',
|
|
114
|
+
}))
|
|
115
|
+
) : (
|
|
116
|
+
<InputField
|
|
117
|
+
role={'combobox'}
|
|
118
|
+
placeholder={isNil(value) || empty(value) ? formatDate(value, props.format) : ''}
|
|
119
|
+
{...HTMLInputProps}
|
|
120
|
+
readOnly={isDefined(value) && !empty(value)}
|
|
121
|
+
value={isNil(value) || empty(value) ? '' : formatDate(value, props.format)}
|
|
122
|
+
onChange={() => undefined}
|
|
123
|
+
onClick={() => setOpen(!is(open))}
|
|
124
|
+
label={props.label}
|
|
125
|
+
>
|
|
126
|
+
<InputField.Icon>
|
|
127
|
+
<IconMinor.Calendar />
|
|
128
|
+
</InputField.Icon>
|
|
129
|
+
</InputField>
|
|
130
|
+
)}
|
|
131
|
+
{is(open) ? /** temporary fix while we wait for https://github.com/shahabyazdi/react-multi-date-picker/pull/153 */ (
|
|
132
|
+
<div role='dialog'>
|
|
133
|
+
<Calendar
|
|
134
|
+
readOnly={isDefined(props.value) && isNil(props.onChange)}
|
|
135
|
+
renderButton={renderArrows}
|
|
136
|
+
mapDays={({ date, isSameDate }) => {
|
|
137
|
+
return {
|
|
138
|
+
...date,
|
|
139
|
+
disabled: !isAvailable({
|
|
140
|
+
date: fromDate(date.toDate()),
|
|
141
|
+
isSameDate: (a, b) =>
|
|
142
|
+
isSameDate(
|
|
143
|
+
toDateObject(a),
|
|
144
|
+
toDateObject(b)
|
|
145
|
+
),
|
|
146
|
+
}),
|
|
147
|
+
}
|
|
148
|
+
}}
|
|
149
|
+
value={
|
|
150
|
+
(isNil(value) || empty(value)) ? undefined : toDateObject(value)
|
|
151
|
+
}
|
|
152
|
+
minDate={isDefined(min) ? toDate(min) : undefined}
|
|
153
|
+
maxDate={isDefined(max) ? toDate(max) : undefined}
|
|
154
|
+
children={calendarChildren}
|
|
155
|
+
onChange={handleChange}
|
|
156
|
+
numberOfMonths={1}
|
|
157
|
+
/>
|
|
158
|
+
</div>
|
|
159
|
+
) : (
|
|
160
|
+
<Nothing />
|
|
161
|
+
)}
|
|
162
|
+
</InputDatePicker>
|
|
163
|
+
)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
ConcreteDatePicker.Controls = ControlsSlot
|
|
167
|
+
ConcreteDatePicker.displayName = 'DatePicker'
|
|
168
|
+
|
|
169
|
+
return ConcreteDatePicker
|
|
170
|
+
|
|
171
|
+
function toDateObject(date: T): DateObject {
|
|
172
|
+
return new DateObject(toDate(date))
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function defaultFormatter (date: T, format?: string): string {
|
|
176
|
+
if (isNil(date)) {
|
|
177
|
+
return ''
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return toDateObject(date).format(defaultTo(format, DEFAULT_DATE_FORMAT))
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function formatDate(date: T | undefined, format?: string | DateFormatter<T>): string {
|
|
184
|
+
if (isFunction(format)) {
|
|
185
|
+
return format({ date, defaultFormatter })
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (isNil(date) || empty(date)) {
|
|
189
|
+
// same behavior as html input type='date', it shows the format
|
|
190
|
+
// even though if you open the picker it goes to TODAY
|
|
191
|
+
return isString(format) ? format : DEFAULT_DATE_FORMAT
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
return toDateObject(date).format(
|
|
195
|
+
defaultTo(format, DEFAULT_DATE_FORMAT)
|
|
196
|
+
)
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
function renderArrows (direction: string, handleClick: () => void) {
|
|
201
|
+
return (
|
|
202
|
+
<button onClick={handleClick}>
|
|
203
|
+
{direction === 'right' ? (
|
|
204
|
+
<IconMinor.ArrowRight />
|
|
205
|
+
) : (
|
|
206
|
+
<IconMinor.ArrowLeft />
|
|
207
|
+
)}
|
|
208
|
+
</button>
|
|
209
|
+
)
|
|
210
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './date-picker'
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { Button, InputField, Label } from '@components'
|
|
2
|
+
import { Padding } from '@foundations'
|
|
3
|
+
import { isDefined } from '@helpers'
|
|
4
|
+
import { OverflowPlayground as Playground } from '@stories'
|
|
5
|
+
import styled from 'styled-components'
|
|
6
|
+
import { DatePicker } from '../date-picker'
|
|
7
|
+
import { datePickerFactory } from '../helpers/date-picker-factory'
|
|
8
|
+
|
|
9
|
+
export const DatePickerExample = () => (
|
|
10
|
+
<Playground
|
|
11
|
+
code={`
|
|
12
|
+
<DatePicker label='Start Date' />
|
|
13
|
+
`}
|
|
14
|
+
providerProps={{
|
|
15
|
+
renderAsComponent: true,
|
|
16
|
+
scope: {
|
|
17
|
+
DatePicker,
|
|
18
|
+
InputField,
|
|
19
|
+
},
|
|
20
|
+
}}
|
|
21
|
+
/>
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
export const DatePickerFormatExample = () => (
|
|
25
|
+
<Playground
|
|
26
|
+
code={`
|
|
27
|
+
const [value, setValue] = useState(new Date().toISOString());
|
|
28
|
+
|
|
29
|
+
<>
|
|
30
|
+
<div>You Chose: {value}</div>
|
|
31
|
+
<DatePicker format={undefined} value={value} onChange={setValue} />
|
|
32
|
+
<DatePicker format='MMMM D, YYYY' value={value} onChange={setValue} />
|
|
33
|
+
<DatePicker format={({ date }) => 'Today is: ' + date} value={value} onChange={setValue} />
|
|
34
|
+
</>
|
|
35
|
+
`}
|
|
36
|
+
providerProps={{
|
|
37
|
+
renderAsComponent: true,
|
|
38
|
+
scope: {
|
|
39
|
+
DatePicker,
|
|
40
|
+
InputField,
|
|
41
|
+
},
|
|
42
|
+
}}
|
|
43
|
+
/>
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
export const DatePickerAvailableDatesExample = () => (
|
|
47
|
+
<Playground
|
|
48
|
+
code={`
|
|
49
|
+
const today = new Date().toISOString()
|
|
50
|
+
const tomorrow = new Date(today)
|
|
51
|
+
tomorrow.setDate(tomorrow.getDate() + 1)
|
|
52
|
+
|
|
53
|
+
const isUnavailable = ({ date }) => new Date(date).getDay() === 6 || new Date(date).getDay() === 0;
|
|
54
|
+
const isTomorrow = ({ date, isSameDate }) => isSameDate(date, tomorrow);
|
|
55
|
+
|
|
56
|
+
<>
|
|
57
|
+
<div>No weekends, and we can do same day but not next day.</div>
|
|
58
|
+
<DatePicker min={today} isAvailable={(props) => !isUnavailable(props) && !isTomorrow(props)} />
|
|
59
|
+
</>
|
|
60
|
+
`}
|
|
61
|
+
providerProps={{
|
|
62
|
+
renderAsComponent: true,
|
|
63
|
+
scope: {
|
|
64
|
+
DatePicker,
|
|
65
|
+
InputField,
|
|
66
|
+
},
|
|
67
|
+
}}
|
|
68
|
+
/>
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
export const DatePickerControlledExample = () => (
|
|
72
|
+
<Playground
|
|
73
|
+
code={`
|
|
74
|
+
const [value, setValue] = useState(new Date().toISOString());
|
|
75
|
+
|
|
76
|
+
<>
|
|
77
|
+
<div>You chose: {value}</div>
|
|
78
|
+
<DatePicker value={value} onChange={setValue} label='Start Date' />
|
|
79
|
+
</>
|
|
80
|
+
`}
|
|
81
|
+
providerProps={{
|
|
82
|
+
renderAsComponent: true,
|
|
83
|
+
scope: {
|
|
84
|
+
DatePicker,
|
|
85
|
+
InputField,
|
|
86
|
+
},
|
|
87
|
+
}}
|
|
88
|
+
/>
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
export const DatePickerControlledOpenExample = () => (
|
|
92
|
+
<Playground
|
|
93
|
+
code={`
|
|
94
|
+
const [open, setOpen] = useState(false);
|
|
95
|
+
|
|
96
|
+
<>
|
|
97
|
+
<Button onClick={() => setOpen(!open)}>{open ? 'Close' : 'Open'} Sesame!</Button>
|
|
98
|
+
<DatePicker isOpen={open} onClick={() => setOpen(!open)} label='Start Date' />
|
|
99
|
+
</>
|
|
100
|
+
`}
|
|
101
|
+
providerProps={{
|
|
102
|
+
renderAsComponent: true,
|
|
103
|
+
scope: {
|
|
104
|
+
Button,
|
|
105
|
+
DatePicker,
|
|
106
|
+
InputField,
|
|
107
|
+
},
|
|
108
|
+
}}
|
|
109
|
+
/>
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
export const DatePickerCustomHandleExample = () => (
|
|
113
|
+
<Playground
|
|
114
|
+
code={`
|
|
115
|
+
<DatePicker>
|
|
116
|
+
<DatePicker.Controls>
|
|
117
|
+
<Label>Click Me</Label>
|
|
118
|
+
</DatePicker.Controls>
|
|
119
|
+
</DatePicker>
|
|
120
|
+
`}
|
|
121
|
+
providerProps={{
|
|
122
|
+
renderAsComponent: true,
|
|
123
|
+
scope: {
|
|
124
|
+
DatePicker,
|
|
125
|
+
Label,
|
|
126
|
+
},
|
|
127
|
+
}}
|
|
128
|
+
/>
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
const Controls = styled.div`
|
|
132
|
+
padding: ${Padding.l}
|
|
133
|
+
`
|
|
134
|
+
|
|
135
|
+
export const DatePickerWithExtraStuffInTheCalendar = () => (
|
|
136
|
+
<Playground
|
|
137
|
+
code={`
|
|
138
|
+
const [open, setOpen] = useState(false)
|
|
139
|
+
const [value, setValue] = useState(new Date().toISOString())
|
|
140
|
+
const [draft, setDraft] = useState(value);
|
|
141
|
+
const publish = (date) => {
|
|
142
|
+
setValue(date)
|
|
143
|
+
setDraft(date)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const NULL_DATE = ''
|
|
147
|
+
const format = ({ date, defaultFormatter }) => date === NULL_DATE
|
|
148
|
+
? 'Next Available'
|
|
149
|
+
: defaultFormatter(date, 'MMMM D, YYYY');
|
|
150
|
+
|
|
151
|
+
<>
|
|
152
|
+
<DatePicker
|
|
153
|
+
format={format}
|
|
154
|
+
value={draft}
|
|
155
|
+
onChange={setDraft}
|
|
156
|
+
label='Start Date'
|
|
157
|
+
isOpen={open}
|
|
158
|
+
onClick={setOpen}
|
|
159
|
+
>
|
|
160
|
+
<Controls>
|
|
161
|
+
<Button onClick={() => publish(NULL_DATE)}>Next Available</Button>
|
|
162
|
+
<Button onClick={() => { setDraft(value); setOpen(false) }}>Cancel</Button>
|
|
163
|
+
<Button onClick={() => { publish(draft); setOpen(false) }}>Confirm</Button>
|
|
164
|
+
</Controls>
|
|
165
|
+
</DatePicker>
|
|
166
|
+
</>
|
|
167
|
+
`}
|
|
168
|
+
providerProps={{
|
|
169
|
+
renderAsComponent: true,
|
|
170
|
+
scope: {
|
|
171
|
+
DatePicker,
|
|
172
|
+
Controls,
|
|
173
|
+
Button,
|
|
174
|
+
InputField,
|
|
175
|
+
},
|
|
176
|
+
}}
|
|
177
|
+
/>
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
const EpochDatePicker = datePickerFactory<number>({
|
|
181
|
+
toDate: (n) => new Date(n),
|
|
182
|
+
fromDate: (date) => isDefined(date) ? date.valueOf() : 0,
|
|
183
|
+
empty: (date) => date.valueOf() === 0,
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
export const DatePickerFactoryExample = () => (
|
|
187
|
+
<Playground
|
|
188
|
+
code={`
|
|
189
|
+
const [open, setOpen] = useState(false)
|
|
190
|
+
const [value, setValue] = useState(new Date().valueOf())
|
|
191
|
+
const [draft, setDraft] = useState(value)
|
|
192
|
+
const publish = (date) => {
|
|
193
|
+
setValue(date)
|
|
194
|
+
setDraft(date)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const format = ({ date, defaultFormatter }) => date.valueOf() === 0
|
|
198
|
+
? 'Next Available'
|
|
199
|
+
: defaultFormatter(date, 'MMMM D, YYYY');
|
|
200
|
+
|
|
201
|
+
<>
|
|
202
|
+
You Chose: {value}
|
|
203
|
+
<EpochDatePicker
|
|
204
|
+
format={format}
|
|
205
|
+
value={draft}
|
|
206
|
+
onChange={setDraft}
|
|
207
|
+
label='Start Date'
|
|
208
|
+
isOpen={open}
|
|
209
|
+
onClick={setOpen}
|
|
210
|
+
>
|
|
211
|
+
<Controls>
|
|
212
|
+
<Button onClick={() => publish(0)}>Next Available</Button>
|
|
213
|
+
<Button onClick={() => { setDraft(value); setOpen(false) }}>Cancel</Button>
|
|
214
|
+
<Button onClick={() => { publish(draft); setOpen(false) }}>Confirm</Button>
|
|
215
|
+
</Controls>
|
|
216
|
+
</EpochDatePicker>
|
|
217
|
+
</>
|
|
218
|
+
`}
|
|
219
|
+
providerProps={{
|
|
220
|
+
renderAsComponent: true,
|
|
221
|
+
scope: {
|
|
222
|
+
EpochDatePicker,
|
|
223
|
+
Controls,
|
|
224
|
+
Button,
|
|
225
|
+
InputField,
|
|
226
|
+
},
|
|
227
|
+
}}
|
|
228
|
+
/>
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
export const DatePickerFormExample = () => (
|
|
232
|
+
<Playground
|
|
233
|
+
code={`
|
|
234
|
+
const [min, setMin] = useState(new Date().toISOString())
|
|
235
|
+
const [max, setMax] = useState(new Date().toISOString());
|
|
236
|
+
|
|
237
|
+
<form onSubmit={(e) => e.preventDefault()}>
|
|
238
|
+
<DatePicker max={max} label='min' value={min} onChange={setMin} />
|
|
239
|
+
<DatePicker min={min} label='max' value={max} onChange={setMax} />
|
|
240
|
+
<DatePicker
|
|
241
|
+
label='Start Date'
|
|
242
|
+
required
|
|
243
|
+
min={min}
|
|
244
|
+
max={max}
|
|
245
|
+
/>
|
|
246
|
+
<Button primary type='submit'>Submit</Button>
|
|
247
|
+
</form>
|
|
248
|
+
`}
|
|
249
|
+
providerProps={{
|
|
250
|
+
renderAsComponent: true,
|
|
251
|
+
scope: {
|
|
252
|
+
DatePicker,
|
|
253
|
+
Button,
|
|
254
|
+
InputField,
|
|
255
|
+
Label,
|
|
256
|
+
},
|
|
257
|
+
}}
|
|
258
|
+
/>
|
|
259
|
+
)
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Meta, Canvas } from '@storybook/addon-docs';
|
|
2
|
+
import { AlertBanner } from 'components/alert-banner'
|
|
3
|
+
import {
|
|
4
|
+
DatePickerExample,
|
|
5
|
+
DatePickerFormatExample,
|
|
6
|
+
DatePickerCustomHandleExample,
|
|
7
|
+
DatePickerRangeExample,
|
|
8
|
+
DatePickerControlledExample,
|
|
9
|
+
DatePickerControlledOpenExample,
|
|
10
|
+
DatePickerWithExtraStuffInTheCalendar,
|
|
11
|
+
DatePickerFactoryExample,
|
|
12
|
+
DatePickerAvailableDatesExample,
|
|
13
|
+
DatePickerFormExample,
|
|
14
|
+
} from './components'
|
|
15
|
+
import { DatePicker } from '../date-picker'
|
|
16
|
+
|
|
17
|
+
<Meta title="Components/Date Picker"/>
|
|
18
|
+
|
|
19
|
+
# Date Picker
|
|
20
|
+
|
|
21
|
+
Date Pickers let merchants choose dates from a visual calendar that’s consistently applied wherever dates need to be selected across Edvisor. For more details refer to <a href='https://www.figma.com/file/ue1CurHfZ426o2T2l8Dk64/Edvisor-Product-Language?node-id=734%3A7365&t=Cz5qnAbrJNBJj8b1-0'>figma</a>.
|
|
22
|
+
|
|
23
|
+
## How to Use It
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
import { DatePicker } from '@edvisor/product-language'
|
|
27
|
+
|
|
28
|
+
<DatePicker />
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Uncontrolled
|
|
32
|
+
|
|
33
|
+
Drop it into your project uncontrolled.
|
|
34
|
+
|
|
35
|
+
<DatePickerExample />
|
|
36
|
+
|
|
37
|
+
### Controlled
|
|
38
|
+
|
|
39
|
+
Add state to control the date picker. By default the DatePicker takes a string as value.
|
|
40
|
+
|
|
41
|
+
<DatePickerControlledExample />
|
|
42
|
+
|
|
43
|
+
### Familiar HTML Input Interface
|
|
44
|
+
|
|
45
|
+
Wrap it in a form and mark it required. Pass in a min/max to restrict input to that range.
|
|
46
|
+
|
|
47
|
+
<DatePickerFormExample />
|
|
48
|
+
|
|
49
|
+
### Specify Available Dates
|
|
50
|
+
|
|
51
|
+
In addition to the min/max prop, you can pass in an `isAvailable` callback to apply specific restrictions.
|
|
52
|
+
|
|
53
|
+
<DatePickerAvailableDatesExample />
|
|
54
|
+
|
|
55
|
+
## Props
|
|
56
|
+
|
|
57
|
+
extends `InputHTMLAttributes<HTMLInputElement>` except where described below.
|
|
58
|
+
|
|
59
|
+
| Prop | Type | Description |
|
|
60
|
+
| --------------- | --------------------------- | ------------------------------------------------- |
|
|
61
|
+
| `value?` | `string` | The date |
|
|
62
|
+
| `defaultValue?` | `string` | Provide a value for the uncontrolled component |
|
|
63
|
+
| `onChange?` | `(change: string) => void` | Receive the value when it changes |
|
|
64
|
+
| `min?` | `string` | The earliest date the user can choose |
|
|
65
|
+
| `max?` | `string` | The latest date the user can choose |
|
|
66
|
+
| `isAvailable?` | `(date: string) => boolean` | A predicate that determines if a date is disabled |
|
|
67
|
+
|
|
68
|
+
## Customization
|
|
69
|
+
|
|
70
|
+
The default is sufficient for most cases, but you can also customize the DatePicker.
|
|
71
|
+
|
|
72
|
+
### Custom Open/Close
|
|
73
|
+
|
|
74
|
+
By controlling the open state you can open or close the input from outside.
|
|
75
|
+
|
|
76
|
+
<DatePickerControlledOpenExample />
|
|
77
|
+
|
|
78
|
+
### Custom Format
|
|
79
|
+
|
|
80
|
+
Pass in a format string or a custom formatting function. This only affects the visual format of the data.
|
|
81
|
+
|
|
82
|
+
<DatePickerFormatExample />
|
|
83
|
+
|
|
84
|
+
### Custom Input/Handle
|
|
85
|
+
|
|
86
|
+
The input/handle can be replaced using the Controls slot.
|
|
87
|
+
|
|
88
|
+
<DatePickerCustomHandleExample />
|
|
89
|
+
|
|
90
|
+
### Custom Calendar Controls
|
|
91
|
+
|
|
92
|
+
Children are rendered inside the calendar>
|
|
93
|
+
|
|
94
|
+
<DatePickerWithExtraStuffInTheCalendar />
|
|
95
|
+
|
|
96
|
+
### Props
|
|
97
|
+
|
|
98
|
+
| Prop | Type | Description |
|
|
99
|
+
| ---------- | ------------------------ | ------------------------------------------------ |
|
|
100
|
+
| `isOpen?` | `boolean` | Determines if the Calendar is visible |
|
|
101
|
+
| `onClick?` | `() => void` | Called when the input/handle is clicked |
|
|
102
|
+
| `format?` | `string | DateFormatter` | Called to render the date visually in the handle |
|
|
103
|
+
|
|
104
|
+
### Slots
|
|
105
|
+
|
|
106
|
+
| Slot | Description |
|
|
107
|
+
| ---------- | -------------------------------------------- |
|
|
108
|
+
| `Controls` | Completely replaces the default input/handle |
|
|
109
|
+
| `children` | Adds UI elements inside the Calendar |
|
|
110
|
+
|
|
111
|
+
## DatePicker Factory
|
|
112
|
+
|
|
113
|
+
In all the previous examples, the date picker used string as input and output. You can create a DatePicker for any data type using datePickerFactory. For example, you could use number:
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
const EpochDatePicker = datePickerFactory<number>({
|
|
117
|
+
toDate: (n) => new Date(n),
|
|
118
|
+
fromDate: (date) => isDefined(date) ? date.valueOf() : 0,
|
|
119
|
+
empty: (date) => date.valueOf() === 0,
|
|
120
|
+
})
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
This makes it relatively easy to use the DatePicker with date libraries like Luxon.
|
|
124
|
+
|
|
125
|
+
<DatePickerFactoryExample />
|
|
126
|
+
|
|
127
|
+
## Props
|
|
128
|
+
|
|
129
|
+
| Prop | Type | Description |
|
|
130
|
+
| ---------- | ------------------------- | ---------------------------------------------------------------------------------- |
|
|
131
|
+
| `toDate` | `(el: T) => Date` | Maps your type to date |
|
|
132
|
+
| `fromDate` | `(date: Date) => T` | Maps date to your type |
|
|
133
|
+
| `empty` | `(date: Date) => boolean` | Returns true if you give it the empty element of your type (such as '' for string) |
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// this file was generated, but it is safe to modify
|
|
2
|
+
import { bitwiseOr, MappedEnum, RequireOnlyOne, PropsWithChildren } from '@helpers'
|
|
3
|
+
import { Borders } from '@foundations'
|
|
4
|
+
|
|
5
|
+
const enum DividerType {
|
|
6
|
+
default = 1,
|
|
7
|
+
subdued = 2,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
type DividerTypes<T> = MappedEnum<typeof DividerType, T>
|
|
11
|
+
|
|
12
|
+
function toDividerType(n: number): DividerType {
|
|
13
|
+
switch (n) {
|
|
14
|
+
case DividerType.default:
|
|
15
|
+
return DividerType.default
|
|
16
|
+
case DividerType.subdued:
|
|
17
|
+
return DividerType.subdued
|
|
18
|
+
default:
|
|
19
|
+
return DividerType.default
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const DividerTypeColor = {
|
|
24
|
+
[DividerType.default]: Borders.Default.Default,
|
|
25
|
+
[DividerType.subdued]: Borders.Default.Subdued,
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export type DivideTypeProps = Partial<RequireOnlyOne<DividerTypes<boolean>>> &
|
|
29
|
+
PropsWithChildren
|
|
30
|
+
|
|
31
|
+
export function getColor(props: DivideTypeProps): string {
|
|
32
|
+
return DividerTypeColor[
|
|
33
|
+
toDividerType(
|
|
34
|
+
bitwiseOr([props.default, props.subdued])
|
|
35
|
+
)
|
|
36
|
+
]
|
|
37
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/react'
|
|
2
|
+
import { Divider } from './index'
|
|
3
|
+
import { Borders } from '@foundations'
|
|
4
|
+
|
|
5
|
+
describe('Divider Tests', () => {
|
|
6
|
+
describe('Divider Tests', () => {
|
|
7
|
+
it('should render the Divider with default color', async () => {
|
|
8
|
+
render(
|
|
9
|
+
<Divider/>
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
expect(screen.getByTestId('divider-test')).toBeInTheDocument()
|
|
13
|
+
expect(screen.getByTestId('divider-test')).toHaveStyle(`border: 1px solid ${Borders.Default.Default}`)
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it('should render the Divider with default color using parameter', async () => {
|
|
17
|
+
render(
|
|
18
|
+
<Divider default/>
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
expect(screen.getByTestId('divider-test')).toBeInTheDocument()
|
|
22
|
+
expect(screen.getByTestId('divider-test')).toHaveStyle(`border: 1px solid ${Borders.Default.Default}`)
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('should render the Divider with subdued color', async () => {
|
|
26
|
+
render(
|
|
27
|
+
<Divider subdued/>
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
expect(screen.getByTestId('divider-test')).toBeInTheDocument()
|
|
31
|
+
expect(screen.getByTestId('divider-test')).toHaveStyle(`border: 1px solid ${Borders.Default.Subdued}`)
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
})
|