@aloudata/aloudata-design 3.1.0 → 3.1.2

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 (196) hide show
  1. package/dist/AProgress/index.js +10 -0
  2. package/dist/AProgress/index.js.map +1 -1
  3. package/dist/Alert/index.js +3 -1
  4. package/dist/Alert/index.js.map +1 -1
  5. package/dist/Badge/index.js +37 -11
  6. package/dist/Badge/index.js.map +1 -1
  7. package/dist/Breadcrumb/index.js +12 -2
  8. package/dist/Breadcrumb/index.js.map +1 -1
  9. package/dist/Button/index.d.ts +1 -1
  10. package/dist/Button/index.js +20 -6
  11. package/dist/Button/index.js.map +1 -1
  12. package/dist/Card/index.js +1 -1
  13. package/dist/Card/index.js.map +1 -1
  14. package/dist/Carousel/index.js +9 -1
  15. package/dist/Carousel/index.js.map +1 -1
  16. package/dist/Checkbox/index.js +17 -2
  17. package/dist/Checkbox/index.js.map +1 -1
  18. package/dist/Checkbox/type.d.ts +10 -2
  19. package/dist/ColorPicker/index.js +112 -46
  20. package/dist/ColorPicker/index.js.map +1 -1
  21. package/dist/DataPreviewTable/components/Body/Cell.d.ts +2 -0
  22. package/dist/DataPreviewTable/components/Body/Cell.js +9 -1
  23. package/dist/DataPreviewTable/components/Body/Cell.js.map +1 -1
  24. package/dist/DataPreviewTable/components/Body/index.d.ts +1 -0
  25. package/dist/DataPreviewTable/components/Body/index.js +35 -23
  26. package/dist/DataPreviewTable/components/Body/index.js.map +1 -1
  27. package/dist/DataPreviewTable/components/Header/index.d.ts +1 -0
  28. package/dist/DataPreviewTable/components/Header/index.js +36 -28
  29. package/dist/DataPreviewTable/components/Header/index.js.map +1 -1
  30. package/dist/DataPreviewTable/index.js +19 -2
  31. package/dist/DataPreviewTable/index.js.map +1 -1
  32. package/dist/Drawer/index.d.ts +4 -0
  33. package/dist/Drawer/index.js +93 -79
  34. package/dist/Drawer/index.js.map +1 -1
  35. package/dist/Dropdown/index.d.ts +1 -1
  36. package/dist/Dropdown/index.js +64 -13
  37. package/dist/Dropdown/index.js.map +1 -1
  38. package/dist/Form/FormItemContext.d.ts +1 -1
  39. package/dist/Form/FormItemContext.js.map +1 -1
  40. package/dist/Form/index.js +50 -7
  41. package/dist/Form/index.js.map +1 -1
  42. package/dist/IconButton/index.d.ts +2 -2
  43. package/dist/IconButton/index.js +9 -3
  44. package/dist/IconButton/index.js.map +1 -1
  45. package/dist/Input/components/Input/index.js +18 -8
  46. package/dist/Input/components/Input/index.js.map +1 -1
  47. package/dist/Input/components/TextArea/index.js +18 -7
  48. package/dist/Input/components/TextArea/index.js.map +1 -1
  49. package/dist/Input/privateSemanticOwner.d.ts +2 -0
  50. package/dist/Input/privateSemanticOwner.js +1 -0
  51. package/dist/InputNumber/index.js +16 -9
  52. package/dist/InputNumber/index.js.map +1 -1
  53. package/dist/InputNumber/type.d.ts +2 -2
  54. package/dist/LogicTree/components/LogicItem/index.d.ts +2 -1
  55. package/dist/LogicTree/components/LogicItem/index.js +13 -2
  56. package/dist/LogicTree/components/LogicItem/index.js.map +1 -1
  57. package/dist/LogicTree/index.js +2 -0
  58. package/dist/LogicTree/index.js.map +1 -1
  59. package/dist/MemberPicker/components/MemberSelection.d.ts +2 -0
  60. package/dist/MemberPicker/components/MemberSelection.js +15 -13
  61. package/dist/MemberPicker/components/MemberSelection.js.map +1 -1
  62. package/dist/MemberPicker/components/MultipleOption.js +12 -0
  63. package/dist/MemberPicker/components/MultipleOption.js.map +1 -1
  64. package/dist/MemberPicker/components/Panel.d.ts +2 -0
  65. package/dist/MemberPicker/components/Panel.js +11 -1
  66. package/dist/MemberPicker/components/Panel.js.map +1 -1
  67. package/dist/MemberPicker/components/PanelWrapper.js +2 -0
  68. package/dist/MemberPicker/components/PanelWrapper.js.map +1 -1
  69. package/dist/MemberPicker/components/SelectedMemberTags.js +14 -6
  70. package/dist/MemberPicker/components/SelectedMemberTags.js.map +1 -1
  71. package/dist/MemberPicker/components/SingleOption.js +12 -0
  72. package/dist/MemberPicker/components/SingleOption.js.map +1 -1
  73. package/dist/MemberPicker/components/UserGroupSelection.d.ts +3 -1
  74. package/dist/MemberPicker/components/UserGroupSelection.js +65 -42
  75. package/dist/MemberPicker/components/UserGroupSelection.js.map +1 -1
  76. package/dist/MemberPicker/index.js +134 -108
  77. package/dist/MemberPicker/index.js.map +1 -1
  78. package/dist/Menu/index.d.ts +8 -0
  79. package/dist/Menu/index.js +33 -3
  80. package/dist/Menu/index.js.map +1 -1
  81. package/dist/Modal/index.d.ts +4 -0
  82. package/dist/Modal/index.js +55 -66
  83. package/dist/Modal/index.js.map +1 -1
  84. package/dist/OverflowCount/index.js +10 -0
  85. package/dist/OverflowCount/index.js.map +1 -1
  86. package/dist/Pagination/index.js +1 -0
  87. package/dist/Pagination/index.js.map +1 -1
  88. package/dist/Popconfirm/index.js +9 -1
  89. package/dist/Popconfirm/index.js.map +1 -1
  90. package/dist/Popover/index.js +52 -1
  91. package/dist/Popover/index.js.map +1 -1
  92. package/dist/Progress/index.js +4 -0
  93. package/dist/Progress/index.js.map +1 -1
  94. package/dist/Radio/components/Group/index.d.ts +5 -1
  95. package/dist/Radio/components/Group/index.js +7 -2
  96. package/dist/Radio/components/Group/index.js.map +1 -1
  97. package/dist/Radio/components/Radio/index.js +26 -0
  98. package/dist/Radio/components/Radio/index.js.map +1 -1
  99. package/dist/Radio/interface/radio.d.ts +7 -0
  100. package/dist/Radio/interface/radioGroup.d.ts +2 -0
  101. package/dist/RenameInput/index.js +11 -0
  102. package/dist/RenameInput/index.js.map +1 -1
  103. package/dist/Select/BaseSelect.d.ts +3 -0
  104. package/dist/Select/BaseSelect.js +229 -32
  105. package/dist/Select/BaseSelect.js.map +1 -1
  106. package/dist/Select/SelectTrigger.d.ts +2 -0
  107. package/dist/Select/SelectTrigger.js +13 -5
  108. package/dist/Select/SelectTrigger.js.map +1 -1
  109. package/dist/Select/components/OptionCollection.d.ts +41 -0
  110. package/dist/Select/components/OptionCollection.js +124 -0
  111. package/dist/Select/components/OptionCollection.js.map +1 -0
  112. package/dist/Select/index.js +45 -3
  113. package/dist/Select/index.js.map +1 -1
  114. package/dist/Select/interface.d.ts +1 -1
  115. package/dist/Skeleton/index.js +1 -1
  116. package/dist/Skeleton/index.js.map +1 -1
  117. package/dist/Spin/index.d.ts +1 -1
  118. package/dist/Spin/index.js +22 -7
  119. package/dist/Spin/index.js.map +1 -1
  120. package/dist/Switch/index.d.ts +5 -0
  121. package/dist/Switch/index.js +15 -5
  122. package/dist/Switch/index.js.map +1 -1
  123. package/dist/Table/components/Header.js +0 -1
  124. package/dist/Table/components/Header.js.map +1 -1
  125. package/dist/Table/index.js +42 -27
  126. package/dist/Table/index.js.map +1 -1
  127. package/dist/Tabs/index.js +1 -0
  128. package/dist/Tabs/index.js.map +1 -1
  129. package/dist/Tag/index.js +20 -1
  130. package/dist/Tag/index.js.map +1 -1
  131. package/dist/Tooltip/index.js +34 -5
  132. package/dist/Tooltip/index.js.map +1 -1
  133. package/dist/Tour/index.js +13 -1
  134. package/dist/Tour/index.js.map +1 -1
  135. package/dist/Tree/Tree2.js +2 -0
  136. package/dist/Tree/Tree2.js.map +1 -1
  137. package/dist/_utils/dialogAccessibility.d.ts +17 -0
  138. package/dist/_utils/dialogAccessibility.js +110 -0
  139. package/dist/_utils/dialogAccessibility.js.map +1 -0
  140. package/dist/_utils/formControlSemanticOwner.d.ts +3 -0
  141. package/dist/_utils/formControlSemanticOwner.js +17 -0
  142. package/dist/_utils/formControlSemanticOwner.js.map +1 -0
  143. package/dist/_utils/overlayCoordinator.js +1 -11
  144. package/dist/_utils/overlayCoordinator.js.map +1 -1
  145. package/dist/aloudata-design.css +1 -1
  146. package/dist/governance/semantic.d.ts +1 -0
  147. package/dist/governance/semantic.js +2 -0
  148. package/dist/governance/semantic.json +1737 -0
  149. package/dist/theme/contract/baselineResolvedTokenValueManifest.d.ts +1 -1
  150. package/dist/theme/contract/darkResolvedTokenValueManifest.d.ts +1 -1
  151. package/dist/theme/contract/tokenOutputContract.js +1 -0
  152. package/dist/theme/contract/tokenOutputContract.js.map +1 -1
  153. package/dist/theme/generator/acceptedColorValues.d.ts +2 -1
  154. package/dist/theme/generator/baselineTokenValueDelivery.d.ts +9 -1
  155. package/dist/theme/generator/minimalAcceptedColorValues.d.ts +2 -2
  156. package/dist/theme/generator/neutralSourceResolver.d.ts +28 -0
  157. package/dist/theme/generator/neutralSourceResolver.js +2 -0
  158. package/dist/theme/generator/neutralSourceValues.d.ts +28 -0
  159. package/dist/theme/generator/neutralSourceValues.js +2 -0
  160. package/dist/theme/governance/semanticGovernanceContract.d.ts +91 -0
  161. package/dist/theme/governance/semanticGovernanceContract.js +342 -0
  162. package/dist/theme/governance/semanticGovernanceContract.js.map +1 -0
  163. package/dist/theme/index.d.ts +2 -0
  164. package/dist/theme/index.js +1 -0
  165. package/dist/theme/neutralSourceContract.d.ts +3 -0
  166. package/dist/theme/neutralSourceContract.js +11 -0
  167. package/dist/theme/neutralSourceContract.js.map +1 -0
  168. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.d.ts +1 -1
  169. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js +46 -45
  170. package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js.map +1 -1
  171. package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.d.ts +3 -0
  172. package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.js +2 -0
  173. package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.d.ts +3 -0
  174. package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.js +2 -0
  175. package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.d.ts +3 -0
  176. package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.js +2 -0
  177. package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.d.ts +3 -0
  178. package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.js +2 -0
  179. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.d.ts +1 -1
  180. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js +42 -41
  181. package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js.map +1 -1
  182. package/dist/theme/runtime/colorValueMode/index.js +2 -12
  183. package/dist/theme/runtime/colorValueMode/index.js.map +1 -1
  184. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.d.ts +2 -0
  185. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js +48 -0
  186. package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js.map +1 -0
  187. package/dist/theme/runtime/colorValueMode/registry.d.ts +1 -1
  188. package/dist/theme/runtime/colorValueMode/registry.js +2 -1
  189. package/dist/theme/runtime/colorValueMode/registry.js.map +1 -1
  190. package/dist/theme/runtime/initAldTheme.js +1 -3
  191. package/dist/theme/runtime/initAldTheme.js.map +1 -1
  192. package/dist/theme/runtime/neutralSource/index.d.ts +6 -0
  193. package/dist/theme/runtime/neutralSource/index.js +11 -0
  194. package/dist/theme/runtime/neutralSource/index.js.map +1 -0
  195. package/dist/theme/runtime/neutralSource.d.ts +2 -0
  196. package/package.json +12 -2
@@ -11,6 +11,8 @@ interface IProps {
11
11
  width: number;
12
12
  lockedIds: Array<TUserValue | TUserGroupValue>;
13
13
  filterItem?: (item: IUserGroup) => boolean;
14
+ searchValue?: string;
15
+ showSearch?: boolean;
14
16
  renderItem?: (item: IUserGroup, context: {
15
17
  isSelected: boolean;
16
18
  disabled: boolean;
@@ -19,5 +21,5 @@ interface IProps {
19
21
  originNode: React.ReactNode;
20
22
  }) => React.ReactNode;
21
23
  }
22
- declare const UserGroupSelection: ({ className, userGroupList, multiple, onChange, selectedUsersGroup: selectedUsersGroups, loading, width, lockedIds, filterItem, renderItem, }: IProps) => import("react/jsx-runtime").JSX.Element;
24
+ declare const UserGroupSelection: ({ className, userGroupList, multiple, onChange, selectedUsersGroup: selectedUsersGroups, loading, onSearchValueChange, width, lockedIds, filterItem, searchValue, showSearch, renderItem, }: IProps) => import("react/jsx-runtime").JSX.Element;
23
25
  export default UserGroupSelection;
@@ -11,57 +11,71 @@ import CustomSpin from "../../Spin/index.js";
11
11
  import { isUserGroup } from "../utils/getUsersWithUserId.js";
12
12
  import MultipleList from "./MultipleOption.js";
13
13
  import SingleOption from "./SingleOption.js";
14
- import { useCallback, useContext, useEffect, useState } from "react";
14
+ import { useContext, useEffect, useMemo, useState } from "react";
15
15
  import { jsx, jsxs } from "react/jsx-runtime";
16
16
  import _ from "lodash";
17
17
  //#region src/MemberPicker/components/UserGroupSelection.tsx
18
- var UserGroupSelection = ({ className, userGroupList, multiple, onChange, selectedUsersGroup: selectedUsersGroups, loading, width, lockedIds, filterItem, renderItem }) => {
18
+ var UserGroupSelection = ({ className, userGroupList, multiple, onChange, selectedUsersGroup: selectedUsersGroups, loading, onSearchValueChange, width, lockedIds, filterItem, searchValue = "", showSearch, renderItem }) => {
19
19
  const { locale } = useContext(LocaleContext);
20
20
  const t = getTranslator(locale);
21
21
  const { getNextLevelGroup } = useContext(GetUserListContext);
22
22
  const isAsync = !!getNextLevelGroup;
23
- const [searchKey, setSearchKey] = useState("");
24
23
  const [groupPath, setGroupPath] = useState([]);
25
- const [filterUserList, setFilterUserList] = useState([]);
26
- const getFilterUserList = useCallback(async () => {
27
- if (isAsync) return await getNextLevelGroup({
28
- parentGroupId: _.last(groupPath)?.groupId,
29
- keyword: searchKey
30
- });
31
- const normalizedKeyword = searchKey.trim().toLowerCase();
32
- return userGroupList.filter((userGroup) => {
33
- if (groupPath.length === 0) return !userGroup.parentId;
34
- return userGroup.parentId === _.last(groupPath)?.groupId;
35
- }).filter((group) => {
36
- if (!normalizedKeyword) return true;
37
- return group.name.toLowerCase().includes(normalizedKeyword);
24
+ const [asyncUserGroupList, setAsyncUserGroupList] = useState([]);
25
+ const parentGroupId = _.last(groupPath)?.groupId;
26
+ useEffect(() => {
27
+ if (!getNextLevelGroup) return;
28
+ let ignore = false;
29
+ getNextLevelGroup({
30
+ parentGroupId,
31
+ keyword: searchValue
32
+ }).then((userGroups) => {
33
+ if (!ignore) setAsyncUserGroupList(userGroups);
38
34
  });
35
+ return () => {
36
+ ignore = true;
37
+ };
39
38
  }, [
40
- isAsync,
41
- searchKey,
42
- userGroupList,
43
39
  getNextLevelGroup,
44
- groupPath
40
+ parentGroupId,
41
+ searchValue
45
42
  ]);
46
- useEffect(() => {
47
- getFilterUserList().then((userGroups) => {
48
- setFilterUserList(userGroups.filter((userGroup) => {
49
- if (filterItem) return filterItem(userGroup);
50
- return true;
51
- }));
43
+ const filterUserList = useMemo(() => {
44
+ let currentLevelGroups = asyncUserGroupList;
45
+ if (!isAsync) {
46
+ currentLevelGroups = userGroupList.filter((userGroup) => {
47
+ if (groupPath.length === 0) return !userGroup.parentId;
48
+ return userGroup.parentId === parentGroupId;
49
+ });
50
+ const normalizedKeyword = searchValue.trim().toLowerCase();
51
+ currentLevelGroups = currentLevelGroups.filter((group) => {
52
+ if (!normalizedKeyword) return true;
53
+ return group.name.toLowerCase().includes(normalizedKeyword);
54
+ });
55
+ }
56
+ return currentLevelGroups.filter((userGroup) => {
57
+ if (filterItem) return filterItem(userGroup);
58
+ return true;
52
59
  });
53
- }, [filterItem, getFilterUserList]);
60
+ }, [
61
+ asyncUserGroupList,
62
+ filterItem,
63
+ groupPath.length,
64
+ isAsync,
65
+ parentGroupId,
66
+ searchValue,
67
+ userGroupList
68
+ ]);
54
69
  return /* @__PURE__ */ jsxs("div", {
55
70
  className: cn(className, "ald-member-picker-member-list-wrap"),
56
71
  children: [
57
- /* @__PURE__ */ jsx(Input, {
72
+ showSearch && /* @__PURE__ */ jsx(Input, {
58
73
  prefix: /* @__PURE__ */ jsx(Memo$1, { size: 16 }),
59
74
  className: "ald-member-picker-search-input",
75
+ "aria-label": t.InputSearch.search,
60
76
  autoFocus: true,
61
- value: searchKey,
62
- onChange: (e) => {
63
- setSearchKey(e.target.value);
64
- }
77
+ value: searchValue,
78
+ onChange: (event) => onSearchValueChange?.(event.target.value)
65
79
  }),
66
80
  userGroupList.length === 0 && !loading && /* @__PURE__ */ jsx(Empty, {
67
81
  title: t.MemberPicker.noData,
@@ -106,6 +120,9 @@ var UserGroupSelection = ({ className, userGroupList, multiple, onChange, select
106
120
  className: cn("ald-member-picker-member-list", { "ald-member-picker-member-list-null": userGroupList.length === 0 && !loading }),
107
121
  innerClassName: "ald-member-picker-member-scroll",
108
122
  children: /* @__PURE__ */ jsx("div", {
123
+ role: "listbox",
124
+ "aria-label": "Groups",
125
+ "aria-multiselectable": multiple || void 0,
109
126
  className: "ald-member-picker-member-list-inner",
110
127
  style: {
111
128
  width: multiple ? width : void 0,
@@ -120,7 +137,7 @@ var UserGroupSelection = ({ className, userGroupList, multiple, onChange, select
120
137
  const hasNextLevel = userGroupList.some((group) => group.parentId === userGroup.groupId) || isAsync;
121
138
  const onNextLevel = () => {
122
139
  setGroupPath((prev) => [...prev, userGroup]);
123
- setSearchKey("");
140
+ onSearchValueChange?.("");
124
141
  };
125
142
  const originNode = multiple ? /* @__PURE__ */ jsx(MultipleList, {
126
143
  user: userGroup,
@@ -141,15 +158,21 @@ var UserGroupSelection = ({ className, userGroupList, multiple, onChange, select
141
158
  hasNextLevel,
142
159
  onNextLevel
143
160
  }, userGroup.groupId);
144
- if (renderItem) return /* @__PURE__ */ jsx("div", { children: renderItem(userGroup, {
145
- isSelected,
146
- disabled,
147
- onClick: () => {
148
- if (isUserGroup(userGroup) && !disabled) onChange(!isSelected, userGroup);
149
- },
150
- onNextLevel: hasNextLevel ? onNextLevel : void 0,
151
- originNode
152
- }) }, userGroup.groupId);
161
+ if (renderItem) return /* @__PURE__ */ jsx("div", {
162
+ role: "option",
163
+ id: `ald-member-picker-option-${userGroup.groupId}`,
164
+ "aria-selected": isSelected,
165
+ "aria-disabled": disabled || void 0,
166
+ children: renderItem(userGroup, {
167
+ isSelected,
168
+ disabled,
169
+ onClick: () => {
170
+ if (isUserGroup(userGroup) && !disabled) onChange(!isSelected, userGroup);
171
+ },
172
+ onNextLevel: hasNextLevel ? onNextLevel : void 0,
173
+ originNode
174
+ })
175
+ }, userGroup.groupId);
153
176
  return originNode;
154
177
  })
155
178
  })
@@ -1 +1 @@
1
- {"version":3,"file":"UserGroupSelection.js","names":[],"sources":["../../../src/MemberPicker/components/UserGroupSelection.tsx"],"sourcesContent":["import Breadcrumb from '../../Breadcrumb';\nimport { cn } from '../../lib/utils';\nimport _ from 'lodash';\nimport React, { useCallback, useContext, useEffect, useState } from 'react';\nimport GetUserListContext, {\n IUserGroup,\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport Empty from '../../Empty';\nimport { ChevronLeftLine, SearchLine } from '../../Icon';\nimport Input from '../../Input';\nimport ScrollArea from '../../ScrollArea';\nimport Spin from '../../Spin';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { isUserGroup } from '../utils/getUsersWithUserId';\nimport MultipleOption from './MultipleOption';\nimport SingleOption from './SingleOption';\n\ninterface IProps {\n className?: string;\n userGroupList: IUserGroup[];\n multiple?: boolean;\n onChange: (selected: boolean, userGroup: IUserGroup) => void;\n selectedUsersGroup: IUserGroup[];\n loading: boolean;\n onSearchValueChange?: (value: string) => void;\n width: number;\n lockedIds: Array<TUserValue | TUserGroupValue>;\n filterItem?: (item: IUserGroup) => boolean;\n renderItem?: (\n item: IUserGroup,\n context: {\n isSelected: boolean;\n disabled: boolean;\n onClick: () => void;\n onNextLevel?: () => void;\n originNode: React.ReactNode;\n },\n ) => React.ReactNode;\n}\n\nconst UserGroupSelection = ({\n className,\n userGroupList,\n multiple,\n onChange,\n selectedUsersGroup: selectedUsersGroups,\n loading,\n width,\n lockedIds,\n filterItem,\n renderItem,\n}: IProps) => {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const { getNextLevelGroup } = useContext(GetUserListContext);\n\n const isAsync = !!getNextLevelGroup;\n\n const [searchKey, setSearchKey] = useState('');\n const [groupPath, setGroupPath] = useState<IUserGroup[]>([]);\n\n const [filterUserList, setFilterUserList] = useState<IUserGroup[]>([]);\n\n const getFilterUserList = useCallback(async () => {\n if (isAsync) {\n const nextLevelGroup = await getNextLevelGroup({\n parentGroupId: _.last(groupPath)?.groupId,\n keyword: searchKey,\n });\n return nextLevelGroup;\n }\n\n const normalizedKeyword = searchKey.trim().toLowerCase();\n\n const currentLevelGroups = userGroupList.filter((userGroup) => {\n if (groupPath.length === 0) {\n return !userGroup.parentId;\n }\n\n return userGroup.parentId === _.last(groupPath)?.groupId;\n });\n\n return currentLevelGroups.filter((group) => {\n if (!normalizedKeyword) {\n return true;\n }\n\n return group.name.toLowerCase().includes(normalizedKeyword);\n });\n }, [isAsync, searchKey, userGroupList, getNextLevelGroup, groupPath]);\n\n useEffect(() => {\n getFilterUserList().then((userGroups) => {\n setFilterUserList(\n userGroups.filter((userGroup) => {\n if (filterItem) {\n return filterItem(userGroup);\n }\n return true;\n }),\n );\n });\n }, [filterItem, getFilterUserList]);\n\n return (\n <div className={cn(className, 'ald-member-picker-member-list-wrap')}>\n <Input\n prefix={<SearchLine size={16} />}\n className={'ald-member-picker-search-input'}\n autoFocus={true}\n value={searchKey}\n onChange={(e) => {\n setSearchKey(e.target.value);\n }}\n ></Input>\n {userGroupList.length === 0 && !loading && (\n <Empty\n title={t.MemberPicker.noData}\n size=\"small\"\n image={Empty.PRESENTED_IMAGE_SEARCH}\n className=\"ald-member-picker-member-list-empty\"\n />\n )}\n {groupPath.length !== 0 && (\n <ScrollArea className=\"ald-member-picker-breadcrumb-scroll\">\n <Breadcrumb className=\"ald-member-picker-breadcrumb\">\n <Breadcrumb.Item\n className=\"ald-member-picker-breadcrumb-item\"\n onClick={() => {\n setGroupPath([]);\n }}\n >\n <div className=\"ald-member-picker-breadcrumb-item-inner\">\n <ChevronLeftLine size={16} />\n {t.MemberPicker.userGroups}\n </div>\n </Breadcrumb.Item>\n {groupPath.map((group) => (\n <Breadcrumb.Item\n className=\"ald-member-picker-breadcrumb-item\"\n key={group.groupId}\n onClick={() => {\n setGroupPath((groups) => {\n const groupIndex = groups.findIndex(\n (tempGroup) => tempGroup.groupId === group.groupId,\n );\n return groups.filter(\n (tempGroup, index) => index <= groupIndex,\n );\n });\n }}\n >\n <div className=\"ald-member-picker-breadcrumb-item-inner\">\n {group.name}\n </div>\n </Breadcrumb.Item>\n ))}\n </Breadcrumb>\n </ScrollArea>\n )}\n <Spin\n tip=\"Loading\"\n spinning={loading}\n size=\"small\"\n className=\"ald-member-picker-user-list\"\n >\n <ScrollArea\n className={cn('ald-member-picker-member-list', {\n 'ald-member-picker-member-list-null':\n userGroupList.length === 0 && !loading,\n })}\n innerClassName=\"ald-member-picker-member-scroll\"\n >\n <div\n className=\"ald-member-picker-member-list-inner\"\n style={{ width: multiple ? width : undefined, overflow: 'hidden' }}\n >\n {filterUserList.map((userGroup) => {\n const isSelected = selectedUsersGroups.some(\n (selectUserGroup) =>\n selectUserGroup.groupId === userGroup.groupId,\n );\n\n const index = _.findIndex(lockedIds, {\n groupId: userGroup.groupId,\n type: userGroup.type,\n });\n const disabled = index !== -1;\n\n const hasNextLevel =\n userGroupList.some(\n (group) => group.parentId === userGroup.groupId,\n ) || isAsync;\n const onNextLevel = () => {\n setGroupPath((prev) => [...prev, userGroup]);\n setSearchKey('');\n };\n\n const originNode = multiple ? (\n <MultipleOption\n key={userGroup.groupId}\n user={userGroup}\n disabled={disabled}\n selected={isSelected}\n onChange={(selected, userGroup) => {\n if (isUserGroup(userGroup)) {\n onChange(selected, userGroup);\n }\n }}\n hasNextLevel={hasNextLevel}\n onNextLevel={onNextLevel}\n ></MultipleOption>\n ) : (\n <SingleOption\n key={userGroup.groupId}\n user={userGroup}\n disabled={disabled}\n selected={isSelected}\n onChange={(selected, userGroup) => {\n if (isUserGroup(userGroup)) {\n onChange(selected, userGroup);\n }\n }}\n hasNextLevel={hasNextLevel}\n onNextLevel={onNextLevel}\n ></SingleOption>\n );\n\n if (renderItem) {\n return (\n <div key={userGroup.groupId}>\n {renderItem(userGroup, {\n isSelected,\n disabled,\n onClick: () => {\n if (isUserGroup(userGroup) && !disabled) {\n onChange(!isSelected, userGroup);\n }\n },\n onNextLevel: hasNextLevel ? onNextLevel : undefined,\n originNode,\n })}\n </div>\n );\n }\n\n return originNode;\n })}\n </div>\n </ScrollArea>\n </Spin>\n </div>\n );\n};\n\nexport default UserGroupSelection;\n"],"mappings":"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"}
1
+ {"version":3,"file":"UserGroupSelection.js","names":[],"sources":["../../../src/MemberPicker/components/UserGroupSelection.tsx"],"sourcesContent":["import Breadcrumb from '../../Breadcrumb';\nimport { cn } from '../../lib/utils';\nimport _ from 'lodash';\nimport React, { useContext, useEffect, useMemo, useState } from 'react';\nimport GetUserListContext, {\n IUserGroup,\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport Empty from '../../Empty';\nimport { ChevronLeftLine, SearchLine } from '../../Icon';\nimport Input from '../../Input';\nimport ScrollArea from '../../ScrollArea';\nimport Spin from '../../Spin';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { isUserGroup } from '../utils/getUsersWithUserId';\nimport MultipleOption from './MultipleOption';\nimport SingleOption from './SingleOption';\n\ninterface IProps {\n className?: string;\n userGroupList: IUserGroup[];\n multiple?: boolean;\n onChange: (selected: boolean, userGroup: IUserGroup) => void;\n selectedUsersGroup: IUserGroup[];\n loading: boolean;\n onSearchValueChange?: (value: string) => void;\n width: number;\n lockedIds: Array<TUserValue | TUserGroupValue>;\n filterItem?: (item: IUserGroup) => boolean;\n searchValue?: string;\n showSearch?: boolean;\n renderItem?: (\n item: IUserGroup,\n context: {\n isSelected: boolean;\n disabled: boolean;\n onClick: () => void;\n onNextLevel?: () => void;\n originNode: React.ReactNode;\n },\n ) => React.ReactNode;\n}\n\nconst UserGroupSelection = ({\n className,\n userGroupList,\n multiple,\n onChange,\n selectedUsersGroup: selectedUsersGroups,\n loading,\n onSearchValueChange,\n width,\n lockedIds,\n filterItem,\n searchValue = '',\n showSearch,\n renderItem,\n}: IProps) => {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const { getNextLevelGroup } = useContext(GetUserListContext);\n\n const isAsync = !!getNextLevelGroup;\n\n const [groupPath, setGroupPath] = useState<IUserGroup[]>([]);\n const [asyncUserGroupList, setAsyncUserGroupList] = useState<IUserGroup[]>(\n [],\n );\n const parentGroupId = _.last(groupPath)?.groupId;\n\n useEffect(() => {\n if (!getNextLevelGroup) {\n return;\n }\n\n let ignore = false;\n getNextLevelGroup({\n parentGroupId,\n keyword: searchValue,\n }).then((userGroups) => {\n if (!ignore) {\n setAsyncUserGroupList(userGroups);\n }\n });\n\n return () => {\n ignore = true;\n };\n }, [getNextLevelGroup, parentGroupId, searchValue]);\n\n const filterUserList = useMemo(() => {\n let currentLevelGroups = asyncUserGroupList;\n\n if (!isAsync) {\n currentLevelGroups = userGroupList.filter((userGroup) => {\n if (groupPath.length === 0) {\n return !userGroup.parentId;\n }\n\n return userGroup.parentId === parentGroupId;\n });\n\n const normalizedKeyword = searchValue.trim().toLowerCase();\n currentLevelGroups = currentLevelGroups.filter((group) => {\n if (!normalizedKeyword) {\n return true;\n }\n\n return group.name.toLowerCase().includes(normalizedKeyword);\n });\n }\n\n return currentLevelGroups.filter((userGroup) => {\n if (filterItem) {\n return filterItem(userGroup);\n }\n\n return true;\n });\n }, [\n asyncUserGroupList,\n filterItem,\n groupPath.length,\n isAsync,\n parentGroupId,\n searchValue,\n userGroupList,\n ]);\n\n return (\n <div className={cn(className, 'ald-member-picker-member-list-wrap')}>\n {showSearch && (\n <Input\n prefix={<SearchLine size={16} />}\n className=\"ald-member-picker-search-input\"\n aria-label={t.InputSearch.search}\n autoFocus\n value={searchValue}\n onChange={(event) => onSearchValueChange?.(event.target.value)}\n />\n )}\n {userGroupList.length === 0 && !loading && (\n <Empty\n title={t.MemberPicker.noData}\n size=\"small\"\n image={Empty.PRESENTED_IMAGE_SEARCH}\n className=\"ald-member-picker-member-list-empty\"\n />\n )}\n {groupPath.length !== 0 && (\n <ScrollArea className=\"ald-member-picker-breadcrumb-scroll\">\n <Breadcrumb className=\"ald-member-picker-breadcrumb\">\n <Breadcrumb.Item\n className=\"ald-member-picker-breadcrumb-item\"\n onClick={() => {\n setGroupPath([]);\n }}\n >\n <div className=\"ald-member-picker-breadcrumb-item-inner\">\n <ChevronLeftLine size={16} />\n {t.MemberPicker.userGroups}\n </div>\n </Breadcrumb.Item>\n {groupPath.map((group) => (\n <Breadcrumb.Item\n className=\"ald-member-picker-breadcrumb-item\"\n key={group.groupId}\n onClick={() => {\n setGroupPath((groups) => {\n const groupIndex = groups.findIndex(\n (tempGroup) => tempGroup.groupId === group.groupId,\n );\n return groups.filter(\n (tempGroup, index) => index <= groupIndex,\n );\n });\n }}\n >\n <div className=\"ald-member-picker-breadcrumb-item-inner\">\n {group.name}\n </div>\n </Breadcrumb.Item>\n ))}\n </Breadcrumb>\n </ScrollArea>\n )}\n <Spin\n tip=\"Loading\"\n spinning={loading}\n size=\"small\"\n className=\"ald-member-picker-user-list\"\n >\n <ScrollArea\n className={cn('ald-member-picker-member-list', {\n 'ald-member-picker-member-list-null':\n userGroupList.length === 0 && !loading,\n })}\n innerClassName=\"ald-member-picker-member-scroll\"\n >\n <div\n role=\"listbox\"\n aria-label=\"Groups\"\n aria-multiselectable={multiple || undefined}\n className=\"ald-member-picker-member-list-inner\"\n style={{ width: multiple ? width : undefined, overflow: 'hidden' }}\n >\n {filterUserList.map((userGroup) => {\n const isSelected = selectedUsersGroups.some(\n (selectUserGroup) =>\n selectUserGroup.groupId === userGroup.groupId,\n );\n\n const index = _.findIndex(lockedIds, {\n groupId: userGroup.groupId,\n type: userGroup.type,\n });\n const disabled = index !== -1;\n\n const hasNextLevel =\n userGroupList.some(\n (group) => group.parentId === userGroup.groupId,\n ) || isAsync;\n const onNextLevel = () => {\n setGroupPath((prev) => [...prev, userGroup]);\n onSearchValueChange?.('');\n };\n\n const originNode = multiple ? (\n <MultipleOption\n key={userGroup.groupId}\n user={userGroup}\n disabled={disabled}\n selected={isSelected}\n onChange={(selected, userGroup) => {\n if (isUserGroup(userGroup)) {\n onChange(selected, userGroup);\n }\n }}\n hasNextLevel={hasNextLevel}\n onNextLevel={onNextLevel}\n ></MultipleOption>\n ) : (\n <SingleOption\n key={userGroup.groupId}\n user={userGroup}\n disabled={disabled}\n selected={isSelected}\n onChange={(selected, userGroup) => {\n if (isUserGroup(userGroup)) {\n onChange(selected, userGroup);\n }\n }}\n hasNextLevel={hasNextLevel}\n onNextLevel={onNextLevel}\n ></SingleOption>\n );\n\n if (renderItem) {\n return (\n <div\n key={userGroup.groupId}\n role=\"option\"\n id={`ald-member-picker-option-${userGroup.groupId}`}\n aria-selected={isSelected}\n aria-disabled={disabled || undefined}\n >\n {renderItem(userGroup, {\n isSelected,\n disabled,\n onClick: () => {\n if (isUserGroup(userGroup) && !disabled) {\n onChange(!isSelected, userGroup);\n }\n },\n onNextLevel: hasNextLevel ? onNextLevel : undefined,\n originNode,\n })}\n </div>\n );\n }\n\n return originNode;\n })}\n </div>\n </ScrollArea>\n </Spin>\n </div>\n );\n};\n\nexport default UserGroupSelection;\n"],"mappings":"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"}
@@ -7,10 +7,11 @@ import Select_default from "../Select/index.js";
7
7
  /* empty css */
8
8
  import message from "../message/index.js";
9
9
  import { EMemberPicker } from "./interface.js";
10
+ import { getId } from "./utils/index.js";
10
11
  import { isUser, isUserGroup } from "./utils/getUsersWithUserId.js";
11
12
  import Panel from "./components/Panel.js";
12
13
  import PanelWrapper from "./components/PanelWrapper.js";
13
- import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
14
+ import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
14
15
  import { jsx, jsxs } from "react/jsx-runtime";
15
16
  import _ from "lodash";
16
17
  import { usePrevious, useRequest } from "ahooks";
@@ -27,6 +28,7 @@ var Component = (props) => {
27
28
  const [searchUserList, setSearchUserList] = useState([]);
28
29
  const [searchString, setSearchString] = useState("");
29
30
  const [dropdownContentWidth, setDropdownContentWidth] = useState(dropdownWidth);
31
+ const selectOwnerRef = useRef(null);
30
32
  const panelWidth = dropdownWidth ?? (multiple ? DEFAULT_MULTIPLE_DROPDOWN_WIDTH : true);
31
33
  const triggerRef = useRef(null);
32
34
  const onSearchValueChange = useCallback((v) => {
@@ -150,9 +152,6 @@ var Component = (props) => {
150
152
  setDropdownOpen(open);
151
153
  onOpenChange?.(open);
152
154
  }, [onOpenChange]);
153
- const panelKey = useMemo(() => {
154
- if (dropdownOpen) return _.sampleSize("abcdefghijklmnopqrstuvwxyz0123456789", 8).join("");
155
- }, [dropdownOpen]);
156
155
  const mode = useMemo(() => {
157
156
  if (multiple === true) {
158
157
  if (typeof propsMode === "object") return {
@@ -168,115 +167,142 @@ var Component = (props) => {
168
167
  return multiple ? multiple : propsMode;
169
168
  }, [multiple, propsMode]);
170
169
  const selectOpen = typeof open === "boolean" ? open : dropdownOpen;
171
- return /* @__PURE__ */ jsx(Select_default, {
172
- prefix: propPrefix,
173
- ...restProps,
174
- "data-testid": dataTestId,
175
- "aria-label": ariaLabel,
176
- size,
177
- className: cn("ald-member-picker-select", className),
178
- value: selectedUserList.map((item) => {
179
- if (item.type === EUserType.USER_GROUP) return item.groupId;
180
- else return item.userId;
181
- }),
182
- onChange: (value) => {
183
- if (_.isEmpty(value)) {
184
- setSelectedUserList([]);
185
- if (multiple) onChange?.([]);
186
- else onChange?.();
187
- } else {
188
- const valueList = Array.isArray(value) ? value : [value];
189
- if (multiple) {
190
- const users = valueList.map((item) => {
191
- return totalUserList.find((user) => {
192
- if (user.type === EUserType.USER) return user.userId === item;
193
- return user.groupId === item;
194
- });
195
- }).filter(Boolean);
196
- setSelectedUserList(users);
197
- onChange?.(users);
170
+ const listboxId = `ald-member-picker-listbox-${React.useId().replace(/:/g, "")}`;
171
+ const activeMember = totalUserList[0];
172
+ const activeMemberId = activeMember ? `ald-member-picker-option-${getId(activeMember)}` : void 0;
173
+ useEffect(() => {
174
+ const owner = selectOwnerRef.current?.querySelector("[role=\"combobox\"], input");
175
+ if (!owner) return;
176
+ owner.setAttribute("aria-controls", listboxId);
177
+ if (selectOpen && activeMemberId) owner.setAttribute("aria-activedescendant", activeMemberId);
178
+ else owner.removeAttribute("aria-activedescendant");
179
+ }, [
180
+ activeMemberId,
181
+ listboxId,
182
+ selectOpen
183
+ ]);
184
+ return /* @__PURE__ */ jsx("div", {
185
+ ref: selectOwnerRef,
186
+ style: { display: "contents" },
187
+ children: /* @__PURE__ */ jsx(Select_default, {
188
+ prefix: propPrefix,
189
+ ...restProps,
190
+ "data-testid": dataTestId,
191
+ "aria-label": ariaLabel,
192
+ showSearch: true,
193
+ searchValue: searchString,
194
+ onSearch: onSearchValueChange,
195
+ "aria-controls": listboxId,
196
+ "aria-activedescendant": selectOpen ? activeMemberId : void 0,
197
+ size,
198
+ className: cn("ald-member-picker-select", className),
199
+ value: selectedUserList.map((item) => {
200
+ if (item.type === EUserType.USER_GROUP) return item.groupId;
201
+ else return item.userId;
202
+ }),
203
+ onChange: (value) => {
204
+ if (_.isEmpty(value)) {
205
+ setSelectedUserList([]);
206
+ if (multiple) onChange?.([]);
207
+ else onChange?.();
198
208
  } else {
199
- const user = totalUserList.find((user) => {
200
- if (user.type === EUserType.USER) return user.userId === value;
201
- return user.groupId === value;
202
- });
203
- if (user) {
204
- setSelectedUserList([user]);
205
- onChange?.(user);
209
+ const valueList = Array.isArray(value) ? value : [value];
210
+ if (multiple) {
211
+ const users = valueList.map((item) => {
212
+ return totalUserList.find((user) => {
213
+ if (user.type === EUserType.USER) return user.userId === item;
214
+ return user.groupId === item;
215
+ });
216
+ }).filter(Boolean);
217
+ setSelectedUserList(users);
218
+ onChange?.(users);
206
219
  } else {
207
- setSelectedUserList([]);
208
- onChange?.();
220
+ const user = totalUserList.find((user) => {
221
+ if (user.type === EUserType.USER) return user.userId === value;
222
+ return user.groupId === value;
223
+ });
224
+ if (user) {
225
+ setSelectedUserList([user]);
226
+ onChange?.(user);
227
+ } else {
228
+ setSelectedUserList([]);
229
+ onChange?.();
230
+ }
209
231
  }
210
232
  }
233
+ },
234
+ disabled,
235
+ allowClear,
236
+ onClear: () => {
237
+ setSelectedUserList([]);
238
+ if (multiple) onChange?.([]);
239
+ else onChange?.();
240
+ onClear?.();
241
+ },
242
+ popupClassName: cn("ald-member-picker-popup", allowOverlap && "ald-member-picker-popup-adaptive", props.popupClassName),
243
+ mode,
244
+ options: selectedUserList.map((item) => {
245
+ if (item.type === EUserType.USER_GROUP) return {
246
+ label: item.name || item.groupId,
247
+ value: item.groupId,
248
+ tag: /* @__PURE__ */ jsxs("div", {
249
+ className: "ald-member-picker-tag",
250
+ children: [/* @__PURE__ */ jsx(Avatar, {
251
+ type: "team",
252
+ size: 20,
253
+ children: item.name || item.groupId
254
+ }), item.name || item.groupId]
255
+ })
256
+ };
257
+ return {
258
+ label: item.nickname || item.name || item.userId,
259
+ value: item.userId,
260
+ tag: /* @__PURE__ */ jsxs("div", {
261
+ className: "ald-member-picker-tag",
262
+ children: [/* @__PURE__ */ jsx(Avatar, {
263
+ size: 20,
264
+ src: item.photo,
265
+ type: item.type === EUserType.USER ? "user" : "team",
266
+ children: item.nickname || item.name || item.userId
267
+ }), item.nickname || item.name || item.userId]
268
+ })
269
+ };
270
+ }),
271
+ optionLabelProp: multiple ? "label" : "tag",
272
+ open: selectOpen,
273
+ onOpenChange: onDropdownOpenChange,
274
+ popupMatchSelectWidth: panelWidth,
275
+ allowOverlap,
276
+ placeholder,
277
+ dropdownRender: () => {
278
+ return /* @__PURE__ */ jsx("div", {
279
+ ref: triggerRef,
280
+ id: listboxId,
281
+ role: "group",
282
+ "aria-label": "Member selection results",
283
+ className: cn({ "ald-member-picker-popup-body": allowOverlap }),
284
+ children: /* @__PURE__ */ jsx(Panel, {
285
+ type,
286
+ footer,
287
+ value: selectedUserList,
288
+ dataList: totalUserList,
289
+ lockedIds,
290
+ multiple: !!multiple,
291
+ loading,
292
+ dropdownWidth: dropdownContentWidth,
293
+ onSearchValueChange,
294
+ onChange: onSelectedChange,
295
+ onCancel: () => {
296
+ onCancel?.();
297
+ setDropdownOpen(false);
298
+ },
299
+ renderItem,
300
+ renderSelectedTag,
301
+ searchValue: searchString
302
+ })
303
+ });
211
304
  }
212
- },
213
- disabled,
214
- allowClear,
215
- onClear: () => {
216
- setSelectedUserList([]);
217
- if (multiple) onChange?.([]);
218
- else onChange?.();
219
- onClear?.();
220
- },
221
- popupClassName: cn("ald-member-picker-popup", allowOverlap && "ald-member-picker-popup-adaptive", props.popupClassName),
222
- mode,
223
- options: selectedUserList.map((item) => {
224
- if (item.type === EUserType.USER_GROUP) return {
225
- label: item.name || item.groupId,
226
- value: item.groupId,
227
- tag: /* @__PURE__ */ jsxs("div", {
228
- className: "ald-member-picker-tag",
229
- children: [/* @__PURE__ */ jsx(Avatar, {
230
- type: "team",
231
- size: 20,
232
- children: item.name || item.groupId
233
- }), item.name || item.groupId]
234
- })
235
- };
236
- return {
237
- label: item.nickname || item.name || item.userId,
238
- value: item.userId,
239
- tag: /* @__PURE__ */ jsxs("div", {
240
- className: "ald-member-picker-tag",
241
- children: [/* @__PURE__ */ jsx(Avatar, {
242
- size: 20,
243
- src: item.photo,
244
- type: item.type === EUserType.USER ? "user" : "team",
245
- children: item.nickname || item.name || item.userId
246
- }), item.nickname || item.name || item.userId]
247
- })
248
- };
249
- }),
250
- optionLabelProp: multiple ? "label" : "tag",
251
- open: selectOpen,
252
- onOpenChange: onDropdownOpenChange,
253
- popupMatchSelectWidth: panelWidth,
254
- allowOverlap,
255
- placeholder,
256
- dropdownRender: () => {
257
- return /* @__PURE__ */ jsx("div", {
258
- ref: triggerRef,
259
- className: cn({ "ald-member-picker-popup-body": allowOverlap }),
260
- children: /* @__PURE__ */ jsx(Panel, {
261
- type,
262
- footer,
263
- value: selectedUserList,
264
- dataList: totalUserList,
265
- lockedIds,
266
- multiple: !!multiple,
267
- loading,
268
- dropdownWidth: dropdownContentWidth,
269
- onSearchValueChange,
270
- onChange: onSelectedChange,
271
- onCancel: () => {
272
- onCancel?.();
273
- setDropdownOpen(false);
274
- },
275
- renderItem,
276
- renderSelectedTag
277
- }, panelKey)
278
- });
279
- }
305
+ })
280
306
  });
281
307
  };
282
308
  var MemberSelector = Component;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/MemberPicker/index.tsx"],"sourcesContent":["import { usePrevious, useRequest } from 'ahooks';\nimport { cn } from '../lib/utils';\nimport _ from 'lodash';\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport Avatar from '../Avatar';\nimport ConfigProvider from '../ConfigProvider';\nimport './member-picker.css';\nimport {\n EUserType,\n IUser,\n IUserGroup,\n TUser,\n} from '../ConfigProvider/getUserList';\nimport { LocaleContext, getTranslator } from '../locale/default';\nimport message from '../message';\nimport Panel from './components/Panel';\nimport MemberPanel from './components/PanelWrapper';\nimport {\n EMemberPicker,\n IMemberPickerProps,\n TUserGroupValue,\n TUserValue,\n} from './interface';\nimport { isUser, isUserGroup } from './utils/getUsersWithUserId';\nimport Select from '../Select';\nimport { Mode } from '../Select/BaseSelect';\n\nconst DEFAULT_MULTIPLE_DROPDOWN_WIDTH = 480;\n\nconst Component: React.FC<IMemberPickerProps> = (props) => {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const {\n value,\n type = EMemberPicker.USER,\n onChange,\n multiple,\n dropdownWidth,\n open,\n onOpenChange,\n placeholder = t.MemberPicker.select,\n className,\n allowClear,\n disabled,\n onClear,\n size,\n prefix: propPrefix,\n lockedIds = [],\n footer,\n onCancel,\n filterItem,\n mode: propsMode,\n renderItem,\n renderSelectedTag,\n 'data-testid': dataTestId,\n 'aria-label': ariaLabel,\n ...restProps\n } = props;\n const allowOverlap = props.allowOverlap ?? false;\n const { getUsersByIds, getUsersByKeywords } = ConfigProvider.useGetUserList();\n const [selectedUserList, setSelectedUserList] = useState<TUser>([]);\n const prevValue = usePrevious(value);\n const [searchUserList, setSearchUserList] = useState<TUser>([]);\n const [searchString, setSearchString] = useState<string>('');\n const [dropdownContentWidth, setDropdownContentWidth] =\n useState(dropdownWidth);\n // 单选默认浮窗跟触发器等宽(true),调用方传 dropdownWidth 时用具体数字;\n // 多选默认 480,单条记录只有 头像+nickname 时触发器太窄装不下选中标签,故固定值。\n const panelWidth: number | boolean =\n dropdownWidth ?? (multiple ? DEFAULT_MULTIPLE_DROPDOWN_WIDTH : true);\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const onSearchValueChange = useCallback((v: string) => {\n setSearchString(v);\n }, []);\n const [dropdownOpen, setDropdownOpen] = useState<boolean>(!!open);\n const queryByKeywords = useMemo(() => {\n if (getUsersByKeywords) {\n return getUsersByKeywords;\n }\n\n return (_params = {}) =>\n Promise.reject({\n message: t.MemberPicker.pleaseConfigGetUserByKeywordsMethod,\n });\n }, [getUsersByKeywords, t.MemberPicker.pleaseConfigGetUserByKeywordsMethod]);\n const queryByIds = useMemo(() => {\n if (getUsersByIds) {\n return getUsersByIds;\n }\n\n return (_params = {}) =>\n Promise.reject({\n message: t.MemberPicker.pleaseConfigGetUserByIdsMethod,\n });\n }, [getUsersByIds, t.MemberPicker.pleaseConfigGetUserByIdsMethod]);\n const { loading, run } = useRequest(() => queryByKeywords(searchString), {\n refreshDeps: [searchString],\n manual: true,\n cacheKey: 'member-selector',\n cacheTime: 1000 * 60 * 2, // 2分钟内不重复请求\n onSuccess: (result) => {\n setSearchUserList(result);\n },\n onError: (error) => {\n message.error(error.message);\n },\n });\n\n const totalUserList: TUser = useMemo(() => {\n const totalUsers = searchUserList.concat(\n selectedUserList.filter((item) => {\n const name =\n (item.type === EUserType.USER ? item.nickname : item.name) || '';\n\n return name.toUpperCase().includes(searchString.trim().toUpperCase());\n }),\n );\n\n return _.uniqBy(totalUsers, (data: IUser | IUserGroup) => {\n if (data.type === EUserType.USER) return data.userId;\n\n return data.groupId;\n }).filter((item) => {\n if (filterItem) {\n return filterItem(item);\n }\n\n return true;\n });\n }, [filterItem, searchString, searchUserList, selectedUserList]);\n\n useEffect(() => {\n if (!dropdownOpen) return;\n run();\n }, [dropdownOpen, run, searchString]);\n\n useEffect(() => {\n if (_.isEqual(value, prevValue)) {\n return;\n }\n if (Array.isArray(value) && (isUser(value[0]) || isUserGroup(value[0]))) {\n setSelectedUserList(value as TUser);\n } else if (isUser(value) || isUserGroup(value)) {\n setSelectedUserList([value]);\n } else {\n let param: Array<TUserValue | TUserGroupValue> = [];\n if (!value) return;\n if (Array.isArray(value) && value.length === 0) {\n setSelectedUserList([]);\n\n return;\n }\n if (!Array.isArray(value)) {\n param = [value];\n } else {\n param = value;\n }\n queryByIds(param).then((result) => {\n // 如果用户已被删除,则需要展示出id\n const valueNotInResult: TUser = param\n .filter((item) => {\n if (item.type === EUserType.USER) {\n return result\n .filter(isUser)\n .every((user) => user.userId !== item.userId);\n }\n\n return result\n .filter(isUserGroup)\n .every((user) => user.groupId !== item.groupId);\n })\n .map((item) => {\n if (item.type === EUserType.USER) {\n return {\n type: EUserType.USER,\n userId: item.userId,\n } as IUser;\n }\n\n return {\n type: EUserType.USER_GROUP,\n groupId: item.groupId,\n } as IUserGroup;\n });\n\n setSelectedUserList([...result, ...valueNotInResult]);\n });\n }\n }, [value, queryByIds, prevValue]);\n\n const onSelectedChange = useCallback(\n (users: TUser) => {\n if (multiple) {\n setSelectedUserList(users);\n onChange?.(users);\n } else {\n setSelectedUserList(users);\n onChange?.(users[0]);\n }\n setDropdownOpen(false);\n },\n [multiple, onChange, setDropdownOpen],\n );\n\n useEffect(() => {\n if (typeof open === 'boolean') {\n setDropdownOpen(open);\n }\n }, [open]);\n\n useEffect(() => {\n if (!dropdownContentWidth) {\n const resizeEle = triggerRef.current;\n if (!resizeEle) return;\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width } = entry.contentRect;\n setDropdownContentWidth(width);\n }\n });\n resizeObserver.observe(resizeEle);\n\n return () => {\n resizeObserver.unobserve(resizeEle);\n };\n }\n }, [triggerRef, dropdownContentWidth]);\n const onDropdownOpenChange = useCallback(\n (open: boolean) => {\n setDropdownOpen(open);\n onOpenChange?.(open);\n },\n [onOpenChange],\n );\n const panelKey = useMemo(() => {\n if (dropdownOpen) {\n return _.sampleSize('abcdefghijklmnopqrstuvwxyz0123456789', 8).join('');\n }\n }, [dropdownOpen]);\n const mode = useMemo(() => {\n if (multiple === true) {\n if (typeof propsMode === 'object')\n return {\n ...(propsMode || {}),\n type: 'multiple',\n responsive: _.isNil(propsMode.responsive)\n ? true\n : propsMode.responsive,\n } as Mode;\n return {\n type: 'multiple',\n responsive: true,\n } as Mode;\n }\n\n return multiple ? (multiple as Mode) : propsMode;\n }, [multiple, propsMode]);\n\n const selectOpen = typeof open === 'boolean' ? open : dropdownOpen;\n\n return (\n <Select\n prefix={propPrefix}\n {...restProps}\n data-testid={dataTestId}\n aria-label={ariaLabel}\n size={size}\n className={cn('ald-member-picker-select', className)}\n value={selectedUserList.map((item) => {\n if (item.type === EUserType.USER_GROUP) {\n return item.groupId;\n } else {\n return item.userId;\n }\n })}\n onChange={(value) => {\n if (_.isEmpty(value)) {\n setSelectedUserList([]);\n if (multiple) {\n onChange?.([]);\n } else {\n onChange?.();\n }\n } else {\n const valueList = Array.isArray(value) ? value : [value];\n if (multiple) {\n const users = valueList\n .map((item) => {\n const user = totalUserList.find((user) => {\n if (user.type === EUserType.USER) {\n return user.userId === item;\n }\n\n return user.groupId === item;\n });\n\n return user;\n })\n .filter(Boolean) as TUser;\n setSelectedUserList(users);\n onChange?.(users);\n } else {\n const user = totalUserList.find((user) => {\n if (user.type === EUserType.USER) {\n return user.userId === value;\n }\n\n return user.groupId === value;\n });\n if (user) {\n setSelectedUserList([user]);\n onChange?.(user);\n } else {\n setSelectedUserList([]);\n onChange?.();\n }\n }\n }\n }}\n disabled={disabled}\n allowClear={allowClear}\n onClear={() => {\n setSelectedUserList([]);\n if (multiple) {\n onChange?.([]);\n } else {\n onChange?.();\n }\n onClear?.();\n }}\n popupClassName={cn(\n 'ald-member-picker-popup',\n allowOverlap && 'ald-member-picker-popup-adaptive',\n props.popupClassName,\n )}\n mode={mode}\n options={selectedUserList.map((item) => {\n if (item.type === EUserType.USER_GROUP)\n return {\n label: item.name || item.groupId,\n value: item.groupId,\n tag: (\n <div className={'ald-member-picker-tag'}>\n <Avatar type=\"team\" size={20}>\n {item.name || item.groupId}\n </Avatar>\n {item.name || item.groupId}\n </div>\n ),\n };\n\n return {\n label: item.nickname || item.name || item.userId,\n value: item.userId,\n tag: (\n <div className={'ald-member-picker-tag'}>\n <Avatar\n size={20}\n src={item.photo}\n type={item.type === EUserType.USER ? 'user' : 'team'}\n >\n {item.nickname || item.name || item.userId}\n </Avatar>\n {item.nickname || item.name || item.userId}\n </div>\n ),\n };\n })}\n optionLabelProp={multiple ? 'label' : 'tag'}\n open={selectOpen}\n onOpenChange={onDropdownOpenChange}\n popupMatchSelectWidth={panelWidth}\n allowOverlap={allowOverlap}\n placeholder={placeholder}\n dropdownRender={() => {\n return (\n <div\n ref={triggerRef}\n className={cn({\n 'ald-member-picker-popup-body': allowOverlap,\n })}\n >\n <Panel\n type={type}\n footer={footer}\n value={selectedUserList}\n dataList={totalUserList}\n lockedIds={lockedIds}\n multiple={!!multiple}\n key={panelKey}\n loading={loading}\n dropdownWidth={dropdownContentWidth}\n onSearchValueChange={onSearchValueChange}\n onChange={onSelectedChange}\n onCancel={() => {\n onCancel?.();\n setDropdownOpen(false);\n }}\n renderItem={renderItem}\n renderSelectedTag={renderSelectedTag}\n ></Panel>\n </div>\n );\n }}\n ></Select>\n );\n};\n\nconst MemberSelector = Component as React.FC<IMemberPickerProps> & {\n MemberPanel: typeof MemberPanel;\n};\n\nMemberSelector.MemberPanel = MemberPanel;\nexport default MemberSelector;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/MemberPicker/index.tsx"],"sourcesContent":["import { usePrevious, useRequest } from 'ahooks';\nimport { cn } from '../lib/utils';\nimport _ from 'lodash';\nimport React, {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport Avatar from '../Avatar';\nimport ConfigProvider from '../ConfigProvider';\nimport './member-picker.css';\nimport {\n EUserType,\n IUser,\n IUserGroup,\n TUser,\n} from '../ConfigProvider/getUserList';\nimport { LocaleContext, getTranslator } from '../locale/default';\nimport message from '../message';\nimport Panel from './components/Panel';\nimport MemberPanel from './components/PanelWrapper';\nimport {\n EMemberPicker,\n IMemberPickerProps,\n TUserGroupValue,\n TUserValue,\n} from './interface';\nimport { getId } from './utils';\nimport { isUser, isUserGroup } from './utils/getUsersWithUserId';\nimport Select from '../Select';\nimport { Mode } from '../Select/BaseSelect';\n\nconst DEFAULT_MULTIPLE_DROPDOWN_WIDTH = 480;\n\nconst Component: React.FC<IMemberPickerProps> = (props) => {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const {\n value,\n type = EMemberPicker.USER,\n onChange,\n multiple,\n dropdownWidth,\n open,\n onOpenChange,\n placeholder = t.MemberPicker.select,\n className,\n allowClear,\n disabled,\n onClear,\n size,\n prefix: propPrefix,\n lockedIds = [],\n footer,\n onCancel,\n filterItem,\n mode: propsMode,\n renderItem,\n renderSelectedTag,\n 'data-testid': dataTestId,\n 'aria-label': ariaLabel,\n ...restProps\n } = props;\n const allowOverlap = props.allowOverlap ?? false;\n const { getUsersByIds, getUsersByKeywords } = ConfigProvider.useGetUserList();\n const [selectedUserList, setSelectedUserList] = useState<TUser>([]);\n const prevValue = usePrevious(value);\n const [searchUserList, setSearchUserList] = useState<TUser>([]);\n const [searchString, setSearchString] = useState<string>('');\n const [dropdownContentWidth, setDropdownContentWidth] =\n useState(dropdownWidth);\n const selectOwnerRef = useRef<HTMLDivElement>(null);\n // 单选默认浮窗跟触发器等宽(true),调用方传 dropdownWidth 时用具体数字;\n // 多选默认 480,单条记录只有 头像+nickname 时触发器太窄装不下选中标签,故固定值。\n const panelWidth: number | boolean =\n dropdownWidth ?? (multiple ? DEFAULT_MULTIPLE_DROPDOWN_WIDTH : true);\n\n const triggerRef = useRef<HTMLDivElement>(null);\n const onSearchValueChange = useCallback((v: string) => {\n setSearchString(v);\n }, []);\n const [dropdownOpen, setDropdownOpen] = useState<boolean>(!!open);\n const queryByKeywords = useMemo(() => {\n if (getUsersByKeywords) {\n return getUsersByKeywords;\n }\n\n return (_params = {}) =>\n Promise.reject({\n message: t.MemberPicker.pleaseConfigGetUserByKeywordsMethod,\n });\n }, [getUsersByKeywords, t.MemberPicker.pleaseConfigGetUserByKeywordsMethod]);\n const queryByIds = useMemo(() => {\n if (getUsersByIds) {\n return getUsersByIds;\n }\n\n return (_params = {}) =>\n Promise.reject({\n message: t.MemberPicker.pleaseConfigGetUserByIdsMethod,\n });\n }, [getUsersByIds, t.MemberPicker.pleaseConfigGetUserByIdsMethod]);\n const { loading, run } = useRequest(() => queryByKeywords(searchString), {\n refreshDeps: [searchString],\n manual: true,\n cacheKey: 'member-selector',\n cacheTime: 1000 * 60 * 2, // 2分钟内不重复请求\n onSuccess: (result) => {\n setSearchUserList(result);\n },\n onError: (error) => {\n message.error(error.message);\n },\n });\n\n const totalUserList: TUser = useMemo(() => {\n const totalUsers = searchUserList.concat(\n selectedUserList.filter((item) => {\n const name =\n (item.type === EUserType.USER ? item.nickname : item.name) || '';\n\n return name.toUpperCase().includes(searchString.trim().toUpperCase());\n }),\n );\n\n return _.uniqBy(totalUsers, (data: IUser | IUserGroup) => {\n if (data.type === EUserType.USER) return data.userId;\n\n return data.groupId;\n }).filter((item) => {\n if (filterItem) {\n return filterItem(item);\n }\n\n return true;\n });\n }, [filterItem, searchString, searchUserList, selectedUserList]);\n\n useEffect(() => {\n if (!dropdownOpen) return;\n run();\n }, [dropdownOpen, run, searchString]);\n\n useEffect(() => {\n if (_.isEqual(value, prevValue)) {\n return;\n }\n if (Array.isArray(value) && (isUser(value[0]) || isUserGroup(value[0]))) {\n setSelectedUserList(value as TUser);\n } else if (isUser(value) || isUserGroup(value)) {\n setSelectedUserList([value]);\n } else {\n let param: Array<TUserValue | TUserGroupValue> = [];\n if (!value) return;\n if (Array.isArray(value) && value.length === 0) {\n setSelectedUserList([]);\n\n return;\n }\n if (!Array.isArray(value)) {\n param = [value];\n } else {\n param = value;\n }\n queryByIds(param).then((result) => {\n // 如果用户已被删除,则需要展示出id\n const valueNotInResult: TUser = param\n .filter((item) => {\n if (item.type === EUserType.USER) {\n return result\n .filter(isUser)\n .every((user) => user.userId !== item.userId);\n }\n\n return result\n .filter(isUserGroup)\n .every((user) => user.groupId !== item.groupId);\n })\n .map((item) => {\n if (item.type === EUserType.USER) {\n return {\n type: EUserType.USER,\n userId: item.userId,\n } as IUser;\n }\n\n return {\n type: EUserType.USER_GROUP,\n groupId: item.groupId,\n } as IUserGroup;\n });\n\n setSelectedUserList([...result, ...valueNotInResult]);\n });\n }\n }, [value, queryByIds, prevValue]);\n\n const onSelectedChange = useCallback(\n (users: TUser) => {\n if (multiple) {\n setSelectedUserList(users);\n onChange?.(users);\n } else {\n setSelectedUserList(users);\n onChange?.(users[0]);\n }\n setDropdownOpen(false);\n },\n [multiple, onChange, setDropdownOpen],\n );\n\n useEffect(() => {\n if (typeof open === 'boolean') {\n setDropdownOpen(open);\n }\n }, [open]);\n\n useEffect(() => {\n if (!dropdownContentWidth) {\n const resizeEle = triggerRef.current;\n if (!resizeEle) return;\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width } = entry.contentRect;\n setDropdownContentWidth(width);\n }\n });\n resizeObserver.observe(resizeEle);\n\n return () => {\n resizeObserver.unobserve(resizeEle);\n };\n }\n }, [triggerRef, dropdownContentWidth]);\n const onDropdownOpenChange = useCallback(\n (open: boolean) => {\n setDropdownOpen(open);\n onOpenChange?.(open);\n },\n [onOpenChange],\n );\n const mode = useMemo(() => {\n if (multiple === true) {\n if (typeof propsMode === 'object')\n return {\n ...(propsMode || {}),\n type: 'multiple',\n responsive: _.isNil(propsMode.responsive)\n ? true\n : propsMode.responsive,\n } as Mode;\n return {\n type: 'multiple',\n responsive: true,\n } as Mode;\n }\n\n return multiple ? (multiple as Mode) : propsMode;\n }, [multiple, propsMode]);\n\n const selectOpen = typeof open === 'boolean' ? open : dropdownOpen;\n const listboxId = `ald-member-picker-listbox-${React.useId().replace(\n /:/g,\n '',\n )}`;\n const activeMember = totalUserList[0];\n const activeMemberId = activeMember\n ? `ald-member-picker-option-${getId(activeMember)}`\n : undefined;\n\n useEffect(() => {\n const owner = selectOwnerRef.current?.querySelector<HTMLElement>(\n '[role=\"combobox\"], input',\n );\n if (!owner) return;\n owner.setAttribute('aria-controls', listboxId);\n if (selectOpen && activeMemberId) {\n owner.setAttribute('aria-activedescendant', activeMemberId);\n } else {\n owner.removeAttribute('aria-activedescendant');\n }\n }, [activeMemberId, listboxId, selectOpen]);\n\n return (\n <div ref={selectOwnerRef} style={{ display: 'contents' }}>\n <Select\n prefix={propPrefix}\n {...restProps}\n data-testid={dataTestId}\n aria-label={ariaLabel}\n showSearch\n searchValue={searchString}\n onSearch={onSearchValueChange}\n aria-controls={listboxId}\n aria-activedescendant={selectOpen ? activeMemberId : undefined}\n size={size}\n className={cn('ald-member-picker-select', className)}\n value={selectedUserList.map((item) => {\n if (item.type === EUserType.USER_GROUP) {\n return item.groupId;\n } else {\n return item.userId;\n }\n })}\n onChange={(value) => {\n if (_.isEmpty(value)) {\n setSelectedUserList([]);\n if (multiple) {\n onChange?.([]);\n } else {\n onChange?.();\n }\n } else {\n const valueList = Array.isArray(value) ? value : [value];\n if (multiple) {\n const users = valueList\n .map((item) => {\n const user = totalUserList.find((user) => {\n if (user.type === EUserType.USER) {\n return user.userId === item;\n }\n\n return user.groupId === item;\n });\n\n return user;\n })\n .filter(Boolean) as TUser;\n setSelectedUserList(users);\n onChange?.(users);\n } else {\n const user = totalUserList.find((user) => {\n if (user.type === EUserType.USER) {\n return user.userId === value;\n }\n\n return user.groupId === value;\n });\n if (user) {\n setSelectedUserList([user]);\n onChange?.(user);\n } else {\n setSelectedUserList([]);\n onChange?.();\n }\n }\n }\n }}\n disabled={disabled}\n allowClear={allowClear}\n onClear={() => {\n setSelectedUserList([]);\n if (multiple) {\n onChange?.([]);\n } else {\n onChange?.();\n }\n onClear?.();\n }}\n popupClassName={cn(\n 'ald-member-picker-popup',\n allowOverlap && 'ald-member-picker-popup-adaptive',\n props.popupClassName,\n )}\n mode={mode}\n options={selectedUserList.map((item) => {\n if (item.type === EUserType.USER_GROUP)\n return {\n label: item.name || item.groupId,\n value: item.groupId,\n tag: (\n <div className={'ald-member-picker-tag'}>\n <Avatar type=\"team\" size={20}>\n {item.name || item.groupId}\n </Avatar>\n {item.name || item.groupId}\n </div>\n ),\n };\n\n return {\n label: item.nickname || item.name || item.userId,\n value: item.userId,\n tag: (\n <div className={'ald-member-picker-tag'}>\n <Avatar\n size={20}\n src={item.photo}\n type={item.type === EUserType.USER ? 'user' : 'team'}\n >\n {item.nickname || item.name || item.userId}\n </Avatar>\n {item.nickname || item.name || item.userId}\n </div>\n ),\n };\n })}\n optionLabelProp={multiple ? 'label' : 'tag'}\n open={selectOpen}\n onOpenChange={onDropdownOpenChange}\n popupMatchSelectWidth={panelWidth}\n allowOverlap={allowOverlap}\n placeholder={placeholder}\n dropdownRender={() => {\n return (\n <div\n ref={triggerRef}\n id={listboxId}\n role=\"group\"\n aria-label=\"Member selection results\"\n className={cn({\n 'ald-member-picker-popup-body': allowOverlap,\n })}\n >\n <Panel\n type={type}\n footer={footer}\n value={selectedUserList}\n dataList={totalUserList}\n lockedIds={lockedIds}\n multiple={!!multiple}\n loading={loading}\n dropdownWidth={dropdownContentWidth}\n onSearchValueChange={onSearchValueChange}\n onChange={onSelectedChange}\n onCancel={() => {\n onCancel?.();\n setDropdownOpen(false);\n }}\n renderItem={renderItem}\n renderSelectedTag={renderSelectedTag}\n searchValue={searchString}\n ></Panel>\n </div>\n );\n }}\n ></Select>\n </div>\n );\n};\n\nconst MemberSelector = Component as React.FC<IMemberPickerProps> & {\n MemberPanel: typeof MemberPanel;\n};\n\nMemberSelector.MemberPanel = MemberPanel;\nexport default MemberSelector;\n"],"mappings":"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"}
@@ -6,6 +6,12 @@ export interface MenuProps {
6
6
  items: MenuItemType[];
7
7
  selectedKeys?: string[];
8
8
  menuStyle?: React.CSSProperties;
9
+ /** Accessible name for the command menu when its context is not otherwise clear. */
10
+ ariaLabel?: string;
11
+ /** @internal Requested initial keyboard position when the popup opens. */
12
+ initialFocus?: 'first' | 'last';
13
+ /** @internal Requests that the owning popup close, including on Escape. */
14
+ onRequestClose?: (reason: 'click' | 'cancel' | 'blur' | 'scroll') => void;
9
15
  rootClosing?: boolean;
10
16
  /** @internal 由 Dropdown 注入,禁用内部定位/overflow 计算。不支持含 SubMenu 的菜单 */
11
17
  externalOverflow?: boolean;
@@ -24,6 +30,7 @@ export interface ItemType {
24
30
  danger?: boolean;
25
31
  disabled?: boolean;
26
32
  className?: string;
33
+ ariaLabel?: string;
27
34
  }
28
35
  export interface MenuDividerType {
29
36
  key?: string;
@@ -41,6 +48,7 @@ export interface SubMenuType {
41
48
  icon?: React.ReactNode;
42
49
  popupClassName?: string;
43
50
  disabled?: boolean;
51
+ ariaLabel?: string;
44
52
  }
45
53
  export interface MenuInfo {
46
54
  key: string;