@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,157 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-syntax */
|
|
2
|
+
import { InputHTMLAttributes } from 'react'
|
|
3
|
+
import { FC } from '@helpers'
|
|
4
|
+
import styled from 'styled-components'
|
|
5
|
+
import { Borders, Focused, Icons, Margin, Padding, Surface } from '@foundations'
|
|
6
|
+
import { Label } from 'components/typography'
|
|
7
|
+
|
|
8
|
+
export interface InputElementProps extends InputHTMLAttributes<HTMLInputElement> {
|
|
9
|
+
label: string;
|
|
10
|
+
id: string;
|
|
11
|
+
key?: string;
|
|
12
|
+
disabled?: boolean;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface IOption {
|
|
16
|
+
label: string;
|
|
17
|
+
value: string;
|
|
18
|
+
name?: string;
|
|
19
|
+
disabled?: boolean;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface IOptionGroup {
|
|
23
|
+
label: string;
|
|
24
|
+
options: IOption[];
|
|
25
|
+
onChange: (value: string) => void
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const RadioButton: FC<InputElementProps> = (props) => {
|
|
29
|
+
return (
|
|
30
|
+
<OptionWrapper>
|
|
31
|
+
<Label style={{minWidth: '50px'}}>
|
|
32
|
+
{props.label}
|
|
33
|
+
</Label>
|
|
34
|
+
<Radio type="radio" disabled={props.disabled} {...props} />
|
|
35
|
+
</OptionWrapper>
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const RadioButtonGroup: FC<IOptionGroup> = (props) => {
|
|
40
|
+
|
|
41
|
+
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
|
|
42
|
+
props.onChange(event.target.value)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const renderOptions = () => {
|
|
46
|
+
return props.options.map((option: IOption, index) => {
|
|
47
|
+
const shortenedOptionLabel = option.label.replace(/\s+/g, '')
|
|
48
|
+
const optionId = `radio-option-${shortenedOptionLabel}`
|
|
49
|
+
|
|
50
|
+
return (
|
|
51
|
+
<RadioButton
|
|
52
|
+
value={option.value}
|
|
53
|
+
label={option.label}
|
|
54
|
+
key={optionId}
|
|
55
|
+
id={optionId}
|
|
56
|
+
name={option.name}
|
|
57
|
+
disabled={option.disabled}
|
|
58
|
+
defaultChecked={index === 0}
|
|
59
|
+
onChange={handleChange}
|
|
60
|
+
/>
|
|
61
|
+
)
|
|
62
|
+
})
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<Container>
|
|
67
|
+
<Title>{props.label}</Title>
|
|
68
|
+
<GroupWrapper>
|
|
69
|
+
{renderOptions()}
|
|
70
|
+
</GroupWrapper>
|
|
71
|
+
</Container>
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const Container = styled.div`
|
|
76
|
+
display: flex;
|
|
77
|
+
flex-direction: row;
|
|
78
|
+
align-items: center;
|
|
79
|
+
float: left;
|
|
80
|
+
`
|
|
81
|
+
|
|
82
|
+
const Title = styled(Label)`
|
|
83
|
+
padding: ${Padding.none} ${Padding.xs};
|
|
84
|
+
min-width: 100px;
|
|
85
|
+
`
|
|
86
|
+
|
|
87
|
+
const GroupWrapper = styled.div`
|
|
88
|
+
display: flex;
|
|
89
|
+
min-width: 150px;
|
|
90
|
+
flex-direction: row;
|
|
91
|
+
align-items: center;
|
|
92
|
+
`
|
|
93
|
+
|
|
94
|
+
const OptionWrapper = styled.div`
|
|
95
|
+
gap: 6px;
|
|
96
|
+
padding: ${Padding.xs};
|
|
97
|
+
display: flex;
|
|
98
|
+
flex-direction: row-reverse;
|
|
99
|
+
float: left;
|
|
100
|
+
`
|
|
101
|
+
|
|
102
|
+
export const Radio = styled.input`
|
|
103
|
+
-webkit-appearance: none;
|
|
104
|
+
appearance: none;
|
|
105
|
+
margin: ${Margin.none};
|
|
106
|
+
width: 1.5em;
|
|
107
|
+
height: 1.5em;
|
|
108
|
+
border: 2px solid ${Borders.Highlight.Default};
|
|
109
|
+
border-radius: 50%;
|
|
110
|
+
transition: all 0.1s ease-in-out;
|
|
111
|
+
::after {
|
|
112
|
+
content: "";
|
|
113
|
+
display: block;
|
|
114
|
+
border-radius: 50%;
|
|
115
|
+
width: 0.75em;
|
|
116
|
+
height: 0.75em;
|
|
117
|
+
margin: 3px;
|
|
118
|
+
}
|
|
119
|
+
:checked {
|
|
120
|
+
::after {
|
|
121
|
+
background-color: ${Icons.Highlight};
|
|
122
|
+
}
|
|
123
|
+
:hover {
|
|
124
|
+
background-color: ${Surface.Default.Default};
|
|
125
|
+
border: 2px solid ${Icons.Highlight};
|
|
126
|
+
::after {
|
|
127
|
+
background-color: ${Icons.Highlight};
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
:hover {
|
|
132
|
+
::after {
|
|
133
|
+
background-color: ${Focused.Default};
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
:disabled {
|
|
137
|
+
cursor: not-allowed;
|
|
138
|
+
border: 2px solid ${Focused.Default};
|
|
139
|
+
background-color: ${Surface.Highlight.Default};
|
|
140
|
+
:hover {
|
|
141
|
+
::after {
|
|
142
|
+
background-color: ${Surface.Highlight.Default};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
:checked {
|
|
146
|
+
::after {
|
|
147
|
+
background-color: ${Focused.Default};
|
|
148
|
+
}
|
|
149
|
+
:hover {
|
|
150
|
+
background-color: ${Surface.Highlight.Default};
|
|
151
|
+
::after {
|
|
152
|
+
background-color: ${Focused.Default};
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
`
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { Canvas, Meta, Story, ArgsTable } from '@storybook/addon-docs';
|
|
2
|
+
import { Select } from '../index'
|
|
3
|
+
import {
|
|
4
|
+
SelectOptions,
|
|
5
|
+
CustomLabelComponent,
|
|
6
|
+
HugeListWithCustomLabelComponent,
|
|
7
|
+
CustomValidation,
|
|
8
|
+
CustomMenu,
|
|
9
|
+
FancyMenu
|
|
10
|
+
} from './components'
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
<Meta title="Components/Select" component={Select}/>
|
|
14
|
+
|
|
15
|
+
# Select System
|
|
16
|
+
|
|
17
|
+
For more details, check out the guidelines on [Figma](https://www.figma.com/file/ue1CurHfZ426o2T2l8Dk64/Edvisor-Product-Language?node-id=4%3A12&t=3Z4YOaL6SG9Km6ih-0)
|
|
18
|
+
|
|
19
|
+
### Table of Contents
|
|
20
|
+
1. [How to use](#how-to-use)
|
|
21
|
+
2. [Select Options](#select-options)
|
|
22
|
+
3. [Custom Label component](#custom-label)
|
|
23
|
+
4. [Handling Huge lists](#huge-lists)
|
|
24
|
+
5. [Validation](#validation)
|
|
25
|
+
6. [Custom Menu Component](#custom-menu)
|
|
26
|
+
7. [Customized Menu](#fancy-menu)
|
|
27
|
+
8. [API](#api)
|
|
28
|
+
9. [Select props](#select)
|
|
29
|
+
10. [option props](#option)
|
|
30
|
+
11. [labelComponent props](#labelComponent)
|
|
31
|
+
12. [menuComponent props](#menuComponent)
|
|
32
|
+
|
|
33
|
+
<div id="how-to-use"/>
|
|
34
|
+
|
|
35
|
+
## How to Use
|
|
36
|
+
|
|
37
|
+
```tsx
|
|
38
|
+
import { select } from '@edvisor/product-language'
|
|
39
|
+
|
|
40
|
+
<Select />
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
<div id="select-options"></div>
|
|
45
|
+
|
|
46
|
+
### Select Options
|
|
47
|
+
<SelectOptions />
|
|
48
|
+
|
|
49
|
+
<div id="custom-label"></div>
|
|
50
|
+
|
|
51
|
+
### Custom Label component
|
|
52
|
+
<CustomLabelComponent/>
|
|
53
|
+
|
|
54
|
+
<div id="huge-lists"></div>
|
|
55
|
+
|
|
56
|
+
### Handling Huge lists
|
|
57
|
+
The Select component uses [react-window](https://github.com/bvaughn/react-window) for efficiently rendering large lists by rendering part of a large data set
|
|
58
|
+
|
|
59
|
+
Try searching some Countries
|
|
60
|
+
<HugeListWithCustomLabelComponent/>
|
|
61
|
+
|
|
62
|
+
<div id="validation"></div>
|
|
63
|
+
|
|
64
|
+
### Validation
|
|
65
|
+
<CustomValidation/>
|
|
66
|
+
|
|
67
|
+
<div id="custom-menu"></div>
|
|
68
|
+
|
|
69
|
+
### Custom Menu Component
|
|
70
|
+
You can build your own menu component and pass it to the `menuComponent` property
|
|
71
|
+
<CustomMenu/>
|
|
72
|
+
|
|
73
|
+
<div id="fancy-menu"></div>
|
|
74
|
+
|
|
75
|
+
### Customized Menu
|
|
76
|
+
|
|
77
|
+
This is a ready to use costumized menu.
|
|
78
|
+
Add the extra `icon` and `helperText` to the option Object to have them rendered in the menu.
|
|
79
|
+
|
|
80
|
+
```tsx
|
|
81
|
+
{
|
|
82
|
+
label: string,
|
|
83
|
+
value: T | T[],
|
|
84
|
+
icon?: IconM | IconMinor,
|
|
85
|
+
helperText?: string
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
<FancyMenu/>
|
|
89
|
+
|
|
90
|
+
<div id="api"></div>
|
|
91
|
+
|
|
92
|
+
## API
|
|
93
|
+
|
|
94
|
+
<div id="select"></div>
|
|
95
|
+
|
|
96
|
+
### `Select : ISelectProps`
|
|
97
|
+
|
|
98
|
+
| Prop | Type | Description |
|
|
99
|
+
| ------------------------------------ | ----------------------------------------------------------------- | ---------------------------------------------------------------- |
|
|
100
|
+
| `className?` | `string` | A Class name to be added to the wrapper |
|
|
101
|
+
| [`options?`](#option) | `IOption<T>[]` | A list of values to be selected |
|
|
102
|
+
| `value?` | `T` \| `T[]` | The current value selected |
|
|
103
|
+
| `placeholder?` | `string` | The placeholder to be displayed |
|
|
104
|
+
| `emptyText?` | `string` | The text to be displayed when there are no values |
|
|
105
|
+
| `clearable?` | `boolean` | Allow the selected value to be cleared |
|
|
106
|
+
| `searchable?` | `boolean` | Enable search in the select |
|
|
107
|
+
| `disabled?` | `boolean` | Disable the component |
|
|
108
|
+
| `multi?` | `boolean` | Enable multi selection |
|
|
109
|
+
| `invalid?` | `boolean` | Indicate there's an error in the component |
|
|
110
|
+
| `rowHeight?` | `number` | The height of the fields, defaults to 44px |
|
|
111
|
+
| `menuHeight?` | `number` | The height of the menu, defaults to 190px |
|
|
112
|
+
| `menuPosition?` | `top` \| `bottom` | The poosition where the menu should be rendered |
|
|
113
|
+
| `menuTitle?` | `string` | Menu title when using the [Customized Menu](#fancy-menu) |
|
|
114
|
+
| `label?` | `string` | The Label of the select |
|
|
115
|
+
| `labelPosition?` | `top` \| `side` | The position where the label should be rendered |
|
|
116
|
+
| [`menuComponent?`](#menuComponent) | `JSX.Element<IMenuComponentProps>` | Replaces the default List Menu component |
|
|
117
|
+
| [`labelComponent?`](#labelComponent) | `JSX.Element<LabelComponentProps<T>>` | Replaces the default Label component |
|
|
118
|
+
| `onChange?` | `(value: T[]` \| `T` \| `undefined, option?: IOption<T>) => void` | Called when an option is changed |
|
|
119
|
+
| `onSearch?` | `(value: string) => void` | Called when the search is trigged |
|
|
120
|
+
| `onOpen?` | `() => void` | Called when the menu opnes |
|
|
121
|
+
| `onClose?` | `() => void` | Called when the menu closes |
|
|
122
|
+
|
|
123
|
+
<div id="option"></div>
|
|
124
|
+
|
|
125
|
+
### `option: IOption`
|
|
126
|
+
The options property expects an array of objects of a type:
|
|
127
|
+
```tsx
|
|
128
|
+
{
|
|
129
|
+
label: string,
|
|
130
|
+
value: T | T[],
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
| Prop | Type | Description |
|
|
135
|
+
| ----------------- | ------------- | ----------------------------------------------- |
|
|
136
|
+
| value | T | The Option value |
|
|
137
|
+
| disabled? | boolean | Whether the option is disabled (not implemented) |
|
|
138
|
+
| label | string | The Option label to be displayed |
|
|
139
|
+
| [key: string] | any | key to the custom properties |
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
<div id="labelComponent"></div>
|
|
143
|
+
|
|
144
|
+
### `labelComponent: LabelComponentProps extends IOption`
|
|
145
|
+
| Prop | Type | Description |
|
|
146
|
+
| ----------------- | ------------- | ---------------------------------------------------------- |
|
|
147
|
+
| `active` | `boolean` | indicates the option is active |
|
|
148
|
+
| `type` | `value-single` \| `value-multi` \| `option` | used to style accordinglygly |
|
|
149
|
+
|
|
150
|
+
<div id="menuComponent"></div>
|
|
151
|
+
|
|
152
|
+
### `menuComponent: IMenuComponentProps`
|
|
153
|
+
When using the custom menuComponent, the select exposes this properties.
|
|
154
|
+
|
|
155
|
+
| Prop | Type | Description |
|
|
156
|
+
| ----------------- | --------------------------------------------------------| --------------------------------------------- |
|
|
157
|
+
| `options` | `IOption<T>[]` | The list of values of the selected |
|
|
158
|
+
| `value` | `T` \| `T[]` | The Selected Value |
|
|
159
|
+
| `labelComponent` | `JSX.Element<LabelComponentProps<T>>` | The Select Label Component |
|
|
160
|
+
| `emptyText` | `string` | Text displayed when there are no values |
|
|
161
|
+
| `multi` | `boolean` | Indicate multi selection is active |
|
|
162
|
+
| `rowHeight` | `number` | The height of the fields |
|
|
163
|
+
| `menuHeight` | `number` | The height of the menu |
|
|
164
|
+
| `menuPosition` | `top` \| `bottom` | The positio of the menu |
|
|
165
|
+
| `invalid` | `boolean` | Indicate an error in the component |
|
|
166
|
+
| `selectedIndex?` | `number` | The index of the Selected Item |
|
|
167
|
+
| `open` | `boolean` | Indicates if the menu is open |
|
|
168
|
+
| `search?` | `string` | The string typed in the search field |
|
|
169
|
+
| `labelPosition?` | `string` | The position where the label |
|
|
170
|
+
| `label?` | `string` | The Label of the select |
|
|
171
|
+
| `onSelect` |`(value: T extends any[] ? T[] : T, option?: T) => void` | Trigged when the selected option changes |
|
|
172
|
+
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
import { FC } from '@helpers'
|
|
2
|
+
import { CSSProperties } from 'react'
|
|
3
|
+
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
|
+
export interface ISelectProps<T = any> {
|
|
6
|
+
className?: string
|
|
7
|
+
style?: CSSProperties
|
|
8
|
+
options?: IOption<T>[]
|
|
9
|
+
value?: T | T[]
|
|
10
|
+
placeholder?: string
|
|
11
|
+
emptyText?: string
|
|
12
|
+
clearable?: boolean
|
|
13
|
+
searchable?: boolean
|
|
14
|
+
disabled?: boolean
|
|
15
|
+
multi?: boolean
|
|
16
|
+
invalid?: boolean
|
|
17
|
+
errors?: { message: string }[]
|
|
18
|
+
rowHeight?: number
|
|
19
|
+
menuHeight?: number
|
|
20
|
+
menuPosition?: 'top' | 'bottom'
|
|
21
|
+
menuTitle?: string
|
|
22
|
+
label?: string
|
|
23
|
+
labelPosition?: 'top' | 'side'
|
|
24
|
+
labelComponent?: FC<LabelComponentProps<T>>
|
|
25
|
+
menuComponent?: FC<IMenuComponentProps>
|
|
26
|
+
onChange?(value: T[] | T | undefined, option?: IOption<T>): void
|
|
27
|
+
onSearch?(value: string): void
|
|
28
|
+
onOpen?(): void
|
|
29
|
+
onClose?(): void
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface IValueProps {
|
|
33
|
+
options: ISelectProps['options'];
|
|
34
|
+
value: ISelectProps['value'];
|
|
35
|
+
placeholder: ISelectProps['placeholder'];
|
|
36
|
+
clearable: ISelectProps['clearable'];
|
|
37
|
+
searchable: ISelectProps['searchable'];
|
|
38
|
+
labelComponent: ISelectProps['labelComponent'];
|
|
39
|
+
multi: ISelectProps['multi'];
|
|
40
|
+
disabled: ISelectProps['disabled'];
|
|
41
|
+
invalid: ISelectProps['invalid'];
|
|
42
|
+
errors: ISelectProps['errors'];
|
|
43
|
+
search?: string;
|
|
44
|
+
open: boolean;
|
|
45
|
+
focused?: boolean;
|
|
46
|
+
label: ISelectProps['label'];
|
|
47
|
+
labelPosition: ISelectProps['labelPosition'];
|
|
48
|
+
onClear(): void;
|
|
49
|
+
onClick(): void;
|
|
50
|
+
onSearch(search: string): void;
|
|
51
|
+
onSearchFocus(): void;
|
|
52
|
+
onSearchBlur(): void;
|
|
53
|
+
onOptionRemove(value: any): void;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface IMenuContainerProps {
|
|
57
|
+
className?: string;
|
|
58
|
+
menuTop?: number;
|
|
59
|
+
menuHeight?: RectSize;
|
|
60
|
+
menuPosition?: ISelectProps['menuPosition'];
|
|
61
|
+
invalid?: boolean;
|
|
62
|
+
labelPosition?: string
|
|
63
|
+
label?: string
|
|
64
|
+
children?: React.ReactNode;
|
|
65
|
+
onRef?(el: HTMLDivElement | undefined): void;
|
|
66
|
+
onClick?(el: React.MouseEvent<HTMLDivElement>): void;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
type RectSize = number | 'auto';
|
|
70
|
+
|
|
71
|
+
export interface IValueComponentMultiProps<T = any>
|
|
72
|
+
extends IValueComponentSingleProps<T> {
|
|
73
|
+
options: IOption<T>[];
|
|
74
|
+
onRemove(value: T): void;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export type LabelComponentProps<T = any> = IOption<T> & {
|
|
78
|
+
active: boolean;
|
|
79
|
+
type: 'value-single' | 'value-multi' | 'option';
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export interface IValueComponentSingleProps<T = any> {
|
|
83
|
+
className?: string;
|
|
84
|
+
option: IOption<T>;
|
|
85
|
+
labelComponent: ISelectProps['labelComponent'];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface IOptionComponentProps<T extends IOption = any> {
|
|
89
|
+
className?: string;
|
|
90
|
+
option: T;
|
|
91
|
+
active?: boolean;
|
|
92
|
+
selected?: boolean;
|
|
93
|
+
height?: number;
|
|
94
|
+
labelComponent: ISelectProps['labelComponent'];
|
|
95
|
+
search?: string;
|
|
96
|
+
onSelect(value: T['value'], option?: T): void;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface IOption<T = any> {
|
|
100
|
+
value: T;
|
|
101
|
+
disabled?: boolean;
|
|
102
|
+
label: string;
|
|
103
|
+
[key: string]: any;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface IMenuComponentProps<T = any> {
|
|
107
|
+
options: ISelectProps['options'];
|
|
108
|
+
value: ISelectProps['value'];
|
|
109
|
+
labelComponent: ISelectProps['labelComponent'];
|
|
110
|
+
menuComponent: ISelectProps['menuComponent'];
|
|
111
|
+
emptyText: ISelectProps['emptyText'];
|
|
112
|
+
multi: ISelectProps['multi'];
|
|
113
|
+
rowHeight: ISelectProps['rowHeight'];
|
|
114
|
+
menuHeight: ISelectProps['menuHeight'];
|
|
115
|
+
menuPosition: ISelectProps['menuPosition'];
|
|
116
|
+
invalid: ISelectProps['invalid'];
|
|
117
|
+
selectedIndex?: number;
|
|
118
|
+
open: boolean;
|
|
119
|
+
search?: string;
|
|
120
|
+
labelPosition?: string;
|
|
121
|
+
label?: string;
|
|
122
|
+
menuTitle?: string
|
|
123
|
+
onSelect(value: T extends any[] ? T[] : T, option?: T): void;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export interface IPosition {
|
|
127
|
+
menuPosition?: 'top' | 'bottom',
|
|
128
|
+
menuHeight?: RectSize,
|
|
129
|
+
label?: string,
|
|
130
|
+
labelPosition?: string
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export const DEFAULT_ROW_HEIGHT = 44
|
|
134
|
+
|
|
135
|
+
export const DEFAULT_MENU_HEIGHT = 190
|
|
136
|
+
|
|
137
|
+
export const DEFAULT_EMPTY_TEXT = 'No results found'
|
|
138
|
+
|
|
139
|
+
export const DEFAULT_PLACEHOLDER = 'Select Something'
|
|
140
|
+
|
|
141
|
+
export const enum menuPositionType {
|
|
142
|
+
TOP = 'top',
|
|
143
|
+
BOTTOM = 'bottom',
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export const enum labelPositionType {
|
|
147
|
+
TOP = 'top',
|
|
148
|
+
SIDE = 'side',
|
|
149
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { is, isDefined, isEmpty, isNil } from '@helpers'
|
|
3
|
+
import { IOption, IPosition, labelPositionType, menuPositionType } from './types'
|
|
4
|
+
|
|
5
|
+
export function getDocument(): Document | undefined {
|
|
6
|
+
if (typeof document !== 'undefined') {
|
|
7
|
+
return document
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return undefined
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export function equal(valueA: any, valueB: any) {
|
|
14
|
+
if (valueA === valueB) {
|
|
15
|
+
return true
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (isNil(valueA) || isNil(valueB)) {
|
|
19
|
+
return false
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
if (typeof valueA === 'object' && typeof valueB === 'object') {
|
|
23
|
+
if (isDefined(valueA.toJSON) && isDefined(valueB.toJSON)) {
|
|
24
|
+
return JSON.stringify(valueA.toJSON()) === JSON.stringify(valueB.toJSON())
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return JSON.stringify(valueA) === JSON.stringify(valueB)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return false
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function getValueOptions(
|
|
34
|
+
options: IOption[],
|
|
35
|
+
value: any,
|
|
36
|
+
multi: boolean | undefined,
|
|
37
|
+
) {
|
|
38
|
+
return options
|
|
39
|
+
.slice()
|
|
40
|
+
.filter((option) => {
|
|
41
|
+
if (Array.isArray(value) && is(multi)) {
|
|
42
|
+
return value.some((val) =>
|
|
43
|
+
equal(option.value, val)
|
|
44
|
+
)
|
|
45
|
+
} else {
|
|
46
|
+
return equal(option.value, value)
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
.sort((optionA, optionB) => {
|
|
50
|
+
if (Array.isArray(value) && is(multi)) {
|
|
51
|
+
const resultA = value.findIndex((val) =>
|
|
52
|
+
equal(optionA.value, val)
|
|
53
|
+
)
|
|
54
|
+
const resultB = value.findIndex((val) =>
|
|
55
|
+
equal(optionB.value, val)
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
return resultA < resultB ? -1 : resultA > resultB ? 1 : 0
|
|
59
|
+
} else {
|
|
60
|
+
return 0
|
|
61
|
+
}
|
|
62
|
+
})
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export const keys = {
|
|
66
|
+
ARROW_UP: 'ArrowUp',
|
|
67
|
+
ARROW_DOWN: 'ArrowDown',
|
|
68
|
+
ENTER: 'Enter',
|
|
69
|
+
TAB: 'Tab',
|
|
70
|
+
ESC: 'Escape',
|
|
71
|
+
BACKSPACE: 'Backspace',
|
|
72
|
+
SPACE: ' '
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export function toKey(value: any): string | number {
|
|
76
|
+
if (typeof value === 'string') {
|
|
77
|
+
return value
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (isDefined(value) && typeof value === 'object') {
|
|
81
|
+
const jsonObject = isDefined(value.toJSON) ? value.toJSON() : value
|
|
82
|
+
|
|
83
|
+
return JSON.stringify(jsonObject)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return JSON.stringify(value)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const topPosition = (props: IPosition) => {
|
|
90
|
+
if (props.menuPosition === menuPositionType.TOP
|
|
91
|
+
&& isDefined(props.menuHeight)
|
|
92
|
+
&& typeof props.menuHeight === 'number') {
|
|
93
|
+
|
|
94
|
+
return `${-(props.menuHeight + (
|
|
95
|
+
isDefined(props.label) && !isEmpty(props.label)
|
|
96
|
+
&& props.labelPosition === labelPositionType.TOP
|
|
97
|
+
? 64
|
|
98
|
+
: 44))}px`
|
|
99
|
+
}
|
|
100
|
+
return '4px'
|
|
101
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './spinner'
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { bitwiseOr, MappedEnum, RequireOnlyOne, PropsWithChildren } from '@helpers'
|
|
2
|
+
|
|
3
|
+
const enum SpinnerSize {
|
|
4
|
+
small = 1,
|
|
5
|
+
medium = 2,
|
|
6
|
+
large = 4,
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
type SpinnerSizes<T> = MappedEnum<typeof SpinnerSize, T>
|
|
10
|
+
|
|
11
|
+
function toSpinner(n: number): SpinnerSize {
|
|
12
|
+
switch (n) {
|
|
13
|
+
case SpinnerSize.small:
|
|
14
|
+
return SpinnerSize.small
|
|
15
|
+
case SpinnerSize.medium:
|
|
16
|
+
return SpinnerSize.medium
|
|
17
|
+
case SpinnerSize.large:
|
|
18
|
+
return SpinnerSize.large
|
|
19
|
+
default:
|
|
20
|
+
return SpinnerSize.medium
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
const SpinnerValues = {
|
|
25
|
+
[SpinnerSize.small]: '18px',
|
|
26
|
+
[SpinnerSize.medium]: '40px',
|
|
27
|
+
[SpinnerSize.large]: '60px',
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export type SpinnerProps = Partial<RequireOnlyOne<SpinnerSizes<boolean>>> &
|
|
31
|
+
PropsWithChildren
|
|
32
|
+
|
|
33
|
+
export function getValuesBySize(props: SpinnerProps): string {
|
|
34
|
+
return SpinnerValues[
|
|
35
|
+
toSpinner(
|
|
36
|
+
bitwiseOr([props.small, props.medium, props.large])
|
|
37
|
+
)
|
|
38
|
+
]
|
|
39
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { render, screen } from '@testing-library/react'
|
|
2
|
+
import { Spinner } from './index'
|
|
3
|
+
|
|
4
|
+
describe('Spinner Tests', () => {
|
|
5
|
+
describe('Spinner Tests', () => {
|
|
6
|
+
it('should render the Spinner with default size', async () => {
|
|
7
|
+
render(
|
|
8
|
+
<Spinner />
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
const spinner = screen.getByRole('icon')
|
|
12
|
+
|
|
13
|
+
expect(spinner).toBeInTheDocument()
|
|
14
|
+
expect(spinner).toHaveStyle('height: 40px')
|
|
15
|
+
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it('should render the Spinner with small size', async () => {
|
|
19
|
+
render(
|
|
20
|
+
<Spinner small/>
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
const spinner = screen.getByRole('icon')
|
|
24
|
+
|
|
25
|
+
expect(spinner).toBeInTheDocument()
|
|
26
|
+
expect(spinner).toHaveStyle('height: 18px')
|
|
27
|
+
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
})
|
|
31
|
+
})
|