@douyinfe/semi-ui 2.2.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/_base/_story/a11y.jsx +6 -6
- package/_base/_story/a11y.scss +0 -1
- package/_base/_story/index.scss +2 -5
- package/_utils/hooks/usePrevFocus.ts +16 -0
- package/_utils/index.ts +4 -0
- package/anchor/_story/anchor.stories.js +1 -1
- package/anchor/index.tsx +5 -2
- package/anchor/link.tsx +29 -4
- package/autoComplete/index.tsx +28 -1
- package/avatar/_story/avatar.stories.js +4 -4
- package/avatar/index.tsx +6 -4
- package/banner/index.tsx +2 -1
- package/breadcrumb/_story/breadcrumb.stories.js +22 -8
- package/breadcrumb/index.tsx +8 -1
- package/breadcrumb/item.tsx +1 -1
- package/button/Button.tsx +4 -0
- package/button/__test__/button.test.js +1 -1
- package/button/_story/button.stories.js +10 -10
- package/button/buttonGroup.tsx +4 -2
- package/button/splitButtonGroup.tsx +5 -2
- package/card/_story/card.stories.js +8 -1
- package/card/_story/card.stories.tsx +3 -0
- package/card/index.tsx +5 -2
- package/cascader/index.tsx +33 -5
- package/checkbox/_story/checkbox.stories.js +19 -12
- package/checkbox/checkbox.tsx +40 -5
- package/checkbox/checkboxGroup.tsx +30 -5
- package/checkbox/checkboxInner.tsx +25 -2
- package/collapse/index.tsx +1 -1
- package/collapse/item.tsx +12 -7
- package/collapsible/index.tsx +4 -2
- package/configProvider/_story/configProvider.stories.tsx +27 -0
- package/datePicker/__test__/datePicker.test.js +108 -0
- package/datePicker/_story/datePicker.stories.js +146 -2
- package/datePicker/datePicker.tsx +24 -0
- package/datePicker/monthsGrid.tsx +2 -1
- package/dist/css/semi.css +34 -7
- package/dist/css/semi.min.css +1 -1
- package/dist/umd/semi-ui.js +2768 -1501
- package/dist/umd/semi-ui.js.map +1 -1
- package/dist/umd/semi-ui.min.js +1 -1
- package/dist/umd/semi-ui.min.js.map +1 -1
- package/dropdown/dropdownItem.tsx +1 -1
- package/dropdown/dropdownMenu.tsx +1 -1
- package/empty/index.tsx +4 -4
- package/form/_story/FormApi/formApiDemo.jsx +3 -2
- package/form/_story/Validate/validateDemo.jsx +1 -1
- package/form/_story/demo.jsx +12 -3
- package/form/_story/form.stories.js +0 -7
- package/form/baseForm.tsx +2 -0
- package/form/errorMessage.tsx +13 -2
- package/form/hoc/withField.tsx +37 -8
- package/form/index.tsx +0 -2
- package/form/interface.ts +2 -0
- package/form/label.tsx +4 -2
- package/input/index.tsx +49 -4
- package/input/inputGroup.tsx +9 -4
- package/input/textarea.tsx +25 -6
- package/inputNumber/_story/inputNumber.stories.js +12 -0
- package/inputNumber/index.tsx +33 -2
- package/layout/Sider.tsx +6 -2
- package/layout/index.tsx +4 -3
- package/lib/cjs/_utils/hooks/usePrevFocus.d.ts +2 -0
- package/lib/cjs/_utils/hooks/usePrevFocus.js +30 -0
- package/lib/cjs/_utils/index.d.ts +1 -0
- package/lib/cjs/_utils/index.js +6 -1
- package/lib/cjs/anchor/index.d.ts +2 -0
- package/lib/cjs/anchor/index.js +6 -1
- package/lib/cjs/anchor/link.d.ts +4 -1
- package/lib/cjs/anchor/link.js +39 -5
- package/lib/cjs/autoComplete/index.d.ts +17 -0
- package/lib/cjs/autoComplete/index.js +21 -2
- package/lib/cjs/avatar/index.d.ts +4 -3
- package/lib/cjs/avatar/index.js +15 -11
- package/lib/cjs/banner/index.js +4 -2
- package/lib/cjs/breadcrumb/index.d.ts +3 -0
- package/lib/cjs/breadcrumb/index.js +10 -4
- package/lib/cjs/breadcrumb/item.js +2 -2
- package/lib/cjs/button/Button.d.ts +2 -0
- package/lib/cjs/button/Button.js +4 -2
- package/lib/cjs/button/buttonGroup.d.ts +3 -0
- package/lib/cjs/button/buttonGroup.js +8 -4
- package/lib/cjs/button/index.d.ts +1 -0
- package/lib/cjs/button/splitButtonGroup.d.ts +3 -0
- package/lib/cjs/button/splitButtonGroup.js +5 -2
- package/lib/cjs/card/index.d.ts +3 -0
- package/lib/cjs/card/index.js +3 -1
- package/lib/cjs/cascader/index.d.ts +14 -0
- package/lib/cjs/cascader/index.js +35 -7
- package/lib/cjs/checkbox/checkbox.d.ts +21 -1
- package/lib/cjs/checkbox/checkbox.js +51 -17
- package/lib/cjs/checkbox/checkboxGroup.d.ts +13 -1
- package/lib/cjs/checkbox/checkboxGroup.js +16 -3
- package/lib/cjs/checkbox/checkboxInner.d.ts +15 -0
- package/lib/cjs/checkbox/checkboxInner.js +20 -3
- package/lib/cjs/collapse/item.d.ts +2 -1
- package/lib/cjs/collapse/item.js +12 -2
- package/lib/cjs/collapsible/index.d.ts +1 -0
- package/lib/cjs/collapsible/index.js +4 -2
- package/lib/cjs/datePicker/datePicker.d.ts +12 -0
- package/lib/cjs/datePicker/datePicker.js +22 -3
- package/lib/cjs/datePicker/monthsGrid.d.ts +1 -0
- package/lib/cjs/datePicker/monthsGrid.js +2 -1
- package/lib/cjs/dropdown/dropdownItem.js +3 -1
- package/lib/cjs/dropdown/dropdownMenu.js +4 -1
- package/lib/cjs/form/baseForm.d.ts +9 -0
- package/lib/cjs/form/baseForm.js +3 -1
- package/lib/cjs/form/errorMessage.d.ts +4 -0
- package/lib/cjs/form/errorMessage.js +21 -3
- package/lib/cjs/form/field.d.ts +7 -0
- package/lib/cjs/form/hoc/withField.js +49 -16
- package/lib/cjs/form/index.d.ts +0 -1
- package/lib/cjs/form/interface.d.ts +2 -0
- package/lib/cjs/form/label.d.ts +2 -0
- package/lib/cjs/form/label.js +5 -2
- package/lib/cjs/input/index.d.ts +16 -0
- package/lib/cjs/input/index.js +51 -15
- package/lib/cjs/input/inputGroup.d.ts +2 -1
- package/lib/cjs/input/inputGroup.js +11 -1
- package/lib/cjs/input/textarea.js +12 -1
- package/lib/cjs/inputNumber/index.d.ts +21 -12
- package/lib/cjs/inputNumber/index.js +37 -3
- package/lib/cjs/layout/Sider.d.ts +4 -0
- package/lib/cjs/layout/Sider.js +4 -1
- package/lib/cjs/layout/index.js +2 -0
- package/lib/cjs/list/item.js +0 -1
- package/lib/cjs/modal/Modal.js +2 -0
- package/lib/cjs/modal/ModalContent.d.ts +3 -1
- package/lib/cjs/modal/ModalContent.js +47 -5
- package/lib/cjs/navigation/Item.d.ts +4 -2
- package/lib/cjs/navigation/Item.js +25 -5
- package/lib/cjs/navigation/SubNav.d.ts +4 -2
- package/lib/cjs/navigation/SubNav.js +8 -1
- package/lib/cjs/navigation/index.js +2 -0
- package/lib/cjs/notification/notice.d.ts +1 -1
- package/lib/cjs/notification/notice.js +32 -22
- package/lib/cjs/pagination/index.js +16 -6
- package/lib/cjs/popover/index.js +7 -3
- package/lib/cjs/progress/index.d.ts +8 -0
- package/lib/cjs/progress/index.js +42 -9
- package/lib/cjs/radio/radio.d.ts +6 -1
- package/lib/cjs/radio/radio.js +17 -5
- package/lib/cjs/radio/radioGroup.d.ts +16 -1
- package/lib/cjs/radio/radioGroup.js +18 -3
- package/lib/cjs/radio/radioInner.d.ts +6 -1
- package/lib/cjs/radio/radioInner.js +11 -3
- package/lib/cjs/rating/index.d.ts +14 -0
- package/lib/cjs/rating/index.js +14 -3
- package/lib/cjs/rating/item.d.ts +2 -0
- package/lib/cjs/rating/item.js +6 -1
- package/lib/cjs/select/index.d.ts +16 -0
- package/lib/cjs/select/index.js +65 -19
- package/lib/cjs/select/option.js +28 -22
- package/lib/cjs/sideSheet/SideSheetContent.d.ts +1 -0
- package/lib/cjs/sideSheet/SideSheetContent.js +4 -1
- package/lib/cjs/sideSheet/index.d.ts +1 -0
- package/lib/cjs/sideSheet/index.js +2 -1
- package/lib/cjs/slider/index.d.ts +2 -1
- package/lib/cjs/slider/index.js +64 -17
- package/lib/cjs/spin/icon.js +3 -4
- package/lib/cjs/steps/basicStep.d.ts +3 -0
- package/lib/cjs/steps/basicStep.js +23 -25
- package/lib/cjs/steps/basicSteps.d.ts +1 -0
- package/lib/cjs/steps/basicSteps.js +2 -1
- package/lib/cjs/steps/fillStep.d.ts +3 -0
- package/lib/cjs/steps/fillStep.js +19 -4
- package/lib/cjs/steps/fillSteps.d.ts +1 -0
- package/lib/cjs/steps/fillSteps.js +2 -1
- package/lib/cjs/steps/navStep.d.ts +3 -0
- package/lib/cjs/steps/navStep.js +22 -25
- package/lib/cjs/steps/navSteps.d.ts +1 -0
- package/lib/cjs/steps/navSteps.js +2 -1
- package/lib/cjs/switch/index.d.ts +12 -0
- package/lib/cjs/switch/index.js +19 -4
- package/lib/cjs/table/Body/BaseRow.js +35 -3
- package/lib/cjs/table/Body/index.js +9 -1
- package/lib/cjs/table/ColumnFilter.js +4 -0
- package/lib/cjs/table/ColumnSelection.d.ts +3 -0
- package/lib/cjs/table/ColumnSelection.js +6 -2
- package/lib/cjs/table/ColumnSorter.js +19 -3
- package/lib/cjs/table/CustomExpandIcon.js +7 -1
- package/lib/cjs/table/Table.d.ts +2 -0
- package/lib/cjs/table/Table.js +31 -15
- package/lib/cjs/table/TableCell.d.ts +2 -0
- package/lib/cjs/table/TableCell.js +6 -2
- package/lib/cjs/table/TableHeaderRow.js +8 -2
- package/lib/cjs/tabs/TabBar.js +11 -3
- package/lib/cjs/tabs/TabPane.js +3 -1
- package/lib/cjs/tabs/index.js +0 -1
- package/lib/cjs/tagInput/index.d.ts +4 -1
- package/lib/cjs/tagInput/index.js +29 -3
- package/lib/cjs/timePicker/TimePicker.d.ts +12 -0
- package/lib/cjs/timePicker/TimePicker.js +9 -1
- package/lib/cjs/timePicker/index.d.ts +6 -0
- package/lib/cjs/timeline/index.d.ts +1 -1
- package/lib/cjs/timeline/index.js +1 -0
- package/lib/cjs/timeline/item.js +4 -2
- package/lib/cjs/toast/toast.js +2 -0
- package/lib/cjs/tooltip/TriangleArrow.js +1 -0
- package/lib/cjs/tooltip/TriangleArrowVertical.js +1 -0
- package/lib/cjs/tooltip/index.d.ts +16 -12
- package/lib/cjs/tooltip/index.js +55 -39
- package/lib/cjs/transfer/index.d.ts +1 -1
- package/lib/cjs/transfer/index.js +35 -17
- package/lib/cjs/tree/index.d.ts +1 -0
- package/lib/cjs/tree/index.js +15 -6
- package/lib/cjs/tree/treeNode.d.ts +12 -4
- package/lib/cjs/tree/treeNode.js +44 -4
- package/lib/cjs/treeSelect/index.d.ts +16 -0
- package/lib/cjs/treeSelect/index.js +60 -12
- package/lib/cjs/typography/base.js +18 -7
- package/lib/cjs/typography/copyable.js +6 -1
- package/lib/cjs/upload/fileCard.js +26 -7
- package/lib/cjs/upload/index.js +19 -4
- package/lib/es/_utils/hooks/usePrevFocus.d.ts +2 -0
- package/lib/es/_utils/hooks/usePrevFocus.js +15 -0
- package/lib/es/_utils/index.d.ts +1 -0
- package/lib/es/_utils/index.js +4 -1
- package/lib/es/anchor/index.d.ts +2 -0
- package/lib/es/anchor/index.js +6 -1
- package/lib/es/anchor/link.d.ts +4 -1
- package/lib/es/anchor/link.js +38 -5
- package/lib/es/autoComplete/index.d.ts +17 -0
- package/lib/es/autoComplete/index.js +21 -2
- package/lib/es/avatar/index.d.ts +4 -3
- package/lib/es/avatar/index.js +15 -11
- package/lib/es/banner/index.js +4 -2
- package/lib/es/breadcrumb/index.d.ts +3 -0
- package/lib/es/breadcrumb/index.js +10 -4
- package/lib/es/breadcrumb/item.js +2 -2
- package/lib/es/button/Button.d.ts +2 -0
- package/lib/es/button/Button.js +4 -2
- package/lib/es/button/buttonGroup.d.ts +3 -0
- package/lib/es/button/buttonGroup.js +8 -4
- package/lib/es/button/index.d.ts +1 -0
- package/lib/es/button/splitButtonGroup.d.ts +3 -0
- package/lib/es/button/splitButtonGroup.js +5 -2
- package/lib/es/card/index.d.ts +3 -0
- package/lib/es/card/index.js +3 -1
- package/lib/es/cascader/index.d.ts +14 -0
- package/lib/es/cascader/index.js +35 -7
- package/lib/es/checkbox/checkbox.d.ts +21 -1
- package/lib/es/checkbox/checkbox.js +50 -17
- package/lib/es/checkbox/checkboxGroup.d.ts +13 -1
- package/lib/es/checkbox/checkboxGroup.js +18 -5
- package/lib/es/checkbox/checkboxInner.d.ts +15 -0
- package/lib/es/checkbox/checkboxInner.js +20 -3
- package/lib/es/collapse/item.d.ts +2 -1
- package/lib/es/collapse/item.js +11 -2
- package/lib/es/collapsible/index.d.ts +1 -0
- package/lib/es/collapsible/index.js +4 -2
- package/lib/es/datePicker/datePicker.d.ts +12 -0
- package/lib/es/datePicker/datePicker.js +22 -3
- package/lib/es/datePicker/monthsGrid.d.ts +1 -0
- package/lib/es/datePicker/monthsGrid.js +2 -1
- package/lib/es/dropdown/dropdownItem.js +3 -1
- package/lib/es/dropdown/dropdownMenu.js +4 -1
- package/lib/es/form/baseForm.d.ts +9 -0
- package/lib/es/form/baseForm.js +3 -1
- package/lib/es/form/errorMessage.d.ts +4 -0
- package/lib/es/form/errorMessage.js +21 -3
- package/lib/es/form/field.d.ts +7 -0
- package/lib/es/form/hoc/withField.js +48 -15
- package/lib/es/form/index.d.ts +0 -1
- package/lib/es/form/index.js +0 -1
- package/lib/es/form/interface.d.ts +2 -0
- package/lib/es/form/label.d.ts +2 -0
- package/lib/es/form/label.js +5 -2
- package/lib/es/input/index.d.ts +16 -0
- package/lib/es/input/index.js +51 -15
- package/lib/es/input/inputGroup.d.ts +2 -1
- package/lib/es/input/inputGroup.js +11 -1
- package/lib/es/input/textarea.js +12 -1
- package/lib/es/inputNumber/index.d.ts +21 -12
- package/lib/es/inputNumber/index.js +38 -3
- package/lib/es/layout/Sider.d.ts +4 -0
- package/lib/es/layout/Sider.js +4 -1
- package/lib/es/layout/index.js +2 -0
- package/lib/es/list/item.js +0 -1
- package/lib/es/modal/Modal.js +2 -0
- package/lib/es/modal/ModalContent.d.ts +3 -1
- package/lib/es/modal/ModalContent.js +46 -5
- package/lib/es/navigation/Item.d.ts +4 -2
- package/lib/es/navigation/Item.js +25 -5
- package/lib/es/navigation/SubNav.d.ts +4 -2
- package/lib/es/navigation/SubNav.js +8 -1
- package/lib/es/navigation/index.js +2 -0
- package/lib/es/notification/notice.d.ts +1 -1
- package/lib/es/notification/notice.js +33 -24
- package/lib/es/pagination/index.js +16 -6
- package/lib/es/popover/index.js +7 -3
- package/lib/es/progress/index.d.ts +8 -0
- package/lib/es/progress/index.js +42 -9
- package/lib/es/radio/radio.d.ts +6 -1
- package/lib/es/radio/radio.js +16 -5
- package/lib/es/radio/radioGroup.d.ts +16 -1
- package/lib/es/radio/radioGroup.js +18 -3
- package/lib/es/radio/radioInner.d.ts +6 -1
- package/lib/es/radio/radioInner.js +11 -3
- package/lib/es/rating/index.d.ts +14 -0
- package/lib/es/rating/index.js +14 -3
- package/lib/es/rating/item.d.ts +2 -0
- package/lib/es/rating/item.js +6 -1
- package/lib/es/select/index.d.ts +16 -0
- package/lib/es/select/index.js +63 -17
- package/lib/es/select/option.js +28 -22
- package/lib/es/sideSheet/SideSheetContent.d.ts +1 -0
- package/lib/es/sideSheet/SideSheetContent.js +4 -1
- package/lib/es/sideSheet/index.d.ts +1 -0
- package/lib/es/sideSheet/index.js +2 -1
- package/lib/es/slider/index.d.ts +2 -1
- package/lib/es/slider/index.js +63 -16
- package/lib/es/spin/icon.js +3 -4
- package/lib/es/steps/basicStep.d.ts +3 -0
- package/lib/es/steps/basicStep.js +23 -23
- package/lib/es/steps/basicSteps.d.ts +1 -0
- package/lib/es/steps/basicSteps.js +2 -1
- package/lib/es/steps/fillStep.d.ts +3 -0
- package/lib/es/steps/fillStep.js +19 -4
- package/lib/es/steps/fillSteps.d.ts +1 -0
- package/lib/es/steps/fillSteps.js +2 -1
- package/lib/es/steps/navStep.d.ts +3 -0
- package/lib/es/steps/navStep.js +22 -23
- package/lib/es/steps/navSteps.d.ts +1 -0
- package/lib/es/steps/navSteps.js +2 -1
- package/lib/es/switch/index.d.ts +12 -0
- package/lib/es/switch/index.js +19 -4
- package/lib/es/table/Body/BaseRow.js +35 -3
- package/lib/es/table/Body/index.js +9 -2
- package/lib/es/table/ColumnFilter.js +4 -0
- package/lib/es/table/ColumnSelection.d.ts +3 -0
- package/lib/es/table/ColumnSelection.js +6 -2
- package/lib/es/table/ColumnSorter.js +17 -3
- package/lib/es/table/CustomExpandIcon.js +6 -1
- package/lib/es/table/Table.d.ts +2 -0
- package/lib/es/table/Table.js +31 -15
- package/lib/es/table/TableCell.d.ts +2 -0
- package/lib/es/table/TableCell.js +6 -2
- package/lib/es/table/TableHeaderRow.js +8 -2
- package/lib/es/tabs/TabBar.js +11 -3
- package/lib/es/tabs/TabPane.js +3 -1
- package/lib/es/tabs/index.js +0 -1
- package/lib/es/tagInput/index.d.ts +4 -1
- package/lib/es/tagInput/index.js +29 -3
- package/lib/es/timePicker/TimePicker.d.ts +12 -0
- package/lib/es/timePicker/TimePicker.js +9 -1
- package/lib/es/timePicker/index.d.ts +6 -0
- package/lib/es/timeline/index.d.ts +1 -1
- package/lib/es/timeline/index.js +1 -0
- package/lib/es/timeline/item.js +4 -2
- package/lib/es/toast/toast.js +2 -0
- package/lib/es/tooltip/TriangleArrow.js +1 -0
- package/lib/es/tooltip/TriangleArrowVertical.js +1 -0
- package/lib/es/tooltip/index.d.ts +16 -12
- package/lib/es/tooltip/index.js +53 -39
- package/lib/es/transfer/index.d.ts +1 -1
- package/lib/es/transfer/index.js +35 -17
- package/lib/es/tree/index.d.ts +1 -0
- package/lib/es/tree/index.js +15 -6
- package/lib/es/tree/treeNode.d.ts +12 -4
- package/lib/es/tree/treeNode.js +44 -4
- package/lib/es/treeSelect/index.d.ts +16 -0
- package/lib/es/treeSelect/index.js +57 -10
- package/lib/es/typography/base.js +17 -7
- package/lib/es/typography/copyable.js +5 -1
- package/lib/es/upload/fileCard.js +26 -7
- package/lib/es/upload/index.js +19 -4
- package/list/item.tsx +0 -1
- package/modal/Modal.tsx +2 -0
- package/modal/ModalContent.tsx +35 -5
- package/navigation/Item.tsx +15 -0
- package/navigation/SubNav.tsx +13 -1
- package/navigation/index.tsx +1 -1
- package/notification/notice.tsx +19 -14
- package/package.json +8 -8
- package/pagination/index.tsx +9 -5
- package/popover/index.tsx +5 -0
- package/progress/_story/progress.stories.js +18 -18
- package/progress/index.tsx +58 -20
- package/radio/radio.tsx +12 -2
- package/radio/radioGroup.tsx +29 -3
- package/radio/radioInner.tsx +10 -1
- package/rating/index.tsx +19 -2
- package/rating/item.tsx +6 -0
- package/select/__test__/select.test.js +45 -0
- package/select/_story/select.stories.js +29 -0
- package/select/index.tsx +52 -4
- package/select/option.tsx +3 -0
- package/sideSheet/SideSheetContent.tsx +6 -4
- package/sideSheet/index.tsx +3 -2
- package/slider/__test__/slider.test.js +9 -0
- package/slider/_story/slider.stories.js +1 -1
- package/slider/index.tsx +44 -7
- package/spin/icon.tsx +4 -3
- package/steps/basicStep.tsx +15 -4
- package/steps/basicSteps.tsx +3 -2
- package/steps/fillStep.tsx +27 -12
- package/steps/fillSteps.tsx +2 -0
- package/steps/navStep.tsx +15 -4
- package/steps/navSteps.tsx +3 -2
- package/switch/_story/switch.stories.js +20 -19
- package/switch/_story/switch.stories.tsx +13 -13
- package/switch/index.tsx +23 -5
- package/table/Body/BaseRow.tsx +25 -1
- package/table/Body/index.tsx +7 -2
- package/table/ColumnFilter.tsx +7 -1
- package/table/ColumnSelection.tsx +4 -1
- package/table/ColumnSorter.tsx +18 -1
- package/table/CustomExpandIcon.tsx +5 -0
- package/table/Table.tsx +26 -13
- package/table/TableCell.tsx +11 -1
- package/table/TableHeaderRow.tsx +16 -2
- package/table/__test__/table.test.js +46 -0
- package/tabs/TabBar.tsx +8 -5
- package/tabs/TabPane.tsx +3 -1
- package/tabs/index.tsx +0 -1
- package/tagInput/__test__/tagInput.test.js +46 -0
- package/tagInput/_story/tagInput.stories.js +2 -2
- package/tagInput/index.tsx +31 -8
- package/timePicker/TimePicker.tsx +14 -1
- package/timeline/_story/timeline.stories.js +1 -1
- package/timeline/index.tsx +2 -2
- package/timeline/item.tsx +2 -1
- package/toast/toast.tsx +2 -0
- package/tooltip/TriangleArrow.tsx +1 -1
- package/tooltip/TriangleArrowVertical.tsx +1 -1
- package/tooltip/_story/tooltip.stories.js +562 -514
- package/tooltip/index.tsx +51 -33
- package/transfer/index.tsx +32 -28
- package/tree/_story/tree.stories.js +3 -3
- package/tree/index.tsx +10 -2
- package/tree/treeNode.tsx +46 -10
- package/treeSelect/__test__/treeMultiple.test.js +5 -0
- package/treeSelect/_story/treeSelect.stories.js +12 -0
- package/treeSelect/index.tsx +58 -7
- package/typography/base.tsx +7 -1
- package/typography/copyable.tsx +10 -1
- package/upload/fileCard.tsx +14 -16
- package/upload/index.tsx +10 -6
|
@@ -3,7 +3,7 @@ import React from 'react';
|
|
|
3
3
|
import PropTypes from 'prop-types';
|
|
4
4
|
import classnames from 'classnames';
|
|
5
5
|
import { checkboxGroupClasses as css, strings } from '@douyinfe/semi-foundation/checkbox/constants';
|
|
6
|
-
import
|
|
6
|
+
import CheckboxGroupFoundation, { CheckboxGroupAdapter } from '@douyinfe/semi-foundation/checkbox/checkboxGroupFoundation';
|
|
7
7
|
import BaseComponent from '../_base/baseComponent';
|
|
8
8
|
import { Context } from './context';
|
|
9
9
|
import { isEqual } from 'lodash';
|
|
@@ -13,6 +13,11 @@ export type CheckboxDirection = 'horizontal' | 'vertical';
|
|
|
13
13
|
export type CheckboxType = 'default' | 'card' | 'pureCard';
|
|
14
14
|
|
|
15
15
|
export type CheckboxGroupProps = {
|
|
16
|
+
'aria-describedby'?: React.AriaAttributes['aria-describedby'];
|
|
17
|
+
'aria-errormessage'?: React.AriaAttributes['aria-errormessage'];
|
|
18
|
+
'aria-invalid'?: React.AriaAttributes['aria-invalid'];
|
|
19
|
+
'aria-labelledby'?: React.AriaAttributes['aria-labelledby'];
|
|
20
|
+
'aria-required'?: React.AriaAttributes['aria-required'];
|
|
16
21
|
defaultValue?: any[];
|
|
17
22
|
disabled?: boolean;
|
|
18
23
|
name?: string;
|
|
@@ -26,6 +31,7 @@ export type CheckboxGroupProps = {
|
|
|
26
31
|
className?: string;
|
|
27
32
|
type?: CheckboxType;
|
|
28
33
|
id?: string;
|
|
34
|
+
'aria-label'?: React.AriaAttributes['aria-label'];
|
|
29
35
|
};
|
|
30
36
|
|
|
31
37
|
export type CheckboxGroupState = {
|
|
@@ -34,6 +40,11 @@ export type CheckboxGroupState = {
|
|
|
34
40
|
class CheckboxGroup extends BaseComponent<CheckboxGroupProps, CheckboxGroupState> {
|
|
35
41
|
|
|
36
42
|
static propTypes = {
|
|
43
|
+
'aria-describedby': PropTypes.string,
|
|
44
|
+
'aria-errormessage': PropTypes.string,
|
|
45
|
+
'aria-invalid': PropTypes.bool,
|
|
46
|
+
'aria-labelledby': PropTypes.string,
|
|
47
|
+
'aria-required': PropTypes.bool,
|
|
37
48
|
defaultValue: PropTypes.array,
|
|
38
49
|
disabled: PropTypes.bool,
|
|
39
50
|
name: PropTypes.string,
|
|
@@ -69,12 +80,13 @@ class CheckboxGroup extends BaseComponent<CheckboxGroupProps, CheckboxGroupState
|
|
|
69
80
|
};
|
|
70
81
|
}
|
|
71
82
|
|
|
83
|
+
foundation: CheckboxGroupFoundation;
|
|
72
84
|
constructor(props: CheckboxGroupProps) {
|
|
73
85
|
super(props);
|
|
74
86
|
this.state = {
|
|
75
87
|
value: props.value || props.defaultValue,
|
|
76
88
|
};
|
|
77
|
-
this.foundation = new
|
|
89
|
+
this.foundation = new CheckboxGroupFoundation(this.adapter);
|
|
78
90
|
this.onChange = this.onChange.bind(this);
|
|
79
91
|
}
|
|
80
92
|
|
|
@@ -97,7 +109,7 @@ class CheckboxGroup extends BaseComponent<CheckboxGroupProps, CheckboxGroupState
|
|
|
97
109
|
}
|
|
98
110
|
|
|
99
111
|
render() {
|
|
100
|
-
const { children, options, prefixCls, direction, className, id, style, type } = this.props;
|
|
112
|
+
const { children, options, prefixCls, direction, className, id, style, type, disabled } = this.props;
|
|
101
113
|
|
|
102
114
|
const isPureCardType = type === strings.TYPE_PURECARD;
|
|
103
115
|
const isCardType = type === strings.TYPE_CARD || isPureCardType;
|
|
@@ -119,6 +131,7 @@ class CheckboxGroup extends BaseComponent<CheckboxGroupProps, CheckboxGroupState
|
|
|
119
131
|
if (typeof option === 'string') {
|
|
120
132
|
return (
|
|
121
133
|
<Checkbox
|
|
134
|
+
role="listitem"
|
|
122
135
|
key={index}
|
|
123
136
|
disabled={this.props.disabled}
|
|
124
137
|
value={option}
|
|
@@ -130,6 +143,7 @@ class CheckboxGroup extends BaseComponent<CheckboxGroupProps, CheckboxGroupState
|
|
|
130
143
|
} else {
|
|
131
144
|
return (
|
|
132
145
|
<Checkbox
|
|
146
|
+
role="listitem"
|
|
133
147
|
key={index}
|
|
134
148
|
disabled={option.disabled || this.props.disabled}
|
|
135
149
|
value={option.value}
|
|
@@ -145,11 +159,22 @@ class CheckboxGroup extends BaseComponent<CheckboxGroupProps, CheckboxGroupState
|
|
|
145
159
|
}
|
|
146
160
|
});
|
|
147
161
|
} else if (children) {
|
|
148
|
-
inner = (React.Children.toArray(children) as React.ReactElement[]).map((itm, index) => React.cloneElement(itm, { key: index }));
|
|
162
|
+
inner = (React.Children.toArray(children) as React.ReactElement[]).map((itm, index) => React.cloneElement(itm, { key: index, role: 'listitem' }));
|
|
149
163
|
}
|
|
150
164
|
|
|
151
165
|
return (
|
|
152
|
-
<div
|
|
166
|
+
<div
|
|
167
|
+
id={id}
|
|
168
|
+
role="list"
|
|
169
|
+
aria-label={this.props['aria-label']}
|
|
170
|
+
className={prefixClsDisplay}
|
|
171
|
+
style={style}
|
|
172
|
+
aria-labelledby={this.props['aria-labelledby']}
|
|
173
|
+
aria-describedby={this.props['aria-describedby']}
|
|
174
|
+
// aria-errormessage={this.props['aria-errormessage']}
|
|
175
|
+
// aria-invalid={this.props['aria-invalid']}
|
|
176
|
+
// aria-required={this.props['aria-required']}
|
|
177
|
+
>
|
|
153
178
|
<Context.Provider
|
|
154
179
|
value={{
|
|
155
180
|
checkboxGroup: {
|
|
@@ -8,6 +8,11 @@ import { Context } from './context';
|
|
|
8
8
|
import { IconCheckboxTick, IconCheckboxIndeterminate } from '@douyinfe/semi-icons';
|
|
9
9
|
|
|
10
10
|
export interface CheckboxInnerProps {
|
|
11
|
+
'aria-describedby'?: React.AriaAttributes['aria-describedby'];
|
|
12
|
+
'aria-errormessage'?: React.AriaAttributes['aria-errormessage'];
|
|
13
|
+
'aria-invalid'?: React.AriaAttributes['aria-invalid'];
|
|
14
|
+
'aria-labelledby'?: React.AriaAttributes['aria-labelledby'];
|
|
15
|
+
'aria-required'?: React.AriaAttributes['aria-required'];
|
|
11
16
|
indeterminate?: boolean;
|
|
12
17
|
checked?: boolean;
|
|
13
18
|
disabled?: boolean;
|
|
@@ -15,12 +20,20 @@ export interface CheckboxInnerProps {
|
|
|
15
20
|
name?: string;
|
|
16
21
|
isPureCardType?: boolean;
|
|
17
22
|
ref?: React.MutableRefObject<CheckboxInner> | ((ref: CheckboxInner) => void);
|
|
23
|
+
addonId?: string;
|
|
24
|
+
extraId?: string;
|
|
25
|
+
'aria-label'?: React.AriaAttributes['aria-label'];
|
|
18
26
|
}
|
|
19
27
|
|
|
20
28
|
class CheckboxInner extends PureComponent<CheckboxInnerProps> {
|
|
21
29
|
static contextType = Context;
|
|
22
30
|
|
|
23
31
|
static propTypes = {
|
|
32
|
+
'aria-describedby': PropTypes.string,
|
|
33
|
+
'aria-errormessage': PropTypes.string,
|
|
34
|
+
'aria-invalid': PropTypes.bool,
|
|
35
|
+
'aria-labelledby': PropTypes.string,
|
|
36
|
+
'aria-required': PropTypes.bool,
|
|
24
37
|
checked: PropTypes.bool,
|
|
25
38
|
disabled: PropTypes.bool,
|
|
26
39
|
onChange: PropTypes.func,
|
|
@@ -28,6 +41,8 @@ class CheckboxInner extends PureComponent<CheckboxInnerProps> {
|
|
|
28
41
|
grouped: PropTypes.bool,
|
|
29
42
|
value: PropTypes.any,
|
|
30
43
|
isPureCardType: PropTypes.bool,
|
|
44
|
+
addonId: PropTypes.string,
|
|
45
|
+
extraId: PropTypes.string,
|
|
31
46
|
};
|
|
32
47
|
|
|
33
48
|
static defaultProps = {
|
|
@@ -44,7 +59,7 @@ class CheckboxInner extends PureComponent<CheckboxInnerProps> {
|
|
|
44
59
|
}
|
|
45
60
|
|
|
46
61
|
render() {
|
|
47
|
-
const { indeterminate, checked, disabled, prefixCls, name, isPureCardType } = this.props;
|
|
62
|
+
const { indeterminate, checked, disabled, prefixCls, name, isPureCardType, addonId, extraId } = this.props;
|
|
48
63
|
const prefix = prefixCls || css.PREFIX;
|
|
49
64
|
|
|
50
65
|
const wrapper = classnames(
|
|
@@ -69,10 +84,18 @@ class CheckboxInner extends PureComponent<CheckboxInnerProps> {
|
|
|
69
84
|
return (
|
|
70
85
|
<span className={wrapper}>
|
|
71
86
|
<input
|
|
87
|
+
type="checkbox"
|
|
88
|
+
aria-label={this.props['aria-label']}
|
|
89
|
+
aria-disabled={disabled}
|
|
90
|
+
aria-checked={checked}
|
|
91
|
+
aria-labelledby={addonId}
|
|
92
|
+
aria-describedby={extraId || this.props['aria-describedby']}
|
|
93
|
+
aria-invalid={this.props['aria-invalid']}
|
|
94
|
+
aria-errormessage={this.props['aria-errormessage']}
|
|
95
|
+
aria-required={this.props['aria-required']}
|
|
72
96
|
ref={ref => {
|
|
73
97
|
this.inputEntity = ref;
|
|
74
98
|
}}
|
|
75
|
-
type="checkbox"
|
|
76
99
|
className={css.INPUT}
|
|
77
100
|
onChange={noop}
|
|
78
101
|
checked={checked}
|
package/collapse/index.tsx
CHANGED
package/collapse/item.tsx
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import React, { PureComponent, ReactNode
|
|
1
|
+
import React, { CSSProperties, PureComponent, ReactNode } from 'react';
|
|
2
2
|
import cls from 'classnames';
|
|
3
3
|
import PropTypes from 'prop-types';
|
|
4
4
|
import { cssClasses } from '@douyinfe/semi-foundation/collapse/constants';
|
|
5
5
|
import Collapsible from '../collapsible';
|
|
6
6
|
import CollapseContext, { CollapseContextType } from './collapse-context';
|
|
7
7
|
import { IconChevronDown, IconChevronUp } from '@douyinfe/semi-icons';
|
|
8
|
+
import { getUuidShort } from '@douyinfe/semi-foundation/utils/uuid';
|
|
8
9
|
|
|
9
|
-
export interface CollapsePanelProps{
|
|
10
|
+
export interface CollapsePanelProps {
|
|
10
11
|
itemKey: string;
|
|
11
12
|
extra?: ReactNode;
|
|
12
13
|
header?: ReactNode;
|
|
@@ -32,6 +33,8 @@ export default class CollapsePanel extends PureComponent<CollapsePanelProps> {
|
|
|
32
33
|
]),
|
|
33
34
|
};
|
|
34
35
|
|
|
36
|
+
private ariaID = getUuidShort({});
|
|
37
|
+
|
|
35
38
|
renderHeader(active: boolean, expandIconEnable = true) {
|
|
36
39
|
const {
|
|
37
40
|
header,
|
|
@@ -43,13 +46,13 @@ export default class CollapsePanel extends PureComponent<CollapsePanelProps> {
|
|
|
43
46
|
} = this.context;
|
|
44
47
|
const { expandIconPosition } = this.context;
|
|
45
48
|
if (typeof expandIcon === 'undefined') {
|
|
46
|
-
expandIcon = (<IconChevronDown
|
|
49
|
+
expandIcon = (<IconChevronDown/>);
|
|
47
50
|
}
|
|
48
51
|
if (typeof collapseIcon === 'undefined') {
|
|
49
|
-
collapseIcon = (<IconChevronUp
|
|
52
|
+
collapseIcon = (<IconChevronUp/>);
|
|
50
53
|
}
|
|
51
54
|
const icon = (
|
|
52
|
-
<span className={cls([`${cssClasses.PREFIX}-header-icon`,
|
|
55
|
+
<span aria-hidden='true' className={cls([`${cssClasses.PREFIX}-header-icon`,
|
|
53
56
|
{ [`${cssClasses.PREFIX}-header-iconDisabled`]: !expandIconEnable }])}>
|
|
54
57
|
{/* eslint-disable-next-line no-nested-ternary */}
|
|
55
58
|
{expandIconEnable ? (active ? collapseIcon : expandIcon) : expandIcon}
|
|
@@ -105,7 +108,6 @@ export default class CollapsePanel extends PureComponent<CollapsePanelProps> {
|
|
|
105
108
|
});
|
|
106
109
|
return (
|
|
107
110
|
<div
|
|
108
|
-
role="Collapse-panel"
|
|
109
111
|
className={itemCls}
|
|
110
112
|
{...restProps}
|
|
111
113
|
>
|
|
@@ -114,6 +116,7 @@ export default class CollapsePanel extends PureComponent<CollapsePanelProps> {
|
|
|
114
116
|
tabIndex={0}
|
|
115
117
|
className={headerCls}
|
|
116
118
|
aria-expanded={active ? 'true' : 'false'}
|
|
119
|
+
aria-owns={this.ariaID}
|
|
117
120
|
onClick={e => onClick(itemKey, e)}
|
|
118
121
|
>
|
|
119
122
|
{this.renderHeader(active, children !== undefined)}
|
|
@@ -125,6 +128,8 @@ export default class CollapsePanel extends PureComponent<CollapsePanelProps> {
|
|
|
125
128
|
reCalcKey={reCalcKey}>
|
|
126
129
|
<div
|
|
127
130
|
className={contentCls}
|
|
131
|
+
aria-hidden={!active}
|
|
132
|
+
id={this.ariaID}
|
|
128
133
|
>
|
|
129
134
|
<div className={`${cssClasses.PREFIX}-content-wrapper`}>
|
|
130
135
|
{children}
|
|
@@ -136,4 +141,4 @@ export default class CollapsePanel extends PureComponent<CollapsePanelProps> {
|
|
|
136
141
|
</div>
|
|
137
142
|
);
|
|
138
143
|
}
|
|
139
|
-
}
|
|
144
|
+
}
|
package/collapsible/index.tsx
CHANGED
|
@@ -19,6 +19,7 @@ export interface CollapsibleProps {
|
|
|
19
19
|
style?: React.CSSProperties;
|
|
20
20
|
collapseHeight?: number;
|
|
21
21
|
reCalcKey?: number | string;
|
|
22
|
+
id?:string,
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
|
|
@@ -32,7 +33,8 @@ const Collapsible = (props: CollapsibleProps) => {
|
|
|
32
33
|
collapseHeight,
|
|
33
34
|
style,
|
|
34
35
|
className,
|
|
35
|
-
reCalcKey
|
|
36
|
+
reCalcKey,
|
|
37
|
+
id
|
|
36
38
|
} = props;
|
|
37
39
|
|
|
38
40
|
const ref = useRef(null);
|
|
@@ -90,7 +92,7 @@ const Collapsible = (props: CollapsibleProps) => {
|
|
|
90
92
|
const wrapperCls = cls(`${cssClasses.PREFIX}-wrapper`, className);
|
|
91
93
|
return (
|
|
92
94
|
<div style={wrapperstyle} className={wrapperCls} ref={ref}>
|
|
93
|
-
<div ref={setHeight} style={{overflow:'hidden'}}>{children}</div>
|
|
95
|
+
<div ref={setHeight} style={{ overflow: 'hidden' }} id={id}>{children}</div>
|
|
94
96
|
</div>
|
|
95
97
|
);
|
|
96
98
|
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { ButtonGroup, Button, ConfigProvider } from '@douyinfe/semi-ui';
|
|
3
|
+
|
|
4
|
+
export default function RTLWrapper({ children, onDirectionChange }: { children: React.ReactNode; onDirectionChange?: (direction: 'ltr' | 'rtl') => void }) {
|
|
5
|
+
const [direction, setDirection] = useState();
|
|
6
|
+
const handleDirectionChange = dir => {
|
|
7
|
+
setDirection(dir);
|
|
8
|
+
|
|
9
|
+
if (typeof onDirectionChange === 'function') {
|
|
10
|
+
onDirectionChange(dir);
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<>
|
|
16
|
+
<div style={{ marginBottom: 20 }}>
|
|
17
|
+
<ButtonGroup>
|
|
18
|
+
<Button onClick={() => handleDirectionChange('ltr')}>LTR</Button>
|
|
19
|
+
<Button onClick={() => handleDirectionChange('rtl')}>RTL</Button>
|
|
20
|
+
</ButtonGroup>
|
|
21
|
+
</div>
|
|
22
|
+
<ConfigProvider direction={direction}>
|
|
23
|
+
{children}
|
|
24
|
+
</ConfigProvider>
|
|
25
|
+
</>
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -191,12 +191,27 @@ describe(`DatePicker`, () => {
|
|
|
191
191
|
btns[0].click();
|
|
192
192
|
await sleep();
|
|
193
193
|
expect(_.first(elem.state('value')).getDate() === currentValue.getDate()).toBeTruthy();
|
|
194
|
+
expect(_.isEqual(elem.state('cachedSelectedValue'), [currentValue])).toBe(true);
|
|
194
195
|
|
|
195
196
|
/**
|
|
196
197
|
* click ensure button
|
|
197
198
|
*/
|
|
198
199
|
btns[1].click();
|
|
199
200
|
await sleep();
|
|
201
|
+
expect(_.first(elem.state('value')).getDate() === currentValue.getDate()).toBe(true);
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* re click next day
|
|
205
|
+
*/
|
|
206
|
+
nextOffsetDayElem.click();
|
|
207
|
+
await sleep();
|
|
208
|
+
expect(_.first(elem.state('value')).getDate() === currentValue.getDate()).toBeTruthy();
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* re click ensure button
|
|
212
|
+
*/
|
|
213
|
+
btns[1].click();
|
|
214
|
+
await sleep();
|
|
200
215
|
expect(_.first(elem.state('value')).getDate() - currentValue.getDate()).toBe(dayOffset);
|
|
201
216
|
|
|
202
217
|
demo.unmount();
|
|
@@ -953,4 +968,97 @@ describe(`DatePicker`, () => {
|
|
|
953
968
|
|
|
954
969
|
it('test month sync change dateRange type', () => { testMonthSyncChange('dateRange') });
|
|
955
970
|
it('test month sync change dateTimeRange type', () => { testMonthSyncChange('dateTimeRange')});
|
|
971
|
+
|
|
972
|
+
it(`test preset given null`, async () => {
|
|
973
|
+
const props = {
|
|
974
|
+
presets: [
|
|
975
|
+
{
|
|
976
|
+
text: 'Today',
|
|
977
|
+
start: null,
|
|
978
|
+
end: null,
|
|
979
|
+
}
|
|
980
|
+
],
|
|
981
|
+
defaultValue: baseDate,
|
|
982
|
+
defaultOpen: true,
|
|
983
|
+
motion: false,
|
|
984
|
+
type: 'dateRange'
|
|
985
|
+
}
|
|
986
|
+
const handleChange = sinon.spy();
|
|
987
|
+
const demo = mount(<DatePicker {...props} onChange={handleChange} />);
|
|
988
|
+
const elem = demo.find(BaseDatePicker);
|
|
989
|
+
|
|
990
|
+
const btns = document.querySelectorAll('.semi-datepicker-quick-control-item');
|
|
991
|
+
|
|
992
|
+
btns[0].click();
|
|
993
|
+
expect(handleChange.called).toBeTruthy();
|
|
994
|
+
const args = handleChange.getCall(0).args;
|
|
995
|
+
expect(args[0].length).toEqual(0);
|
|
996
|
+
expect(elem.state('panelShow')).toBeFalsy();
|
|
997
|
+
});
|
|
998
|
+
|
|
999
|
+
it(`test preset given null + needConfirm`, async () => {
|
|
1000
|
+
const props = {
|
|
1001
|
+
presets: [
|
|
1002
|
+
{
|
|
1003
|
+
text: 'Today',
|
|
1004
|
+
start: null,
|
|
1005
|
+
end: null,
|
|
1006
|
+
}
|
|
1007
|
+
],
|
|
1008
|
+
defaultValue: baseDate,
|
|
1009
|
+
defaultOpen: true,
|
|
1010
|
+
motion: false,
|
|
1011
|
+
type: 'dateTimeRange',
|
|
1012
|
+
needConfirm: true,
|
|
1013
|
+
}
|
|
1014
|
+
const handleChange = sinon.spy();
|
|
1015
|
+
const handleConfirm = sinon.spy();
|
|
1016
|
+
const demo = mount(<DatePicker {...props} onChange={handleChange} onConfirm={handleConfirm} />);
|
|
1017
|
+
const elem = demo.find(BaseDatePicker);
|
|
1018
|
+
|
|
1019
|
+
const btns = document.querySelectorAll('.semi-datepicker-quick-control-item');
|
|
1020
|
+
|
|
1021
|
+
// 点击 preset
|
|
1022
|
+
btns[0].click();
|
|
1023
|
+
expect(handleChange.called).toBe(true);
|
|
1024
|
+
const argsChange = handleChange.getCall(0).args;
|
|
1025
|
+
expect(argsChange[0].length).toBe(0);
|
|
1026
|
+
expect(elem.state('panelShow')).toBe(true);
|
|
1027
|
+
// 点击确定
|
|
1028
|
+
const footerBtns = document.querySelectorAll('.semi-datepicker-footer .semi-button');
|
|
1029
|
+
footerBtns[1].click();
|
|
1030
|
+
expect(handleConfirm.called).toBe(true);
|
|
1031
|
+
const argsConfirm = handleConfirm.getCall(0).args;
|
|
1032
|
+
expect(argsConfirm[0].length).toBe(0);
|
|
1033
|
+
expect(elem.state('panelShow')).toBe(false);
|
|
1034
|
+
});
|
|
1035
|
+
|
|
1036
|
+
it('test dateRange triggerRender', async () => {
|
|
1037
|
+
const elem = mount(
|
|
1038
|
+
<DatePicker
|
|
1039
|
+
motion={false}
|
|
1040
|
+
// defaultOpen
|
|
1041
|
+
type="dateRange"
|
|
1042
|
+
triggerRender={({ placeholder }) => (
|
|
1043
|
+
<button>
|
|
1044
|
+
{placeholder}
|
|
1045
|
+
</button>
|
|
1046
|
+
)}
|
|
1047
|
+
/>
|
|
1048
|
+
);
|
|
1049
|
+
const trigger = document.querySelector('button');
|
|
1050
|
+
trigger.click();
|
|
1051
|
+
await sleep();
|
|
1052
|
+
const leftPanel = document.querySelector(`.${BASE_CLASS_PREFIX}-datepicker-month-grid-left`);
|
|
1053
|
+
const leftSecondWeek = leftPanel.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-week`)[1];
|
|
1054
|
+
const leftSecondWeekDays = leftSecondWeek.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-day`);
|
|
1055
|
+
const rightPanel = document.querySelector(`.${BASE_CLASS_PREFIX}-datepicker-month-grid-right`);
|
|
1056
|
+
const rightSecondWeek = rightPanel.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-week`)[1];
|
|
1057
|
+
const rightSecondWeekDays = rightSecondWeek.querySelectorAll(`.${BASE_CLASS_PREFIX}-datepicker-day`);
|
|
1058
|
+
leftSecondWeekDays[0].click();
|
|
1059
|
+
rightSecondWeekDays[0].click();
|
|
1060
|
+
|
|
1061
|
+
const baseElem = elem.find(BaseDatePicker);
|
|
1062
|
+
expect(baseElem.state('panelShow')).toBeFalsy();
|
|
1063
|
+
});
|
|
956
1064
|
});
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
startOfWeek,
|
|
11
11
|
endOfWeek,
|
|
12
12
|
} from 'date-fns';
|
|
13
|
-
import { Space, ConfigProvider, InputGroup, InputNumber, Form, withField } from '../../index';
|
|
13
|
+
import { Space, ConfigProvider, InputGroup, InputNumber, Form, withField, Button } from '../../index';
|
|
14
14
|
|
|
15
15
|
// stores
|
|
16
16
|
import NeedConfirmDemo from './NeedConfirm';
|
|
@@ -661,4 +661,148 @@ export const FixParseISOBug = () => (
|
|
|
661
661
|
FixParseISOBug.storyName = '修复 parseISO bug';
|
|
662
662
|
FixParseISOBug.parameters = {
|
|
663
663
|
chromatic: { disableSnapshot: false },
|
|
664
|
-
};
|
|
664
|
+
};
|
|
665
|
+
|
|
666
|
+
export const FixNeedConfirm = () => {
|
|
667
|
+
const defaultDate = '2021-12-27 10:37:13';
|
|
668
|
+
const defaultDateRange = ['2021-12-27 10:37:13', '2022-01-28 10:37:13' ];
|
|
669
|
+
const props = {
|
|
670
|
+
needConfirm: true,
|
|
671
|
+
onConfirm: (...args) => {
|
|
672
|
+
console.log('Confirmed: ', ...args);
|
|
673
|
+
},
|
|
674
|
+
onChange: (...args) => {
|
|
675
|
+
console.log('Changed: ', ...args);
|
|
676
|
+
},
|
|
677
|
+
onCancel: (...args) => {
|
|
678
|
+
console.log('Canceled: ', ...args);
|
|
679
|
+
},
|
|
680
|
+
};
|
|
681
|
+
|
|
682
|
+
return (
|
|
683
|
+
<div>
|
|
684
|
+
<div data-cy="1">
|
|
685
|
+
<span>dateTime + needConfirm + defaultValue</span>
|
|
686
|
+
<div>
|
|
687
|
+
<DatePicker
|
|
688
|
+
type="dateTime"
|
|
689
|
+
defaultValue={defaultDate}
|
|
690
|
+
{...props}
|
|
691
|
+
/>
|
|
692
|
+
</div>
|
|
693
|
+
</div>
|
|
694
|
+
<div data-cy="2">
|
|
695
|
+
<span>dateTime + needConfirm</span>
|
|
696
|
+
<div>
|
|
697
|
+
<DatePicker
|
|
698
|
+
type="dateTime"
|
|
699
|
+
{...props}
|
|
700
|
+
/>
|
|
701
|
+
</div>
|
|
702
|
+
</div>
|
|
703
|
+
<div data-cy="3">
|
|
704
|
+
<span>dateTimeRange + needConfirm + defaultValue</span>
|
|
705
|
+
<div>
|
|
706
|
+
<DatePicker
|
|
707
|
+
type="dateTimeRange"
|
|
708
|
+
defaultValue={defaultDateRange}
|
|
709
|
+
{...props}
|
|
710
|
+
/>
|
|
711
|
+
</div>
|
|
712
|
+
</div>
|
|
713
|
+
<div data-cy="4">
|
|
714
|
+
<span>dateTimeRange + needConfirm</span>
|
|
715
|
+
<div>
|
|
716
|
+
<DatePicker
|
|
717
|
+
type="dateTimeRange"
|
|
718
|
+
{...props}
|
|
719
|
+
/>
|
|
720
|
+
</div>
|
|
721
|
+
</div>
|
|
722
|
+
</div>
|
|
723
|
+
)
|
|
724
|
+
}
|
|
725
|
+
FixNeedConfirm.storyName = '修复 needConfirm 取消后输入框显示错误';
|
|
726
|
+
|
|
727
|
+
/**
|
|
728
|
+
* fix https://github.com/DouyinFE/semi-design/issues/388
|
|
729
|
+
*/
|
|
730
|
+
export const FixPresetsClick = () => {
|
|
731
|
+
const presets = [
|
|
732
|
+
{
|
|
733
|
+
text: '清空',
|
|
734
|
+
start: '',
|
|
735
|
+
end: '',
|
|
736
|
+
},
|
|
737
|
+
{
|
|
738
|
+
text: 'Tomorrow',
|
|
739
|
+
start: new Date(new Date().valueOf() + 1000 * 3600 * 24),
|
|
740
|
+
end: new Date(new Date().valueOf() + 1000 * 3600 * 24),
|
|
741
|
+
},
|
|
742
|
+
];
|
|
743
|
+
|
|
744
|
+
const handleChange = v => {
|
|
745
|
+
console.log('change', v);
|
|
746
|
+
};
|
|
747
|
+
|
|
748
|
+
const handleConfirm = v => {
|
|
749
|
+
console.log('confirm', v);
|
|
750
|
+
}
|
|
751
|
+
|
|
752
|
+
return (
|
|
753
|
+
<div>
|
|
754
|
+
<div>
|
|
755
|
+
<label>
|
|
756
|
+
<span>不设置 needConfirm</span>
|
|
757
|
+
<DatePicker onChange={console.log} type="dateRange" presets={presets} />
|
|
758
|
+
</label>
|
|
759
|
+
</div>
|
|
760
|
+
<div>
|
|
761
|
+
<label>
|
|
762
|
+
<span>设置 needConfirm</span>
|
|
763
|
+
<DatePicker needConfirm onChange={handleChange} onConfirm={handleConfirm} type="dateTimeRange" presets={presets} />
|
|
764
|
+
</label>
|
|
765
|
+
</div>
|
|
766
|
+
</div>
|
|
767
|
+
);
|
|
768
|
+
};
|
|
769
|
+
FixPresetsClick.storyName = '修复 presets 点击后不收起问题';
|
|
770
|
+
|
|
771
|
+
/**
|
|
772
|
+
* fix https://github.com/DouyinFE/semi-design/issues/410
|
|
773
|
+
*/
|
|
774
|
+
export const FixTriggerRenderClosePanel = () => {
|
|
775
|
+
const [value, setValue] = useState([]);
|
|
776
|
+
|
|
777
|
+
const handleChange = v => {
|
|
778
|
+
console.log('change', v);
|
|
779
|
+
setValue(v);
|
|
780
|
+
};
|
|
781
|
+
|
|
782
|
+
const formatValue = (dates) => {
|
|
783
|
+
const dateStrs = dates.map(v => String(v));
|
|
784
|
+
return dateStrs.join(' ~ ');
|
|
785
|
+
};
|
|
786
|
+
|
|
787
|
+
const showClear = Array.isArray(value) && value.length > 1;
|
|
788
|
+
|
|
789
|
+
return (
|
|
790
|
+
<Space>
|
|
791
|
+
<DatePicker
|
|
792
|
+
value={value}
|
|
793
|
+
type="dateRange"
|
|
794
|
+
onChange={handleChange}
|
|
795
|
+
motion={false}
|
|
796
|
+
triggerRender={({ placeholder }) => (
|
|
797
|
+
<Button>
|
|
798
|
+
{(value && formatValue(value)) || placeholder}
|
|
799
|
+
</Button>
|
|
800
|
+
)}
|
|
801
|
+
/>
|
|
802
|
+
{showClear && (
|
|
803
|
+
<Button onClick={() => setValue([])}>清除</Button>
|
|
804
|
+
)}
|
|
805
|
+
</Space>
|
|
806
|
+
);
|
|
807
|
+
};
|
|
808
|
+
FixTriggerRenderClosePanel.storyName = "fix triggerRender close bug"
|
|
@@ -21,9 +21,15 @@ import { RangeType } from '@douyinfe/semi-foundation/datePicker/inputFoundation'
|
|
|
21
21
|
import { TimePickerProps } from '../timePicker/TimePicker';
|
|
22
22
|
|
|
23
23
|
export interface DatePickerProps extends DatePickerFoundationProps {
|
|
24
|
+
'aria-describedby'?: React.AriaAttributes['aria-describedby'];
|
|
25
|
+
'aria-errormessage'?: React.AriaAttributes['aria-errormessage'];
|
|
26
|
+
'aria-invalid'?: React.AriaAttributes['aria-invalid'];
|
|
27
|
+
'aria-labelledby'?: React.AriaAttributes['aria-labelledby'];
|
|
28
|
+
'aria-required'?: React.AriaAttributes['aria-required'];
|
|
24
29
|
timePickerOpts?: TimePickerProps;
|
|
25
30
|
bottomSlot?: React.ReactNode;
|
|
26
31
|
insetLabel?: React.ReactNode;
|
|
32
|
+
insetLabelId?: string;
|
|
27
33
|
prefix?: React.ReactNode;
|
|
28
34
|
topSlot?: React.ReactNode;
|
|
29
35
|
renderDate?: (dayNumber?: number, fullDate?: string) => React.ReactNode;
|
|
@@ -42,6 +48,11 @@ export type DatePickerState = DatePickerFoundationState;
|
|
|
42
48
|
export default class DatePicker extends BaseComponent<DatePickerProps, DatePickerState> {
|
|
43
49
|
static contextType = ConfigContext;
|
|
44
50
|
static propTypes = {
|
|
51
|
+
'aria-describedby': PropTypes.string,
|
|
52
|
+
'aria-errormessage': PropTypes.string,
|
|
53
|
+
'aria-invalid': PropTypes.bool,
|
|
54
|
+
'aria-labelledby': PropTypes.string,
|
|
55
|
+
'aria-required': PropTypes.bool,
|
|
45
56
|
type: PropTypes.oneOf(strings.TYPE_SET),
|
|
46
57
|
size: PropTypes.oneOf(strings.SIZE_SET),
|
|
47
58
|
density: PropTypes.oneOf(strings.DENSITY_SET),
|
|
@@ -76,6 +87,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
|
|
|
76
87
|
prefixCls: PropTypes.string,
|
|
77
88
|
prefix: PropTypes.node,
|
|
78
89
|
insetLabel: PropTypes.node,
|
|
90
|
+
insetLabelId: PropTypes.string,
|
|
79
91
|
zIndex: PropTypes.number,
|
|
80
92
|
position: PropTypes.oneOf(popoverStrings.POSITION_SET),
|
|
81
93
|
getPopupContainer: PropTypes.func,
|
|
@@ -206,6 +218,9 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
|
|
|
206
218
|
this.clickOutSideHandler = null;
|
|
207
219
|
}
|
|
208
220
|
this.clickOutSideHandler = e => {
|
|
221
|
+
if (this.adapter.needConfirm()) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
209
224
|
const triggerEl = this.triggerElRef && this.triggerElRef.current;
|
|
210
225
|
const panelEl = this.panelRef && this.panelRef.current;
|
|
211
226
|
const isInTrigger = triggerEl && triggerEl.contains(e.target as Node);
|
|
@@ -360,6 +375,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
|
|
|
360
375
|
syncSwitchMonth,
|
|
361
376
|
onPanelChange,
|
|
362
377
|
timeZone,
|
|
378
|
+
triggerRender
|
|
363
379
|
} = this.props;
|
|
364
380
|
const { value, cachedSelectedValue, motionEnd, rangeInputFocus } = this.state;
|
|
365
381
|
|
|
@@ -405,6 +421,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
|
|
|
405
421
|
onPanelChange={onPanelChange}
|
|
406
422
|
timeZone={timeZone}
|
|
407
423
|
focusRecordsRef={this.focusRecordsRef}
|
|
424
|
+
triggerRender={triggerRender}
|
|
408
425
|
/>
|
|
409
426
|
);
|
|
410
427
|
}
|
|
@@ -447,6 +464,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
|
|
|
447
464
|
disabled,
|
|
448
465
|
showClear,
|
|
449
466
|
insetLabel,
|
|
467
|
+
insetLabelId,
|
|
450
468
|
placeholder,
|
|
451
469
|
validateStatus,
|
|
452
470
|
inputStyle,
|
|
@@ -483,6 +501,7 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
|
|
|
483
501
|
inputStyle,
|
|
484
502
|
showClear,
|
|
485
503
|
insetLabel,
|
|
504
|
+
insetLabelId,
|
|
486
505
|
type,
|
|
487
506
|
format,
|
|
488
507
|
multiple,
|
|
@@ -637,6 +656,11 @@ export default class DatePicker extends BaseComponent<DatePickerProps, DatePicke
|
|
|
637
656
|
style,
|
|
638
657
|
className: classnames(className, { [prefixCls]: true }),
|
|
639
658
|
ref: this.setTriggerRef,
|
|
659
|
+
'aria-invalid': this.props['aria-invalid'],
|
|
660
|
+
'aria-errormessage': this.props['aria-errormessage'],
|
|
661
|
+
'aria-labelledby': this.props['aria-labelledby'],
|
|
662
|
+
'aria-describedby': this.props['aria-describedby'],
|
|
663
|
+
'aria-required': this.props['aria-required'],
|
|
640
664
|
};
|
|
641
665
|
|
|
642
666
|
const inner = this.renderInner();
|