@yoka-ui/ui 1.0.1
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/@Docs-yoka/exports.generated.md +93 -0
- package/@Docs-yoka/llms.txt +23 -0
- package/README.md +113 -0
- package/dist/es/Themes/InputTheme/index.d.ts +6 -0
- package/dist/es/Themes/InputTheme/index.js +22 -0
- package/dist/es/Themes/InputTheme/index.js.map +7 -0
- package/dist/es/Themes/TableTheme/index.d.ts +7 -0
- package/dist/es/Themes/TableTheme/index.js +31 -0
- package/dist/es/Themes/TableTheme/index.js.map +7 -0
- package/dist/es/Themes/TableTheme/index.less +46 -0
- package/dist/es/assets/image/YKUI-logo.png +0 -0
- package/dist/es/assets/less/ant-reset.less +402 -0
- package/dist/es/assets/less/index.less +1 -0
- package/dist/es/assets/less/variables.less +16 -0
- package/dist/es/business/AiChat/MarkdownRender.d.ts +9 -0
- package/dist/es/business/AiChat/MarkdownRender.js +72 -0
- package/dist/es/business/AiChat/MarkdownRender.js.map +7 -0
- package/dist/es/business/AiChat/index.d.ts +16 -0
- package/dist/es/business/AiChat/index.js +733 -0
- package/dist/es/business/AiChat/index.js.map +7 -0
- package/dist/es/business/AiChat/intentRecognizer.d.ts +33 -0
- package/dist/es/business/AiChat/intentRecognizer.js +166 -0
- package/dist/es/business/AiChat/intentRecognizer.js.map +7 -0
- package/dist/es/business/AiChat/navigationManager.d.ts +94 -0
- package/dist/es/business/AiChat/navigationManager.js +208 -0
- package/dist/es/business/AiChat/navigationManager.js.map +7 -0
- package/dist/es/business/AiChat/sse.d.ts +16 -0
- package/dist/es/business/AiChat/sse.js +171 -0
- package/dist/es/business/AiChat/sse.js.map +7 -0
- package/dist/es/business/AiChat/type.d.ts +156 -0
- package/dist/es/business/AiChat/type.js +1 -0
- package/dist/es/business/AiChat/type.js.map +7 -0
- package/dist/es/business/AiChat/useAiChat.d.ts +2 -0
- package/dist/es/business/AiChat/useAiChat.js +268 -0
- package/dist/es/business/AiChat/useAiChat.js.map +7 -0
- package/dist/es/business/AiChat/useTaskWorkflow.d.ts +25 -0
- package/dist/es/business/AiChat/useTaskWorkflow.js +196 -0
- package/dist/es/business/AiChat/useTaskWorkflow.js.map +7 -0
- package/dist/es/business/DrawerPageInfo/index.d.ts +35 -0
- package/dist/es/business/DrawerPageInfo/index.js +133 -0
- package/dist/es/business/DrawerPageInfo/index.js.map +7 -0
- package/dist/es/business/DrawerPageInfo/index.module.less +87 -0
- package/dist/es/business/DrawerPageInfo/test.png +0 -0
- package/dist/es/business/Editor/index.d.ts +11 -0
- package/dist/es/business/Editor/index.js +86 -0
- package/dist/es/business/Editor/index.js.map +7 -0
- package/dist/es/business/Editor/index.less +31 -0
- package/dist/es/business/Empty/empty.png +0 -0
- package/dist/es/business/Empty/index.d.ts +19 -0
- package/dist/es/business/Empty/index.js +51 -0
- package/dist/es/business/Empty/index.js.map +7 -0
- package/dist/es/business/ModCommonFilter/assets/images/empty.png +0 -0
- package/dist/es/business/ModCommonFilter/components/FilterButton/IconClose.d.ts +13 -0
- package/dist/es/business/ModCommonFilter/components/FilterButton/IconClose.js +51 -0
- package/dist/es/business/ModCommonFilter/components/FilterButton/IconClose.js.map +7 -0
- package/dist/es/business/ModCommonFilter/components/FilterButton/IconXiala.d.ts +13 -0
- package/dist/es/business/ModCommonFilter/components/FilterButton/IconXiala.js +51 -0
- package/dist/es/business/ModCommonFilter/components/FilterButton/IconXiala.js.map +7 -0
- package/dist/es/business/ModCommonFilter/components/FilterButton/index.d.ts +25 -0
- package/dist/es/business/ModCommonFilter/components/FilterButton/index.js +30 -0
- package/dist/es/business/ModCommonFilter/components/FilterButton/index.js.map +7 -0
- package/dist/es/business/ModCommonFilter/components/FilterButton/index.module.less +97 -0
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Category.d.ts +18 -0
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Category.js +74 -0
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Category.js.map +7 -0
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Content.d.ts +37 -0
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Content.js +216 -0
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Content.js.map +7 -0
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Selected.d.ts +26 -0
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Selected.js +102 -0
- package/dist/es/business/ModCommonFilter/components/PopoverContent/Selected.js.map +7 -0
- package/dist/es/business/ModCommonFilter/components/PopoverContent/index.d.ts +51 -0
- package/dist/es/business/ModCommonFilter/components/PopoverContent/index.js +71 -0
- package/dist/es/business/ModCommonFilter/components/PopoverContent/index.js.map +7 -0
- package/dist/es/business/ModCommonFilter/components/PopoverContent/index.module.less +260 -0
- package/dist/es/business/ModCommonFilter/index.d.ts +53 -0
- package/dist/es/business/ModCommonFilter/index.js +129 -0
- package/dist/es/business/ModCommonFilter/index.js.map +7 -0
- package/dist/es/business/ModCommonFilter/index.module.less +7 -0
- package/dist/es/business/ModCommonFilter/typing.d.ts +20 -0
- package/dist/es/business/ModCommonFilter/typing.js +1 -0
- package/dist/es/business/ModCommonFilter/typing.js.map +7 -0
- package/dist/es/business/YkPorjectSelect/icon-product.png +0 -0
- package/dist/es/business/YkPorjectSelect/index.d.ts +51 -0
- package/dist/es/business/YkPorjectSelect/index.js +260 -0
- package/dist/es/business/YkPorjectSelect/index.js.map +7 -0
- package/dist/es/business/YkPorjectSelect/index.module.less +334 -0
- package/dist/es/business/YkPorjectSelect/product-close.png +0 -0
- package/dist/es/components/Clock/index.d.ts +19 -0
- package/dist/es/components/Clock/index.js +55 -0
- package/dist/es/components/Clock/index.js.map +7 -0
- package/dist/es/components/DebounceInput/index.d.ts +16 -0
- package/dist/es/components/DebounceInput/index.js +77 -0
- package/dist/es/components/DebounceInput/index.js.map +7 -0
- package/dist/es/components/DebounceInput/index.module.less +23 -0
- package/dist/es/components/MultipleSelect/index.d.ts +23 -0
- package/dist/es/components/MultipleSelect/index.js +249 -0
- package/dist/es/components/MultipleSelect/index.js.map +7 -0
- package/dist/es/components/MultipleSelect/index.module.less +174 -0
- package/dist/es/components/NumericInput/index.d.ts +19 -0
- package/dist/es/components/NumericInput/index.js +56 -0
- package/dist/es/components/NumericInput/index.js.map +7 -0
- package/dist/es/components/RefreshButton/index.d.ts +8 -0
- package/dist/es/components/RefreshButton/index.js +21 -0
- package/dist/es/components/RefreshButton/index.js.map +7 -0
- package/dist/es/components/SearchWithHistory/index.d.ts +21 -0
- package/dist/es/components/SearchWithHistory/index.js +115 -0
- package/dist/es/components/SearchWithHistory/index.js.map +7 -0
- package/dist/es/components/SearchWithHistory/index.module.less +64 -0
- package/dist/es/components/TextWithInput/index.d.ts +15 -0
- package/dist/es/components/TextWithInput/index.js +35 -0
- package/dist/es/components/TextWithInput/index.js.map +7 -0
- package/dist/es/components/TextWithToolTip/index.d.ts +17 -0
- package/dist/es/components/TextWithToolTip/index.js +118 -0
- package/dist/es/components/TextWithToolTip/index.js.map +7 -0
- package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.d.ts +28 -0
- package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.js +161 -0
- package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.js.map +7 -0
- package/dist/es/components/TreeTransfer/components/TreeTransferPanel/index.less +151 -0
- package/dist/es/components/TreeTransfer/index.d.ts +28 -0
- package/dist/es/components/TreeTransfer/index.js +210 -0
- package/dist/es/components/TreeTransfer/index.js.map +7 -0
- package/dist/es/components/TreeTransfer/index.less +69 -0
- package/dist/es/components/TreeTransfer/types.d.ts +122 -0
- package/dist/es/components/TreeTransfer/types.js +6 -0
- package/dist/es/components/TreeTransfer/types.js.map +7 -0
- package/dist/es/components/TreeTransfer/utils/index.d.ts +120 -0
- package/dist/es/components/TreeTransfer/utils/index.js +195 -0
- package/dist/es/components/TreeTransfer/utils/index.js.map +7 -0
- package/dist/es/components/YkDateRangePicker/YkDateRangePicker.mdx +180 -0
- package/dist/es/components/YkDateRangePicker/index.d.ts +61 -0
- package/dist/es/components/YkDateRangePicker/index.js +317 -0
- package/dist/es/components/YkDateRangePicker/index.js.map +7 -0
- package/dist/es/components/YkDateRangePicker/index.module.less +304 -0
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.d.ts +16 -0
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js +193 -0
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js.map +7 -0
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.d.ts +31 -0
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js +576 -0
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +7 -0
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.d.ts +16 -0
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.js +55 -0
- package/dist/es/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.js.map +7 -0
- package/dist/es/components/YkRangeDateWithVS/index.d.ts +62 -0
- package/dist/es/components/YkRangeDateWithVS/index.js +130 -0
- package/dist/es/components/YkRangeDateWithVS/index.js.map +7 -0
- package/dist/es/components/YkRangeDateWithVS/index.module.less +566 -0
- package/dist/es/components/YkRangeDateWithVS/styles.d.ts +2 -0
- package/dist/es/components/YkRangeDateWithVS/styles.js +18 -0
- package/dist/es/components/YkRangeDateWithVS/styles.js.map +7 -0
- package/dist/es/components/YkRangeDateWithVS/typing.d.ts +15 -0
- package/dist/es/components/YkRangeTimeWithRecent/constants.d.ts +48 -0
- package/dist/es/components/YkRangeTimeWithRecent/constants.js +288 -0
- package/dist/es/components/YkRangeTimeWithRecent/constants.js.map +7 -0
- package/dist/es/components/YkRangeTimeWithRecent/index.d.ts +26 -0
- package/dist/es/components/YkRangeTimeWithRecent/index.js +647 -0
- package/dist/es/components/YkRangeTimeWithRecent/index.js.map +7 -0
- package/dist/es/components/YkRangeTimeWithRecent/index.module.less +263 -0
- package/dist/es/creative/ButtonRadioWithInfo/index.d.ts +17 -0
- package/dist/es/creative/ButtonRadioWithInfo/index.js +103 -0
- package/dist/es/creative/ButtonRadioWithInfo/index.js.map +7 -0
- package/dist/es/creative/ButtonRadioWithInfo/index.less +106 -0
- package/dist/es/creative/ButtonWithProgress/index.d.ts +11 -0
- package/dist/es/creative/ButtonWithProgress/index.js +79 -0
- package/dist/es/creative/ButtonWithProgress/index.js.map +7 -0
- package/dist/es/creative/ButtonWithProgress/index.less +66 -0
- package/dist/es/global.less +12 -0
- package/dist/es/index.d.ts +43 -0
- package/dist/es/index.js +87 -0
- package/dist/es/index.js.map +7 -0
- package/dist/es/index.less +35 -0
- package/dist/es/layout/FlexGrid/index.d.ts +25 -0
- package/dist/es/layout/FlexGrid/index.js +63 -0
- package/dist/es/layout/FlexGrid/index.js.map +7 -0
- package/dist/es/layout/YkContainer/index.d.ts +27 -0
- package/dist/es/layout/YkContainer/index.js +79 -0
- package/dist/es/layout/YkContainer/index.js.map +7 -0
- package/dist/es/layout/YkDrawer/index.d.ts +22 -0
- package/dist/es/layout/YkDrawer/index.js +160 -0
- package/dist/es/layout/YkDrawer/index.js.map +7 -0
- package/dist/es/layout/YkDrawer/index.module.less +45 -0
- package/dist/es/ui/LabelSelect/demo.d.ts +3 -0
- package/dist/es/ui/LabelSelect/demo.js +83 -0
- package/dist/es/ui/LabelSelect/demo.js.map +7 -0
- package/dist/es/ui/LabelSelect/index.d.ts +41 -0
- package/dist/es/ui/LabelSelect/index.js +136 -0
- package/dist/es/ui/LabelSelect/index.js.map +7 -0
- package/dist/es/ui/LogicOperator/index.d.ts +10 -0
- package/dist/es/ui/LogicOperator/index.js +12 -0
- package/dist/es/ui/LogicOperator/index.js.map +7 -0
- package/dist/es/ui/LogicOperator/index.module.less +97 -0
- package/dist/es/ui/YkButton/index.d.ts +9 -0
- package/dist/es/ui/YkButton/index.js +59 -0
- package/dist/es/ui/YkButton/index.js.map +7 -0
- package/dist/es/ui/YkCard/index.d.ts +4 -0
- package/dist/es/ui/YkCard/index.js +79 -0
- package/dist/es/ui/YkCard/index.js.map +7 -0
- package/dist/es/ui/YkCard/index.module.less +30 -0
- package/dist/es/ui/YkCheckbox/index.d.ts +4 -0
- package/dist/es/ui/YkCheckbox/index.js +45 -0
- package/dist/es/ui/YkCheckbox/index.js.map +7 -0
- package/dist/es/ui/YkCheckbox/index.module.less +22 -0
- package/dist/es/ui/YkDescriptions/index.d.ts +4 -0
- package/dist/es/ui/YkDescriptions/index.js +41 -0
- package/dist/es/ui/YkDescriptions/index.js.map +7 -0
- package/dist/es/ui/YkPagination/index.d.ts +4 -0
- package/dist/es/ui/YkPagination/index.js +63 -0
- package/dist/es/ui/YkPagination/index.js.map +7 -0
- package/dist/es/ui/YkPagination/index.module.less +22 -0
- package/dist/es/ui/YkRadio/index.d.ts +4 -0
- package/dist/es/ui/YkRadio/index.js +51 -0
- package/dist/es/ui/YkRadio/index.js.map +7 -0
- package/dist/es/ui/YkRadio/index.module.less +22 -0
- package/dist/es/ui/YkRadioBtnSpecial/index.d.ts +15 -0
- package/dist/es/ui/YkRadioBtnSpecial/index.js +23 -0
- package/dist/es/ui/YkRadioBtnSpecial/index.js.map +7 -0
- package/dist/es/ui/YkRadioBtnSpecial/index.module.less +112 -0
- package/dist/es/ui/YkSegmented/index.d.ts +4 -0
- package/dist/es/ui/YkSegmented/index.js +41 -0
- package/dist/es/ui/YkSegmented/index.js.map +7 -0
- package/dist/es/ui/YkSelect/index.d.ts +7 -0
- package/dist/es/ui/YkSelect/index.js +54 -0
- package/dist/es/ui/YkSelect/index.js.map +7 -0
- package/dist/es/ui/YkSpin/index.d.ts +4 -0
- package/dist/es/ui/YkSpin/index.js +41 -0
- package/dist/es/ui/YkSpin/index.js.map +7 -0
- package/dist/es/ui/YkStatistic/index.d.ts +4 -0
- package/dist/es/ui/YkStatistic/index.js +41 -0
- package/dist/es/ui/YkStatistic/index.js.map +7 -0
- package/dist/es/ui/YkSwitch/index.d.ts +4 -0
- package/dist/es/ui/YkSwitch/index.js +51 -0
- package/dist/es/ui/YkSwitch/index.js.map +7 -0
- package/dist/es/ui/YkTabs/index.d.ts +12 -0
- package/dist/es/ui/YkTabs/index.js +75 -0
- package/dist/es/ui/YkTabs/index.js.map +7 -0
- package/dist/es/ui/YkTabs/index.module.less +11 -0
- package/dist/es/ui/YkTooltip/index.d.ts +4 -0
- package/dist/es/ui/YkTooltip/index.js +50 -0
- package/dist/es/ui/YkTooltip/index.js.map +7 -0
- package/dist/es/utils/styleUtils.d.ts +18 -0
- package/dist/es/utils/styleUtils.js +57 -0
- package/dist/es/utils/styleUtils.js.map +7 -0
- package/dist/es/utils/ykStorybookDoc.d.ts +17 -0
- package/dist/es/utils/ykStorybookDoc.js +18 -0
- package/dist/es/utils/ykStorybookDoc.js.map +7 -0
- package/dist/lib/Themes/InputTheme/index.d.ts +6 -0
- package/dist/lib/Themes/InputTheme/index.js +52 -0
- package/dist/lib/Themes/InputTheme/index.js.map +7 -0
- package/dist/lib/Themes/TableTheme/index.d.ts +7 -0
- package/dist/lib/Themes/TableTheme/index.js +61 -0
- package/dist/lib/Themes/TableTheme/index.js.map +7 -0
- package/dist/lib/Themes/TableTheme/index.less +46 -0
- package/dist/lib/assets/image/YKUI-logo.png +0 -0
- package/dist/lib/assets/less/ant-reset.less +402 -0
- package/dist/lib/assets/less/index.less +1 -0
- package/dist/lib/assets/less/variables.less +16 -0
- package/dist/lib/business/AiChat/MarkdownRender.d.ts +9 -0
- package/dist/lib/business/AiChat/MarkdownRender.js +102 -0
- package/dist/lib/business/AiChat/MarkdownRender.js.map +7 -0
- package/dist/lib/business/AiChat/index.d.ts +16 -0
- package/dist/lib/business/AiChat/index.js +723 -0
- package/dist/lib/business/AiChat/index.js.map +7 -0
- package/dist/lib/business/AiChat/intentRecognizer.d.ts +33 -0
- package/dist/lib/business/AiChat/intentRecognizer.js +193 -0
- package/dist/lib/business/AiChat/intentRecognizer.js.map +7 -0
- package/dist/lib/business/AiChat/navigationManager.d.ts +94 -0
- package/dist/lib/business/AiChat/navigationManager.js +214 -0
- package/dist/lib/business/AiChat/navigationManager.js.map +7 -0
- package/dist/lib/business/AiChat/sse.d.ts +16 -0
- package/dist/lib/business/AiChat/sse.js +171 -0
- package/dist/lib/business/AiChat/sse.js.map +7 -0
- package/dist/lib/business/AiChat/type.d.ts +156 -0
- package/dist/lib/business/AiChat/type.js +18 -0
- package/dist/lib/business/AiChat/type.js.map +7 -0
- package/dist/lib/business/AiChat/useAiChat.d.ts +2 -0
- package/dist/lib/business/AiChat/useAiChat.js +252 -0
- package/dist/lib/business/AiChat/useAiChat.js.map +7 -0
- package/dist/lib/business/AiChat/useTaskWorkflow.d.ts +25 -0
- package/dist/lib/business/AiChat/useTaskWorkflow.js +182 -0
- package/dist/lib/business/AiChat/useTaskWorkflow.js.map +7 -0
- package/dist/lib/business/DrawerPageInfo/index.d.ts +35 -0
- package/dist/lib/business/DrawerPageInfo/index.js +163 -0
- package/dist/lib/business/DrawerPageInfo/index.js.map +7 -0
- package/dist/lib/business/DrawerPageInfo/index.module.less +87 -0
- package/dist/lib/business/DrawerPageInfo/test.png +0 -0
- package/dist/lib/business/Editor/index.d.ts +11 -0
- package/dist/lib/business/Editor/index.js +99 -0
- package/dist/lib/business/Editor/index.js.map +7 -0
- package/dist/lib/business/Editor/index.less +31 -0
- package/dist/lib/business/Empty/empty.png +0 -0
- package/dist/lib/business/Empty/index.d.ts +19 -0
- package/dist/lib/business/Empty/index.js +65 -0
- package/dist/lib/business/Empty/index.js.map +7 -0
- package/dist/lib/business/ModCommonFilter/assets/images/empty.png +0 -0
- package/dist/lib/business/ModCommonFilter/components/FilterButton/IconClose.d.ts +13 -0
- package/dist/lib/business/ModCommonFilter/components/FilterButton/IconClose.js +50 -0
- package/dist/lib/business/ModCommonFilter/components/FilterButton/IconClose.js.map +7 -0
- package/dist/lib/business/ModCommonFilter/components/FilterButton/IconXiala.d.ts +13 -0
- package/dist/lib/business/ModCommonFilter/components/FilterButton/IconXiala.js +50 -0
- package/dist/lib/business/ModCommonFilter/components/FilterButton/IconXiala.js.map +7 -0
- package/dist/lib/business/ModCommonFilter/components/FilterButton/index.d.ts +25 -0
- package/dist/lib/business/ModCommonFilter/components/FilterButton/index.js +60 -0
- package/dist/lib/business/ModCommonFilter/components/FilterButton/index.js.map +7 -0
- package/dist/lib/business/ModCommonFilter/components/FilterButton/index.module.less +97 -0
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Category.d.ts +18 -0
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Category.js +69 -0
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Category.js.map +7 -0
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Content.d.ts +37 -0
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Content.js +211 -0
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Content.js.map +7 -0
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Selected.d.ts +26 -0
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Selected.js +97 -0
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/Selected.js.map +7 -0
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/index.d.ts +51 -0
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/index.js +101 -0
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/index.js.map +7 -0
- package/dist/lib/business/ModCommonFilter/components/PopoverContent/index.module.less +260 -0
- package/dist/lib/business/ModCommonFilter/index.d.ts +53 -0
- package/dist/lib/business/ModCommonFilter/index.js +143 -0
- package/dist/lib/business/ModCommonFilter/index.js.map +7 -0
- package/dist/lib/business/ModCommonFilter/index.module.less +7 -0
- package/dist/lib/business/ModCommonFilter/typing.d.ts +20 -0
- package/dist/lib/business/ModCommonFilter/typing.js +18 -0
- package/dist/lib/business/ModCommonFilter/typing.js.map +7 -0
- package/dist/lib/business/YkPorjectSelect/icon-product.png +0 -0
- package/dist/lib/business/YkPorjectSelect/index.d.ts +51 -0
- package/dist/lib/business/YkPorjectSelect/index.js +235 -0
- package/dist/lib/business/YkPorjectSelect/index.js.map +7 -0
- package/dist/lib/business/YkPorjectSelect/index.module.less +334 -0
- package/dist/lib/business/YkPorjectSelect/product-close.png +0 -0
- package/dist/lib/components/Clock/index.d.ts +19 -0
- package/dist/lib/components/Clock/index.js +85 -0
- package/dist/lib/components/Clock/index.js.map +7 -0
- package/dist/lib/components/DebounceInput/index.d.ts +16 -0
- package/dist/lib/components/DebounceInput/index.js +107 -0
- package/dist/lib/components/DebounceInput/index.js.map +7 -0
- package/dist/lib/components/DebounceInput/index.module.less +23 -0
- package/dist/lib/components/MultipleSelect/index.d.ts +23 -0
- package/dist/lib/components/MultipleSelect/index.js +279 -0
- package/dist/lib/components/MultipleSelect/index.js.map +7 -0
- package/dist/lib/components/MultipleSelect/index.module.less +174 -0
- package/dist/lib/components/NumericInput/index.d.ts +19 -0
- package/dist/lib/components/NumericInput/index.js +67 -0
- package/dist/lib/components/NumericInput/index.js.map +7 -0
- package/dist/lib/components/RefreshButton/index.d.ts +8 -0
- package/dist/lib/components/RefreshButton/index.js +51 -0
- package/dist/lib/components/RefreshButton/index.js.map +7 -0
- package/dist/lib/components/SearchWithHistory/index.d.ts +21 -0
- package/dist/lib/components/SearchWithHistory/index.js +145 -0
- package/dist/lib/components/SearchWithHistory/index.js.map +7 -0
- package/dist/lib/components/SearchWithHistory/index.module.less +64 -0
- package/dist/lib/components/TextWithInput/index.d.ts +15 -0
- package/dist/lib/components/TextWithInput/index.js +65 -0
- package/dist/lib/components/TextWithInput/index.js.map +7 -0
- package/dist/lib/components/TextWithToolTip/index.d.ts +17 -0
- package/dist/lib/components/TextWithToolTip/index.js +134 -0
- package/dist/lib/components/TextWithToolTip/index.js.map +7 -0
- package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.d.ts +28 -0
- package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.js +191 -0
- package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.js.map +7 -0
- package/dist/lib/components/TreeTransfer/components/TreeTransferPanel/index.less +151 -0
- package/dist/lib/components/TreeTransfer/index.d.ts +28 -0
- package/dist/lib/components/TreeTransfer/index.js +214 -0
- package/dist/lib/components/TreeTransfer/index.js.map +7 -0
- package/dist/lib/components/TreeTransfer/index.less +69 -0
- package/dist/lib/components/TreeTransfer/types.d.ts +122 -0
- package/dist/lib/components/TreeTransfer/types.js +30 -0
- package/dist/lib/components/TreeTransfer/types.js.map +7 -0
- package/dist/lib/components/TreeTransfer/utils/index.d.ts +120 -0
- package/dist/lib/components/TreeTransfer/utils/index.js +208 -0
- package/dist/lib/components/TreeTransfer/utils/index.js.map +7 -0
- package/dist/lib/components/YkDateRangePicker/YkDateRangePicker.mdx +180 -0
- package/dist/lib/components/YkDateRangePicker/index.d.ts +61 -0
- package/dist/lib/components/YkDateRangePicker/index.js +338 -0
- package/dist/lib/components/YkDateRangePicker/index.js.map +7 -0
- package/dist/lib/components/YkDateRangePicker/index.module.less +304 -0
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.d.ts +16 -0
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js +223 -0
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSCompare.js.map +7 -0
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.d.ts +31 -0
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js +587 -0
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSRange.js.map +7 -0
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.d.ts +16 -0
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.js +85 -0
- package/dist/lib/components/YkRangeDateWithVS/YkRangeDateWithVSSelect.js.map +7 -0
- package/dist/lib/components/YkRangeDateWithVS/index.d.ts +62 -0
- package/dist/lib/components/YkRangeDateWithVS/index.js +140 -0
- package/dist/lib/components/YkRangeDateWithVS/index.js.map +7 -0
- package/dist/lib/components/YkRangeDateWithVS/index.module.less +566 -0
- package/dist/lib/components/YkRangeDateWithVS/styles.d.ts +2 -0
- package/dist/lib/components/YkRangeDateWithVS/styles.js +48 -0
- package/dist/lib/components/YkRangeDateWithVS/styles.js.map +7 -0
- package/dist/lib/components/YkRangeDateWithVS/typing.d.ts +15 -0
- package/dist/lib/components/YkRangeTimeWithRecent/constants.d.ts +48 -0
- package/dist/lib/components/YkRangeTimeWithRecent/constants.js +333 -0
- package/dist/lib/components/YkRangeTimeWithRecent/constants.js.map +7 -0
- package/dist/lib/components/YkRangeTimeWithRecent/index.d.ts +26 -0
- package/dist/lib/components/YkRangeTimeWithRecent/index.js +647 -0
- package/dist/lib/components/YkRangeTimeWithRecent/index.js.map +7 -0
- package/dist/lib/components/YkRangeTimeWithRecent/index.module.less +263 -0
- package/dist/lib/creative/ButtonRadioWithInfo/index.d.ts +17 -0
- package/dist/lib/creative/ButtonRadioWithInfo/index.js +102 -0
- package/dist/lib/creative/ButtonRadioWithInfo/index.js.map +7 -0
- package/dist/lib/creative/ButtonRadioWithInfo/index.less +106 -0
- package/dist/lib/creative/ButtonWithProgress/index.d.ts +11 -0
- package/dist/lib/creative/ButtonWithProgress/index.js +70 -0
- package/dist/lib/creative/ButtonWithProgress/index.js.map +7 -0
- package/dist/lib/creative/ButtonWithProgress/index.less +66 -0
- package/dist/lib/global.less +12 -0
- package/dist/lib/index.d.ts +43 -0
- package/dist/lib/index.js +161 -0
- package/dist/lib/index.js.map +7 -0
- package/dist/lib/index.less +35 -0
- package/dist/lib/layout/FlexGrid/index.d.ts +25 -0
- package/dist/lib/layout/FlexGrid/index.js +77 -0
- package/dist/lib/layout/FlexGrid/index.js.map +7 -0
- package/dist/lib/layout/YkContainer/index.d.ts +27 -0
- package/dist/lib/layout/YkContainer/index.js +79 -0
- package/dist/lib/layout/YkContainer/index.js.map +7 -0
- package/dist/lib/layout/YkDrawer/index.d.ts +22 -0
- package/dist/lib/layout/YkDrawer/index.js +152 -0
- package/dist/lib/layout/YkDrawer/index.js.map +7 -0
- package/dist/lib/layout/YkDrawer/index.module.less +45 -0
- package/dist/lib/ui/LabelSelect/demo.d.ts +3 -0
- package/dist/lib/ui/LabelSelect/demo.js +113 -0
- package/dist/lib/ui/LabelSelect/demo.js.map +7 -0
- package/dist/lib/ui/LabelSelect/index.d.ts +41 -0
- package/dist/lib/ui/LabelSelect/index.js +124 -0
- package/dist/lib/ui/LabelSelect/index.js.map +7 -0
- package/dist/lib/ui/LogicOperator/index.d.ts +10 -0
- package/dist/lib/ui/LogicOperator/index.js +42 -0
- package/dist/lib/ui/LogicOperator/index.js.map +7 -0
- package/dist/lib/ui/LogicOperator/index.module.less +97 -0
- package/dist/lib/ui/YkButton/index.d.ts +9 -0
- package/dist/lib/ui/YkButton/index.js +55 -0
- package/dist/lib/ui/YkButton/index.js.map +7 -0
- package/dist/lib/ui/YkCard/index.d.ts +4 -0
- package/dist/lib/ui/YkCard/index.js +76 -0
- package/dist/lib/ui/YkCard/index.js.map +7 -0
- package/dist/lib/ui/YkCard/index.module.less +30 -0
- package/dist/lib/ui/YkCheckbox/index.d.ts +4 -0
- package/dist/lib/ui/YkCheckbox/index.js +42 -0
- package/dist/lib/ui/YkCheckbox/index.js.map +7 -0
- package/dist/lib/ui/YkCheckbox/index.module.less +22 -0
- package/dist/lib/ui/YkDescriptions/index.d.ts +4 -0
- package/dist/lib/ui/YkDescriptions/index.js +41 -0
- package/dist/lib/ui/YkDescriptions/index.js.map +7 -0
- package/dist/lib/ui/YkPagination/index.d.ts +4 -0
- package/dist/lib/ui/YkPagination/index.js +60 -0
- package/dist/lib/ui/YkPagination/index.js.map +7 -0
- package/dist/lib/ui/YkPagination/index.module.less +22 -0
- package/dist/lib/ui/YkRadio/index.d.ts +4 -0
- package/dist/lib/ui/YkRadio/index.js +51 -0
- package/dist/lib/ui/YkRadio/index.js.map +7 -0
- package/dist/lib/ui/YkRadio/index.module.less +22 -0
- package/dist/lib/ui/YkRadioBtnSpecial/index.d.ts +15 -0
- package/dist/lib/ui/YkRadioBtnSpecial/index.js +53 -0
- package/dist/lib/ui/YkRadioBtnSpecial/index.js.map +7 -0
- package/dist/lib/ui/YkRadioBtnSpecial/index.module.less +112 -0
- package/dist/lib/ui/YkSegmented/index.d.ts +4 -0
- package/dist/lib/ui/YkSegmented/index.js +41 -0
- package/dist/lib/ui/YkSegmented/index.js.map +7 -0
- package/dist/lib/ui/YkSelect/index.d.ts +7 -0
- package/dist/lib/ui/YkSelect/index.js +54 -0
- package/dist/lib/ui/YkSelect/index.js.map +7 -0
- package/dist/lib/ui/YkSpin/index.d.ts +4 -0
- package/dist/lib/ui/YkSpin/index.js +41 -0
- package/dist/lib/ui/YkSpin/index.js.map +7 -0
- package/dist/lib/ui/YkStatistic/index.d.ts +4 -0
- package/dist/lib/ui/YkStatistic/index.js +41 -0
- package/dist/lib/ui/YkStatistic/index.js.map +7 -0
- package/dist/lib/ui/YkSwitch/index.d.ts +4 -0
- package/dist/lib/ui/YkSwitch/index.js +51 -0
- package/dist/lib/ui/YkSwitch/index.js.map +7 -0
- package/dist/lib/ui/YkTabs/index.d.ts +12 -0
- package/dist/lib/ui/YkTabs/index.js +70 -0
- package/dist/lib/ui/YkTabs/index.js.map +7 -0
- package/dist/lib/ui/YkTabs/index.module.less +11 -0
- package/dist/lib/ui/YkTooltip/index.d.ts +4 -0
- package/dist/lib/ui/YkTooltip/index.js +45 -0
- package/dist/lib/ui/YkTooltip/index.js.map +7 -0
- package/dist/lib/utils/styleUtils.d.ts +18 -0
- package/dist/lib/utils/styleUtils.js +84 -0
- package/dist/lib/utils/styleUtils.js.map +7 -0
- package/dist/lib/utils/ykStorybookDoc.d.ts +17 -0
- package/dist/lib/utils/ykStorybookDoc.js +41 -0
- package/dist/lib/utils/ykStorybookDoc.js.map +7 -0
- package/package.json +148 -0
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
|
|
29
|
+
// src/components/TreeTransfer/components/TreeTransferPanel/index.tsx
|
|
30
|
+
var TreeTransferPanel_exports = {};
|
|
31
|
+
__export(TreeTransferPanel_exports, {
|
|
32
|
+
default: () => TreeTransferPanel_default
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(TreeTransferPanel_exports);
|
|
35
|
+
var import_react = __toESM(require("react"));
|
|
36
|
+
var import_antd = require("antd");
|
|
37
|
+
var import_icons = require("@ant-design/icons");
|
|
38
|
+
var import_types = require("../../types");
|
|
39
|
+
var import_index = require("./index.less");
|
|
40
|
+
var { Text } = import_antd.Typography;
|
|
41
|
+
var HEADER_HEIGHT = 34;
|
|
42
|
+
var SEARCH_HEIGHT = 44;
|
|
43
|
+
var PAGINATION_HEIGHT = 36;
|
|
44
|
+
var MARGIN = 8;
|
|
45
|
+
var EXTRA_PADDING = 60;
|
|
46
|
+
var MIN_SCROLL_Y = 100;
|
|
47
|
+
var TreeTransferPanel = ({
|
|
48
|
+
dataSource,
|
|
49
|
+
selectedRowKeys,
|
|
50
|
+
onRowSelect,
|
|
51
|
+
searchValue,
|
|
52
|
+
setSearchValue,
|
|
53
|
+
totalCount,
|
|
54
|
+
title,
|
|
55
|
+
showPagination = false,
|
|
56
|
+
currentPage = 1,
|
|
57
|
+
pageSize = import_types.DEFAULT_PAGE_SIZE,
|
|
58
|
+
onPageChange,
|
|
59
|
+
columns: customColumns,
|
|
60
|
+
customRender,
|
|
61
|
+
searchPlaceholder
|
|
62
|
+
}) => {
|
|
63
|
+
const panelRef = (0, import_react.useRef)(null);
|
|
64
|
+
const [tableScrollY, setTableScrollY] = (0, import_react.useState)(void 0);
|
|
65
|
+
(0, import_react.useEffect)(() => {
|
|
66
|
+
if (!panelRef.current)
|
|
67
|
+
return void 0;
|
|
68
|
+
let rafId;
|
|
69
|
+
const calculateScrollHeight = () => {
|
|
70
|
+
var _a;
|
|
71
|
+
const panelHeight = ((_a = panelRef.current) == null ? void 0 : _a.clientHeight) ?? 0;
|
|
72
|
+
const paginationOffset = showPagination ? PAGINATION_HEIGHT : 0;
|
|
73
|
+
const available = panelHeight - HEADER_HEIGHT - SEARCH_HEIGHT - paginationOffset - MARGIN - EXTRA_PADDING;
|
|
74
|
+
setTableScrollY(Math.max(available, MIN_SCROLL_Y));
|
|
75
|
+
};
|
|
76
|
+
const scheduleCalc = () => {
|
|
77
|
+
cancelAnimationFrame(rafId);
|
|
78
|
+
rafId = requestAnimationFrame(calculateScrollHeight);
|
|
79
|
+
};
|
|
80
|
+
scheduleCalc();
|
|
81
|
+
const resizeObserver = new ResizeObserver(scheduleCalc);
|
|
82
|
+
resizeObserver.observe(panelRef.current);
|
|
83
|
+
const mutationObserver = new MutationObserver(scheduleCalc);
|
|
84
|
+
const tableBody = panelRef.current.querySelector(".ant-table-tbody");
|
|
85
|
+
if (tableBody) {
|
|
86
|
+
mutationObserver.observe(tableBody, {
|
|
87
|
+
childList: true,
|
|
88
|
+
subtree: true,
|
|
89
|
+
attributes: true,
|
|
90
|
+
attributeFilter: ["class"]
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
return () => {
|
|
94
|
+
cancelAnimationFrame(rafId);
|
|
95
|
+
resizeObserver.disconnect();
|
|
96
|
+
mutationObserver.disconnect();
|
|
97
|
+
};
|
|
98
|
+
}, [showPagination]);
|
|
99
|
+
const defaultColumns = (0, import_react.useMemo)(
|
|
100
|
+
() => [
|
|
101
|
+
{
|
|
102
|
+
title: "ID",
|
|
103
|
+
dataIndex: "key",
|
|
104
|
+
key: "id",
|
|
105
|
+
width: "35%",
|
|
106
|
+
onCell: (record) => record.isParent ? {} : { colSpan: 0 },
|
|
107
|
+
render: (_, record) => record.isParent ? String(record.key) : ""
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
title: "名称",
|
|
111
|
+
dataIndex: "data",
|
|
112
|
+
key: "name",
|
|
113
|
+
width: "65%",
|
|
114
|
+
ellipsis: { showTitle: false },
|
|
115
|
+
onCell: (record) => {
|
|
116
|
+
if (!record.isParent)
|
|
117
|
+
return { colSpan: 2 };
|
|
118
|
+
return (customRender == null ? void 0 : customRender.onCell) ? customRender.onCell(record) : {};
|
|
119
|
+
},
|
|
120
|
+
render: (_, record, index) => {
|
|
121
|
+
if (customRender == null ? void 0 : customRender.cellRender)
|
|
122
|
+
return customRender.cellRender(_, record, index);
|
|
123
|
+
const content = JSON.stringify(record.data);
|
|
124
|
+
if (content.length > 20) {
|
|
125
|
+
return /* @__PURE__ */ import_react.default.createElement(import_antd.Tooltip, { placement: "topLeft", title: content }, content);
|
|
126
|
+
}
|
|
127
|
+
return content;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
],
|
|
131
|
+
[customRender]
|
|
132
|
+
);
|
|
133
|
+
const columns = customColumns ?? defaultColumns;
|
|
134
|
+
const rowSelection = (0, import_react.useMemo)(
|
|
135
|
+
() => ({
|
|
136
|
+
selectedRowKeys,
|
|
137
|
+
onChange: (selectedKeys, selectedRows) => {
|
|
138
|
+
onRowSelect(selectedRows, selectedKeys);
|
|
139
|
+
},
|
|
140
|
+
checkStrictly: false,
|
|
141
|
+
columnWidth: 50
|
|
142
|
+
}),
|
|
143
|
+
[selectedRowKeys, onRowSelect]
|
|
144
|
+
);
|
|
145
|
+
const handleSearchChange = (0, import_react.useCallback)(
|
|
146
|
+
(e) => setSearchValue(e.target.value),
|
|
147
|
+
[setSearchValue]
|
|
148
|
+
);
|
|
149
|
+
return /* @__PURE__ */ import_react.default.createElement("div", { ref: panelRef, className: "tree-transfer-panel" }, /* @__PURE__ */ import_react.default.createElement("div", { className: "tree-transfer-panel-header" }, /* @__PURE__ */ import_react.default.createElement(Text, null, title), /* @__PURE__ */ import_react.default.createElement(Text, { type: "secondary" }, "(", totalCount, ")")), /* @__PURE__ */ import_react.default.createElement("div", { className: "tree-transfer-panel-search" }, /* @__PURE__ */ import_react.default.createElement(
|
|
150
|
+
import_antd.Input,
|
|
151
|
+
{
|
|
152
|
+
placeholder: searchPlaceholder ?? "搜索",
|
|
153
|
+
prefix: /* @__PURE__ */ import_react.default.createElement(import_icons.SearchOutlined, null),
|
|
154
|
+
value: searchValue,
|
|
155
|
+
onChange: handleSearchChange,
|
|
156
|
+
allowClear: true
|
|
157
|
+
}
|
|
158
|
+
)), /* @__PURE__ */ import_react.default.createElement("div", { className: "tree-transfer-panel-content" }, dataSource.length > 0 ? /* @__PURE__ */ import_react.default.createElement(
|
|
159
|
+
import_antd.Table,
|
|
160
|
+
{
|
|
161
|
+
rowKey: "key",
|
|
162
|
+
columns,
|
|
163
|
+
dataSource,
|
|
164
|
+
rowSelection,
|
|
165
|
+
expandable: {
|
|
166
|
+
childrenColumnName: "children",
|
|
167
|
+
defaultExpandAllRows: true,
|
|
168
|
+
indentSize: 30
|
|
169
|
+
},
|
|
170
|
+
pagination: false,
|
|
171
|
+
size: "small",
|
|
172
|
+
className: "tree-transfer-table",
|
|
173
|
+
scroll: tableScrollY !== void 0 ? { y: tableScrollY } : void 0
|
|
174
|
+
}
|
|
175
|
+
) : /* @__PURE__ */ import_react.default.createElement(import_antd.Empty, { description: "暂无数据", image: import_antd.Empty.PRESENTED_IMAGE_SIMPLE })), showPagination && onPageChange && totalCount > pageSize && /* @__PURE__ */ import_react.default.createElement("div", { className: "tree-transfer-panel-pagination" }, /* @__PURE__ */ import_react.default.createElement(
|
|
176
|
+
import_antd.Pagination,
|
|
177
|
+
{
|
|
178
|
+
current: currentPage,
|
|
179
|
+
pageSize,
|
|
180
|
+
total: totalCount,
|
|
181
|
+
showSizeChanger: false,
|
|
182
|
+
showQuickJumper: false,
|
|
183
|
+
showTitle: false,
|
|
184
|
+
onChange: onPageChange,
|
|
185
|
+
size: "small",
|
|
186
|
+
simple: true
|
|
187
|
+
}
|
|
188
|
+
)));
|
|
189
|
+
};
|
|
190
|
+
var TreeTransferPanel_default = TreeTransferPanel;
|
|
191
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../src/components/TreeTransfer/components/TreeTransferPanel/index.tsx"],
|
|
4
|
+
"sourcesContent": ["/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n/**\n * TreeTransferPanel\n *\n * 树形穿梭框单侧面板:搜索框 + 树形表格 + 分页器。\n *\n * @example\n * ```tsx\n * <TreeTransferPanel\n * dataSource={data}\n * selectedRowKeys={selectedKeys}\n * onRowSelect={handleRowSelect}\n * searchValue={searchValue}\n * setSearchValue={setSearchValue}\n * totalCount={totalCount}\n * title=\"待分配项\"\n * showPagination={true}\n * currentPage={currentPage}\n * pageSize={20}\n * onPageChange={handlePageChange}\n * columns={customColumns}\n * />\n * ```\n */\n\nimport React, { useMemo, useRef, useState, useEffect, useCallback } from 'react';\nimport { Table, Input, Empty, Pagination, Typography, Tooltip } from 'antd';\nimport type { ColumnsType } from 'antd/es/table';\nimport { SearchOutlined } from '@ant-design/icons';\nimport { TreeTransferPanelProps, TreeTransferRow, DEFAULT_PAGE_SIZE } from '../../types';\nimport './index.less';\n\nconst { Text } = Typography;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// 固定元素高度常量(与 CSS 保持一致)\n// ─────────────────────────────────────────────────────────────────────────────\nconst HEADER_HEIGHT = 34; // .tree-transfer-panel-header padding + border\nconst SEARCH_HEIGHT = 44; // .tree-transfer-panel-search padding + input\nconst PAGINATION_HEIGHT = 36; // .tree-transfer-panel-pagination\nconst MARGIN = 8; // 底部预留间距\nconst EXTRA_PADDING = 60; // 最后一行防遮挡预留空间\nconst MIN_SCROLL_Y = 100; // 表格最小可见高度(px)\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TreeTransferPanel\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst TreeTransferPanel = <T,>({\n dataSource,\n selectedRowKeys,\n onRowSelect,\n searchValue,\n setSearchValue,\n totalCount,\n title,\n showPagination = false,\n currentPage = 1,\n pageSize = DEFAULT_PAGE_SIZE,\n onPageChange,\n columns: customColumns,\n customRender,\n searchPlaceholder,\n}: TreeTransferPanelProps<T>) => {\n const panelRef = useRef<HTMLDivElement>(null);\n\n // 表格滚动高度(undefined 表示尚未计算完成,Table 自适应)\n const [tableScrollY, setTableScrollY] = useState<number | undefined>(undefined);\n\n // ── 动态计算表格可滚动高度 ─────────────────────────────────────────────────\n //\n // 计算逻辑:面板总高 - 固定头部/搜索/分页区域高度 = 表格可用高度。\n //\n // 修复说明:\n // 1. 初始值改为 undefined,避免 Table 短暂以 scroll.y=0 渲染导致高度坍塌。\n // 2. MutationObserver 回调中原使用 setTimeout(fn, 150),每次 DOM 变化都会\n // 入队新定时器;树形展开时大量 mutation 会堆积数十个 timer。\n // 修复:改用 requestAnimationFrame,每次只在下一帧执行一次计算。\n // 3. 移除 `dataSource` 出 deps:dataSource 每次 render 都是新数组引用,\n // 导致 observer 被频繁拆卸/重建。表格内容的 DOM 变化已由 MutationObserver 捕获,\n // 无需在数据变化时重建整个 effect。\n //\n useEffect(() => {\n if (!panelRef.current) return undefined;\n\n let rafId: number;\n\n const calculateScrollHeight = () => {\n const panelHeight = panelRef.current?.clientHeight ?? 0;\n const paginationOffset = showPagination ? PAGINATION_HEIGHT : 0;\n const available = panelHeight - HEADER_HEIGHT - SEARCH_HEIGHT - paginationOffset - MARGIN - EXTRA_PADDING;\n setTableScrollY(Math.max(available, MIN_SCROLL_Y));\n };\n\n const scheduleCalc = () => {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(calculateScrollHeight);\n };\n\n // 初次计算\n scheduleCalc();\n\n // 监听面板容器尺寸(窗口 resize、flex 布局变化等)\n const resizeObserver = new ResizeObserver(scheduleCalc);\n resizeObserver.observe(panelRef.current);\n\n // 监听表格 DOM 变化(树形行展开 / 收起会增删行节点)\n const mutationObserver = new MutationObserver(scheduleCalc);\n const tableBody = panelRef.current.querySelector('.ant-table-tbody');\n if (tableBody) {\n mutationObserver.observe(tableBody, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['class'],\n });\n }\n\n return () => {\n cancelAnimationFrame(rafId);\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n };\n }, [showPagination]); // 只在 showPagination 变化时重建(影响固定高度计算)\n\n // ── 默认列配置 ─────────────────────────────────────────────────────────────\n // 第一列:父节点显示 ID,子节点合并到名称列(colSpan:0)\n // 第二列:名称列,子节点 colSpan:2 占满整行\n const defaultColumns: ColumnsType<TreeTransferRow<T>> = useMemo(\n () => [\n {\n title: 'ID',\n dataIndex: 'key',\n key: 'id',\n width: '35%',\n onCell: (record: TreeTransferRow<T>) => (record.isParent ? {} : { colSpan: 0 }),\n render: (_: unknown, record: TreeTransferRow<T>) => (record.isParent ? String(record.key) : ''),\n },\n {\n title: '名称',\n dataIndex: 'data',\n key: 'name',\n width: '65%',\n ellipsis: { showTitle: false },\n onCell: (record: TreeTransferRow<T>) => {\n if (!record.isParent) return { colSpan: 2 };\n return customRender?.onCell ? customRender.onCell(record) : {};\n },\n render: (_: unknown, record: TreeTransferRow<T>, index: number) => {\n if (customRender?.cellRender) return customRender.cellRender(_, record, index);\n const content = JSON.stringify(record.data);\n if (content.length > 20) {\n return (\n <Tooltip placement='topLeft' title={content}>\n {content}\n </Tooltip>\n );\n }\n return content;\n },\n },\n ],\n [customRender],\n );\n\n // 优先使用调用方传入的列配置\n const columns = customColumns ?? defaultColumns;\n\n // ── 行选择配置 ─────────────────────────────────────────────────────────────\n // checkStrictly:false — 选中父节点时自动全选子节点\n const rowSelection = useMemo(\n () => ({\n selectedRowKeys,\n onChange: (selectedKeys: React.Key[], selectedRows: TreeTransferRow<T>[]) => {\n onRowSelect(selectedRows, selectedKeys);\n },\n checkStrictly: false,\n columnWidth: 50,\n }),\n [selectedRowKeys, onRowSelect],\n );\n\n // ── 搜索框 onChange ────────────────────────────────────────────────────────\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => setSearchValue(e.target.value),\n [setSearchValue],\n );\n\n // ── 渲染 ──────────────────────────────────────────────────────────────────\n\n return (\n <div ref={panelRef} className='tree-transfer-panel'>\n {/* 头部:标题和数量 */}\n <div className='tree-transfer-panel-header'>\n <Text>{title}</Text>\n <Text type='secondary'>({totalCount})</Text>\n </div>\n\n {/* 搜索框 */}\n <div className='tree-transfer-panel-search'>\n <Input\n placeholder={searchPlaceholder ?? '搜索'}\n prefix={<SearchOutlined />}\n value={searchValue}\n onChange={handleSearchChange}\n allowClear\n />\n </div>\n\n {/* 表格内容区域 */}\n <div className='tree-transfer-panel-content'>\n {dataSource.length > 0 ? (\n <Table\n rowKey='key'\n columns={columns}\n dataSource={dataSource}\n rowSelection={rowSelection}\n expandable={{\n childrenColumnName: 'children',\n defaultExpandAllRows: true,\n indentSize: 30,\n }}\n pagination={false}\n size='small'\n className='tree-transfer-table'\n // tableScrollY 未计算完成时不传 y,Table 自适应高度,避免初始高度坍塌\n scroll={tableScrollY !== undefined ? { y: tableScrollY } : undefined}\n />\n ) : (\n <Empty description='暂无数据' image={Empty.PRESENTED_IMAGE_SIMPLE} />\n )}\n </div>\n\n {/* 分页器:数据超过 1 页才显示 */}\n {showPagination && onPageChange && totalCount > pageSize && (\n <div className='tree-transfer-panel-pagination'>\n <Pagination\n current={currentPage}\n pageSize={pageSize}\n total={totalCount}\n showSizeChanger={false}\n showQuickJumper={false}\n showTitle={false}\n onChange={onPageChange}\n size='small'\n simple\n />\n </div>\n )}\n </div>\n );\n};\n\nexport default TreeTransferPanel;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Licensed to the Apache Software Foundation (ASF) under one or more
|
|
3
|
+
* contributor license agreements. See the NOTICE file distributed with
|
|
4
|
+
* this work for additional information regarding copyright ownership.
|
|
5
|
+
* The ASF licenses this file to You under the Apache License, Version 2.0
|
|
6
|
+
* (the "License"); you may not use this file except in compliance with
|
|
7
|
+
* the License. You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
.tree-transfer-panel {
|
|
20
|
+
flex: 1;
|
|
21
|
+
display: flex;
|
|
22
|
+
flex-direction: column;
|
|
23
|
+
min-width: 350px;
|
|
24
|
+
max-width: 500px;
|
|
25
|
+
background: #fff;
|
|
26
|
+
border-radius: 4px;
|
|
27
|
+
overflow: hidden;
|
|
28
|
+
|
|
29
|
+
// 头部区域
|
|
30
|
+
.tree-transfer-panel-header {
|
|
31
|
+
display: flex;
|
|
32
|
+
justify-content: flex-start;
|
|
33
|
+
align-items: center;
|
|
34
|
+
padding-top: 12px;
|
|
35
|
+
padding-bottom: 12px;
|
|
36
|
+
padding-left: 17px;
|
|
37
|
+
background: #fafafa;
|
|
38
|
+
border-bottom: 1px solid #f0f0f0;
|
|
39
|
+
flex-shrink: 0;
|
|
40
|
+
gap: 8px;
|
|
41
|
+
|
|
42
|
+
.ant-typography {
|
|
43
|
+
margin-bottom: 0;
|
|
44
|
+
font-size: 14px;
|
|
45
|
+
font-weight: normal;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// 搜索区域
|
|
50
|
+
.tree-transfer-panel-search {
|
|
51
|
+
padding: 12px 16px;
|
|
52
|
+
flex-shrink: 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// 表格内容区域
|
|
56
|
+
.tree-transfer-panel-content {
|
|
57
|
+
flex: 1;
|
|
58
|
+
overflow: hidden;
|
|
59
|
+
|
|
60
|
+
.tree-transfer-table {
|
|
61
|
+
.ant-table {
|
|
62
|
+
font-size: 13px;
|
|
63
|
+
border: 1px solid #f0f0f0;
|
|
64
|
+
|
|
65
|
+
// 去掉列边线,保留行边线
|
|
66
|
+
.ant-table-tbody > tr > td {
|
|
67
|
+
border-left: none;
|
|
68
|
+
border-right: none;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// 表头样式
|
|
72
|
+
.ant-table-thead > tr > th {
|
|
73
|
+
padding: 8px 12px;
|
|
74
|
+
background: #fafafa;
|
|
75
|
+
font-weight: 500;
|
|
76
|
+
font-size: 13px;
|
|
77
|
+
border-left: none;
|
|
78
|
+
border-right: none;
|
|
79
|
+
border-bottom: 1px solid #f0f0f0;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// 单元格样式
|
|
83
|
+
.ant-table-tbody > tr > td {
|
|
84
|
+
padding: 8px 12px;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// 树形展开图标样式
|
|
88
|
+
.ant-table-row-expand-icon {
|
|
89
|
+
width: 16px;
|
|
90
|
+
height: 16px;
|
|
91
|
+
line-height: 14px;
|
|
92
|
+
font-size: 10px;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// 展开行背景色
|
|
96
|
+
.ant-table-expanded-row {
|
|
97
|
+
background: #fafafa;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// 强制子项缩进30px
|
|
101
|
+
.ant-table-tbody > tr.ant-table-row-level-1 > td {
|
|
102
|
+
padding-left: 32px !important;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// 第一层不缩进
|
|
106
|
+
.ant-table-tbody > tr.ant-table-row-level-0 > td {
|
|
107
|
+
padding-left: 12px;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// 复选框样式
|
|
111
|
+
.ant-checkbox-wrapper {
|
|
112
|
+
.ant-checkbox {
|
|
113
|
+
.ant-checkbox-inner {
|
|
114
|
+
width: 14px;
|
|
115
|
+
height: 14px;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// 空状态样式
|
|
121
|
+
.ant-empty {
|
|
122
|
+
padding: 40px 0;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// 空状态容器
|
|
128
|
+
.ant-empty {
|
|
129
|
+
height: 100%;
|
|
130
|
+
display: flex;
|
|
131
|
+
align-items: center;
|
|
132
|
+
justify-content: center;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// 分页器区域
|
|
137
|
+
.tree-transfer-panel-pagination {
|
|
138
|
+
padding: 12px 16px;
|
|
139
|
+
border-top: 1px solid #f0f0f0;
|
|
140
|
+
flex-shrink: 0;
|
|
141
|
+
display: flex;
|
|
142
|
+
justify-content: center;
|
|
143
|
+
|
|
144
|
+
.ant-space-compact {
|
|
145
|
+
.ant-btn {
|
|
146
|
+
min-width: 70px;
|
|
147
|
+
font-size: 12px;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TreeTransfer
|
|
3
|
+
*
|
|
4
|
+
* 树形表格穿梭框组件。支持:
|
|
5
|
+
* - 树形结构展示,父子联动选择(checkStrictly: false)
|
|
6
|
+
* - 前端分页 + 防抖搜索
|
|
7
|
+
* - 左右穿梭操作(含多级树正确迁移)
|
|
8
|
+
* - 自定义列配置和渲染
|
|
9
|
+
* - 完整的 TypeScript 泛型支持
|
|
10
|
+
*
|
|
11
|
+
* @template T - 行数据的自定义业务类型
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```tsx
|
|
15
|
+
* <TreeTransfer
|
|
16
|
+
* leftDataSource={leftData}
|
|
17
|
+
* rightDataSource={rightData}
|
|
18
|
+
* leftTitle="待分配"
|
|
19
|
+
* rightTitle="已分配"
|
|
20
|
+
* onChange={({ leftData, rightData }) => { ... }}
|
|
21
|
+
* />
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
import React from 'react';
|
|
25
|
+
import { TreeTransferProps } from './types';
|
|
26
|
+
import './index.less';
|
|
27
|
+
declare function TreeTransfer<T>({ leftDataSource, rightDataSource, loading, leftTitle, rightTitle, pageSize, columns, customRender, searchFields, searchPlaceholder, onChange, }: TreeTransferProps<T>): React.JSX.Element;
|
|
28
|
+
export default TreeTransfer;
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
|
|
29
|
+
// src/components/TreeTransfer/index.tsx
|
|
30
|
+
var TreeTransfer_exports = {};
|
|
31
|
+
__export(TreeTransfer_exports, {
|
|
32
|
+
default: () => TreeTransfer_default
|
|
33
|
+
});
|
|
34
|
+
module.exports = __toCommonJS(TreeTransfer_exports);
|
|
35
|
+
var import_react = __toESM(require("react"));
|
|
36
|
+
var import_antd = require("antd");
|
|
37
|
+
var import_icons = require("@ant-design/icons");
|
|
38
|
+
var import_types = require("./types");
|
|
39
|
+
var import_utils = require("./utils");
|
|
40
|
+
var import_TreeTransferPanel = __toESM(require("./components/TreeTransferPanel"));
|
|
41
|
+
var import_index = require("./index.less");
|
|
42
|
+
function useDebounce(callback, delay) {
|
|
43
|
+
const callbackRef = (0, import_react.useRef)(callback);
|
|
44
|
+
callbackRef.current = callback;
|
|
45
|
+
const timeoutRef = (0, import_react.useRef)();
|
|
46
|
+
return (0, import_react.useCallback)(
|
|
47
|
+
(...args) => {
|
|
48
|
+
clearTimeout(timeoutRef.current);
|
|
49
|
+
timeoutRef.current = setTimeout(() => callbackRef.current(...args), delay);
|
|
50
|
+
},
|
|
51
|
+
[delay]
|
|
52
|
+
// callback 通过 ref 读取,不需要放入 deps
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
function TreeTransfer({
|
|
56
|
+
leftDataSource,
|
|
57
|
+
rightDataSource,
|
|
58
|
+
loading = false,
|
|
59
|
+
leftTitle = "待分配项",
|
|
60
|
+
rightTitle = "已分配项",
|
|
61
|
+
pageSize = import_types.DEFAULT_PAGE_SIZE,
|
|
62
|
+
columns,
|
|
63
|
+
customRender,
|
|
64
|
+
searchFields,
|
|
65
|
+
searchPlaceholder,
|
|
66
|
+
onChange
|
|
67
|
+
}) {
|
|
68
|
+
const [leftPanel, setLeftPanel] = (0, import_react.useState)({
|
|
69
|
+
selectedRowKeys: [],
|
|
70
|
+
searchValue: "",
|
|
71
|
+
currentPage: 1,
|
|
72
|
+
totalCount: 0
|
|
73
|
+
});
|
|
74
|
+
const [rightPanel, setRightPanel] = (0, import_react.useState)({
|
|
75
|
+
selectedRowKeys: [],
|
|
76
|
+
searchValue: "",
|
|
77
|
+
currentPage: 1,
|
|
78
|
+
totalCount: 0
|
|
79
|
+
});
|
|
80
|
+
const filteredLeft = (0, import_react.useMemo)(
|
|
81
|
+
() => (0, import_utils.filterData)(leftDataSource, leftPanel.searchValue, searchFields),
|
|
82
|
+
[leftDataSource, leftPanel.searchValue, searchFields]
|
|
83
|
+
);
|
|
84
|
+
const filteredRight = (0, import_react.useMemo)(
|
|
85
|
+
() => (0, import_utils.filterData)(rightDataSource, rightPanel.searchValue, searchFields),
|
|
86
|
+
[rightDataSource, rightPanel.searchValue, searchFields]
|
|
87
|
+
);
|
|
88
|
+
const filteredLeftData = (0, import_react.useMemo)(
|
|
89
|
+
() => (0, import_utils.sliceDataByPage)(filteredLeft, leftPanel.currentPage, pageSize),
|
|
90
|
+
[filteredLeft, leftPanel.currentPage, pageSize]
|
|
91
|
+
);
|
|
92
|
+
const filteredRightData = (0, import_react.useMemo)(
|
|
93
|
+
() => (0, import_utils.sliceDataByPage)(filteredRight, rightPanel.currentPage, pageSize),
|
|
94
|
+
[filteredRight, rightPanel.currentPage, pageSize]
|
|
95
|
+
);
|
|
96
|
+
const filteredLeftTotalCount = (0, import_react.useMemo)(() => (0, import_utils.countParentNodes)(filteredLeft), [filteredLeft]);
|
|
97
|
+
const filteredRightTotalCount = (0, import_react.useMemo)(() => (0, import_utils.countParentNodes)(filteredRight), [filteredRight]);
|
|
98
|
+
(0, import_react.useEffect)(() => {
|
|
99
|
+
setLeftPanel((prev) => ({
|
|
100
|
+
...prev,
|
|
101
|
+
currentPage: 1,
|
|
102
|
+
totalCount: (0, import_utils.countParentNodes)(leftDataSource)
|
|
103
|
+
}));
|
|
104
|
+
}, [leftDataSource]);
|
|
105
|
+
(0, import_react.useEffect)(() => {
|
|
106
|
+
setRightPanel((prev) => ({
|
|
107
|
+
...prev,
|
|
108
|
+
currentPage: 1,
|
|
109
|
+
totalCount: (0, import_utils.countParentNodes)(rightDataSource)
|
|
110
|
+
}));
|
|
111
|
+
}, [rightDataSource]);
|
|
112
|
+
const handleLeftSearchChange = useDebounce((value) => {
|
|
113
|
+
setLeftPanel((prev) => ({ ...prev, searchValue: value, currentPage: 1 }));
|
|
114
|
+
}, 300);
|
|
115
|
+
const handleRightSearchChange = useDebounce((value) => {
|
|
116
|
+
setRightPanel((prev) => ({ ...prev, searchValue: value, currentPage: 1 }));
|
|
117
|
+
}, 300);
|
|
118
|
+
const handleLeftPageChange = (0, import_react.useCallback)((page) => {
|
|
119
|
+
setLeftPanel((prev) => ({ ...prev, currentPage: page }));
|
|
120
|
+
}, []);
|
|
121
|
+
const handleRightPageChange = (0, import_react.useCallback)((page) => {
|
|
122
|
+
setRightPanel((prev) => ({ ...prev, currentPage: page }));
|
|
123
|
+
}, []);
|
|
124
|
+
const handleMoveRight = (0, import_react.useCallback)(() => {
|
|
125
|
+
if (leftPanel.selectedRowKeys.length === 0)
|
|
126
|
+
return;
|
|
127
|
+
const selectedSet = new Set(leftPanel.selectedRowKeys.map(String));
|
|
128
|
+
const nodesToAdd = (0, import_utils.extractTopLevelSelectedNodes)(selectedSet, leftDataSource);
|
|
129
|
+
const keysToRemove = new Set((0, import_utils.getAllDescendantKeys)(leftPanel.selectedRowKeys, leftDataSource));
|
|
130
|
+
const newLeftData = (0, import_utils.removeNodesFromTree)(leftDataSource, keysToRemove);
|
|
131
|
+
const newRightData = (0, import_utils.addNodesToTree)(rightDataSource, null, nodesToAdd);
|
|
132
|
+
setLeftPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));
|
|
133
|
+
setRightPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));
|
|
134
|
+
onChange == null ? void 0 : onChange({
|
|
135
|
+
leftSelected: [],
|
|
136
|
+
rightSelected: [],
|
|
137
|
+
leftData: newLeftData,
|
|
138
|
+
rightData: newRightData
|
|
139
|
+
});
|
|
140
|
+
}, [leftPanel.selectedRowKeys, leftDataSource, rightDataSource, onChange]);
|
|
141
|
+
const handleMoveLeft = (0, import_react.useCallback)(() => {
|
|
142
|
+
if (rightPanel.selectedRowKeys.length === 0)
|
|
143
|
+
return;
|
|
144
|
+
const selectedSet = new Set(rightPanel.selectedRowKeys.map(String));
|
|
145
|
+
const nodesToAdd = (0, import_utils.extractTopLevelSelectedNodes)(selectedSet, rightDataSource);
|
|
146
|
+
const keysToRemove = new Set((0, import_utils.getAllDescendantKeys)(rightPanel.selectedRowKeys, rightDataSource));
|
|
147
|
+
const newRightData = (0, import_utils.removeNodesFromTree)(rightDataSource, keysToRemove);
|
|
148
|
+
const newLeftData = (0, import_utils.addNodesToTree)(leftDataSource, null, nodesToAdd);
|
|
149
|
+
setLeftPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));
|
|
150
|
+
setRightPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));
|
|
151
|
+
onChange == null ? void 0 : onChange({
|
|
152
|
+
leftSelected: [],
|
|
153
|
+
rightSelected: [],
|
|
154
|
+
leftData: newLeftData,
|
|
155
|
+
rightData: newRightData
|
|
156
|
+
});
|
|
157
|
+
}, [rightPanel.selectedRowKeys, rightDataSource, leftDataSource, onChange]);
|
|
158
|
+
return /* @__PURE__ */ import_react.default.createElement("div", { className: "tree-transfer-wrapper" }, /* @__PURE__ */ import_react.default.createElement(import_antd.Spin, { spinning: loading }, /* @__PURE__ */ import_react.default.createElement("div", { className: "tree-transfer-content" }, /* @__PURE__ */ import_react.default.createElement(
|
|
159
|
+
import_TreeTransferPanel.default,
|
|
160
|
+
{
|
|
161
|
+
dataSource: filteredLeftData,
|
|
162
|
+
selectedRowKeys: leftPanel.selectedRowKeys,
|
|
163
|
+
onRowSelect: (_, keys) => setLeftPanel((prev) => ({ ...prev, selectedRowKeys: keys })),
|
|
164
|
+
searchValue: leftPanel.searchValue,
|
|
165
|
+
setSearchValue: handleLeftSearchChange,
|
|
166
|
+
totalCount: leftPanel.searchValue ? filteredLeftTotalCount : leftPanel.totalCount,
|
|
167
|
+
title: leftTitle,
|
|
168
|
+
showPagination: true,
|
|
169
|
+
currentPage: leftPanel.currentPage,
|
|
170
|
+
pageSize,
|
|
171
|
+
onPageChange: handleLeftPageChange,
|
|
172
|
+
columns,
|
|
173
|
+
customRender,
|
|
174
|
+
searchPlaceholder
|
|
175
|
+
}
|
|
176
|
+
), /* @__PURE__ */ import_react.default.createElement("div", { className: "tree-transfer-operations" }, /* @__PURE__ */ import_react.default.createElement(import_antd.Space, { direction: "vertical", size: 8 }, /* @__PURE__ */ import_react.default.createElement(
|
|
177
|
+
import_antd.Button,
|
|
178
|
+
{
|
|
179
|
+
className: "tree-transfer-operation-btn",
|
|
180
|
+
type: leftPanel.selectedRowKeys.length > 0 ? "primary" : "default",
|
|
181
|
+
icon: /* @__PURE__ */ import_react.default.createElement(import_icons.RightOutlined, null),
|
|
182
|
+
onClick: handleMoveRight,
|
|
183
|
+
disabled: leftPanel.selectedRowKeys.length === 0
|
|
184
|
+
}
|
|
185
|
+
), /* @__PURE__ */ import_react.default.createElement(
|
|
186
|
+
import_antd.Button,
|
|
187
|
+
{
|
|
188
|
+
className: "tree-transfer-operation-btn",
|
|
189
|
+
type: rightPanel.selectedRowKeys.length > 0 ? "primary" : "default",
|
|
190
|
+
icon: /* @__PURE__ */ import_react.default.createElement(import_icons.LeftOutlined, null),
|
|
191
|
+
onClick: handleMoveLeft,
|
|
192
|
+
disabled: rightPanel.selectedRowKeys.length === 0
|
|
193
|
+
}
|
|
194
|
+
))), /* @__PURE__ */ import_react.default.createElement(
|
|
195
|
+
import_TreeTransferPanel.default,
|
|
196
|
+
{
|
|
197
|
+
dataSource: filteredRightData,
|
|
198
|
+
selectedRowKeys: rightPanel.selectedRowKeys,
|
|
199
|
+
onRowSelect: (_, keys) => setRightPanel((prev) => ({ ...prev, selectedRowKeys: keys })),
|
|
200
|
+
searchValue: rightPanel.searchValue,
|
|
201
|
+
setSearchValue: handleRightSearchChange,
|
|
202
|
+
totalCount: rightPanel.searchValue ? filteredRightTotalCount : rightPanel.totalCount,
|
|
203
|
+
title: rightTitle,
|
|
204
|
+
showPagination: true,
|
|
205
|
+
currentPage: rightPanel.currentPage,
|
|
206
|
+
pageSize,
|
|
207
|
+
onPageChange: handleRightPageChange,
|
|
208
|
+
columns,
|
|
209
|
+
customRender
|
|
210
|
+
}
|
|
211
|
+
))));
|
|
212
|
+
}
|
|
213
|
+
var TreeTransfer_default = TreeTransfer;
|
|
214
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/components/TreeTransfer/index.tsx"],
|
|
4
|
+
"sourcesContent": ["/*\n * Licensed to the Apache Software Foundation (ASF) under one or more\n * contributor license agreements. See the NOTICE file distributed with\n * this work for additional information regarding copyright ownership.\n * The ASF licenses this file to You under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with\n * the License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n/**\n * TreeTransfer\n *\n * 树形表格穿梭框组件。支持:\n * - 树形结构展示,父子联动选择(checkStrictly: false)\n * - 前端分页 + 防抖搜索\n * - 左右穿梭操作(含多级树正确迁移)\n * - 自定义列配置和渲染\n * - 完整的 TypeScript 泛型支持\n *\n * @template T - 行数据的自定义业务类型\n *\n * @example\n * ```tsx\n * <TreeTransfer\n * leftDataSource={leftData}\n * rightDataSource={rightData}\n * leftTitle=\"待分配\"\n * rightTitle=\"已分配\"\n * onChange={({ leftData, rightData }) => { ... }}\n * />\n * ```\n */\n\nimport React, { useState, useMemo, useCallback, useEffect, useRef } from 'react';\nimport { Spin, Button, Space } from 'antd';\nimport { RightOutlined, LeftOutlined } from '@ant-design/icons';\nimport { TreeTransferProps, DEFAULT_PAGE_SIZE } from './types';\nimport {\n sliceDataByPage,\n filterData,\n getAllDescendantKeys,\n removeNodesFromTree,\n addNodesToTree,\n countParentNodes,\n extractTopLevelSelectedNodes,\n} from './utils';\nimport TreeTransferPanel from './components/TreeTransferPanel';\nimport './index.less';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// useDebounce\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 防抖 Hook\n *\n * 修复说明:\n * 原实现将 `callback` 放入 `useCallback` 的 deps,导致每次渲染(callback 为\n * 新引用)都重新创建防抖函数,使 timeout 重置,防抖完全失效。\n * 修复方案:将最新 callback 存入 ref,useCallback 仅依赖 delay,保证\n * 防抖函数引用稳定,timeout 不被意外清除。\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction useDebounce<T extends (...args: any[]) => any>(callback: T, delay: number): T {\n // 存储最新 callback,避免 stale closure\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n const timeoutRef = useRef<NodeJS.Timeout>();\n\n return useCallback(\n (...args: Parameters<T>) => {\n clearTimeout(timeoutRef.current);\n timeoutRef.current = setTimeout(() => callbackRef.current(...args), delay);\n },\n [delay], // callback 通过 ref 读取,不需要放入 deps\n ) as T;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// TreeTransfer\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * 面板选择/分页状态(不含 dataSource,数据源来自 props + memo 计算)\n */\ninterface PanelState {\n selectedRowKeys: React.Key[];\n searchValue: string;\n currentPage: number;\n totalCount: number;\n}\n\nfunction TreeTransfer<T>({\n leftDataSource,\n rightDataSource,\n loading = false,\n leftTitle = '待分配项',\n rightTitle = '已分配项',\n pageSize = DEFAULT_PAGE_SIZE,\n columns,\n customRender,\n searchFields,\n searchPlaceholder,\n onChange,\n}: TreeTransferProps<T>) {\n // ── 面板状态(选择、搜索、分页) ─────────────────────────────────────────────\n // 注意:dataSource 不存储在 state 中;显示数据通过 memo 从 props 实时计算,\n // 避免 state 与 props 不同步的问题。\n const [leftPanel, setLeftPanel] = useState<PanelState>({\n selectedRowKeys: [],\n searchValue: '',\n currentPage: 1,\n totalCount: 0,\n });\n\n const [rightPanel, setRightPanel] = useState<PanelState>({\n selectedRowKeys: [],\n searchValue: '',\n currentPage: 1,\n totalCount: 0,\n });\n\n // ── 过滤后的完整数据(先 filter,再由 slice 分页) ──────────────────────────\n // 合并 filter + count,避免对同一搜索词调用两次 filterData(原来的问题)。\n\n const filteredLeft = useMemo(\n () => filterData<T>(leftDataSource, leftPanel.searchValue, searchFields),\n [leftDataSource, leftPanel.searchValue, searchFields],\n );\n\n const filteredRight = useMemo(\n () => filterData<T>(rightDataSource, rightPanel.searchValue, searchFields),\n [rightDataSource, rightPanel.searchValue, searchFields],\n );\n\n /** 当前页展示数据(供左侧面板渲染) */\n const filteredLeftData = useMemo(\n () => sliceDataByPage<T>(filteredLeft, leftPanel.currentPage, pageSize),\n [filteredLeft, leftPanel.currentPage, pageSize],\n );\n\n /** 当前页展示数据(供右侧面板渲染) */\n const filteredRightData = useMemo(\n () => sliceDataByPage<T>(filteredRight, rightPanel.currentPage, pageSize),\n [filteredRight, rightPanel.currentPage, pageSize],\n );\n\n /** 搜索后的顶层节点数(用于分页器 total) */\n const filteredLeftTotalCount = useMemo(() => countParentNodes(filteredLeft), [filteredLeft]);\n const filteredRightTotalCount = useMemo(() => countParentNodes(filteredRight), [filteredRight]);\n\n // ── 数据源变化时更新 totalCount,同时重置到第 1 页 ──────────────────────────\n useEffect(() => {\n setLeftPanel((prev) => ({\n ...prev,\n currentPage: 1,\n totalCount: countParentNodes(leftDataSource),\n }));\n }, [leftDataSource]);\n\n useEffect(() => {\n setRightPanel((prev) => ({\n ...prev,\n currentPage: 1,\n totalCount: countParentNodes(rightDataSource),\n }));\n }, [rightDataSource]);\n\n // ── 防抖搜索 ─────────────────────────────────────────────────────────────────\n\n const handleLeftSearchChange = useDebounce((value: string) => {\n setLeftPanel((prev) => ({ ...prev, searchValue: value, currentPage: 1 }));\n }, 300);\n\n const handleRightSearchChange = useDebounce((value: string) => {\n setRightPanel((prev) => ({ ...prev, searchValue: value, currentPage: 1 }));\n }, 300);\n\n // ── 分页 ─────────────────────────────────────────────────────────────────────\n\n const handleLeftPageChange = useCallback((page: number) => {\n setLeftPanel((prev) => ({ ...prev, currentPage: page }));\n }, []);\n\n const handleRightPageChange = useCallback((page: number) => {\n setRightPanel((prev) => ({ ...prev, currentPage: page }));\n }, []);\n\n // ── 穿梭操作 ─────────────────────────────────────────────────────────────────\n\n /**\n * 右移:将左侧选中项移到右侧\n *\n * 修复说明:\n * 原实现通过 `dataSource.filter(item => item.key === key)` 只查根节点,\n * 导致仅选中子节点时 nodesToAdd 为空,数据静默丢失。\n * 修复:使用 `extractTopLevelSelectedNodes` 递归提取选中的顶层节点(含 children)。\n */\n const handleMoveRight = useCallback(() => {\n if (leftPanel.selectedRowKeys.length === 0) return;\n\n const selectedSet = new Set(leftPanel.selectedRowKeys.map(String));\n // 提取选中的顶层节点(子节点随父一起携带)\n const nodesToAdd = extractTopLevelSelectedNodes<T>(selectedSet, leftDataSource);\n // 删除所有相关 key(含后代)\n const keysToRemove = new Set(getAllDescendantKeys(leftPanel.selectedRowKeys, leftDataSource));\n const newLeftData = removeNodesFromTree(leftDataSource, keysToRemove);\n const newRightData = addNodesToTree(rightDataSource, null, nodesToAdd);\n\n setLeftPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));\n setRightPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));\n\n onChange?.({\n leftSelected: [],\n rightSelected: [],\n leftData: newLeftData,\n rightData: newRightData,\n });\n }, [leftPanel.selectedRowKeys, leftDataSource, rightDataSource, onChange]);\n\n /**\n * 左移:将右侧选中项移到左侧\n */\n const handleMoveLeft = useCallback(() => {\n if (rightPanel.selectedRowKeys.length === 0) return;\n\n const selectedSet = new Set(rightPanel.selectedRowKeys.map(String));\n const nodesToAdd = extractTopLevelSelectedNodes<T>(selectedSet, rightDataSource);\n const keysToRemove = new Set(getAllDescendantKeys(rightPanel.selectedRowKeys, rightDataSource));\n const newRightData = removeNodesFromTree(rightDataSource, keysToRemove);\n const newLeftData = addNodesToTree(leftDataSource, null, nodesToAdd);\n\n setLeftPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));\n setRightPanel((prev) => ({ ...prev, currentPage: 1, selectedRowKeys: [] }));\n\n onChange?.({\n leftSelected: [],\n rightSelected: [],\n leftData: newLeftData,\n rightData: newRightData,\n });\n }, [rightPanel.selectedRowKeys, rightDataSource, leftDataSource, onChange]);\n\n // ── 渲染 ─────────────────────────────────────────────────────────────────────\n\n return (\n <div className='tree-transfer-wrapper'>\n <Spin spinning={loading}>\n <div className='tree-transfer-content'>\n {/* 左侧面板 */}\n <TreeTransferPanel<T>\n dataSource={filteredLeftData}\n selectedRowKeys={leftPanel.selectedRowKeys}\n onRowSelect={(_, keys) => setLeftPanel((prev) => ({ ...prev, selectedRowKeys: keys }))}\n searchValue={leftPanel.searchValue}\n setSearchValue={handleLeftSearchChange}\n totalCount={leftPanel.searchValue ? filteredLeftTotalCount : leftPanel.totalCount}\n title={leftTitle}\n showPagination={true}\n currentPage={leftPanel.currentPage}\n pageSize={pageSize}\n onPageChange={handleLeftPageChange}\n columns={columns}\n customRender={customRender}\n searchPlaceholder={searchPlaceholder}\n />\n\n {/* 中间操作按钮 */}\n <div className='tree-transfer-operations'>\n <Space direction='vertical' size={8}>\n <Button\n className='tree-transfer-operation-btn'\n type={leftPanel.selectedRowKeys.length > 0 ? 'primary' : 'default'}\n icon={<RightOutlined />}\n onClick={handleMoveRight}\n disabled={leftPanel.selectedRowKeys.length === 0}\n />\n <Button\n className='tree-transfer-operation-btn'\n type={rightPanel.selectedRowKeys.length > 0 ? 'primary' : 'default'}\n icon={<LeftOutlined />}\n onClick={handleMoveLeft}\n disabled={rightPanel.selectedRowKeys.length === 0}\n />\n </Space>\n </div>\n\n {/* 右侧面板 */}\n <TreeTransferPanel<T>\n dataSource={filteredRightData}\n selectedRowKeys={rightPanel.selectedRowKeys}\n onRowSelect={(_, keys) => setRightPanel((prev) => ({ ...prev, selectedRowKeys: keys }))}\n searchValue={rightPanel.searchValue}\n setSearchValue={handleRightSearchChange}\n totalCount={rightPanel.searchValue ? filteredRightTotalCount : rightPanel.totalCount}\n title={rightTitle}\n showPagination={true}\n currentPage={rightPanel.currentPage}\n pageSize={pageSize}\n onPageChange={handleRightPageChange}\n columns={columns}\n customRender={customRender}\n />\n </div>\n </Spin>\n </div>\n );\n}\n\nexport default TreeTransfer;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["React", "TreeTransferPanel"]
|
|
7
|
+
}
|