@aloudata/aloudata-design 3.0.0-beta.13 → 3.0.0-beta.15

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.
Files changed (78) hide show
  1. package/dist/AProgress/index.d.ts +1 -1
  2. package/dist/AProgress/index.js +19 -5
  3. package/dist/AProgress/index.js.map +1 -1
  4. package/dist/Alert/index.d.ts +1 -1
  5. package/dist/Alert/index.js +22 -8
  6. package/dist/Alert/index.js.map +1 -1
  7. package/dist/Avatar/component/Avatar/index.d.ts +1 -1
  8. package/dist/Avatar/component/Avatar/index.js +4 -4
  9. package/dist/Avatar/component/Avatar/index.js.map +1 -1
  10. package/dist/Avatar/component/Avatar/type.d.ts +1 -1
  11. package/dist/Avatar/component/Avatar/type.js +6 -1
  12. package/dist/Avatar/component/Avatar/type.js.map +1 -1
  13. package/dist/Avatar/index.js +67 -8
  14. package/dist/Avatar/index.js.map +1 -1
  15. package/dist/Badge/index.d.ts +1 -0
  16. package/dist/Badge/index.js +32 -9
  17. package/dist/Badge/index.js.map +1 -1
  18. package/dist/Breadcrumb/index.js +21 -12
  19. package/dist/Breadcrumb/index.js.map +1 -1
  20. package/dist/Button/index.d.ts +2 -0
  21. package/dist/Button/index.js +39 -32
  22. package/dist/Button/index.js.map +1 -1
  23. package/dist/Card/index.js +5 -5
  24. package/dist/Card/index.js.map +1 -1
  25. package/dist/Checkbox/index.js +4 -11
  26. package/dist/Checkbox/index.js.map +1 -1
  27. package/dist/Checkbox/type.d.ts +2 -0
  28. package/dist/Collapse/index.js +38 -22
  29. package/dist/Collapse/index.js.map +1 -1
  30. package/dist/DataPreviewTable/index.js +1 -1
  31. package/dist/DataPreviewTable/index.js.map +1 -1
  32. package/dist/Drawer/index.d.ts +1 -0
  33. package/dist/Drawer/index.js +45 -33
  34. package/dist/Drawer/index.js.map +1 -1
  35. package/dist/Dropdown/index.d.ts +5 -0
  36. package/dist/Dropdown/index.js +151 -34
  37. package/dist/Dropdown/index.js.map +1 -1
  38. package/dist/LogicTree/DisplayLogicTree.d.ts +1 -1
  39. package/dist/LogicTree/DisplayLogicTree.js.map +1 -1
  40. package/dist/LogicTree/components/DisplayLogicItem/index.d.ts +1 -1
  41. package/dist/LogicTree/components/DisplayLogicItem/index.js +1 -1
  42. package/dist/LogicTree/components/DisplayLogicItem/index.js.map +1 -1
  43. package/dist/LogicTree/components/LogicItem/index.js +2 -3
  44. package/dist/LogicTree/components/LogicItem/index.js.map +1 -1
  45. package/dist/LogicTree/index.d.ts +1 -1
  46. package/dist/LogicTree/index.js.map +1 -1
  47. package/dist/MemberPicker/components/NickLabel.js +1 -1
  48. package/dist/MemberPicker/components/NickLabel.js.map +1 -1
  49. package/dist/MemberPicker/components/Panel.js +13 -14
  50. package/dist/MemberPicker/components/Panel.js.map +1 -1
  51. package/dist/MemberPicker/index.js +6 -3
  52. package/dist/MemberPicker/index.js.map +1 -1
  53. package/dist/Menu/index.d.ts +4 -0
  54. package/dist/Menu/index.js +34 -12
  55. package/dist/Menu/index.js.map +1 -1
  56. package/dist/Popover/index.js +3 -2
  57. package/dist/Popover/index.js.map +1 -1
  58. package/dist/Progress/index.d.ts +0 -3
  59. package/dist/Progress/index.js +0 -3
  60. package/dist/Progress/index.js.map +1 -1
  61. package/dist/Select/BaseSelect.js +2 -1
  62. package/dist/Select/BaseSelect.js.map +1 -1
  63. package/dist/Select/interface.d.ts +4 -0
  64. package/dist/Table/components/Footer/index.js +1 -1
  65. package/dist/Table/components/Footer/index.js.map +1 -1
  66. package/dist/Table/hooks/useRowSelection.d.ts +1 -1
  67. package/dist/Table/hooks/useRowSelection.js +7 -9
  68. package/dist/Table/hooks/useRowSelection.js.map +1 -1
  69. package/dist/Table/index.js +1 -1
  70. package/dist/Table/index.js.map +1 -1
  71. package/dist/Tree/Tree2.js +1 -1
  72. package/dist/Tree/Tree2.js.map +1 -1
  73. package/dist/_utils/storybookArgTypes.d.ts +11 -0
  74. package/dist/_utils/storybookArgTypes.js +2 -0
  75. package/dist/aloudata-design.css +1 -1
  76. package/dist/index.d.ts +3 -2
  77. package/dist/index.js +1 -1
  78. package/package.json +2 -2
@@ -8,18 +8,27 @@ import _ from "lodash";
8
8
  import { ControlledMenu, MenuDivider, MenuHeader, MenuItem, SubMenu } from "@szhsin/react-menu";
9
9
  //#region src/Menu/index.tsx
10
10
  function Menu(props) {
11
- const { className, items, onClick: onMenuClick, selectedKeys, menuStyle } = props;
11
+ const { className, items, onClick: onMenuClick, onBeforeLeafItemClick, selectedKeys, menuStyle, rootClosing = false, externalOverflow } = props;
12
+ const selectedKeySet = new Set(selectedKeys || []);
13
+ const hasDirectSelectedItem = (items) => items.some((item) => {
14
+ if (isSubMenuItem(item)) return selectedKeySet.has(item.key);
15
+ if (isHeaderMenuItem(item) || isDivideMenuItem(item)) return false;
16
+ return selectedKeySet.has(item.key);
17
+ });
12
18
  const getMenuItems = (items, parentPath = []) => {
19
+ const isSelectableGroup = hasDirectSelectedItem(items);
13
20
  return items.map((item, index) => {
14
21
  if (isDivideMenuItem(item)) return /* @__PURE__ */ jsx(MenuDivider, {}, `divider_${index}`);
15
22
  if (isHeaderMenuItem(item)) return /* @__PURE__ */ jsx(MenuHeader, { children: item.label }, `header_${index}`);
16
23
  const currPath = [...parentPath, item.key];
17
24
  const titleStr = _.isString(item.label) ? item.label : "";
25
+ const isSelected = selectedKeys?.includes(item.key);
18
26
  if (isSubMenuItem(item)) return /* @__PURE__ */ jsx(SubMenu, {
19
27
  label: /* @__PURE__ */ jsxs("div", {
20
28
  className: "ald-menu-item-label",
21
29
  title: titleStr,
22
30
  children: [
31
+ isSelectableGroup ? /* @__PURE__ */ jsx("div", { className: "ald-menu-item-selection-slot" }) : null,
23
32
  item.icon ? /* @__PURE__ */ jsx("div", {
24
33
  className: "ald-menu-item-label-icon",
25
34
  children: item.icon
@@ -35,22 +44,27 @@ function Menu(props) {
35
44
  ]
36
45
  }),
37
46
  disabled: item.disabled,
38
- gap: 0,
47
+ align: "start",
48
+ direction: "right",
49
+ gap: -8,
50
+ position: "anchor",
51
+ shift: 0,
39
52
  menuStyle: {
40
53
  ...menuStyle,
41
54
  overflow: isLeafMenu(item.children) ? "auto" : void 0
42
55
  },
43
- menuClassName: cn("ald-menu-submenu-popup", item.popupClassName),
56
+ menuClassName: cn("ald-menu-submenu-popup", item.popupClassName, rootClosing && "ald-menu-submenu-popup-root-closing"),
44
57
  overflow: isLeafMenu(item.children) ? "auto" : void 0,
45
58
  children: getMenuItems(item.children, currPath)
46
59
  }, item.key);
47
60
  return /* @__PURE__ */ jsx(MenuItem, {
48
61
  className: cn(item.className, {
49
62
  "ald-menu-item-danger": item.danger,
50
- "ald-menu-item-selected": selectedKeys?.includes(item.key)
63
+ "ald-menu-item-selected": isSelected
51
64
  }),
52
65
  disabled: item.disabled,
53
66
  onClick: ({ syntheticEvent }) => {
67
+ onBeforeLeafItemClick?.();
54
68
  const menuInfo = {
55
69
  key: item.key,
56
70
  keyPath: currPath,
@@ -63,6 +77,10 @@ function Menu(props) {
63
77
  className: "ald-menu-item-label",
64
78
  title: titleStr,
65
79
  children: [
80
+ isSelectableGroup ? /* @__PURE__ */ jsx("div", {
81
+ className: cn("ald-menu-item-selection-slot", isSelected && "ald-menu-item-selection-slot-selected ald-menu-item-selected-icon"),
82
+ children: isSelected ? /* @__PURE__ */ jsx(Memo, {}) : null
83
+ }) : null,
66
84
  item.icon ? /* @__PURE__ */ jsx("div", {
67
85
  className: "ald-menu-item-label-icon",
68
86
  children: item.icon
@@ -70,10 +88,6 @@ function Menu(props) {
70
88
  /* @__PURE__ */ jsx("div", {
71
89
  className: "ald-menu-item-label-text",
72
90
  children: item.label
73
- }),
74
- selectedKeys?.includes(item.key) && /* @__PURE__ */ jsx("div", {
75
- className: "ald-menu-item-selected-icon",
76
- children: /* @__PURE__ */ jsx(Memo, {})
77
91
  })
78
92
  ]
79
93
  })
@@ -81,21 +95,29 @@ function Menu(props) {
81
95
  });
82
96
  };
83
97
  const ref = useRef(null);
98
+ const leafOverflow = isLeafMenu(items) ? "auto" : void 0;
84
99
  return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("div", {
85
100
  style: { display: "none" },
86
101
  ref
87
102
  }), /* @__PURE__ */ jsx(ControlledMenu, {
88
103
  state: "open",
104
+ transition: {
105
+ open: true,
106
+ close: true
107
+ },
108
+ transitionTimeout: 200,
109
+ submenuOpenDelay: 0,
110
+ submenuCloseDelay: 0,
89
111
  menuStyle: {
90
112
  ...menuStyle,
91
- overflow: isLeafMenu(items) ? "auto" : void 0
113
+ overflow: externalOverflow ? void 0 : leafOverflow
92
114
  },
93
115
  anchorRef: ref,
94
116
  className: cn(className, "ald-menu"),
95
- position: "auto",
117
+ position: externalOverflow ? "initial" : "auto",
96
118
  captureFocus: false,
97
- viewScroll: "auto",
98
- overflow: isLeafMenu(items) ? "auto" : void 0,
119
+ viewScroll: externalOverflow ? "initial" : "auto",
120
+ overflow: externalOverflow ? "visible" : leafOverflow,
99
121
  children: getMenuItems(items || [])
100
122
  })] });
101
123
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/Menu/index.tsx"],"sourcesContent":["import {\n ControlledMenu,\n MenuDivider,\n MenuHeader,\n MenuItem,\n SubMenu,\n} from '@szhsin/react-menu';\nimport { cn } from '../lib/utils';\nimport _ from 'lodash';\nimport React, { useRef } from 'react';\nimport { CheckLightLine, ChevronRightLine } from '../Icon';\nimport './menu.css';\n\nexport interface MenuProps {\n onClick?: (info: MenuInfo) => void;\n className?: string;\n items: MenuItemType[];\n selectedKeys?: string[];\n menuStyle?: React.CSSProperties;\n}\n\nexport default function Menu(props: MenuProps) {\n const {\n className,\n items,\n onClick: onMenuClick,\n selectedKeys,\n menuStyle,\n } = props;\n\n const getMenuItems = (items: MenuItemType[], parentPath: string[] = []) => {\n return items.map((item, index) => {\n if (isDivideMenuItem(item)) {\n return <MenuDivider key={`divider_${index}`} />;\n }\n if (isHeaderMenuItem(item)) {\n return <MenuHeader key={`header_${index}`}>{item.label}</MenuHeader>;\n }\n const currPath = [...parentPath, item.key];\n const titleStr = _.isString(item.label) ? item.label : '';\n\n if (isSubMenuItem(item)) {\n const subMenuItemLabel = (\n <div className=\"ald-menu-item-label\" title={titleStr}>\n {item.icon ? (\n <div className=\"ald-menu-item-label-icon\">{item.icon}</div>\n ) : null}\n <div className=\"ald-menu-item-label-text\">{item.label}</div>\n <div className=\"ald-menu-item-right\">\n <ChevronRightLine size={16} />\n </div>\n </div>\n );\n\n return (\n <SubMenu\n key={item.key}\n label={subMenuItemLabel}\n disabled={item.disabled}\n gap={0}\n menuStyle={{\n ...menuStyle,\n overflow: isLeafMenu(item.children) ? 'auto' : undefined,\n }}\n menuClassName={cn('ald-menu-submenu-popup', item.popupClassName)}\n overflow={isLeafMenu(item.children) ? 'auto' : undefined}\n >\n {getMenuItems(item.children, currPath)}\n </SubMenu>\n );\n }\n\n return (\n <MenuItem\n key={item.key}\n className={cn(item.className, {\n 'ald-menu-item-danger': item.danger,\n 'ald-menu-item-selected': selectedKeys?.includes(item.key),\n })}\n disabled={item.disabled}\n onClick={({ syntheticEvent }) => {\n const menuInfo = {\n key: item.key,\n keyPath: currPath,\n domEvent: syntheticEvent,\n };\n if (item.onClick) {\n item.onClick(menuInfo);\n }\n if (onMenuClick) {\n onMenuClick(menuInfo);\n }\n }}\n >\n <div className=\"ald-menu-item-label\" title={titleStr}>\n {item.icon ? (\n <div className=\"ald-menu-item-label-icon\">{item.icon}</div>\n ) : null}\n <div className=\"ald-menu-item-label-text\">{item.label}</div>\n {selectedKeys?.includes(item.key) && (\n <div className=\"ald-menu-item-selected-icon\">\n <CheckLightLine />\n </div>\n )}\n </div>\n </MenuItem>\n );\n });\n };\n\n const ref = useRef(null);\n\n return (\n <>\n <div style={{ display: 'none' }} ref={ref} />\n <ControlledMenu\n state=\"open\"\n menuStyle={{\n ...menuStyle,\n overflow: isLeafMenu(items) ? 'auto' : undefined,\n }}\n anchorRef={ref}\n className={cn(className, 'ald-menu')}\n position=\"auto\"\n captureFocus={false}\n viewScroll=\"auto\"\n overflow={isLeafMenu(items) ? 'auto' : undefined}\n >\n {getMenuItems(items || [])}\n </ControlledMenu>\n </>\n );\n}\n\nexport function isHeaderMenuItem(\n menuItem: MenuItemType,\n): menuItem is MenuHeaderType {\n return 'type' in menuItem && menuItem.type === 'header';\n}\n\nexport function isDivideMenuItem(\n menuItem: MenuItemType,\n): menuItem is MenuDividerType {\n return 'type' in menuItem && menuItem.type === 'divider';\n}\n\nexport function isSubMenuItem(menuItem: MenuItemType): menuItem is SubMenuType {\n return 'children' in menuItem && !!menuItem.children;\n}\n\nexport function isLeafMenu(menuItems: MenuItemType[]) {\n return !_.some(menuItems, (item) => isSubMenuItem(item));\n}\n\nexport type MenuItemType =\n | ItemType\n | MenuDividerType\n | SubMenuType\n | MenuHeaderType;\n\nexport interface ItemType {\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n onClick?: (info: MenuInfo) => void;\n danger?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nexport interface MenuDividerType {\n key?: string;\n type: 'divider';\n}\n\nexport interface MenuHeaderType {\n key?: string;\n type: 'header';\n label: string;\n}\n\nexport interface SubMenuType {\n children: MenuItemType[];\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n popupClassName?: string;\n disabled?: boolean;\n}\n\nexport interface MenuInfo {\n key: string;\n keyPath: string[];\n domEvent: MouseEvent | KeyboardEvent;\n // 阻止菜单关闭\n keepOpen?: boolean;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/Menu/index.tsx"],"sourcesContent":["import {\n ControlledMenu,\n MenuDivider,\n MenuHeader,\n MenuItem,\n SubMenu,\n} from '@szhsin/react-menu';\nimport { cn } from '../lib/utils';\nimport _ from 'lodash';\nimport React, { useRef } from 'react';\nimport { CheckLightLine, ChevronRightLine } from '../Icon';\nimport './menu.css';\n\nexport interface MenuProps {\n onClick?: (info: MenuInfo) => void;\n onBeforeLeafItemClick?: () => void;\n className?: string;\n items: MenuItemType[];\n selectedKeys?: string[];\n menuStyle?: React.CSSProperties;\n rootClosing?: boolean;\n /** @internal 由 Dropdown 注入,禁用内部定位/overflow 计算。不支持含 SubMenu 的菜单 */\n externalOverflow?: boolean;\n}\n\nexport default function Menu(props: MenuProps) {\n const {\n className,\n items,\n onClick: onMenuClick,\n onBeforeLeafItemClick,\n selectedKeys,\n menuStyle,\n rootClosing = false,\n externalOverflow,\n } = props;\n const selectedKeySet = new Set(selectedKeys || []);\n\n const hasDirectSelectedItem = (items: MenuItemType[]): boolean =>\n items.some((item) => {\n if (isSubMenuItem(item)) {\n return selectedKeySet.has(item.key);\n }\n if (isHeaderMenuItem(item) || isDivideMenuItem(item)) {\n return false;\n }\n return selectedKeySet.has(item.key);\n });\n\n const getMenuItems = (items: MenuItemType[], parentPath: string[] = []) => {\n const isSelectableGroup = hasDirectSelectedItem(items);\n\n return items.map((item, index) => {\n if (isDivideMenuItem(item)) {\n return <MenuDivider key={`divider_${index}`} />;\n }\n if (isHeaderMenuItem(item)) {\n return <MenuHeader key={`header_${index}`}>{item.label}</MenuHeader>;\n }\n const currPath = [...parentPath, item.key];\n const titleStr = _.isString(item.label) ? item.label : '';\n const isSelected = selectedKeys?.includes(item.key);\n\n if (isSubMenuItem(item)) {\n const subMenuItemLabel = (\n <div className=\"ald-menu-item-label\" title={titleStr}>\n {isSelectableGroup ? (\n <div className=\"ald-menu-item-selection-slot\" />\n ) : null}\n {item.icon ? (\n <div className=\"ald-menu-item-label-icon\">{item.icon}</div>\n ) : null}\n <div className=\"ald-menu-item-label-text\">{item.label}</div>\n <div className=\"ald-menu-item-right\">\n <ChevronRightLine size={16} />\n </div>\n </div>\n );\n\n return (\n <SubMenu\n key={item.key}\n label={subMenuItemLabel}\n disabled={item.disabled}\n align=\"start\"\n direction=\"right\"\n gap={-8}\n position=\"anchor\"\n shift={0}\n menuStyle={{\n ...menuStyle,\n overflow: isLeafMenu(item.children) ? 'auto' : undefined,\n }}\n menuClassName={cn(\n 'ald-menu-submenu-popup',\n item.popupClassName,\n rootClosing && 'ald-menu-submenu-popup-root-closing',\n )}\n overflow={isLeafMenu(item.children) ? 'auto' : undefined}\n >\n {getMenuItems(item.children, currPath)}\n </SubMenu>\n );\n }\n\n return (\n <MenuItem\n key={item.key}\n className={cn(item.className, {\n 'ald-menu-item-danger': item.danger,\n 'ald-menu-item-selected': isSelected,\n })}\n disabled={item.disabled}\n onClick={({ syntheticEvent }) => {\n onBeforeLeafItemClick?.();\n const menuInfo = {\n key: item.key,\n keyPath: currPath,\n domEvent: syntheticEvent,\n };\n if (item.onClick) {\n item.onClick(menuInfo);\n }\n if (onMenuClick) {\n onMenuClick(menuInfo);\n }\n }}\n >\n <div className=\"ald-menu-item-label\" title={titleStr}>\n {isSelectableGroup ? (\n <div\n className={cn(\n 'ald-menu-item-selection-slot',\n isSelected &&\n 'ald-menu-item-selection-slot-selected ald-menu-item-selected-icon',\n )}\n >\n {isSelected ? <CheckLightLine /> : null}\n </div>\n ) : null}\n {item.icon ? (\n <div className=\"ald-menu-item-label-icon\">{item.icon}</div>\n ) : null}\n <div className=\"ald-menu-item-label-text\">{item.label}</div>\n </div>\n </MenuItem>\n );\n });\n };\n\n const ref = useRef(null);\n\n const leafOverflow = isLeafMenu(items) ? 'auto' : undefined;\n\n return (\n <>\n <div style={{ display: 'none' }} ref={ref} />\n <ControlledMenu\n state=\"open\"\n transition={{ open: true, close: true }}\n transitionTimeout={200}\n submenuOpenDelay={0}\n submenuCloseDelay={0}\n menuStyle={{\n ...menuStyle,\n overflow: externalOverflow ? undefined : leafOverflow,\n }}\n anchorRef={ref}\n className={cn(className, 'ald-menu')}\n position={externalOverflow ? 'initial' : 'auto'}\n captureFocus={false}\n viewScroll={externalOverflow ? 'initial' : 'auto'}\n overflow={externalOverflow ? 'visible' : leafOverflow}\n >\n {getMenuItems(items || [])}\n </ControlledMenu>\n </>\n );\n}\n\nexport function isHeaderMenuItem(\n menuItem: MenuItemType,\n): menuItem is MenuHeaderType {\n return 'type' in menuItem && menuItem.type === 'header';\n}\n\nexport function isDivideMenuItem(\n menuItem: MenuItemType,\n): menuItem is MenuDividerType {\n return 'type' in menuItem && menuItem.type === 'divider';\n}\n\nexport function isSubMenuItem(menuItem: MenuItemType): menuItem is SubMenuType {\n return 'children' in menuItem && !!menuItem.children;\n}\n\nexport function isLeafMenu(menuItems: MenuItemType[]) {\n return !_.some(menuItems, (item) => isSubMenuItem(item));\n}\n\nexport type MenuItemType =\n | ItemType\n | MenuDividerType\n | SubMenuType\n | MenuHeaderType;\n\nexport interface ItemType {\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n onClick?: (info: MenuInfo) => void;\n danger?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nexport interface MenuDividerType {\n key?: string;\n type: 'divider';\n}\n\nexport interface MenuHeaderType {\n key?: string;\n type: 'header';\n label: string;\n}\n\nexport interface SubMenuType {\n children: MenuItemType[];\n key: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n popupClassName?: string;\n disabled?: boolean;\n}\n\nexport interface MenuInfo {\n key: string;\n keyPath: string[];\n domEvent: MouseEvent | KeyboardEvent;\n // 阻止菜单关闭\n keepOpen?: boolean;\n}\n"],"mappings":"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"}
@@ -3,6 +3,7 @@ import React from "react";
3
3
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
4
4
  import * as PopoverPrimitive from "@radix-ui/react-popover";
5
5
  //#region src/Popover/index.tsx
6
+ var DEFAULT_POPOVER_Z_INDEX = 1100;
6
7
  var placementMap = {
7
8
  top: "top",
8
9
  bottom: "bottom",
@@ -65,10 +66,10 @@ function Popover(props) {
65
66
  side,
66
67
  align,
67
68
  sideOffset: 4,
68
- className: cn("ald-popover ant-popover-inner tw-z-50 tw-rounded-r-75 tw-border tw-border-solid tw-border-[var(--border-default-alpha)] tw-bg-[var(--alias-colors-bg-skeleton-subtler)] tw-p-3 tw-outline-none", "tw-animate-in tw-fade-in-0 tw-zoom-in-95", overlayClassName),
69
+ className: cn("ald-popover ant-popover-inner tw-rounded-r-75 tw-border tw-border-solid tw-border-[var(--border-default-alpha)] tw-bg-[var(--alias-colors-bg-skeleton-subtler)] tw-p-3 tw-outline-none", "tw-animate-in tw-fade-in-0 tw-zoom-in-95", overlayClassName),
69
70
  style: {
70
71
  boxShadow: "var(--elevation-bottom-bottom-sm)",
71
- zIndex,
72
+ zIndex: zIndex ?? DEFAULT_POPOVER_Z_INDEX,
72
73
  ...overlayStyle
73
74
  },
74
75
  onMouseEnter: isHoverTrigger ? () => handleOpenChange(true) : void 0,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/Popover/index.tsx"],"sourcesContent":["import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport React from 'react';\nimport { cn } from '../lib/utils';\n\ntype TriggerType = 'hover' | 'click' | 'focus';\n\nexport interface PopoverProps {\n content?: React.ReactNode;\n title?: React.ReactNode;\n children?: React.ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n trigger?: TriggerType | TriggerType[];\n rootClassName?: string;\n placement?:\n | 'top'\n | 'bottom'\n | 'left'\n | 'right'\n | 'topLeft'\n | 'topRight'\n | 'bottomLeft'\n | 'bottomRight'\n | 'leftTop'\n | 'leftBottom'\n | 'rightTop'\n | 'rightBottom';\n overlayClassName?: string;\n overlayStyle?: React.CSSProperties;\n arrow?: boolean;\n mouseEnterDelay?: number;\n mouseLeaveDelay?: number;\n className?: string;\n style?: React.CSSProperties;\n getPopupContainer?: () => HTMLElement;\n zIndex?: number;\n}\n\nconst placementMap: Record<\n string,\n PopoverPrimitive.PopoverContentProps['side']\n> = {\n top: 'top',\n bottom: 'bottom',\n left: 'left',\n right: 'right',\n topLeft: 'top',\n topRight: 'top',\n bottomLeft: 'bottom',\n bottomRight: 'bottom',\n leftTop: 'left',\n leftBottom: 'left',\n rightTop: 'right',\n rightBottom: 'right',\n};\n\nconst alignMap: Record<string, PopoverPrimitive.PopoverContentProps['align']> =\n {\n topLeft: 'start',\n topRight: 'end',\n bottomLeft: 'start',\n bottomRight: 'end',\n leftTop: 'start',\n leftBottom: 'end',\n rightTop: 'start',\n rightBottom: 'end',\n };\n\nfunction normalizeTrigger(trigger: PopoverProps['trigger']): Set<TriggerType> {\n if (Array.isArray(trigger)) return new Set(trigger);\n if (trigger) return new Set([trigger]);\n return new Set<TriggerType>(['hover']);\n}\n\nfunction Popover(props: PopoverProps) {\n const {\n content,\n title,\n children,\n open,\n defaultOpen,\n onOpenChange,\n trigger = 'hover',\n placement = 'top',\n overlayClassName,\n overlayStyle,\n arrow = false,\n getPopupContainer,\n zIndex,\n } = props;\n\n const containerRef = React.useRef<HTMLElement | undefined>(\n getPopupContainer?.(),\n );\n\n const [hoverOpen, setHoverOpen] = React.useState(false);\n const triggers = normalizeTrigger(trigger);\n\n const isControlled = open !== undefined;\n const isHoverTrigger = triggers.has('hover');\n const isOpen = isControlled\n ? open\n : isHoverTrigger\n ? hoverOpen\n : triggers.size === 0\n ? false\n : undefined;\n\n const handleOpenChange = (val: boolean) => {\n if (!isControlled && isHoverTrigger) {\n setHoverOpen(val);\n }\n onOpenChange?.(val);\n };\n\n const side = placementMap[placement] || 'top';\n const align = alignMap[placement] || 'center';\n\n const triggerChild = React.isValidElement(children) ? (\n children\n ) : (\n <span>{children}</span>\n );\n\n if (triggers.size === 0 && !isControlled) {\n return <>{children}</>;\n }\n\n return (\n <PopoverPrimitive.Root\n open={isOpen}\n defaultOpen={defaultOpen}\n onOpenChange={handleOpenChange}\n >\n <PopoverPrimitive.Trigger asChild>\n {isHoverTrigger ? (\n <span\n onMouseEnter={() => handleOpenChange(true)}\n onMouseLeave={() => handleOpenChange(false)}\n >\n {triggerChild}\n </span>\n ) : (\n triggerChild\n )}\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal container={containerRef.current}>\n <PopoverPrimitive.Content\n side={side}\n align={align}\n sideOffset={4}\n // antd 兼容:保留 ant-popover-inner class,消费方 CSS 可能通过该选择器自定义内边距、背景等样式\n className={cn(\n 'ald-popover ant-popover-inner tw-z-50 tw-rounded-r-75 tw-border tw-border-solid tw-border-[var(--border-default-alpha)] tw-bg-[var(--alias-colors-bg-skeleton-subtler)] tw-p-3 tw-outline-none',\n 'tw-animate-in tw-fade-in-0 tw-zoom-in-95',\n overlayClassName,\n )}\n style={{\n boxShadow: 'var(--elevation-bottom-bottom-sm)',\n zIndex,\n ...overlayStyle,\n }}\n onMouseEnter={\n isHoverTrigger ? () => handleOpenChange(true) : undefined\n }\n onMouseLeave={\n isHoverTrigger ? () => handleOpenChange(false) : undefined\n }\n >\n {title && (\n <div className=\"ald-popover-title tw-mb-2 tw-text-sm tw-font-medium tw-text-[var(--content-primary)]\">\n {title}\n </div>\n )}\n {content && (\n // antd 兼容:保留 ant-popover-inner-content class,消费方 CSS 可能通过该选择器自定义样式\n <div className=\"ald-popover-inner-content ant-popover-inner-content\">\n {content}\n </div>\n )}\n {arrow && (\n <PopoverPrimitive.Arrow\n style={{ fill: 'var(--alias-colors-bg-skeleton-subtler, #fff)' }}\n />\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n\nexport default Popover;\n"],"mappings":";;;;;AAuCA,IAAM,eAGF;CACF,KAAK;CACL,QAAQ;CACR,MAAM;CACN,OAAO;CACP,SAAS;CACT,UAAU;CACV,YAAY;CACZ,aAAa;CACb,SAAS;CACT,YAAY;CACZ,UAAU;CACV,aAAa;CACd;AAED,IAAM,WACJ;CACE,SAAS;CACT,UAAU;CACV,YAAY;CACZ,aAAa;CACb,SAAS;CACT,YAAY;CACZ,UAAU;CACV,aAAa;CACd;AAEH,SAAS,iBAAiB,SAAoD;AAC5E,KAAI,MAAM,QAAQ,QAAQ,CAAE,QAAO,IAAI,IAAI,QAAQ;AACnD,KAAI,QAAS,QAAO,IAAI,IAAI,CAAC,QAAQ,CAAC;AACtC,QAAO,IAAI,IAAiB,CAAC,QAAQ,CAAC;;AAGxC,SAAS,QAAQ,OAAqB;CACpC,MAAM,EACJ,SACA,OACA,UACA,MACA,aACA,cACA,UAAU,SACV,YAAY,OACZ,kBACA,cACA,QAAQ,OACR,mBACA,WACE;CAEJ,MAAM,eAAe,MAAM,OACzB,qBAAqB,CACtB;CAED,MAAM,CAAC,WAAW,gBAAgB,MAAM,SAAS,MAAM;CACvD,MAAM,WAAW,iBAAiB,QAAQ;CAE1C,MAAM,eAAe,SAAS;CAC9B,MAAM,iBAAiB,SAAS,IAAI,QAAQ;CAC5C,MAAM,SAAS,eACX,OACA,iBACA,YACA,SAAS,SAAS,IAClB,QACA;CAEJ,MAAM,oBAAoB,QAAiB;AACzC,MAAI,CAAC,gBAAgB,eACnB,cAAa,IAAI;AAEnB,iBAAe,IAAI;;CAGrB,MAAM,OAAO,aAAa,cAAc;CACxC,MAAM,QAAQ,SAAS,cAAc;CAErC,MAAM,eAAe,MAAM,eAAe,SAAS,GACjD,WAEA,oBAAC,QAAD,EAAO,UAAgB,CAAA;AAGzB,KAAI,SAAS,SAAS,KAAK,CAAC,aAC1B,QAAO,oBAAA,UAAA,EAAG,UAAY,CAAA;AAGxB,QACE,qBAAC,iBAAiB,MAAlB;EACE,MAAM;EACO;EACb,cAAc;YAHhB,CAKE,oBAAC,iBAAiB,SAAlB;GAA0B,SAAA;aACvB,iBACC,oBAAC,QAAD;IACE,oBAAoB,iBAAiB,KAAK;IAC1C,oBAAoB,iBAAiB,MAAM;cAE1C;IACI,CAAA,GAEP;GAEuB,CAAA,EAC3B,oBAAC,iBAAiB,QAAlB;GAAyB,WAAW,aAAa;aAC/C,qBAAC,iBAAiB,SAAlB;IACQ;IACC;IACP,YAAY;IAEZ,WAAW,GACT,kMACA,4CACA,iBACD;IACD,OAAO;KACL,WAAW;KACX;KACA,GAAG;KACJ;IACD,cACE,uBAAuB,iBAAiB,KAAK,GAAG;IAElD,cACE,uBAAuB,iBAAiB,MAAM,GAAG;cAnBrD;KAsBG,SACC,oBAAC,OAAD;MAAK,WAAU;gBACZ;MACG,CAAA;KAEP,WAEC,oBAAC,OAAD;MAAK,WAAU;gBACZ;MACG,CAAA;KAEP,SACC,oBAAC,iBAAiB,OAAlB,EACE,OAAO,EAAE,MAAM,iDAAiD,EAChE,CAAA;KAEqB;;GACH,CAAA,CACJ"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/Popover/index.tsx"],"sourcesContent":["import * as PopoverPrimitive from '@radix-ui/react-popover';\nimport React from 'react';\nimport { cn } from '../lib/utils';\n\ntype TriggerType = 'hover' | 'click' | 'focus';\n\nconst DEFAULT_POPOVER_Z_INDEX = 1100;\n\nexport interface PopoverProps {\n content?: React.ReactNode;\n title?: React.ReactNode;\n children?: React.ReactNode;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n trigger?: TriggerType | TriggerType[];\n rootClassName?: string;\n placement?:\n | 'top'\n | 'bottom'\n | 'left'\n | 'right'\n | 'topLeft'\n | 'topRight'\n | 'bottomLeft'\n | 'bottomRight'\n | 'leftTop'\n | 'leftBottom'\n | 'rightTop'\n | 'rightBottom';\n overlayClassName?: string;\n overlayStyle?: React.CSSProperties;\n arrow?: boolean;\n mouseEnterDelay?: number;\n mouseLeaveDelay?: number;\n className?: string;\n style?: React.CSSProperties;\n getPopupContainer?: () => HTMLElement;\n zIndex?: number;\n}\n\nconst placementMap: Record<\n string,\n PopoverPrimitive.PopoverContentProps['side']\n> = {\n top: 'top',\n bottom: 'bottom',\n left: 'left',\n right: 'right',\n topLeft: 'top',\n topRight: 'top',\n bottomLeft: 'bottom',\n bottomRight: 'bottom',\n leftTop: 'left',\n leftBottom: 'left',\n rightTop: 'right',\n rightBottom: 'right',\n};\n\nconst alignMap: Record<string, PopoverPrimitive.PopoverContentProps['align']> =\n {\n topLeft: 'start',\n topRight: 'end',\n bottomLeft: 'start',\n bottomRight: 'end',\n leftTop: 'start',\n leftBottom: 'end',\n rightTop: 'start',\n rightBottom: 'end',\n };\n\nfunction normalizeTrigger(trigger: PopoverProps['trigger']): Set<TriggerType> {\n if (Array.isArray(trigger)) return new Set(trigger);\n if (trigger) return new Set([trigger]);\n return new Set<TriggerType>(['hover']);\n}\n\nfunction Popover(props: PopoverProps) {\n const {\n content,\n title,\n children,\n open,\n defaultOpen,\n onOpenChange,\n trigger = 'hover',\n placement = 'top',\n overlayClassName,\n overlayStyle,\n arrow = false,\n getPopupContainer,\n zIndex,\n } = props;\n\n const containerRef = React.useRef<HTMLElement | undefined>(\n getPopupContainer?.(),\n );\n\n const [hoverOpen, setHoverOpen] = React.useState(false);\n const triggers = normalizeTrigger(trigger);\n\n const isControlled = open !== undefined;\n const isHoverTrigger = triggers.has('hover');\n const isOpen = isControlled\n ? open\n : isHoverTrigger\n ? hoverOpen\n : triggers.size === 0\n ? false\n : undefined;\n\n const handleOpenChange = (val: boolean) => {\n if (!isControlled && isHoverTrigger) {\n setHoverOpen(val);\n }\n onOpenChange?.(val);\n };\n\n const side = placementMap[placement] || 'top';\n const align = alignMap[placement] || 'center';\n\n const triggerChild = React.isValidElement(children) ? (\n children\n ) : (\n <span>{children}</span>\n );\n\n if (triggers.size === 0 && !isControlled) {\n return <>{children}</>;\n }\n\n return (\n <PopoverPrimitive.Root\n open={isOpen}\n defaultOpen={defaultOpen}\n onOpenChange={handleOpenChange}\n >\n <PopoverPrimitive.Trigger asChild>\n {isHoverTrigger ? (\n <span\n onMouseEnter={() => handleOpenChange(true)}\n onMouseLeave={() => handleOpenChange(false)}\n >\n {triggerChild}\n </span>\n ) : (\n triggerChild\n )}\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal container={containerRef.current}>\n <PopoverPrimitive.Content\n side={side}\n align={align}\n sideOffset={4}\n // antd 兼容:保留 ant-popover-inner class,消费方 CSS 可能通过该选择器自定义内边距、背景等样式\n className={cn(\n 'ald-popover ant-popover-inner tw-rounded-r-75 tw-border tw-border-solid tw-border-[var(--border-default-alpha)] tw-bg-[var(--alias-colors-bg-skeleton-subtler)] tw-p-3 tw-outline-none',\n 'tw-animate-in tw-fade-in-0 tw-zoom-in-95',\n overlayClassName,\n )}\n style={{\n boxShadow: 'var(--elevation-bottom-bottom-sm)',\n zIndex: zIndex ?? DEFAULT_POPOVER_Z_INDEX,\n ...overlayStyle,\n }}\n onMouseEnter={\n isHoverTrigger ? () => handleOpenChange(true) : undefined\n }\n onMouseLeave={\n isHoverTrigger ? () => handleOpenChange(false) : undefined\n }\n >\n {title && (\n <div className=\"ald-popover-title tw-mb-2 tw-text-sm tw-font-medium tw-text-[var(--content-primary)]\">\n {title}\n </div>\n )}\n {content && (\n // antd 兼容:保留 ant-popover-inner-content class,消费方 CSS 可能通过该选择器自定义样式\n <div className=\"ald-popover-inner-content ant-popover-inner-content\">\n {content}\n </div>\n )}\n {arrow && (\n <PopoverPrimitive.Arrow\n style={{ fill: 'var(--alias-colors-bg-skeleton-subtler, #fff)' }}\n />\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n\nexport default Popover;\n"],"mappings":";;;;;AAMA,IAAM,0BAA0B;AAmChC,IAAM,eAGF;CACF,KAAK;CACL,QAAQ;CACR,MAAM;CACN,OAAO;CACP,SAAS;CACT,UAAU;CACV,YAAY;CACZ,aAAa;CACb,SAAS;CACT,YAAY;CACZ,UAAU;CACV,aAAa;CACd;AAED,IAAM,WACJ;CACE,SAAS;CACT,UAAU;CACV,YAAY;CACZ,aAAa;CACb,SAAS;CACT,YAAY;CACZ,UAAU;CACV,aAAa;CACd;AAEH,SAAS,iBAAiB,SAAoD;AAC5E,KAAI,MAAM,QAAQ,QAAQ,CAAE,QAAO,IAAI,IAAI,QAAQ;AACnD,KAAI,QAAS,QAAO,IAAI,IAAI,CAAC,QAAQ,CAAC;AACtC,QAAO,IAAI,IAAiB,CAAC,QAAQ,CAAC;;AAGxC,SAAS,QAAQ,OAAqB;CACpC,MAAM,EACJ,SACA,OACA,UACA,MACA,aACA,cACA,UAAU,SACV,YAAY,OACZ,kBACA,cACA,QAAQ,OACR,mBACA,WACE;CAEJ,MAAM,eAAe,MAAM,OACzB,qBAAqB,CACtB;CAED,MAAM,CAAC,WAAW,gBAAgB,MAAM,SAAS,MAAM;CACvD,MAAM,WAAW,iBAAiB,QAAQ;CAE1C,MAAM,eAAe,SAAS;CAC9B,MAAM,iBAAiB,SAAS,IAAI,QAAQ;CAC5C,MAAM,SAAS,eACX,OACA,iBACA,YACA,SAAS,SAAS,IAClB,QACA;CAEJ,MAAM,oBAAoB,QAAiB;AACzC,MAAI,CAAC,gBAAgB,eACnB,cAAa,IAAI;AAEnB,iBAAe,IAAI;;CAGrB,MAAM,OAAO,aAAa,cAAc;CACxC,MAAM,QAAQ,SAAS,cAAc;CAErC,MAAM,eAAe,MAAM,eAAe,SAAS,GACjD,WAEA,oBAAC,QAAD,EAAO,UAAgB,CAAA;AAGzB,KAAI,SAAS,SAAS,KAAK,CAAC,aAC1B,QAAO,oBAAA,UAAA,EAAG,UAAY,CAAA;AAGxB,QACE,qBAAC,iBAAiB,MAAlB;EACE,MAAM;EACO;EACb,cAAc;YAHhB,CAKE,oBAAC,iBAAiB,SAAlB;GAA0B,SAAA;aACvB,iBACC,oBAAC,QAAD;IACE,oBAAoB,iBAAiB,KAAK;IAC1C,oBAAoB,iBAAiB,MAAM;cAE1C;IACI,CAAA,GAEP;GAEuB,CAAA,EAC3B,oBAAC,iBAAiB,QAAlB;GAAyB,WAAW,aAAa;aAC/C,qBAAC,iBAAiB,SAAlB;IACQ;IACC;IACP,YAAY;IAEZ,WAAW,GACT,0LACA,4CACA,iBACD;IACD,OAAO;KACL,WAAW;KACX,QAAQ,UAAU;KAClB,GAAG;KACJ;IACD,cACE,uBAAuB,iBAAiB,KAAK,GAAG;IAElD,cACE,uBAAuB,iBAAiB,MAAM,GAAG;cAnBrD;KAsBG,SACC,oBAAC,OAAD;MAAK,WAAU;gBACZ;MACG,CAAA;KAEP,WAEC,oBAAC,OAAD;MAAK,WAAU;gBACZ;MACG,CAAA;KAEP,SACC,oBAAC,iBAAiB,OAAlB,EACE,OAAO,EAAE,MAAM,iDAAiD,EAChE,CAAA;KAEqB;;GACH,CAAA,CACJ"}
@@ -1,7 +1,4 @@
1
1
  import { default as React } from 'react';
2
- /**
3
- * 条状进度条组件
4
- */
5
2
  declare const _default: React.ForwardRefExoticComponent<IProps & React.RefAttributes<unknown>>;
6
3
  export default _default;
7
4
  export interface IProps {
@@ -9,9 +9,6 @@ var ELoadingState = /* @__PURE__ */ function(ELoadingState) {
9
9
  ELoadingState["LOADED"] = "LOADED";
10
10
  return ELoadingState;
11
11
  }(ELoadingState || {});
12
- /**
13
- * 条状进度条组件
14
- */
15
12
  var Progress_default = forwardRef(function Progress(props, ref) {
16
13
  const { loading, className } = props;
17
14
  const [loadingState, setLoadingState] = useState(ELoadingState.IDLE);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/Progress/index.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useState,\n} from 'react';\nimport { cn } from '../lib/utils';\nimport './progress.css';\n\nenum ELoadingState {\n IDLE = 'IDLE',\n LOADING = 'LOADING',\n LOADED = 'LOADED',\n}\n\n/**\n * 条状进度条组件\n */\nexport default forwardRef(function Progress(props: IProps, ref) {\n const { loading, className } = props;\n const [loadingState, setLoadingState] = useState(ELoadingState.IDLE);\n const [key, setKey] = useState(0);\n\n useImperativeHandle(ref, () => ({\n restart() {\n setKey((prev) => prev + 1);\n },\n }));\n\n useEffect(() => {\n if (loadingState !== ELoadingState.IDLE) {\n if (loadingState === ELoadingState.LOADING && !loading) {\n setLoadingState(ELoadingState.LOADED);\n }\n return;\n }\n const DELAY_TIME = 200;\n const timer = setTimeout(() => {\n if (loading) {\n setLoadingState(ELoadingState.LOADING);\n }\n }, DELAY_TIME);\n\n return () => {\n if (timer) {\n clearTimeout(timer);\n }\n };\n }, [loading, loadingState]);\n\n const onAnimationEnd = useCallback(() => {\n if (loadingState === ELoadingState.LOADED) {\n setLoadingState(ELoadingState.IDLE);\n }\n }, [loadingState]);\n\n return (\n <div\n key={key}\n className={cn(\n 'ald-progress-bar tw-relative tw-h-[2px] tw-w-full tw-overflow-hidden',\n loadingState !== ELoadingState.IDLE &&\n 'ald-progress-bar-show-bg tw-bg-[var(--background-informative-subtle)]',\n className,\n )}\n >\n <div\n className={cn(\n 'ald-progress-bar-inner tw-absolute tw-left-0 tw-top-0 tw-h-full tw-w-0 tw-bg-[var(--action-primary-normal)]',\n loadingState === ELoadingState.LOADING &&\n 'ald-progress-bar-show-loading tw-animate-[progress-loading_2s_ease-in-out_forwards]',\n loadingState === ELoadingState.LOADED &&\n 'ald-progress-bar-hide-loading tw-animate-[progress-loaded_0.5s_ease-out_forwards]',\n )}\n onAnimationEnd={onAnimationEnd}\n />\n </div>\n );\n});\n\nexport interface IProps {\n loading: boolean;\n className?: string;\n}\n\nexport interface IProgressRef {\n restart: () => void;\n}\n"],"mappings":";;;;;AAUA,IAAK,gBAAL,yBAAA,eAAA;AACE,eAAA,UAAA;AACA,eAAA,aAAA;AACA,eAAA,YAAA;;EAHG,iBAAA,EAAA,CAIJ;;;;AAKD,IAAA,mBAAe,WAAW,SAAS,SAAS,OAAe,KAAK;CAC9D,MAAM,EAAE,SAAS,cAAc;CAC/B,MAAM,CAAC,cAAc,mBAAmB,SAAS,cAAc,KAAK;CACpE,MAAM,CAAC,KAAK,UAAU,SAAS,EAAE;AAEjC,qBAAoB,YAAY,EAC9B,UAAU;AACR,UAAQ,SAAS,OAAO,EAAE;IAE7B,EAAE;AAEH,iBAAgB;AACd,MAAI,iBAAiB,cAAc,MAAM;AACvC,OAAI,iBAAiB,cAAc,WAAW,CAAC,QAC7C,iBAAgB,cAAc,OAAO;AAEvC;;EAGF,MAAM,QAAQ,iBAAiB;AAC7B,OAAI,QACF,iBAAgB,cAAc,QAAQ;KAHvB,IAKL;AAEd,eAAa;AACX,OAAI,MACF,cAAa,MAAM;;IAGtB,CAAC,SAAS,aAAa,CAAC;CAE3B,MAAM,iBAAiB,kBAAkB;AACvC,MAAI,iBAAiB,cAAc,OACjC,iBAAgB,cAAc,KAAK;IAEpC,CAAC,aAAa,CAAC;AAElB,QACE,oBAAC,OAAD;EAEE,WAAW,GACT,wEACA,iBAAiB,cAAc,QAC7B,yEACF,UACD;YAED,oBAAC,OAAD;GACE,WAAW,GACT,+GACA,iBAAiB,cAAc,WAC7B,uFACF,iBAAiB,cAAc,UAC7B,oFACH;GACe;GAChB,CAAA;EACE,EAlBC,IAkBD;EAER"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/Progress/index.tsx"],"sourcesContent":["import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useState,\n} from 'react';\nimport { cn } from '../lib/utils';\nimport './progress.css';\n\nenum ELoadingState {\n IDLE = 'IDLE',\n LOADING = 'LOADING',\n LOADED = 'LOADED',\n}\n\nexport default forwardRef(function Progress(props: IProps, ref) {\n const { loading, className } = props;\n const [loadingState, setLoadingState] = useState(ELoadingState.IDLE);\n const [key, setKey] = useState(0);\n\n useImperativeHandle(ref, () => ({\n restart() {\n setKey((prev) => prev + 1);\n },\n }));\n\n useEffect(() => {\n if (loadingState !== ELoadingState.IDLE) {\n if (loadingState === ELoadingState.LOADING && !loading) {\n setLoadingState(ELoadingState.LOADED);\n }\n return;\n }\n const DELAY_TIME = 200;\n const timer = setTimeout(() => {\n if (loading) {\n setLoadingState(ELoadingState.LOADING);\n }\n }, DELAY_TIME);\n\n return () => {\n if (timer) {\n clearTimeout(timer);\n }\n };\n }, [loading, loadingState]);\n\n const onAnimationEnd = useCallback(() => {\n if (loadingState === ELoadingState.LOADED) {\n setLoadingState(ELoadingState.IDLE);\n }\n }, [loadingState]);\n\n return (\n <div\n key={key}\n className={cn(\n 'ald-progress-bar tw-relative tw-h-[2px] tw-w-full tw-overflow-hidden',\n loadingState !== ELoadingState.IDLE &&\n 'ald-progress-bar-show-bg tw-bg-[var(--background-informative-subtle)]',\n className,\n )}\n >\n <div\n className={cn(\n 'ald-progress-bar-inner tw-absolute tw-left-0 tw-top-0 tw-h-full tw-w-0 tw-bg-[var(--action-primary-normal)]',\n loadingState === ELoadingState.LOADING &&\n 'ald-progress-bar-show-loading tw-animate-[progress-loading_2s_ease-in-out_forwards]',\n loadingState === ELoadingState.LOADED &&\n 'ald-progress-bar-hide-loading tw-animate-[progress-loaded_0.5s_ease-out_forwards]',\n )}\n onAnimationEnd={onAnimationEnd}\n />\n </div>\n );\n});\n\nexport interface IProps {\n loading: boolean;\n className?: string;\n}\n\nexport interface IProgressRef {\n restart: () => void;\n}\n"],"mappings":";;;;;AAUA,IAAK,gBAAL,yBAAA,eAAA;AACE,eAAA,UAAA;AACA,eAAA,aAAA;AACA,eAAA,YAAA;;EAHG,iBAAA,EAAA,CAIJ;AAED,IAAA,mBAAe,WAAW,SAAS,SAAS,OAAe,KAAK;CAC9D,MAAM,EAAE,SAAS,cAAc;CAC/B,MAAM,CAAC,cAAc,mBAAmB,SAAS,cAAc,KAAK;CACpE,MAAM,CAAC,KAAK,UAAU,SAAS,EAAE;AAEjC,qBAAoB,YAAY,EAC9B,UAAU;AACR,UAAQ,SAAS,OAAO,EAAE;IAE7B,EAAE;AAEH,iBAAgB;AACd,MAAI,iBAAiB,cAAc,MAAM;AACvC,OAAI,iBAAiB,cAAc,WAAW,CAAC,QAC7C,iBAAgB,cAAc,OAAO;AAEvC;;EAGF,MAAM,QAAQ,iBAAiB;AAC7B,OAAI,QACF,iBAAgB,cAAc,QAAQ;KAHvB,IAKL;AAEd,eAAa;AACX,OAAI,MACF,cAAa,MAAM;;IAGtB,CAAC,SAAS,aAAa,CAAC;CAE3B,MAAM,iBAAiB,kBAAkB;AACvC,MAAI,iBAAiB,cAAc,OACjC,iBAAgB,cAAc,KAAK;IAEpC,CAAC,aAAa,CAAC;AAElB,QACE,oBAAC,OAAD;EAEE,WAAW,GACT,wEACA,iBAAiB,cAAc,QAC7B,yEACF,UACD;YAED,oBAAC,OAAD;GACE,WAAW,GACT,+GACA,iBAAiB,cAAc,WAC7B,uFACF,iBAAiB,cAAc,UAC7B,oFACH;GACe;GAChB,CAAA;EACE,EAlBC,IAkBD;EAER"}
@@ -26,7 +26,7 @@ function isShowSelectedSection(mode) {
26
26
  return typeof mode === "object" && mode.showSelectedSection && mode.responsive;
27
27
  }
28
28
  var BaseSelect = React$1.forwardRef((props, ref) => {
29
- const { id, className, displayValues, onDisplayValuesChange, displayMenu, notFoundContent, onClear, width, mode, status: customStatus, onOptionSelect, onClick, size: customSize, borderLess = false, disabled, placeholder, open, defaultOpen, onOpenChange, showSearch, innerSearchValue, setInnerSearchValue, allowClear, showArrow = true, prefix, suffixIcon, dropdownRender, overlayStyle, dropdownStyle, popupMatchSelectWidth = true, placement, popupClassName, style, ...restProps } = props;
29
+ const { id, className, displayValues, onDisplayValuesChange, displayMenu, notFoundContent, onClear, width, mode, status: customStatus, onOptionSelect, onClick, size: customSize, borderLess = false, disabled, placeholder, open, defaultOpen, onOpenChange, showSearch, innerSearchValue, setInnerSearchValue, allowClear, showArrow = true, prefix, suffixIcon, dropdownRender, overlayStyle, dropdownStyle, popupMatchSelectWidth = true, placement, popupClassName, allowOverlap, style, ...restProps } = props;
30
30
  const setClassNames = prefixCls("select");
31
31
  const selectRef = useRef(null);
32
32
  const widthStyle = getWidthStyle(width);
@@ -151,6 +151,7 @@ var BaseSelect = React$1.forwardRef((props, ref) => {
151
151
  dropdownRender,
152
152
  overlayStyle: overlayStyle || dropdownStyle,
153
153
  placement,
154
+ allowOverlap,
154
155
  onOpenChange: (open) => {
155
156
  if (isResponsiveMode) if (!mergedOpen && !showResponsiveSelectedSection && displayValues.length > 0 && isShowSelectedSection(mode)) setShowResponsiveSelectedSection(true);
156
157
  else onToggleOpen(open);
@@ -1 +1 @@
1
- {"version":3,"file":"BaseSelect.js","names":[],"sources":["../../src/Select/BaseSelect.tsx"],"sourcesContent":["import './ald-select.css';\nimport * as React from 'react';\nimport useMergedState from 'rc-util/es/hooks/useMergedState';\nimport { cn } from '../lib/utils';\nimport prefixCls from '../_utils/prefixCls';\n\n/** Align config type (locally defined to avoid rc-trigger dependency) */\nexport interface AlignType {\n points?: string[];\n offset?: (number | string)[];\n targetOffset?: (number | string)[];\n overflow?: { adjustX?: boolean; adjustY?: boolean };\n _experimental?: Record<string, any>;\n}\nimport SelectTrigger, { RefTriggerProps } from './SelectTrigger';\nimport Selector from './Selector';\nimport _ from 'lodash';\nimport { useContext, useRef, useState } from 'react';\nimport { FormItemInputContext } from '../Form/FormItemContext';\nimport getWidthStyle from './utils/getWidthStyle';\nimport Suffix from './components/Suffix';\nimport { PlacementType } from '../Dropdown';\nimport {\n BaseSelectRef,\n DisplayValueType,\n ISelectProps,\n LabelInValueType,\n SelectMenuProps,\n} from './interface';\nimport SizeContext from '../ConfigProvider/sizeContext';\nimport { ConfigContext } from '../ConfigProvider';\nimport { useCompactItemContext } from '../Space/CompactContext';\nimport { MenuInfo } from '../Menu';\n\nexport type RenderNode = React.ReactNode | ((props: any) => React.ReactNode);\n\nexport type RenderDOMFunc = (props: any) => HTMLElement;\n\nexport type Mode =\n | 'multiple'\n | {\n type: 'multiple';\n responsive?: boolean;\n maxRows?: number;\n showSelectedSection?: boolean;\n };\n\nexport type RawValueType = string | number;\n\nexport type CustomTagProps = {\n label: React.ReactNode;\n value: any;\n disabled: boolean;\n onClose: (event?: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n closable: boolean;\n};\nexport interface BaseSelectPrivateProps {\n // >>> MISC\n omitDomProps?: string[];\n\n // >>> Value\n displayValues: LabelInValueType[];\n onDisplayValuesChange: (\n values: LabelInValueType[],\n info: {\n type: 'add' | 'remove' | 'clear';\n values: LabelInValueType[];\n },\n ) => void;\n\n // >>> Active\n /** Current dropdown list active item string value */\n activeValue?: string;\n /** Link search input with target element */\n activeDescendantId?: string;\n onActiveValueChange?: (value: string | null) => void;\n}\n\nexport type BaseSelectPropsWithoutPrivate = Omit<\n BaseSelectProps,\n keyof BaseSelectPrivateProps\n>;\n\nexport interface BaseSelectProps\n extends BaseSelectPrivateProps,\n ISelectProps,\n React.AriaAttributes {\n className?: string;\n style?: React.CSSProperties;\n notFoundContent?: React.ReactNode;\n onClear?: () => void;\n innerSearchValue?: string;\n setInnerSearchValue?: (value: string) => void;\n displayMenu?: SelectMenuProps;\n // >>> Open\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n onOptionSelect?: (val: RawValueType) => void;\n\n // >>> Icons\n allowClear?: boolean;\n showArrow?: boolean;\n suffixIcon?: React.ReactNode;\n\n // >>> Dropdown\n dropdownAlign?: AlignType;\n placement?: PlacementType;\n getPopupContainer?: () => HTMLElement;\n\n // >>> Focus\n onBlur?: React.FocusEventHandler<HTMLElement>;\n onFocus?: React.FocusEventHandler<HTMLElement>;\n\n // >>> Rest Events\n onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;\n onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;\n onMouseDown?: React.MouseEventHandler<HTMLDivElement>;\n onPopupScroll?: React.UIEventHandler<HTMLDivElement>;\n onInputKeyDown?: React.KeyboardEventHandler<\n HTMLInputElement | HTMLTextAreaElement\n >;\n onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLDivElement>;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n}\n\nexport function isMultiple(mode?: Mode) {\n return !!mode;\n}\nexport function isResponsive(mode?: Mode) {\n return mode === 'multiple' || (typeof mode === 'object' && mode?.responsive);\n}\nexport function isShowSelectedSection(mode?: Mode) {\n if (!mode || mode === 'multiple') {\n return false;\n }\n\n return (\n typeof mode === 'object' && mode.showSelectedSection && mode.responsive\n );\n}\nconst BaseSelect = React.forwardRef(\n (props: BaseSelectProps, ref: React.Ref<BaseSelectRef>) => {\n const {\n id,\n className,\n // Value\n displayValues,\n onDisplayValuesChange,\n displayMenu,\n notFoundContent,\n onClear,\n width,\n mode,\n status: customStatus,\n onOptionSelect,\n onClick,\n size: customSize,\n borderLess = false,\n // Status\n disabled,\n placeholder,\n\n // Open\n open,\n defaultOpen,\n onOpenChange,\n showSearch,\n innerSearchValue,\n setInnerSearchValue,\n // Icons\n allowClear,\n showArrow = true,\n prefix,\n suffixIcon,\n dropdownRender,\n overlayStyle,\n dropdownStyle,\n popupMatchSelectWidth = true,\n placement,\n popupClassName,\n style,\n ...restProps\n // Rest Props\n } = props;\n const setClassNames = prefixCls('select');\n const selectRef = useRef<HTMLDivElement>(null);\n const widthStyle = getWidthStyle(width);\n const dropdownRef = useRef<RefTriggerProps>(null);\n const isResponsiveMode = isResponsive(mode);\n const isMultipleMode = isMultiple(mode);\n /** Used for component focused management */\n const contentSize = useContext(SizeContext);\n const { direction } = React.useContext(ConfigContext);\n // ===================== Compact Item =====================\n const { compactSize, compactItemClassnames } = useCompactItemContext(\n 'ald-select',\n direction,\n );\n const size = compactSize || customSize || contentSize || 'middle';\n const {\n status: contextStatus,\n // hasFeedback,\n // isFormItemInput,\n // feedbackIcon,\n } = useContext(FormItemInputContext);\n\n const mergedStatus = customStatus || contextStatus || undefined;\n\n // =========================== Imperative ===========================\n React.useImperativeHandle(ref, () => ({\n focus: () => setFocus(true),\n blur: () => setFocus(false),\n open: () => onToggleOpen(true),\n close: () => {\n console.log('ref close');\n onToggleOpen(false);\n },\n }));\n const [focus, setFocus] = useState(false);\n const [isHover, setIsHover] = useState(false);\n // ============================== Open ==============================\n const [innerOpen, setInnerOpen] = useMergedState<boolean>(false, {\n defaultValue: defaultOpen,\n value: open,\n });\n const mergedOpen = innerOpen;\n const onToggleOpen = React.useCallback(\n (newOpen?: boolean) => {\n const nextOpen = newOpen !== undefined ? newOpen : !mergedOpen;\n if (!nextOpen) {\n setShowResponsiveSelectedSection(false);\n setFocus(false);\n }\n if (mergedOpen !== nextOpen && !disabled) {\n setInnerOpen(nextOpen);\n onOpenChange?.(nextOpen);\n }\n },\n [mergedOpen, disabled, setInnerOpen, onOpenChange],\n );\n const [showResponsiveSelectedSection, setShowResponsiveSelectedSection] =\n useState(false);\n\n // ============================ Selector ============================\n const onSelectorRemove = (val: DisplayValueType) => {\n const newValues = displayValues.filter((i) => i !== val);\n\n onDisplayValuesChange(newValues, {\n type: 'remove',\n values: [\n {\n label: val.label,\n value: val.value as RawValueType,\n },\n ],\n });\n };\n\n const mergedClassName = cn(\n setClassNames('beta-ald-select', size, {\n active: mergedOpen || focus,\n borderless: borderLess,\n disabled: disabled,\n [`${mergedStatus}`]: !!mergedStatus,\n 'multiple-responsive': isResponsiveMode,\n 'multiple-default': isMultipleMode && !isResponsiveMode,\n }),\n className,\n compactItemClassnames,\n );\n const showMenu = React.useMemo(() => {\n if (!displayMenu) {\n return undefined;\n }\n\n return {\n ...displayMenu,\n onClick: (info: MenuInfo) => {\n displayMenu?.onClick?.(info);\n if (displayMenu && !isMultipleMode) {\n console.log('menu onClick', info);\n onToggleOpen(false);\n setFocus(false);\n }\n setIsHover(false);\n onOptionSelect?.(info.key);\n },\n };\n }, [displayMenu, isMultipleMode, onToggleOpen, onOptionSelect]);\n const onSelectClick = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) {\n return;\n }\n onClick?.(e);\n },\n [disabled, onClick],\n );\n React.useEffect(() => {\n const element = selectRef.current;\n if (element) {\n const handleMouseOver = () => setIsHover(true);\n const handleMouseOut = () => setIsHover(false);\n\n element.addEventListener('mouseover', handleMouseOver);\n element.addEventListener('mouseout', handleMouseOut);\n\n return () => {\n element.removeEventListener('mouseover', handleMouseOver);\n element.removeEventListener('mouseout', handleMouseOut);\n };\n }\n }, []);\n return (\n <div\n className={mergedClassName}\n style={{\n ...widthStyle,\n ...style,\n }}\n ref={selectRef}\n id={id}\n onClick={onSelectClick}\n >\n <SelectTrigger\n {...restProps}\n open={!!mergedOpen}\n notFoundContent={notFoundContent}\n menu={showMenu}\n ref={dropdownRef}\n showSearch={showSearch}\n searchValue={innerSearchValue}\n setInnerSearchValue={setInnerSearchValue}\n popupMatchSelectWidth={popupMatchSelectWidth}\n overlayClassName={popupClassName}\n // @ts-ignore\n dropdownRender={dropdownRender}\n overlayStyle={overlayStyle || dropdownStyle}\n placement={placement}\n onOpenChange={(open) => {\n if (isResponsiveMode) {\n if (\n !mergedOpen &&\n !showResponsiveSelectedSection &&\n displayValues.length > 0 &&\n isShowSelectedSection(mode)\n ) {\n setShowResponsiveSelectedSection(true);\n } else {\n onToggleOpen(open);\n }\n } else {\n onToggleOpen(open);\n }\n }}\n >\n {/* antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器 */}\n <div className={cn(setClassNames('trigger'), 'ant-select-selector')}>\n {prefix && <div className={setClassNames('prefix')}>{prefix}</div>}\n {_.isEmpty(displayValues) && (\n <div\n className={cn(\n setClassNames('placeholder'),\n 'ant-select-selection-placeholder',\n )}\n >\n {placeholder}\n </div>\n )}\n {!_.isEmpty(displayValues) && (\n <Selector\n {...restProps}\n suffixIcon={suffixIcon}\n size={size}\n disabled={disabled}\n mode={mode}\n dropdownRef={dropdownRef}\n displayValues={displayValues}\n onToggleOpen={onToggleOpen}\n onRemove={onSelectorRemove}\n showResponsiveSelectedSection={showResponsiveSelectedSection}\n ></Selector>\n )}\n </div>\n </SelectTrigger>\n <Suffix\n showArrow={showArrow}\n allowClear={allowClear}\n disabled={disabled}\n isHover={isHover}\n onClear={() => {\n onToggleOpen(false);\n\n onDisplayValuesChange([], {\n type: 'clear',\n values: displayValues,\n });\n onClear?.();\n }}\n isActive={innerOpen}\n icon={suffixIcon}\n displayValues={displayValues}\n ></Suffix>\n </div>\n );\n },\n);\n\nexport default BaseSelect;\n"],"mappings":"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"}
1
+ {"version":3,"file":"BaseSelect.js","names":[],"sources":["../../src/Select/BaseSelect.tsx"],"sourcesContent":["import './ald-select.css';\nimport * as React from 'react';\nimport useMergedState from 'rc-util/es/hooks/useMergedState';\nimport { cn } from '../lib/utils';\nimport prefixCls from '../_utils/prefixCls';\n\n/** Align config type (locally defined to avoid rc-trigger dependency) */\nexport interface AlignType {\n points?: string[];\n offset?: (number | string)[];\n targetOffset?: (number | string)[];\n overflow?: { adjustX?: boolean; adjustY?: boolean };\n _experimental?: Record<string, any>;\n}\nimport SelectTrigger, { RefTriggerProps } from './SelectTrigger';\nimport Selector from './Selector';\nimport _ from 'lodash';\nimport { useContext, useRef, useState } from 'react';\nimport { FormItemInputContext } from '../Form/FormItemContext';\nimport getWidthStyle from './utils/getWidthStyle';\nimport Suffix from './components/Suffix';\nimport { PlacementType } from '../Dropdown';\nimport {\n BaseSelectRef,\n DisplayValueType,\n ISelectProps,\n LabelInValueType,\n SelectMenuProps,\n} from './interface';\nimport SizeContext from '../ConfigProvider/sizeContext';\nimport { ConfigContext } from '../ConfigProvider';\nimport { useCompactItemContext } from '../Space/CompactContext';\nimport { MenuInfo } from '../Menu';\n\nexport type RenderNode = React.ReactNode | ((props: any) => React.ReactNode);\n\nexport type RenderDOMFunc = (props: any) => HTMLElement;\n\nexport type Mode =\n | 'multiple'\n | {\n type: 'multiple';\n responsive?: boolean;\n maxRows?: number;\n showSelectedSection?: boolean;\n };\n\nexport type RawValueType = string | number;\n\nexport type CustomTagProps = {\n label: React.ReactNode;\n value: any;\n disabled: boolean;\n onClose: (event?: React.MouseEvent<HTMLElement, MouseEvent>) => void;\n closable: boolean;\n};\nexport interface BaseSelectPrivateProps {\n // >>> MISC\n omitDomProps?: string[];\n\n // >>> Value\n displayValues: LabelInValueType[];\n onDisplayValuesChange: (\n values: LabelInValueType[],\n info: {\n type: 'add' | 'remove' | 'clear';\n values: LabelInValueType[];\n },\n ) => void;\n\n // >>> Active\n /** Current dropdown list active item string value */\n activeValue?: string;\n /** Link search input with target element */\n activeDescendantId?: string;\n onActiveValueChange?: (value: string | null) => void;\n}\n\nexport type BaseSelectPropsWithoutPrivate = Omit<\n BaseSelectProps,\n keyof BaseSelectPrivateProps\n>;\n\nexport interface BaseSelectProps\n extends BaseSelectPrivateProps,\n ISelectProps,\n React.AriaAttributes {\n className?: string;\n style?: React.CSSProperties;\n notFoundContent?: React.ReactNode;\n onClear?: () => void;\n innerSearchValue?: string;\n setInnerSearchValue?: (value: string) => void;\n displayMenu?: SelectMenuProps;\n // >>> Open\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n onOptionSelect?: (val: RawValueType) => void;\n\n // >>> Icons\n allowClear?: boolean;\n showArrow?: boolean;\n suffixIcon?: React.ReactNode;\n\n // >>> Dropdown\n dropdownAlign?: AlignType;\n placement?: PlacementType;\n getPopupContainer?: () => HTMLElement;\n\n // >>> Focus\n onBlur?: React.FocusEventHandler<HTMLElement>;\n onFocus?: React.FocusEventHandler<HTMLElement>;\n\n // >>> Rest Events\n onKeyUp?: React.KeyboardEventHandler<HTMLDivElement>;\n onKeyDown?: React.KeyboardEventHandler<HTMLDivElement>;\n onMouseDown?: React.MouseEventHandler<HTMLDivElement>;\n onPopupScroll?: React.UIEventHandler<HTMLDivElement>;\n onInputKeyDown?: React.KeyboardEventHandler<\n HTMLInputElement | HTMLTextAreaElement\n >;\n onMouseEnter?: React.MouseEventHandler<HTMLDivElement>;\n onMouseLeave?: React.MouseEventHandler<HTMLDivElement>;\n onClick?: React.MouseEventHandler<HTMLDivElement>;\n}\n\nexport function isMultiple(mode?: Mode) {\n return !!mode;\n}\nexport function isResponsive(mode?: Mode) {\n return mode === 'multiple' || (typeof mode === 'object' && mode?.responsive);\n}\nexport function isShowSelectedSection(mode?: Mode) {\n if (!mode || mode === 'multiple') {\n return false;\n }\n\n return (\n typeof mode === 'object' && mode.showSelectedSection && mode.responsive\n );\n}\nconst BaseSelect = React.forwardRef(\n (props: BaseSelectProps, ref: React.Ref<BaseSelectRef>) => {\n const {\n id,\n className,\n // Value\n displayValues,\n onDisplayValuesChange,\n displayMenu,\n notFoundContent,\n onClear,\n width,\n mode,\n status: customStatus,\n onOptionSelect,\n onClick,\n size: customSize,\n borderLess = false,\n // Status\n disabled,\n placeholder,\n\n // Open\n open,\n defaultOpen,\n onOpenChange,\n showSearch,\n innerSearchValue,\n setInnerSearchValue,\n // Icons\n allowClear,\n showArrow = true,\n prefix,\n suffixIcon,\n dropdownRender,\n overlayStyle,\n dropdownStyle,\n popupMatchSelectWidth = true,\n placement,\n popupClassName,\n allowOverlap,\n style,\n ...restProps\n // Rest Props\n } = props;\n const setClassNames = prefixCls('select');\n const selectRef = useRef<HTMLDivElement>(null);\n const widthStyle = getWidthStyle(width);\n const dropdownRef = useRef<RefTriggerProps>(null);\n const isResponsiveMode = isResponsive(mode);\n const isMultipleMode = isMultiple(mode);\n /** Used for component focused management */\n const contentSize = useContext(SizeContext);\n const { direction } = React.useContext(ConfigContext);\n // ===================== Compact Item =====================\n const { compactSize, compactItemClassnames } = useCompactItemContext(\n 'ald-select',\n direction,\n );\n const size = compactSize || customSize || contentSize || 'middle';\n const {\n status: contextStatus,\n // hasFeedback,\n // isFormItemInput,\n // feedbackIcon,\n } = useContext(FormItemInputContext);\n\n const mergedStatus = customStatus || contextStatus || undefined;\n\n // =========================== Imperative ===========================\n React.useImperativeHandle(ref, () => ({\n focus: () => setFocus(true),\n blur: () => setFocus(false),\n open: () => onToggleOpen(true),\n close: () => {\n console.log('ref close');\n onToggleOpen(false);\n },\n }));\n const [focus, setFocus] = useState(false);\n const [isHover, setIsHover] = useState(false);\n // ============================== Open ==============================\n const [innerOpen, setInnerOpen] = useMergedState<boolean>(false, {\n defaultValue: defaultOpen,\n value: open,\n });\n const mergedOpen = innerOpen;\n const onToggleOpen = React.useCallback(\n (newOpen?: boolean) => {\n const nextOpen = newOpen !== undefined ? newOpen : !mergedOpen;\n if (!nextOpen) {\n setShowResponsiveSelectedSection(false);\n setFocus(false);\n }\n if (mergedOpen !== nextOpen && !disabled) {\n setInnerOpen(nextOpen);\n onOpenChange?.(nextOpen);\n }\n },\n [mergedOpen, disabled, setInnerOpen, onOpenChange],\n );\n const [showResponsiveSelectedSection, setShowResponsiveSelectedSection] =\n useState(false);\n\n // ============================ Selector ============================\n const onSelectorRemove = (val: DisplayValueType) => {\n const newValues = displayValues.filter((i) => i !== val);\n\n onDisplayValuesChange(newValues, {\n type: 'remove',\n values: [\n {\n label: val.label,\n value: val.value as RawValueType,\n },\n ],\n });\n };\n\n const mergedClassName = cn(\n setClassNames('beta-ald-select', size, {\n active: mergedOpen || focus,\n borderless: borderLess,\n disabled: disabled,\n [`${mergedStatus}`]: !!mergedStatus,\n 'multiple-responsive': isResponsiveMode,\n 'multiple-default': isMultipleMode && !isResponsiveMode,\n }),\n className,\n compactItemClassnames,\n );\n const showMenu = React.useMemo(() => {\n if (!displayMenu) {\n return undefined;\n }\n\n return {\n ...displayMenu,\n onClick: (info: MenuInfo) => {\n displayMenu?.onClick?.(info);\n if (displayMenu && !isMultipleMode) {\n console.log('menu onClick', info);\n onToggleOpen(false);\n setFocus(false);\n }\n setIsHover(false);\n onOptionSelect?.(info.key);\n },\n };\n }, [displayMenu, isMultipleMode, onToggleOpen, onOptionSelect]);\n const onSelectClick = React.useCallback(\n (e: React.MouseEvent<HTMLDivElement>) => {\n if (disabled) {\n return;\n }\n onClick?.(e);\n },\n [disabled, onClick],\n );\n React.useEffect(() => {\n const element = selectRef.current;\n if (element) {\n const handleMouseOver = () => setIsHover(true);\n const handleMouseOut = () => setIsHover(false);\n\n element.addEventListener('mouseover', handleMouseOver);\n element.addEventListener('mouseout', handleMouseOut);\n\n return () => {\n element.removeEventListener('mouseover', handleMouseOver);\n element.removeEventListener('mouseout', handleMouseOut);\n };\n }\n }, []);\n return (\n <div\n className={mergedClassName}\n style={{\n ...widthStyle,\n ...style,\n }}\n ref={selectRef}\n id={id}\n onClick={onSelectClick}\n >\n <SelectTrigger\n {...restProps}\n open={!!mergedOpen}\n notFoundContent={notFoundContent}\n menu={showMenu}\n ref={dropdownRef}\n showSearch={showSearch}\n searchValue={innerSearchValue}\n setInnerSearchValue={setInnerSearchValue}\n popupMatchSelectWidth={popupMatchSelectWidth}\n overlayClassName={popupClassName}\n // @ts-ignore\n dropdownRender={dropdownRender}\n overlayStyle={overlayStyle || dropdownStyle}\n placement={placement}\n allowOverlap={allowOverlap}\n onOpenChange={(open) => {\n if (isResponsiveMode) {\n if (\n !mergedOpen &&\n !showResponsiveSelectedSection &&\n displayValues.length > 0 &&\n isShowSelectedSection(mode)\n ) {\n setShowResponsiveSelectedSection(true);\n } else {\n onToggleOpen(open);\n }\n } else {\n onToggleOpen(open);\n }\n }}\n >\n {/* antd 兼容:保留 ant-* class,消费方 CSS 可能依赖该选择器 */}\n <div className={cn(setClassNames('trigger'), 'ant-select-selector')}>\n {prefix && <div className={setClassNames('prefix')}>{prefix}</div>}\n {_.isEmpty(displayValues) && (\n <div\n className={cn(\n setClassNames('placeholder'),\n 'ant-select-selection-placeholder',\n )}\n >\n {placeholder}\n </div>\n )}\n {!_.isEmpty(displayValues) && (\n <Selector\n {...restProps}\n suffixIcon={suffixIcon}\n size={size}\n disabled={disabled}\n mode={mode}\n dropdownRef={dropdownRef}\n displayValues={displayValues}\n onToggleOpen={onToggleOpen}\n onRemove={onSelectorRemove}\n showResponsiveSelectedSection={showResponsiveSelectedSection}\n ></Selector>\n )}\n </div>\n </SelectTrigger>\n <Suffix\n showArrow={showArrow}\n allowClear={allowClear}\n disabled={disabled}\n isHover={isHover}\n onClear={() => {\n onToggleOpen(false);\n\n onDisplayValuesChange([], {\n type: 'clear',\n values: displayValues,\n });\n onClear?.();\n }}\n isActive={innerOpen}\n icon={suffixIcon}\n displayValues={displayValues}\n ></Suffix>\n </div>\n );\n },\n);\n\nexport default BaseSelect;\n"],"mappings":"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"}
@@ -21,6 +21,10 @@ export interface ISelectProps<ValueType = any, OptionType extends BaseOptionType
21
21
  dropdownClassName?: string;
22
22
  popupClassName?: string;
23
23
  placement?: PlacementType;
24
+ /**
25
+ * 空间不足时自动计算下拉面板最大高度并启用内部滚动,继承自 Dropdown。
26
+ */
27
+ allowOverlap?: boolean;
24
28
  labelInValue?: boolean;
25
29
  options?: OptionType[];
26
30
  menu?: SelectMenuProps;
@@ -13,7 +13,7 @@ function TableFooter(props) {
13
13
  const btnItems = [{
14
14
  key: "$UN_SELECT_ALL$",
15
15
  label: t.Table.cancelSelect,
16
- onClick: (e) => rowSelectionInfo.unSelectAll(e)
16
+ onClick: () => rowSelectionInfo.unSelectAll()
17
17
  }, ...items];
18
18
  const rowSelectionNode = isShowRowSelectionInFooter && /* @__PURE__ */ jsxs("div", {
19
19
  className: prefixCls("footer-row-selection"),
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/Table/components/Footer/index.tsx"],"sourcesContent":["import React, { useCallback, useContext } from 'react';\nimport { Pagination } from '../../..';\nimport { IPaginationProps } from '../../../Pagination/types';\nimport TextLink from '../../../TextLink';\nimport { LocaleContext, getTranslator } from '../../../locale/default';\nimport { prefixCls } from '../../helper';\nimport { IRowSelectionInfo } from '../../hooks/useRowSelection';\nimport { ITableProps } from '../../types';\n\nexport default function TableFooter<TDataItem extends object>(\n props: IProps<TDataItem>,\n) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const {\n pagination,\n scroll = {},\n scrollToFirstRow,\n isShowPagination,\n rowSelectionInfo,\n } = props;\n\n // 选择行\n const {\n getCheckboxAllNode,\n selectedRowKeys,\n selectedRowKeysInCurrPage,\n items,\n isShowRowSelectionInFooter,\n onChange: changeSelectedRowKeys,\n } = rowSelectionInfo;\n\n const btnItems = [\n {\n key: '$UN_SELECT_ALL$',\n label: t.Table.cancelSelect,\n onClick: (e: React.MouseEvent) => rowSelectionInfo.unSelectAll(e),\n },\n ...items,\n ];\n\n const rowSelectionNode = isShowRowSelectionInFooter && (\n <div className={prefixCls('footer-row-selection')}>\n <div className={prefixCls('footer-row-selection-btn')}>\n {getCheckboxAllNode?.(t.Table.selectAll)}\n </div>\n <div className={prefixCls('footer-row-selection-selected')}>\n {t.Table.selected}\n <TextLink className={prefixCls('footer-row-selection-selected-num')}>\n {selectedRowKeys.length}\n </TextLink>\n {t.Table.item}\n </div>\n {btnItems.map((btnItem) => {\n return (\n <div\n key={btnItem.key}\n className={prefixCls('footer-row-selection-item')}\n onClick={(e) => {\n btnItem.onClick(e);\n }}\n >\n <TextLink>{btnItem.label}</TextLink>\n </div>\n );\n })}\n </div>\n );\n\n // 翻页器\n const onChangePage = useCallback(\n (page: number) => {\n const { onChange = () => {} } = pagination || {};\n const { scrollToFirstRowOnChange = true } = scroll;\n if (scrollToFirstRowOnChange) {\n scrollToFirstRow();\n }\n onChange(page);\n // 翻页后,清空已选行\n changeSelectedRowKeys([]);\n },\n [scrollToFirstRow, scroll, pagination, changeSelectedRowKeys],\n );\n\n const pager = isShowPagination && pagination && (\n <div className={prefixCls('pager')}>\n <Pagination hideOnSinglePage {...pagination} onChange={onChangePage} />\n </div>\n );\n\n const isShowRowSelection =\n rowSelectionInfo.isRowSelectionEnabled &&\n selectedRowKeysInCurrPage.length > 0;\n\n const isShowFooter = isShowPagination || isShowRowSelection;\n\n return isShowFooter ? (\n <div className={prefixCls('footer')}>\n {rowSelectionNode}\n {pager}\n </div>\n ) : null;\n}\n\ninterface IProps<TDataItem extends object> {\n isShowPagination: boolean;\n rowSelectionInfo: IRowSelectionInfo<TDataItem>;\n pagination?: IPaginationProps;\n scroll?: ITableProps<TDataItem>['scroll'];\n scrollToFirstRow: () => void;\n}\n"],"mappings":";;;;;;;AASA,SAAwB,YACtB,OACA;CACA,MAAM,EAAE,WAAW,WAAW,cAAc;CAC5C,MAAM,IAAI,cAAc,OAAO;CAE/B,MAAM,EACJ,YACA,SAAS,EAAE,EACX,kBACA,kBACA,qBACE;CAGJ,MAAM,EACJ,oBACA,iBACA,2BACA,OACA,4BACA,UAAU,0BACR;CAEJ,MAAM,WAAW,CACf;EACE,KAAK;EACL,OAAO,EAAE,MAAM;EACf,UAAU,MAAwB,iBAAiB,YAAY,EAAE;EAClE,EACD,GAAG,MACJ;CAED,MAAM,mBAAmB,8BACvB,qBAAC,OAAD;EAAK,WAAW,UAAU,uBAAuB;YAAjD;GACE,oBAAC,OAAD;IAAK,WAAW,UAAU,2BAA2B;cAClD,qBAAqB,EAAE,MAAM,UAAU;IACpC,CAAA;GACN,qBAAC,OAAD;IAAK,WAAW,UAAU,gCAAgC;cAA1D;KACG,EAAE,MAAM;KACT,oBAAC,UAAD;MAAU,WAAW,UAAU,oCAAoC;gBAChE,gBAAgB;MACR,CAAA;KACV,EAAE,MAAM;KACL;;GACL,SAAS,KAAK,YAAY;AACzB,WACE,oBAAC,OAAD;KAEE,WAAW,UAAU,4BAA4B;KACjD,UAAU,MAAM;AACd,cAAQ,QAAQ,EAAE;;eAGpB,oBAAC,UAAD,EAAA,UAAW,QAAQ,OAAiB,CAAA;KAChC,EAPC,QAAQ,IAOT;KAER;GACE;;CAIR,MAAM,eAAe,aAClB,SAAiB;EAChB,MAAM,EAAE,iBAAiB,OAAO,cAAc,EAAE;EAChD,MAAM,EAAE,2BAA2B,SAAS;AAC5C,MAAI,yBACF,mBAAkB;AAEpB,WAAS,KAAK;AAEd,wBAAsB,EAAE,CAAC;IAE3B;EAAC;EAAkB;EAAQ;EAAY;EAAsB,CAC9D;CAED,MAAM,QAAQ,oBAAoB,cAChC,oBAAC,OAAD;EAAK,WAAW,UAAU,QAAQ;YAChC,oBAAC,YAAD;GAAY,kBAAA;GAAiB,GAAI;GAAY,UAAU;GAAgB,CAAA;EACnE,CAAA;CAGR,MAAM,qBACJ,iBAAiB,yBACjB,0BAA0B,SAAS;AAIrC,QAFqB,oBAAoB,qBAGvC,qBAAC,OAAD;EAAK,WAAW,UAAU,SAAS;YAAnC,CACG,kBACA,MACG;MACJ"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/Table/components/Footer/index.tsx"],"sourcesContent":["import React, { useCallback, useContext } from 'react';\nimport { Pagination } from '../../..';\nimport { IPaginationProps } from '../../../Pagination/types';\nimport TextLink from '../../../TextLink';\nimport { LocaleContext, getTranslator } from '../../../locale/default';\nimport { prefixCls } from '../../helper';\nimport { IRowSelectionInfo } from '../../hooks/useRowSelection';\nimport { ITableProps } from '../../types';\n\nexport default function TableFooter<TDataItem extends object>(\n props: IProps<TDataItem>,\n) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const {\n pagination,\n scroll = {},\n scrollToFirstRow,\n isShowPagination,\n rowSelectionInfo,\n } = props;\n\n // 选择行\n const {\n getCheckboxAllNode,\n selectedRowKeys,\n selectedRowKeysInCurrPage,\n items,\n isShowRowSelectionInFooter,\n onChange: changeSelectedRowKeys,\n } = rowSelectionInfo;\n\n const btnItems = [\n {\n key: '$UN_SELECT_ALL$',\n label: t.Table.cancelSelect,\n onClick: () => rowSelectionInfo.unSelectAll(),\n },\n ...items,\n ];\n\n const rowSelectionNode = isShowRowSelectionInFooter && (\n <div className={prefixCls('footer-row-selection')}>\n <div className={prefixCls('footer-row-selection-btn')}>\n {getCheckboxAllNode?.(t.Table.selectAll)}\n </div>\n <div className={prefixCls('footer-row-selection-selected')}>\n {t.Table.selected}\n <TextLink className={prefixCls('footer-row-selection-selected-num')}>\n {selectedRowKeys.length}\n </TextLink>\n {t.Table.item}\n </div>\n {btnItems.map((btnItem) => {\n return (\n <div\n key={btnItem.key}\n className={prefixCls('footer-row-selection-item')}\n onClick={(e) => {\n btnItem.onClick(e);\n }}\n >\n <TextLink>{btnItem.label}</TextLink>\n </div>\n );\n })}\n </div>\n );\n\n // 翻页器\n const onChangePage = useCallback(\n (page: number) => {\n const { onChange = () => {} } = pagination || {};\n const { scrollToFirstRowOnChange = true } = scroll;\n if (scrollToFirstRowOnChange) {\n scrollToFirstRow();\n }\n onChange(page);\n // 翻页后,清空已选行\n changeSelectedRowKeys([]);\n },\n [scrollToFirstRow, scroll, pagination, changeSelectedRowKeys],\n );\n\n const pager = isShowPagination && pagination && (\n <div className={prefixCls('pager')}>\n <Pagination hideOnSinglePage {...pagination} onChange={onChangePage} />\n </div>\n );\n\n const isShowRowSelection =\n rowSelectionInfo.isRowSelectionEnabled &&\n selectedRowKeysInCurrPage.length > 0;\n\n const isShowFooter = isShowPagination || isShowRowSelection;\n\n return isShowFooter ? (\n <div className={prefixCls('footer')}>\n {rowSelectionNode}\n {pager}\n </div>\n ) : null;\n}\n\ninterface IProps<TDataItem extends object> {\n isShowPagination: boolean;\n rowSelectionInfo: IRowSelectionInfo<TDataItem>;\n pagination?: IPaginationProps;\n scroll?: ITableProps<TDataItem>['scroll'];\n scrollToFirstRow: () => void;\n}\n"],"mappings":";;;;;;;AASA,SAAwB,YACtB,OACA;CACA,MAAM,EAAE,WAAW,WAAW,cAAc;CAC5C,MAAM,IAAI,cAAc,OAAO;CAE/B,MAAM,EACJ,YACA,SAAS,EAAE,EACX,kBACA,kBACA,qBACE;CAGJ,MAAM,EACJ,oBACA,iBACA,2BACA,OACA,4BACA,UAAU,0BACR;CAEJ,MAAM,WAAW,CACf;EACE,KAAK;EACL,OAAO,EAAE,MAAM;EACf,eAAe,iBAAiB,aAAa;EAC9C,EACD,GAAG,MACJ;CAED,MAAM,mBAAmB,8BACvB,qBAAC,OAAD;EAAK,WAAW,UAAU,uBAAuB;YAAjD;GACE,oBAAC,OAAD;IAAK,WAAW,UAAU,2BAA2B;cAClD,qBAAqB,EAAE,MAAM,UAAU;IACpC,CAAA;GACN,qBAAC,OAAD;IAAK,WAAW,UAAU,gCAAgC;cAA1D;KACG,EAAE,MAAM;KACT,oBAAC,UAAD;MAAU,WAAW,UAAU,oCAAoC;gBAChE,gBAAgB;MACR,CAAA;KACV,EAAE,MAAM;KACL;;GACL,SAAS,KAAK,YAAY;AACzB,WACE,oBAAC,OAAD;KAEE,WAAW,UAAU,4BAA4B;KACjD,UAAU,MAAM;AACd,cAAQ,QAAQ,EAAE;;eAGpB,oBAAC,UAAD,EAAA,UAAW,QAAQ,OAAiB,CAAA;KAChC,EAPC,QAAQ,IAOT;KAER;GACE;;CAIR,MAAM,eAAe,aAClB,SAAiB;EAChB,MAAM,EAAE,iBAAiB,OAAO,cAAc,EAAE;EAChD,MAAM,EAAE,2BAA2B,SAAS;AAC5C,MAAI,yBACF,mBAAkB;AAEpB,WAAS,KAAK;AAEd,wBAAsB,EAAE,CAAC;IAE3B;EAAC;EAAkB;EAAQ;EAAY;EAAsB,CAC9D;CAED,MAAM,QAAQ,oBAAoB,cAChC,oBAAC,OAAD;EAAK,WAAW,UAAU,QAAQ;YAChC,oBAAC,YAAD;GAAY,kBAAA;GAAiB,GAAI;GAAY,UAAU;GAAgB,CAAA;EACnE,CAAA;CAGR,MAAM,qBACJ,iBAAiB,yBACjB,0BAA0B,SAAS;AAIrC,QAFqB,oBAAoB,qBAGvC,qBAAC,OAAD;EAAK,WAAW,UAAU,SAAS;YAAnC,CACG,kBACA,MACG;MACJ"}
@@ -10,7 +10,7 @@ export interface IRowSelectionInfo<TDataItem extends object> {
10
10
  getCheckboxAllNode: ((children?: React.ReactNode) => React.ReactNode) | null;
11
11
  selectedRowKeys: string[];
12
12
  selectedRowKeysInCurrPage: string[];
13
- unSelectAll: (e: React.MouseEvent) => void;
13
+ unSelectAll: () => void;
14
14
  isShowRowSelectionInFooter: boolean;
15
15
  items: {
16
16
  key: string;
@@ -28,10 +28,11 @@ function useRowSelection(props) {
28
28
  }, [getAllSelectedRows, rowSelection]);
29
29
  const checkboxAllStatus = getCheckboxAllStatus(allDataForSelection, selectedRowKeys, rowKey, rowSelection?.getCheckboxProps);
30
30
  const selectAll = useCallback(() => {
31
- changeSelectedRowKeys(allDataForSelection.map((record) => getRowKey(record, rowKey)));
31
+ changeSelectedRowKeys(getDataWithoutDisabled(allDataForSelection, rowSelection?.getCheckboxProps).map((record) => getRowKey(record, rowKey)));
32
32
  }, [
33
33
  allDataForSelection,
34
34
  rowKey,
35
+ rowSelection?.getCheckboxProps,
35
36
  changeSelectedRowKeys
36
37
  ]);
37
38
  const unSelectAll = useCallback(() => {
@@ -143,14 +144,11 @@ function useRowSelection(props) {
143
144
  };
144
145
  }
145
146
  function getCheckboxAllStatus(data, selectedRowKeys, rowKey, getCheckboxProps) {
146
- const selectedKeysInData = data.map((record) => {
147
- const key = getRowKey(record, rowKey);
148
- if (selectedRowKeys.includes(key)) return key;
149
- return null;
150
- }).filter((key) => key !== null);
151
- if (selectedKeysInData.length === 0) return "none";
152
- const dataWithoutDisabled = getDataWithoutDisabled(data, getCheckboxProps);
153
- if (selectedKeysInData.length === dataWithoutDisabled.length) return "all";
147
+ const enabledData = getDataWithoutDisabled(data, getCheckboxProps);
148
+ if (enabledData.length === 0) return "none";
149
+ const selectedEnabledCount = enabledData.filter((record) => selectedRowKeys.includes(getRowKey(record, rowKey))).length;
150
+ if (selectedEnabledCount === 0) return "none";
151
+ if (selectedEnabledCount === enabledData.length) return "all";
154
152
  return "indeterminate";
155
153
  }
156
154
  function getDataWithoutDisabled(data, getCheckboxProps) {
@@ -1 +1 @@
1
- {"version":3,"file":"useRowSelection.js","names":[],"sources":["../../../src/Table/hooks/useRowSelection.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from 'react';\nimport Checkbox from '../../Checkbox';\nimport { getRowKey, hasFixedLeftColumn, prefixCls } from '../helper';\nimport { IRowSelection, ITableColumn, ITableProps } from '../types';\n\nexport default function useRowSelection<TDataItem extends object>(\n props: ITableProps<TDataItem> & {\n isExpandable?: boolean;\n flattenData?: TDataItem[];\n },\n): IRowSelectionInfo<TDataItem> {\n const { columns, rowSelection, rowKey, data, isExpandable, flattenData } =\n props;\n\n const [selectedRowKeysState, setSelectedRowKeysState] = useState(\n rowSelection?.selectedRowKeys || rowSelection?.defaultSelectedRowKeys || [],\n );\n\n const selectedRowKeys = rowSelection?.selectedRowKeys || selectedRowKeysState;\n\n const getSelectedRows = useCallback(\n (rowKeys: string[]) => {\n return data.filter((record) =>\n rowKeys.includes(getRowKey(record, rowKey)),\n );\n },\n [data, rowKey],\n );\n\n // 获取用于全选状态计算和数据获取的完整数据\n const allDataForSelection = useMemo(() => {\n // 如果开启了 expandable,使用扁平化后的数据\n if (isExpandable && flattenData) {\n return flattenData;\n }\n // 否则使用原始数据\n return data;\n }, [isExpandable, flattenData, data]);\n\n // 从完整数据中获取选中的行\n const getAllSelectedRows = useCallback(\n (rowKeys: string[]) => {\n return allDataForSelection.filter((record) =>\n rowKeys.includes(getRowKey(record, rowKey)),\n );\n },\n [allDataForSelection, rowKey],\n );\n\n const changeSelectedRowKeys = useCallback(\n (newSelectedRowKeys: string[]) => {\n setSelectedRowKeysState(newSelectedRowKeys);\n\n // 获取所有选中的行数据(包括被折叠的子项)\n const allSelectedRows = getAllSelectedRows(newSelectedRowKeys);\n rowSelection?.onChange?.(newSelectedRowKeys, allSelectedRows);\n },\n [getAllSelectedRows, rowSelection],\n );\n\n const checkboxAllStatus = getCheckboxAllStatus(\n allDataForSelection,\n selectedRowKeys,\n rowKey,\n rowSelection?.getCheckboxProps,\n );\n\n const selectAll = useCallback(() => {\n const newKeys = allDataForSelection.map((record) =>\n getRowKey(record, rowKey),\n );\n\n changeSelectedRowKeys(newKeys);\n }, [allDataForSelection, rowKey, changeSelectedRowKeys]);\n\n const unSelectAll = useCallback(() => {\n changeSelectedRowKeys([]);\n }, [changeSelectedRowKeys]);\n\n const onClickAllCheckbox = useCallback<(e?: React.MouseEvent) => void>(() => {\n if (checkboxAllStatus === 'all') {\n unSelectAll();\n } else {\n selectAll();\n }\n }, [checkboxAllStatus, unSelectAll, selectAll]);\n\n // 获取节点的所有子孙节点keys\n const getDescendantKeys = useCallback(\n (parentKey: string): string[] => {\n return getNodeDescendants(parentKey, isExpandable, flattenData, rowKey);\n },\n [isExpandable, flattenData, rowKey],\n );\n\n // 获取节点的所有祖先节点keys\n const getAncestorKeys = useCallback(\n (targetKey: string): string[] => {\n return getNodeAncestors(targetKey, isExpandable, flattenData, rowKey);\n },\n [isExpandable, flattenData, rowKey],\n );\n\n // 获取节点的选择状态(考虑子节点状态)\n const getNodeCheckStatus = useCallback(\n (nodeKey: string): { checked: boolean; indeterminate: boolean } => {\n return calculateNodeCheckStatus(\n nodeKey,\n selectedRowKeys,\n rowSelection?.checkStrictly,\n isExpandable,\n getDescendantKeys,\n );\n },\n [\n selectedRowKeys,\n rowSelection?.checkStrictly,\n isExpandable,\n getDescendantKeys,\n ],\n );\n\n const onClickCheckbox = useCallback(\n (key: string, isChecked: boolean) => () => {\n const newKeys = calculateCascadeSelection(\n key,\n isChecked,\n selectedRowKeys,\n rowSelection?.checkStrictly,\n isExpandable,\n getDescendantKeys,\n getAncestorKeys,\n );\n\n changeSelectedRowKeys(newKeys);\n },\n [\n selectedRowKeys,\n changeSelectedRowKeys,\n rowSelection?.checkStrictly,\n isExpandable,\n getDescendantKeys,\n getAncestorKeys,\n ],\n );\n\n // 全选按钮\n const getCheckboxAllNode = (children?: React.ReactNode) => (\n <div className={prefixCls('row-selection-all')}>\n <Checkbox\n onClick={onClickAllCheckbox}\n checked={checkboxAllStatus === 'all'}\n indeterminate={checkboxAllStatus === 'indeterminate'}\n >\n {children}\n </Checkbox>\n </div>\n );\n\n if (!rowSelection) {\n return {\n columns,\n isRowSelectionEnabled: false,\n getCheckboxAllNode,\n selectedRowKeys: [],\n selectedRowKeysInCurrPage: [],\n unSelectAll,\n isShowRowSelectionInFooter: false,\n items: [],\n onChange: () => {},\n };\n }\n\n if (!rowKey) {\n throw new Error('rowKey is required when rowSelection is enabled');\n }\n\n const fixed = !!rowSelection.fixed || hasFixedLeftColumn(columns);\n\n const rowSelectionColumn: ITableColumn<TDataItem> = {\n dataIndex: '',\n title: (\n <div className={prefixCls('row-selection-all-header-wrap')}>\n {getCheckboxAllNode()}\n </div>\n ),\n width: 48,\n render: (text: unknown, record: TDataItem) => {\n const key = getRowKey(record, rowKey);\n const nodeStatus = getNodeCheckStatus(key);\n const checkboxProps = rowSelection.getCheckboxProps?.(record) || {};\n\n return (\n <div className={prefixCls('row-selection-item')}>\n <Checkbox\n onClick={onClickCheckbox(\n key,\n nodeStatus.checked || nodeStatus.indeterminate,\n )}\n checked={nodeStatus.checked}\n indeterminate={nodeStatus.indeterminate}\n {...checkboxProps}\n />\n </div>\n );\n },\n fixed: fixed ? 'left' : undefined,\n };\n\n const selectedRowKeysInCurrPage = getDataWithoutDisabled(\n data,\n rowSelection.getCheckboxProps,\n )\n .map((record) => getRowKey(record, rowKey))\n .filter((key) => selectedRowKeys.includes(key));\n\n const isShowRowSelectionInFooter = selectedRowKeysInCurrPage.length > 0;\n\n const items =\n rowSelection.items?.map((operationItem) => ({\n ...operationItem,\n onClick: (e: React.MouseEvent) => {\n operationItem.onClick(\n selectedRowKeysInCurrPage,\n getSelectedRows(selectedRowKeysInCurrPage),\n e,\n );\n },\n })) || [];\n\n return {\n columns: [rowSelectionColumn, ...columns],\n isRowSelectionEnabled: true,\n getCheckboxAllNode,\n selectedRowKeys: selectedRowKeys, // 返回完整的选中项列表\n selectedRowKeysInCurrPage, // 当前页面可见的选中项\n unSelectAll,\n isShowRowSelectionInFooter,\n items,\n onChange: changeSelectedRowKeys,\n };\n}\n\nfunction getCheckboxAllStatus<TDataItem extends object>(\n data: TDataItem[],\n selectedRowKeys: string[],\n rowKey: ITableProps<TDataItem>['rowKey'],\n getCheckboxProps?: IRowSelection<TDataItem>['getCheckboxProps'],\n): 'all' | 'none' | 'indeterminate' {\n const selectedKeysInData = data\n .map((record) => {\n const key = getRowKey(record, rowKey);\n if (selectedRowKeys.includes(key)) {\n return key;\n }\n return null;\n })\n .filter((key) => key !== null);\n\n if (selectedKeysInData.length === 0) {\n return 'none';\n }\n const dataWithoutDisabled = getDataWithoutDisabled(data, getCheckboxProps);\n if (selectedKeysInData.length === dataWithoutDisabled.length) {\n return 'all';\n }\n return 'indeterminate';\n}\n\nfunction getDataWithoutDisabled<TDataItem extends object>(\n data: TDataItem[],\n getCheckboxProps?: IRowSelection<TDataItem>['getCheckboxProps'],\n) {\n return data.filter((record) => {\n const checkboxProps = getCheckboxProps?.(record) || {};\n const { disabled } = checkboxProps;\n return !disabled;\n });\n}\n\nexport interface IRowSelectionInfo<TDataItem extends object> {\n columns: ITableProps<TDataItem>['columns'];\n isRowSelectionEnabled: boolean;\n getCheckboxAllNode: ((children?: React.ReactNode) => React.ReactNode) | null;\n selectedRowKeys: string[]; // 完整的选中项列表\n selectedRowKeysInCurrPage: string[]; // 当前页面可见的选中项\n unSelectAll: (e: React.MouseEvent) => void;\n isShowRowSelectionInFooter: boolean;\n items: {\n key: string;\n label: React.ReactNode;\n onClick: (e: React.MouseEvent) => void;\n }[];\n onChange: (selectedRowKeys: string[]) => void;\n}\n\n/**\n * 获取节点的所有子孙节点keys\n * @param parentKey 父节点key\n * @param isExpandable 是否启用展开功能\n * @param flattenData 扁平化后的数据(包含所有节点,包括子节点)\n * @param rowKey 行key获取函数\n * @returns 子孙节点keys数组\n */\nexport function getNodeDescendants<TDataItem extends object>(\n parentKey: string,\n isExpandable?: boolean,\n flattenData?: TDataItem[],\n rowKey?: ITableProps<TDataItem>['rowKey'],\n): string[] {\n if (!isExpandable || !flattenData || !rowKey) return [];\n\n const descendants: string[] = [];\n\n // 找到父节点在flattenData中的记录\n const parentNode = flattenData.find(\n (item) => getRowKey(item, rowKey) === parentKey,\n );\n if (!parentNode) return [];\n\n // 从原始节点的children中收集所有子孙节点\n const collectDescendants = (node: any) => {\n const children = node.children || [];\n children.forEach((child: any) => {\n const childKey = getRowKey(child, rowKey);\n descendants.push(childKey);\n collectDescendants(child);\n });\n };\n\n collectDescendants(parentNode);\n return descendants;\n}\n\n/**\n * 获取节点的所有祖先节点keys\n * @param targetKey 目标节点key\n * @param isExpandable 是否启用展开功能\n * @param flattenData 扁平化后的数据\n * @param rowKey 行key获取函数\n * @returns 祖先节点keys数组(从直接父节点到根节点)\n */\nexport function getNodeAncestors<TDataItem extends object>(\n targetKey: string,\n isExpandable?: boolean,\n flattenData?: TDataItem[],\n rowKey?: ITableProps<TDataItem>['rowKey'],\n): string[] {\n if (!isExpandable || !flattenData || !rowKey) return [];\n\n const ancestors: string[] = [];\n\n // 找到目标节点的直接父节点\n const findDirectParent = (childKey: string): TDataItem | null => {\n for (const item of flattenData) {\n const children = (item as any).children || [];\n if (\n children.some((child: any) => getRowKey(child, rowKey) === childKey)\n ) {\n return item;\n }\n }\n return null;\n };\n\n let currentKey = targetKey;\n\n for (;;) {\n const parent = findDirectParent(currentKey);\n if (!parent) break;\n\n const parentKey = getRowKey(parent, rowKey);\n ancestors.push(parentKey);\n currentKey = parentKey;\n }\n\n return ancestors;\n}\n\n/**\n * 计算级联选择后的keys(包含向上级联)\n * @param targetKey 被操作的节点key\n * @param isChecked 当前是否选中\n * @param currentSelectedKeys 当前已选中的keys\n * @param checkStrictly 是否严格模式\n * @param isExpandable 是否启用展开功能\n * @param getDescendantKeys 获取子孙节点keys的函数\n * @param getAncestorKeys 获取祖先节点keys的函数\n * @returns 新的选中keys\n */\nexport function calculateCascadeSelection(\n targetKey: string,\n isChecked: boolean,\n currentSelectedKeys: string[],\n checkStrictly?: boolean,\n isExpandable?: boolean,\n getDescendantKeys?: (nodeKey: string) => string[],\n getAncestorKeys?: (nodeKey: string) => string[],\n): string[] {\n if (\n checkStrictly ||\n !isExpandable ||\n !getDescendantKeys ||\n !getAncestorKeys\n ) {\n // 严格模式,不进行级联\n return isChecked\n ? currentSelectedKeys.filter((key) => key !== targetKey)\n : [...currentSelectedKeys, targetKey];\n }\n\n let newKeys = [...currentSelectedKeys];\n\n if (isChecked) {\n // 取消选择:移除目标节点和所有子孙节点\n newKeys = newKeys.filter((key) => key !== targetKey);\n const descendants = getDescendantKeys(targetKey);\n newKeys = newKeys.filter((key) => !descendants.includes(key));\n\n // 向上级联:检查父节点是否需要取消选择\n const ancestors = getAncestorKeys(targetKey);\n ancestors.forEach((ancestorKey) => {\n const ancestorDescendants = getDescendantKeys(ancestorKey);\n const selectedDescendantsCount = ancestorDescendants.filter((key) =>\n newKeys.includes(key),\n ).length;\n\n // 如果子孙节点没有全部选中,则父节点也应该取消选择\n if (selectedDescendantsCount < ancestorDescendants.length) {\n newKeys = newKeys.filter((key) => key !== ancestorKey);\n }\n });\n } else {\n // 选择:添加目标节点和所有子孙节点\n if (!newKeys.includes(targetKey)) {\n newKeys.push(targetKey);\n }\n const descendants = getDescendantKeys(targetKey);\n descendants.forEach((descendantKey) => {\n if (!newKeys.includes(descendantKey)) {\n newKeys.push(descendantKey);\n }\n });\n\n // 向上级联:检查父节点是否需要选择\n const ancestors = getAncestorKeys(targetKey);\n ancestors.forEach((ancestorKey) => {\n const ancestorDescendants = getDescendantKeys(ancestorKey);\n const selectedDescendantsCount = ancestorDescendants.filter((key) =>\n newKeys.includes(key),\n ).length;\n\n // 如果所有子孙节点都被选中,则父节点也应该被选中\n if (\n selectedDescendantsCount === ancestorDescendants.length &&\n !newKeys.includes(ancestorKey)\n ) {\n newKeys.push(ancestorKey);\n }\n });\n }\n\n return newKeys;\n}\n\n/**\n * 计算节点的选择状态(考虑子节点状态)\n * @param nodeKey 节点key\n * @param selectedRowKeys 已选中的keys\n * @param checkStrictly 是否严格模式\n * @param isExpandable 是否启用展开功能\n * @param getDescendantKeys 获取子孙节点keys的函数\n * @returns 节点的选择状态\n */\nexport function calculateNodeCheckStatus(\n nodeKey: string,\n selectedRowKeys: string[],\n checkStrictly?: boolean,\n isExpandable?: boolean,\n getDescendantKeys?: (nodeKey: string) => string[],\n): { checked: boolean; indeterminate: boolean } {\n if (checkStrictly || !isExpandable || !getDescendantKeys) {\n // 严格模式下或非展开模式,直接返回节点本身的选择状态\n return {\n checked: selectedRowKeys.includes(nodeKey),\n indeterminate: false,\n };\n }\n\n const descendants = getDescendantKeys(nodeKey);\n\n // 如果没有子节点,直接返回本身状态\n if (descendants.length === 0) {\n return {\n checked: selectedRowKeys.includes(nodeKey),\n indeterminate: false,\n };\n }\n\n const selectedDescendants = descendants.filter((key) =>\n selectedRowKeys.includes(key),\n );\n const isNodeSelected = selectedRowKeys.includes(nodeKey);\n\n if (isNodeSelected && selectedDescendants.length === descendants.length) {\n // 节点本身选中且所有子节点都选中\n return { checked: true, indeterminate: false };\n } else if (!isNodeSelected && selectedDescendants.length === 0) {\n // 节点本身未选中且所有子节点都未选中\n return { checked: false, indeterminate: false };\n } else {\n // 部分选中的情况:节点选中但子节点未全选,或节点未选中但部分子节点选中\n return { checked: false, indeterminate: true };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useRowSelection.js","names":[],"sources":["../../../src/Table/hooks/useRowSelection.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useState } from 'react';\nimport Checkbox from '../../Checkbox';\nimport { getRowKey, hasFixedLeftColumn, prefixCls } from '../helper';\nimport { IRowSelection, ITableColumn, ITableProps } from '../types';\n\nexport default function useRowSelection<TDataItem extends object>(\n props: ITableProps<TDataItem> & {\n isExpandable?: boolean;\n flattenData?: TDataItem[];\n },\n): IRowSelectionInfo<TDataItem> {\n const { columns, rowSelection, rowKey, data, isExpandable, flattenData } =\n props;\n\n const [selectedRowKeysState, setSelectedRowKeysState] = useState(\n rowSelection?.selectedRowKeys || rowSelection?.defaultSelectedRowKeys || [],\n );\n\n const selectedRowKeys = rowSelection?.selectedRowKeys || selectedRowKeysState;\n\n const getSelectedRows = useCallback(\n (rowKeys: string[]) => {\n return data.filter((record) =>\n rowKeys.includes(getRowKey(record, rowKey)),\n );\n },\n [data, rowKey],\n );\n\n // 获取用于全选状态计算和数据获取的完整数据\n const allDataForSelection = useMemo(() => {\n // 如果开启了 expandable,使用扁平化后的数据\n if (isExpandable && flattenData) {\n return flattenData;\n }\n // 否则使用原始数据\n return data;\n }, [isExpandable, flattenData, data]);\n\n // 从完整数据中获取选中的行\n const getAllSelectedRows = useCallback(\n (rowKeys: string[]) => {\n return allDataForSelection.filter((record) =>\n rowKeys.includes(getRowKey(record, rowKey)),\n );\n },\n [allDataForSelection, rowKey],\n );\n\n const changeSelectedRowKeys = useCallback(\n (newSelectedRowKeys: string[]) => {\n setSelectedRowKeysState(newSelectedRowKeys);\n\n // 获取所有选中的行数据(包括被折叠的子项)\n const allSelectedRows = getAllSelectedRows(newSelectedRowKeys);\n rowSelection?.onChange?.(newSelectedRowKeys, allSelectedRows);\n },\n [getAllSelectedRows, rowSelection],\n );\n\n const checkboxAllStatus = getCheckboxAllStatus(\n allDataForSelection,\n selectedRowKeys,\n rowKey,\n rowSelection?.getCheckboxProps,\n );\n\n const selectAll = useCallback(() => {\n const newKeys = getDataWithoutDisabled(\n allDataForSelection,\n rowSelection?.getCheckboxProps,\n ).map((record) => getRowKey(record, rowKey));\n\n changeSelectedRowKeys(newKeys);\n }, [\n allDataForSelection,\n rowKey,\n rowSelection?.getCheckboxProps,\n changeSelectedRowKeys,\n ]);\n\n const unSelectAll = useCallback(() => {\n changeSelectedRowKeys([]);\n }, [changeSelectedRowKeys]);\n\n const onClickAllCheckbox = useCallback<(e?: React.MouseEvent) => void>(() => {\n if (checkboxAllStatus === 'all') {\n unSelectAll();\n } else {\n selectAll();\n }\n }, [checkboxAllStatus, unSelectAll, selectAll]);\n\n // 获取节点的所有子孙节点keys\n const getDescendantKeys = useCallback(\n (parentKey: string): string[] => {\n return getNodeDescendants(parentKey, isExpandable, flattenData, rowKey);\n },\n [isExpandable, flattenData, rowKey],\n );\n\n // 获取节点的所有祖先节点keys\n const getAncestorKeys = useCallback(\n (targetKey: string): string[] => {\n return getNodeAncestors(targetKey, isExpandable, flattenData, rowKey);\n },\n [isExpandable, flattenData, rowKey],\n );\n\n // 获取节点的选择状态(考虑子节点状态)\n const getNodeCheckStatus = useCallback(\n (nodeKey: string): { checked: boolean; indeterminate: boolean } => {\n return calculateNodeCheckStatus(\n nodeKey,\n selectedRowKeys,\n rowSelection?.checkStrictly,\n isExpandable,\n getDescendantKeys,\n );\n },\n [\n selectedRowKeys,\n rowSelection?.checkStrictly,\n isExpandable,\n getDescendantKeys,\n ],\n );\n\n const onClickCheckbox = useCallback(\n (key: string, isChecked: boolean) => () => {\n const newKeys = calculateCascadeSelection(\n key,\n isChecked,\n selectedRowKeys,\n rowSelection?.checkStrictly,\n isExpandable,\n getDescendantKeys,\n getAncestorKeys,\n );\n\n changeSelectedRowKeys(newKeys);\n },\n [\n selectedRowKeys,\n changeSelectedRowKeys,\n rowSelection?.checkStrictly,\n isExpandable,\n getDescendantKeys,\n getAncestorKeys,\n ],\n );\n\n // 全选按钮\n const getCheckboxAllNode = (children?: React.ReactNode) => (\n <div className={prefixCls('row-selection-all')}>\n <Checkbox\n onClick={onClickAllCheckbox}\n checked={checkboxAllStatus === 'all'}\n indeterminate={checkboxAllStatus === 'indeterminate'}\n >\n {children}\n </Checkbox>\n </div>\n );\n\n if (!rowSelection) {\n return {\n columns,\n isRowSelectionEnabled: false,\n getCheckboxAllNode,\n selectedRowKeys: [],\n selectedRowKeysInCurrPage: [],\n unSelectAll,\n isShowRowSelectionInFooter: false,\n items: [],\n onChange: () => {},\n };\n }\n\n if (!rowKey) {\n throw new Error('rowKey is required when rowSelection is enabled');\n }\n\n const fixed = !!rowSelection.fixed || hasFixedLeftColumn(columns);\n\n const rowSelectionColumn: ITableColumn<TDataItem> = {\n dataIndex: '',\n title: (\n <div className={prefixCls('row-selection-all-header-wrap')}>\n {getCheckboxAllNode()}\n </div>\n ),\n width: 48,\n render: (text: unknown, record: TDataItem) => {\n const key = getRowKey(record, rowKey);\n const nodeStatus = getNodeCheckStatus(key);\n const checkboxProps = rowSelection.getCheckboxProps?.(record) || {};\n\n return (\n <div className={prefixCls('row-selection-item')}>\n <Checkbox\n onClick={onClickCheckbox(\n key,\n nodeStatus.checked || nodeStatus.indeterminate,\n )}\n checked={nodeStatus.checked}\n indeterminate={nodeStatus.indeterminate}\n {...checkboxProps}\n />\n </div>\n );\n },\n fixed: fixed ? 'left' : undefined,\n };\n\n const selectedRowKeysInCurrPage = getDataWithoutDisabled(\n data,\n rowSelection.getCheckboxProps,\n )\n .map((record) => getRowKey(record, rowKey))\n .filter((key) => selectedRowKeys.includes(key));\n\n const isShowRowSelectionInFooter = selectedRowKeysInCurrPage.length > 0;\n\n const items =\n rowSelection.items?.map((operationItem) => ({\n ...operationItem,\n onClick: (e: React.MouseEvent) => {\n operationItem.onClick(\n selectedRowKeysInCurrPage,\n getSelectedRows(selectedRowKeysInCurrPage),\n e,\n );\n },\n })) || [];\n\n return {\n columns: [rowSelectionColumn, ...columns],\n isRowSelectionEnabled: true,\n getCheckboxAllNode,\n selectedRowKeys: selectedRowKeys, // 返回完整的选中项列表\n selectedRowKeysInCurrPage, // 当前页面可见的选中项\n unSelectAll,\n isShowRowSelectionInFooter,\n items,\n onChange: changeSelectedRowKeys,\n };\n}\n\nfunction getCheckboxAllStatus<TDataItem extends object>(\n data: TDataItem[],\n selectedRowKeys: string[],\n rowKey: ITableProps<TDataItem>['rowKey'],\n getCheckboxProps?: IRowSelection<TDataItem>['getCheckboxProps'],\n): 'all' | 'none' | 'indeterminate' {\n const enabledData = getDataWithoutDisabled(data, getCheckboxProps);\n\n if (enabledData.length === 0) {\n return 'none';\n }\n\n const selectedEnabledCount = enabledData.filter((record) =>\n selectedRowKeys.includes(getRowKey(record, rowKey)),\n ).length;\n\n if (selectedEnabledCount === 0) {\n return 'none';\n }\n if (selectedEnabledCount === enabledData.length) {\n return 'all';\n }\n return 'indeterminate';\n}\n\nfunction getDataWithoutDisabled<TDataItem extends object>(\n data: TDataItem[],\n getCheckboxProps?: IRowSelection<TDataItem>['getCheckboxProps'],\n) {\n return data.filter((record) => {\n const checkboxProps = getCheckboxProps?.(record) || {};\n const { disabled } = checkboxProps;\n return !disabled;\n });\n}\n\nexport interface IRowSelectionInfo<TDataItem extends object> {\n columns: ITableProps<TDataItem>['columns'];\n isRowSelectionEnabled: boolean;\n getCheckboxAllNode: ((children?: React.ReactNode) => React.ReactNode) | null;\n selectedRowKeys: string[]; // 完整的选中项列表\n selectedRowKeysInCurrPage: string[]; // 当前页面可见的选中项\n unSelectAll: () => void;\n isShowRowSelectionInFooter: boolean;\n items: {\n key: string;\n label: React.ReactNode;\n onClick: (e: React.MouseEvent) => void;\n }[];\n onChange: (selectedRowKeys: string[]) => void;\n}\n\n/**\n * 获取节点的所有子孙节点keys\n * @param parentKey 父节点key\n * @param isExpandable 是否启用展开功能\n * @param flattenData 扁平化后的数据(包含所有节点,包括子节点)\n * @param rowKey 行key获取函数\n * @returns 子孙节点keys数组\n */\nexport function getNodeDescendants<TDataItem extends object>(\n parentKey: string,\n isExpandable?: boolean,\n flattenData?: TDataItem[],\n rowKey?: ITableProps<TDataItem>['rowKey'],\n): string[] {\n if (!isExpandable || !flattenData || !rowKey) return [];\n\n const descendants: string[] = [];\n\n // 找到父节点在flattenData中的记录\n const parentNode = flattenData.find(\n (item) => getRowKey(item, rowKey) === parentKey,\n );\n if (!parentNode) return [];\n\n // 从原始节点的children中收集所有子孙节点\n const collectDescendants = (node: any) => {\n const children = node.children || [];\n children.forEach((child: any) => {\n const childKey = getRowKey(child, rowKey);\n descendants.push(childKey);\n collectDescendants(child);\n });\n };\n\n collectDescendants(parentNode);\n return descendants;\n}\n\n/**\n * 获取节点的所有祖先节点keys\n * @param targetKey 目标节点key\n * @param isExpandable 是否启用展开功能\n * @param flattenData 扁平化后的数据\n * @param rowKey 行key获取函数\n * @returns 祖先节点keys数组(从直接父节点到根节点)\n */\nexport function getNodeAncestors<TDataItem extends object>(\n targetKey: string,\n isExpandable?: boolean,\n flattenData?: TDataItem[],\n rowKey?: ITableProps<TDataItem>['rowKey'],\n): string[] {\n if (!isExpandable || !flattenData || !rowKey) return [];\n\n const ancestors: string[] = [];\n\n // 找到目标节点的直接父节点\n const findDirectParent = (childKey: string): TDataItem | null => {\n for (const item of flattenData) {\n const children = (item as any).children || [];\n if (\n children.some((child: any) => getRowKey(child, rowKey) === childKey)\n ) {\n return item;\n }\n }\n return null;\n };\n\n let currentKey = targetKey;\n\n for (;;) {\n const parent = findDirectParent(currentKey);\n if (!parent) break;\n\n const parentKey = getRowKey(parent, rowKey);\n ancestors.push(parentKey);\n currentKey = parentKey;\n }\n\n return ancestors;\n}\n\n/**\n * 计算级联选择后的keys(包含向上级联)\n * @param targetKey 被操作的节点key\n * @param isChecked 当前是否选中\n * @param currentSelectedKeys 当前已选中的keys\n * @param checkStrictly 是否严格模式\n * @param isExpandable 是否启用展开功能\n * @param getDescendantKeys 获取子孙节点keys的函数\n * @param getAncestorKeys 获取祖先节点keys的函数\n * @returns 新的选中keys\n */\nexport function calculateCascadeSelection(\n targetKey: string,\n isChecked: boolean,\n currentSelectedKeys: string[],\n checkStrictly?: boolean,\n isExpandable?: boolean,\n getDescendantKeys?: (nodeKey: string) => string[],\n getAncestorKeys?: (nodeKey: string) => string[],\n): string[] {\n if (\n checkStrictly ||\n !isExpandable ||\n !getDescendantKeys ||\n !getAncestorKeys\n ) {\n // 严格模式,不进行级联\n return isChecked\n ? currentSelectedKeys.filter((key) => key !== targetKey)\n : [...currentSelectedKeys, targetKey];\n }\n\n let newKeys = [...currentSelectedKeys];\n\n if (isChecked) {\n // 取消选择:移除目标节点和所有子孙节点\n newKeys = newKeys.filter((key) => key !== targetKey);\n const descendants = getDescendantKeys(targetKey);\n newKeys = newKeys.filter((key) => !descendants.includes(key));\n\n // 向上级联:检查父节点是否需要取消选择\n const ancestors = getAncestorKeys(targetKey);\n ancestors.forEach((ancestorKey) => {\n const ancestorDescendants = getDescendantKeys(ancestorKey);\n const selectedDescendantsCount = ancestorDescendants.filter((key) =>\n newKeys.includes(key),\n ).length;\n\n // 如果子孙节点没有全部选中,则父节点也应该取消选择\n if (selectedDescendantsCount < ancestorDescendants.length) {\n newKeys = newKeys.filter((key) => key !== ancestorKey);\n }\n });\n } else {\n // 选择:添加目标节点和所有子孙节点\n if (!newKeys.includes(targetKey)) {\n newKeys.push(targetKey);\n }\n const descendants = getDescendantKeys(targetKey);\n descendants.forEach((descendantKey) => {\n if (!newKeys.includes(descendantKey)) {\n newKeys.push(descendantKey);\n }\n });\n\n // 向上级联:检查父节点是否需要选择\n const ancestors = getAncestorKeys(targetKey);\n ancestors.forEach((ancestorKey) => {\n const ancestorDescendants = getDescendantKeys(ancestorKey);\n const selectedDescendantsCount = ancestorDescendants.filter((key) =>\n newKeys.includes(key),\n ).length;\n\n // 如果所有子孙节点都被选中,则父节点也应该被选中\n if (\n selectedDescendantsCount === ancestorDescendants.length &&\n !newKeys.includes(ancestorKey)\n ) {\n newKeys.push(ancestorKey);\n }\n });\n }\n\n return newKeys;\n}\n\n/**\n * 计算节点的选择状态(考虑子节点状态)\n * @param nodeKey 节点key\n * @param selectedRowKeys 已选中的keys\n * @param checkStrictly 是否严格模式\n * @param isExpandable 是否启用展开功能\n * @param getDescendantKeys 获取子孙节点keys的函数\n * @returns 节点的选择状态\n */\nexport function calculateNodeCheckStatus(\n nodeKey: string,\n selectedRowKeys: string[],\n checkStrictly?: boolean,\n isExpandable?: boolean,\n getDescendantKeys?: (nodeKey: string) => string[],\n): { checked: boolean; indeterminate: boolean } {\n if (checkStrictly || !isExpandable || !getDescendantKeys) {\n // 严格模式下或非展开模式,直接返回节点本身的选择状态\n return {\n checked: selectedRowKeys.includes(nodeKey),\n indeterminate: false,\n };\n }\n\n const descendants = getDescendantKeys(nodeKey);\n\n // 如果没有子节点,直接返回本身状态\n if (descendants.length === 0) {\n return {\n checked: selectedRowKeys.includes(nodeKey),\n indeterminate: false,\n };\n }\n\n const selectedDescendants = descendants.filter((key) =>\n selectedRowKeys.includes(key),\n );\n const isNodeSelected = selectedRowKeys.includes(nodeKey);\n\n if (isNodeSelected && selectedDescendants.length === descendants.length) {\n // 节点本身选中且所有子节点都选中\n return { checked: true, indeterminate: false };\n } else if (!isNodeSelected && selectedDescendants.length === 0) {\n // 节点本身未选中且所有子节点都未选中\n return { checked: false, indeterminate: false };\n } else {\n // 部分选中的情况:节点选中但子节点未全选,或节点未选中但部分子节点选中\n return { checked: false, indeterminate: true };\n }\n}\n"],"mappings":"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"}
@@ -258,7 +258,7 @@ function Table(props, ref) {
258
258
  className: prefixCls("body"),
259
259
  style: {
260
260
  width: totalColumnsWidth,
261
- height: virtual ? rowVirtualizer.getTotalSize() : "auto"
261
+ height: virtual ? totalSize ? rowVirtualizer.getTotalSize() : 0 : "auto"
262
262
  },
263
263
  children: isEmpty ? /* @__PURE__ */ jsxs("div", {
264
264
  style: { width: totalSize?.width },