@aloudata/aloudata-design 3.1.6 → 3.1.7

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 (89) hide show
  1. package/dist/ConfigProvider/getUserList.d.ts +47 -0
  2. package/dist/ConfigProvider/getUserList.js.map +1 -1
  3. package/dist/ConfigProvider/hooks/useGetUserList.d.ts +7 -0
  4. package/dist/ConfigProvider/hooks/useGetUserList.js +5 -1
  5. package/dist/ConfigProvider/hooks/useGetUserList.js.map +1 -1
  6. package/dist/ConfigProvider/index.d.ts +5 -1
  7. package/dist/ConfigProvider/index.js +6 -2
  8. package/dist/ConfigProvider/index.js.map +1 -1
  9. package/dist/Dropdown/index.d.ts +7 -2
  10. package/dist/Dropdown/index.js +30 -17
  11. package/dist/Dropdown/index.js.map +1 -1
  12. package/dist/MemberPicker/components/MultipleOption.d.ts +1 -0
  13. package/dist/MemberPicker/components/MultipleOption.js +3 -1
  14. package/dist/MemberPicker/components/MultipleOption.js.map +1 -1
  15. package/dist/MemberPicker/components/NickLabel.d.ts +5 -0
  16. package/dist/MemberPicker/components/NickLabel.js +14 -4
  17. package/dist/MemberPicker/components/NickLabel.js.map +1 -1
  18. package/dist/MemberPicker/components/Panel.d.ts +4 -0
  19. package/dist/MemberPicker/components/Panel.js +13 -4
  20. package/dist/MemberPicker/components/Panel.js.map +1 -1
  21. package/dist/MemberPicker/components/PanelWrapper.js +25 -24
  22. package/dist/MemberPicker/components/PanelWrapper.js.map +1 -1
  23. package/dist/MemberPicker/components/SearchFeedback.d.ts +7 -0
  24. package/dist/MemberPicker/components/SearchFeedback.js +27 -0
  25. package/dist/MemberPicker/components/SearchFeedback.js.map +1 -0
  26. package/dist/MemberPicker/components/SingleOption.d.ts +1 -0
  27. package/dist/MemberPicker/components/SingleOption.js +3 -1
  28. package/dist/MemberPicker/components/SingleOption.js.map +1 -1
  29. package/dist/MemberPicker/components/UserGroupSelection.d.ts +4 -1
  30. package/dist/MemberPicker/components/UserGroupSelection.js +29 -22
  31. package/dist/MemberPicker/components/UserGroupSelection.js.map +1 -1
  32. package/dist/MemberPicker/dialog/DialogColumns.d.ts +5 -0
  33. package/dist/MemberPicker/dialog/DialogColumns.js +59 -0
  34. package/dist/MemberPicker/dialog/DialogColumns.js.map +1 -0
  35. package/dist/MemberPicker/dialog/DialogContent.d.ts +3 -0
  36. package/dist/MemberPicker/dialog/DialogContent.js +106 -0
  37. package/dist/MemberPicker/dialog/DialogContent.js.map +1 -0
  38. package/dist/MemberPicker/dialog/MemberOption.d.ts +16 -0
  39. package/dist/MemberPicker/dialog/MemberOption.js +101 -0
  40. package/dist/MemberPicker/dialog/MemberOption.js.map +1 -0
  41. package/dist/MemberPicker/dialog/MemberPickerDialog.d.ts +11 -0
  42. package/dist/MemberPicker/dialog/MemberPickerDialog.js +11 -0
  43. package/dist/MemberPicker/dialog/MemberPickerDialog.js.map +1 -0
  44. package/dist/MemberPicker/dialog/SelectedMemberPanel.d.ts +12 -0
  45. package/dist/MemberPicker/dialog/SelectedMemberPanel.js +37 -0
  46. package/dist/MemberPicker/dialog/SelectedMemberPanel.js.map +1 -0
  47. package/dist/MemberPicker/dialog/UserCandidatePanel.d.ts +13 -0
  48. package/dist/MemberPicker/dialog/UserCandidatePanel.js +168 -0
  49. package/dist/MemberPicker/dialog/UserCandidatePanel.js.map +1 -0
  50. package/dist/MemberPicker/dialog/UserGroupCandidatePanel.d.ts +13 -0
  51. package/dist/MemberPicker/dialog/UserGroupCandidatePanel.js +134 -0
  52. package/dist/MemberPicker/dialog/UserGroupCandidatePanel.js.map +1 -0
  53. package/dist/MemberPicker/dialog/helper.d.ts +20 -0
  54. package/dist/MemberPicker/dialog/helper.js +61 -0
  55. package/dist/MemberPicker/dialog/helper.js.map +1 -0
  56. package/dist/MemberPicker/dialog/types.d.ts +41 -0
  57. package/dist/MemberPicker/dialog/types.js +7 -0
  58. package/dist/MemberPicker/dialog/types.js.map +1 -0
  59. package/dist/MemberPicker/dialog/useDialogLocale.d.ts +103 -0
  60. package/dist/MemberPicker/dialog/useDialogLocale.js +12 -0
  61. package/dist/MemberPicker/dialog/useDialogLocale.js.map +1 -0
  62. package/dist/MemberPicker/dialog/useMemberPickerDraft.d.ts +27 -0
  63. package/dist/MemberPicker/dialog/useMemberPickerDraft.js +95 -0
  64. package/dist/MemberPicker/dialog/useMemberPickerDraft.js.map +1 -0
  65. package/dist/MemberPicker/dialog/useUserGroupCandidates.d.ts +29 -0
  66. package/dist/MemberPicker/dialog/useUserGroupCandidates.js +443 -0
  67. package/dist/MemberPicker/dialog/useUserGroupCandidates.js.map +1 -0
  68. package/dist/MemberPicker/index.d.ts +2 -0
  69. package/dist/MemberPicker/index.js +58 -34
  70. package/dist/MemberPicker/index.js.map +1 -1
  71. package/dist/MemberPicker/useMemberSearch.d.ts +8 -0
  72. package/dist/MemberPicker/useMemberSearch.js +51 -0
  73. package/dist/MemberPicker/useMemberSearch.js.map +1 -0
  74. package/dist/Menu/index.d.ts +2 -0
  75. package/dist/Menu/index.js +3 -2
  76. package/dist/Menu/index.js.map +1 -1
  77. package/dist/Modal/index.js +1 -1
  78. package/dist/Modal/index.js.map +1 -1
  79. package/dist/aloudata-design.css +1 -1
  80. package/dist/index.d.ts +3 -0
  81. package/dist/index.js +2 -2
  82. package/dist/locale/default.d.ts +29 -0
  83. package/dist/locale/en_US.d.ts +29 -0
  84. package/dist/locale/en_US.js +29 -0
  85. package/dist/locale/en_US.js.map +1 -1
  86. package/dist/locale/zh_CN.d.ts +29 -0
  87. package/dist/locale/zh_CN.js +29 -0
  88. package/dist/locale/zh_CN.js.map +1 -1
  89. package/package.json +2 -1
@@ -2,12 +2,12 @@ import { cn } from "../../lib/utils.js";
2
2
  import { LocaleContext, getTranslator } from "../../locale/default.js";
3
3
  import "../../ConfigProvider/getUserList.js";
4
4
  import Tabs from "../../Tabs/index.js";
5
+ import SelectorFooter from "./SelectorFooter.js";
5
6
  import { EMemberPicker } from "../interface.js";
6
7
  import { getId } from "../utils/index.js";
7
8
  import { isUser, isUserGroup } from "../utils/getUsersWithUserId.js";
8
9
  import MemberSelection from "./MemberSelection.js";
9
10
  import SelectedMemberTags from "./SelectedMemberTags.js";
10
- import SelectorFooter from "./SelectorFooter.js";
11
11
  import UserGroupSelection from "./UserGroupSelection.js";
12
12
  import { useCallback, useContext, useEffect, useMemo, useState } from "react";
13
13
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -60,6 +60,9 @@ function Panel(props) {
60
60
  renderItem
61
61
  });
62
62
  const userGroupSelection = /* @__PURE__ */ jsx(UserGroupSelection, {
63
+ active: props.active,
64
+ useProvidedSearch: props.useProvidedGroupSearch && !!searchValue.trim(),
65
+ parentSearchFailed: props.searchFailed,
63
66
  className: "ald-member-picker-member-selection-multiple",
64
67
  userGroupList: dataList.filter(isUserGroup),
65
68
  filterItem,
@@ -101,18 +104,21 @@ function Panel(props) {
101
104
  showSearch,
102
105
  lockedIds,
103
106
  props.loading,
107
+ props.active,
108
+ props.searchFailed,
109
+ props.useProvidedGroupSearch,
104
110
  type,
105
111
  renderItem,
106
112
  filterItem
107
113
  ]);
108
114
  const wrapperWidth = dropdownWidth ?? (multiple ? panelwidth : "100%");
109
- return /* @__PURE__ */ jsx("div", {
115
+ return /* @__PURE__ */ jsxs("div", {
110
116
  className: cn(className, "ald-member-picker-wrapper", {
111
117
  ["ald-member-picker-multiple"]: multiple,
112
118
  ["ald-member-picker-single"]: !multiple
113
119
  }),
114
120
  style: { width: wrapperWidth },
115
- children: multiple ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
121
+ children: [props.searchFeedback, multiple ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs("div", {
116
122
  className: "ald-member-picker-inner",
117
123
  children: [/* @__PURE__ */ jsx("div", {
118
124
  className: "ald-member-picker-member-selection-wrapper",
@@ -147,6 +153,9 @@ function Panel(props) {
147
153
  loading: props.loading,
148
154
  renderItem
149
155
  }), type === EMemberPicker.GROUP && /* @__PURE__ */ jsx(UserGroupSelection, {
156
+ active: props.active,
157
+ useProvidedSearch: props.useProvidedGroupSearch && !!searchValue.trim(),
158
+ parentSearchFailed: props.searchFailed,
150
159
  className: "ald-member-picker-member-selection-multiple",
151
160
  userGroupList: dataList.filter(isUserGroup),
152
161
  width: (panelwidth - 3) / 2,
@@ -159,7 +168,7 @@ function Panel(props) {
159
168
  lockedIds,
160
169
  loading: props.loading,
161
170
  renderItem
162
- })] })
171
+ })] })]
163
172
  });
164
173
  }
165
174
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"Panel.js","names":[],"sources":["../../../src/MemberPicker/components/Panel.tsx"],"sourcesContent":["import { cn } from '../../lib/utils';\n\nimport React, {\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n EUserType,\n IUserGroup,\n TUser,\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport Tabs from '../../Tabs';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { EMemberPicker, IUser } from '../interface';\nimport { getId } from '../utils';\nimport { isUser, isUserGroup } from '../utils/getUsersWithUserId';\nimport MemberSelection from './MemberSelection';\nimport SelectedMemberTags from './SelectedMemberTags';\nimport SelectorFooter from './SelectorFooter';\nimport UserGroupSelection from './UserGroupSelection';\n\ninterface IPanelProps {\n type: EMemberPicker;\n multiple?: boolean;\n onChange?: (value: TUser) => void;\n dropdownWidth?: number;\n value?: TUser | (IUser | IUserGroup);\n dataList: TUser;\n onSearchValueChange?: (value: string) => void;\n onCancel?: () => void;\n loading: boolean;\n className?: string;\n lockedIds: Array<TUserValue | TUserGroupValue>;\n footer?: ReactNode;\n renderItem?: (\n item: IUser | IUserGroup,\n context: {\n isSelected: boolean;\n disabled: boolean;\n onClick: () => void;\n onNextLevel?: () => void;\n originNode: ReactNode;\n },\n ) => ReactNode;\n renderSelectedTag?: (\n user: IUser | IUserGroup,\n originNode: ReactNode,\n ) => ReactNode;\n filterItem?: (item: IUser | IUserGroup) => boolean;\n searchValue?: string;\n showSearch?: boolean;\n}\n\nexport const userDisplayNameIsRepeated = (\n userList: TUser,\n displayName?: string,\n) => {\n return (\n userList.filter(\n (user) => user.type === EUserType.USER && user.nickname === displayName,\n ).length > 1\n );\n};\n\nexport default function Panel(props: IPanelProps) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const {\n type,\n multiple,\n dropdownWidth,\n value,\n onChange,\n dataList,\n onSearchValueChange,\n className,\n lockedIds,\n footer,\n onCancel,\n renderItem,\n renderSelectedTag,\n filterItem,\n searchValue = '',\n showSearch,\n } = props;\n\n const [selectedUsers, setSelected] = useState<TUser>([]);\n\n const onSelectionChange = useCallback(\n (selected: boolean, user: IUser | IUserGroup) => {\n if (multiple) {\n if (selected) {\n setSelected([...selectedUsers, user]);\n } else {\n setSelected(\n selectedUsers.filter((item) => getId(item) !== getId(user)),\n );\n }\n } else {\n if (selected) {\n setSelected([user]);\n onChange?.([user]);\n } else {\n setSelected([]);\n onChange?.([]);\n }\n }\n },\n [multiple, selectedUsers, onChange],\n );\n\n const onRemove = useCallback(\n (user: IUser | IUserGroup) => {\n setSelected(selectedUsers.filter((item) => getId(item) !== getId(user)));\n },\n [selectedUsers],\n );\n\n const panelwidth = useMemo(() => {\n if (dropdownWidth) {\n return dropdownWidth;\n } else if (multiple) {\n return 480;\n } else {\n return 160;\n }\n }, [dropdownWidth, multiple]);\n\n useEffect(() => {\n if (value) {\n if (Array.isArray(value)) {\n setSelected(value);\n } else {\n setSelected([value]);\n }\n }\n }, [setSelected, value]);\n\n const renderDropdown = useCallback(() => {\n const userSelection = (\n <MemberSelection\n className={'ald-member-picker-member-selection-multiple'}\n userList={dataList.filter(isUser)}\n filterItem={filterItem}\n width={(panelwidth - 6) / 2}\n selectedUsers={selectedUsers.filter(isUser)}\n onChange={onSelectionChange}\n onSearchValueChange={onSearchValueChange}\n searchValue={searchValue}\n showSearch={showSearch}\n multiple={true}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></MemberSelection>\n );\n const userGroupSelection = (\n <UserGroupSelection\n className={'ald-member-picker-member-selection-multiple'}\n userGroupList={dataList.filter(isUserGroup)}\n filterItem={filterItem}\n width={(panelwidth - 6) / 2}\n selectedUsersGroup={selectedUsers.filter(isUserGroup)}\n onChange={onSelectionChange}\n onSearchValueChange={onSearchValueChange}\n searchValue={searchValue}\n showSearch={showSearch}\n multiple={true}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></UserGroupSelection>\n );\n if (type === EMemberPicker.USER) {\n return userSelection;\n }\n if (type === EMemberPicker.GROUP) {\n return userGroupSelection;\n }\n if (type === EMemberPicker.BOTH) {\n return (\n <Tabs\n centered\n destroyInactiveTabPane\n items={[\n {\n key: 'user',\n label: t.MemberPicker.users,\n children: userSelection,\n },\n {\n key: 'userGroup',\n label: t.MemberPicker.userGroups,\n children: userGroupSelection,\n },\n ]}\n className=\"ald-member-tabs\"\n ></Tabs>\n );\n }\n }, [\n t,\n dataList,\n panelwidth,\n selectedUsers,\n onSelectionChange,\n onSearchValueChange,\n searchValue,\n showSearch,\n lockedIds,\n props.loading,\n type,\n renderItem,\n filterItem,\n ]);\n\n // 单选 + 调用方未传 dropdownWidth 时让 wrapper 跟随父级(popupMatchSelectWidth=true 的浮窗 = 触发器宽度),\n // 否则按具体数字(多选 480 / 调用方自定义)固定宽度。\n const wrapperWidth: number | string =\n dropdownWidth ?? (multiple ? panelwidth : '100%');\n\n return (\n <div\n className={cn(className, 'ald-member-picker-wrapper', {\n ['ald-member-picker-multiple']: multiple,\n ['ald-member-picker-single']: !multiple,\n })}\n style={{ width: wrapperWidth }}\n >\n {multiple ? (\n <>\n <div className=\"ald-member-picker-inner\">\n <div className=\"ald-member-picker-member-selection-wrapper\">\n {renderDropdown()}\n </div>\n <SelectedMemberTags\n className={'ald-member-picker-selected-member-tags'}\n selectedUsers={selectedUsers}\n width={(panelwidth - 3) / 2}\n onRemove={onRemove}\n lockedIds={lockedIds}\n userList={dataList}\n renderSelectedTag={renderSelectedTag}\n ></SelectedMemberTags>\n </div>\n <SelectorFooter\n className={'ald-member-picker-selector-footer'}\n onCancel={onCancel}\n onOk={() => {\n onChange?.(selectedUsers);\n }}\n footer={footer}\n ></SelectorFooter>\n </>\n ) : (\n <>\n {type === EMemberPicker.USER && (\n <MemberSelection\n className={'ald-member-picker-member-selection-single'}\n userList={dataList.filter(isUser)}\n width={panelwidth - 2}\n onChange={onSelectionChange}\n selectedUsers={selectedUsers.filter(isUser)}\n onSearchValueChange={onSearchValueChange}\n searchValue={searchValue}\n showSearch={showSearch}\n multiple={false && multiple}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></MemberSelection>\n )}\n {type === EMemberPicker.GROUP && (\n <UserGroupSelection\n className={'ald-member-picker-member-selection-multiple'}\n userGroupList={dataList.filter(isUserGroup)}\n width={(panelwidth - 3) / 2}\n selectedUsersGroup={selectedUsers.filter(isUserGroup)}\n onChange={onSelectionChange}\n onSearchValueChange={onSearchValueChange}\n searchValue={searchValue}\n showSearch={showSearch}\n multiple={false}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></UserGroupSelection>\n )}\n </>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"Panel.js","names":[],"sources":["../../../src/MemberPicker/components/Panel.tsx"],"sourcesContent":["import { cn } from '../../lib/utils';\n\nimport React, {\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport {\n EUserType,\n IUserGroup,\n TUser,\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport Tabs from '../../Tabs';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { EMemberPicker, IUser } from '../interface';\nimport { getId } from '../utils';\nimport { isUser, isUserGroup } from '../utils/getUsersWithUserId';\nimport MemberSelection from './MemberSelection';\nimport SelectedMemberTags from './SelectedMemberTags';\nimport SelectorFooter from './SelectorFooter';\nimport UserGroupSelection from './UserGroupSelection';\n\ninterface IPanelProps {\n searchFeedback?: ReactNode;\n searchFailed?: boolean;\n useProvidedGroupSearch?: boolean;\n active?: boolean;\n type: EMemberPicker;\n multiple?: boolean;\n onChange?: (value: TUser) => void;\n dropdownWidth?: number;\n value?: TUser | (IUser | IUserGroup);\n dataList: TUser;\n onSearchValueChange?: (value: string) => void;\n onCancel?: () => void;\n loading: boolean;\n className?: string;\n lockedIds: Array<TUserValue | TUserGroupValue>;\n footer?: ReactNode;\n renderItem?: (\n item: IUser | IUserGroup,\n context: {\n isSelected: boolean;\n disabled: boolean;\n onClick: () => void;\n onNextLevel?: () => void;\n originNode: ReactNode;\n },\n ) => ReactNode;\n renderSelectedTag?: (\n user: IUser | IUserGroup,\n originNode: ReactNode,\n ) => ReactNode;\n filterItem?: (item: IUser | IUserGroup) => boolean;\n searchValue?: string;\n showSearch?: boolean;\n}\n\nexport const userDisplayNameIsRepeated = (\n userList: TUser,\n displayName?: string,\n) => {\n return (\n userList.filter(\n (user) => user.type === EUserType.USER && user.nickname === displayName,\n ).length > 1\n );\n};\n\nexport default function Panel(props: IPanelProps) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const {\n type,\n multiple,\n dropdownWidth,\n value,\n onChange,\n dataList,\n onSearchValueChange,\n className,\n lockedIds,\n footer,\n onCancel,\n renderItem,\n renderSelectedTag,\n filterItem,\n searchValue = '',\n showSearch,\n } = props;\n\n const [selectedUsers, setSelected] = useState<TUser>([]);\n\n const onSelectionChange = useCallback(\n (selected: boolean, user: IUser | IUserGroup) => {\n if (multiple) {\n if (selected) {\n setSelected([...selectedUsers, user]);\n } else {\n setSelected(\n selectedUsers.filter((item) => getId(item) !== getId(user)),\n );\n }\n } else {\n if (selected) {\n setSelected([user]);\n onChange?.([user]);\n } else {\n setSelected([]);\n onChange?.([]);\n }\n }\n },\n [multiple, selectedUsers, onChange],\n );\n\n const onRemove = useCallback(\n (user: IUser | IUserGroup) => {\n setSelected(selectedUsers.filter((item) => getId(item) !== getId(user)));\n },\n [selectedUsers],\n );\n\n const panelwidth = useMemo(() => {\n if (dropdownWidth) {\n return dropdownWidth;\n } else if (multiple) {\n return 480;\n } else {\n return 160;\n }\n }, [dropdownWidth, multiple]);\n\n useEffect(() => {\n if (value) {\n if (Array.isArray(value)) {\n setSelected(value);\n } else {\n setSelected([value]);\n }\n }\n }, [setSelected, value]);\n\n const renderDropdown = useCallback(() => {\n const userSelection = (\n <MemberSelection\n className={'ald-member-picker-member-selection-multiple'}\n userList={dataList.filter(isUser)}\n filterItem={filterItem}\n width={(panelwidth - 6) / 2}\n selectedUsers={selectedUsers.filter(isUser)}\n onChange={onSelectionChange}\n onSearchValueChange={onSearchValueChange}\n searchValue={searchValue}\n showSearch={showSearch}\n multiple={true}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></MemberSelection>\n );\n const userGroupSelection = (\n <UserGroupSelection\n active={props.active}\n useProvidedSearch={props.useProvidedGroupSearch && !!searchValue.trim()}\n parentSearchFailed={props.searchFailed}\n className={'ald-member-picker-member-selection-multiple'}\n userGroupList={dataList.filter(isUserGroup)}\n filterItem={filterItem}\n width={(panelwidth - 6) / 2}\n selectedUsersGroup={selectedUsers.filter(isUserGroup)}\n onChange={onSelectionChange}\n onSearchValueChange={onSearchValueChange}\n searchValue={searchValue}\n showSearch={showSearch}\n multiple={true}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></UserGroupSelection>\n );\n if (type === EMemberPicker.USER) {\n return userSelection;\n }\n if (type === EMemberPicker.GROUP) {\n return userGroupSelection;\n }\n if (type === EMemberPicker.BOTH) {\n return (\n <Tabs\n centered\n destroyInactiveTabPane\n items={[\n {\n key: 'user',\n label: t.MemberPicker.users,\n children: userSelection,\n },\n {\n key: 'userGroup',\n label: t.MemberPicker.userGroups,\n children: userGroupSelection,\n },\n ]}\n className=\"ald-member-tabs\"\n ></Tabs>\n );\n }\n }, [\n t,\n dataList,\n panelwidth,\n selectedUsers,\n onSelectionChange,\n onSearchValueChange,\n searchValue,\n showSearch,\n lockedIds,\n props.loading,\n props.active,\n props.searchFailed,\n props.useProvidedGroupSearch,\n type,\n renderItem,\n filterItem,\n ]);\n\n // 单选 + 调用方未传 dropdownWidth 时让 wrapper 跟随父级(popupMatchSelectWidth=true 的浮窗 = 触发器宽度),\n // 否则按具体数字(多选 480 / 调用方自定义)固定宽度。\n const wrapperWidth: number | string =\n dropdownWidth ?? (multiple ? panelwidth : '100%');\n\n return (\n <div\n className={cn(className, 'ald-member-picker-wrapper', {\n ['ald-member-picker-multiple']: multiple,\n ['ald-member-picker-single']: !multiple,\n })}\n style={{ width: wrapperWidth }}\n >\n {props.searchFeedback}\n {multiple ? (\n <>\n <div className=\"ald-member-picker-inner\">\n <div className=\"ald-member-picker-member-selection-wrapper\">\n {renderDropdown()}\n </div>\n <SelectedMemberTags\n className={'ald-member-picker-selected-member-tags'}\n selectedUsers={selectedUsers}\n width={(panelwidth - 3) / 2}\n onRemove={onRemove}\n lockedIds={lockedIds}\n userList={dataList}\n renderSelectedTag={renderSelectedTag}\n ></SelectedMemberTags>\n </div>\n <SelectorFooter\n className={'ald-member-picker-selector-footer'}\n onCancel={onCancel}\n onOk={() => {\n onChange?.(selectedUsers);\n }}\n footer={footer}\n ></SelectorFooter>\n </>\n ) : (\n <>\n {type === EMemberPicker.USER && (\n <MemberSelection\n className={'ald-member-picker-member-selection-single'}\n userList={dataList.filter(isUser)}\n width={panelwidth - 2}\n onChange={onSelectionChange}\n selectedUsers={selectedUsers.filter(isUser)}\n onSearchValueChange={onSearchValueChange}\n searchValue={searchValue}\n showSearch={showSearch}\n multiple={false && multiple}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></MemberSelection>\n )}\n {type === EMemberPicker.GROUP && (\n <UserGroupSelection\n active={props.active}\n useProvidedSearch={\n props.useProvidedGroupSearch && !!searchValue.trim()\n }\n parentSearchFailed={props.searchFailed}\n className={'ald-member-picker-member-selection-multiple'}\n userGroupList={dataList.filter(isUserGroup)}\n width={(panelwidth - 3) / 2}\n selectedUsersGroup={selectedUsers.filter(isUserGroup)}\n onChange={onSelectionChange}\n onSearchValueChange={onSearchValueChange}\n searchValue={searchValue}\n showSearch={showSearch}\n multiple={false}\n lockedIds={lockedIds}\n loading={props.loading}\n renderItem={renderItem}\n ></UserGroupSelection>\n )}\n </>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,45 +1,40 @@
1
1
  import { LocaleContext, getTranslator } from "../../locale/default.js";
2
2
  import { EUserType } from "../../ConfigProvider/getUserList.js";
3
3
  import AldCustomConfigProvider from "../../ConfigProvider/index.js";
4
- import message from "../../message/index.js";
5
4
  import { EMemberPicker } from "../interface.js";
5
+ import SearchFeedback from "./SearchFeedback.js";
6
+ import useMemberSearch from "../useMemberSearch.js";
6
7
  import { isUser, isUserGroup } from "../utils/getUsersWithUserId.js";
7
8
  import Panel from "./Panel.js";
8
9
  import { useCallback, useContext, useEffect, useMemo, useState } from "react";
9
10
  import { jsx } from "react/jsx-runtime";
10
11
  import _ from "lodash";
11
- import { useRequest } from "ahooks";
12
12
  //#region src/MemberPicker/components/PanelWrapper.tsx
13
13
  var PanelWrapper = ({ type = EMemberPicker.USER, value, multiple, dropdownWidth, onChange, onCancel, className, footer, lockedIds = [], renderItem, renderSelectedTag, filterItem }) => {
14
14
  const { locale } = useContext(LocaleContext);
15
15
  const t = getTranslator(locale);
16
- const { getUsersByIds, getUsersByKeywords } = AldCustomConfigProvider.useGetUserList();
16
+ const { getUsersByIds, getUsersByKeywords, getUsersByKeywordsWithMeta, getNextLevelGroup, getNextLevelGroupWithMeta } = AldCustomConfigProvider.useGetUserList();
17
+ const usesGroupQuery = (type === EMemberPicker.GROUP || !getUsersByKeywords && !getUsersByKeywordsWithMeta) && !!(getNextLevelGroup || getNextLevelGroupWithMeta);
17
18
  const [selectedUserList, setSelectedUserList] = useState([]);
18
- const [searchUserList, setSearchUserList] = useState([]);
19
19
  const [searchString, setSearchString] = useState("");
20
20
  const onSearchValueChange = useCallback((v) => {
21
21
  setSearchString(v);
22
22
  }, []);
23
23
  const queryByKeywords = useMemo(() => {
24
+ if (getUsersByKeywordsWithMeta) return getUsersByKeywordsWithMeta;
24
25
  if (getUsersByKeywords) return getUsersByKeywords;
25
26
  return (_params = {}) => Promise.reject({ message: t.MemberPicker.pleaseConfigGetUserByKeywordsMethod });
26
- }, [getUsersByKeywords, t.MemberPicker.pleaseConfigGetUserByKeywordsMethod]);
27
+ }, [
28
+ getUsersByKeywords,
29
+ getUsersByKeywordsWithMeta,
30
+ t.MemberPicker.pleaseConfigGetUserByKeywordsMethod
31
+ ]);
27
32
  const queryByIds = useMemo(() => {
28
33
  if (getUsersByIds) return getUsersByIds;
29
34
  return (_params = {}) => Promise.reject({ message: t.MemberPicker.pleaseConfigGetUserByIdsMethod });
30
35
  }, [getUsersByIds, t.MemberPicker.pleaseConfigGetUserByIdsMethod]);
31
- const { loading, run } = useRequest(() => queryByKeywords(searchString), {
32
- refreshDeps: [searchString],
33
- manual: true,
34
- cacheKey: "member-selector",
35
- cacheTime: 1e3 * 60 * 2,
36
- onSuccess: (result) => {
37
- setSearchUserList(result);
38
- },
39
- onError: (error) => {
40
- message.error(error.message);
41
- }
42
- });
36
+ const { result: searchResult, loading, failed, retry } = useMemberSearch(queryByKeywords, searchString, !usesGroupQuery);
37
+ const searchUserList = searchResult.items;
43
38
  const totalUserList = useMemo(() => {
44
39
  const totalUsers = searchUserList.concat(selectedUserList).filter((item) => {
45
40
  if (filterItem) return filterItem(item);
@@ -54,9 +49,6 @@ var PanelWrapper = ({ type = EMemberPicker.USER, value, multiple, dropdownWidth,
54
49
  selectedUserList,
55
50
  filterItem
56
51
  ]);
57
- useEffect(() => {
58
- run();
59
- }, [run, searchString]);
60
52
  useEffect(() => {
61
53
  if (Array.isArray(value) && (isUser(value[0]) || isUserGroup(value[0]))) setSelectedUserList(value);
62
54
  else if (isUser(value) || isUserGroup(value)) setSelectedUserList([value]);
@@ -74,7 +66,19 @@ var PanelWrapper = ({ type = EMemberPicker.USER, value, multiple, dropdownWidth,
74
66
  });
75
67
  }
76
68
  }, [value, queryByIds]);
69
+ const onSelectedChange = useCallback((users) => {
70
+ if (multiple) onChange?.(users);
71
+ else onChange?.(users[0]);
72
+ }, [multiple, onChange]);
77
73
  return /* @__PURE__ */ jsx(Panel, {
74
+ searchFailed: failed,
75
+ useProvidedGroupSearch: type === EMemberPicker.BOTH && !usesGroupQuery,
76
+ searchFeedback: !usesGroupQuery && /* @__PURE__ */ jsx(SearchFeedback, {
77
+ failed,
78
+ hasMore: searchResult.hasMore,
79
+ pathWarningCode: searchResult.pathWarningCode,
80
+ retry
81
+ }),
78
82
  type,
79
83
  value: selectedUserList,
80
84
  dataList: totalUserList,
@@ -84,10 +88,7 @@ var PanelWrapper = ({ type = EMemberPicker.USER, value, multiple, dropdownWidth,
84
88
  onSearchValueChange,
85
89
  searchValue: searchString,
86
90
  showSearch: true,
87
- onChange: useCallback((users) => {
88
- if (multiple) onChange?.(users);
89
- else onChange?.(users[0]);
90
- }, [multiple, onChange]),
91
+ onChange: onSelectedChange,
91
92
  className,
92
93
  onCancel,
93
94
  lockedIds,
@@ -1 +1 @@
1
- {"version":3,"file":"PanelWrapper.js","names":[],"sources":["../../../src/MemberPicker/components/PanelWrapper.tsx"],"sourcesContent":["import { useRequest } from 'ahooks';\nimport _ from 'lodash';\nimport React, {\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport { message } from '../../';\nimport ConfigProvider from '../../ConfigProvider';\nimport {\n EUserType,\n IUserGroup,\n TUser,\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { EMemberPicker, IUser, TMemberPickerValue } from '../interface';\nimport { isUser, isUserGroup } from '../utils/getUsersWithUserId';\nimport Panel from './Panel';\n\ninterface IProps {\n type?: EMemberPicker;\n multiple?: boolean;\n onChange?(v: TUser | (IUser | IUserGroup)): void;\n dropdownWidth?: number;\n value?: TMemberPickerValue;\n className?: string;\n onCancel?: () => void;\n lockedIds?: Array<TUserValue | TUserGroupValue>;\n showUserId?: boolean;\n footer?: ReactNode;\n renderItem?: (\n item: IUser | IUserGroup,\n context: {\n isSelected: boolean;\n disabled: boolean;\n onClick: () => void;\n onNextLevel?: () => void;\n originNode: ReactNode;\n },\n ) => ReactNode;\n renderSelectedTag?: (\n user: IUser | IUserGroup,\n originNode: ReactNode,\n ) => ReactNode;\n filterItem?: (item: IUser | IUserGroup) => boolean;\n}\n\nexport const PanelWrapper = ({\n type = EMemberPicker.USER,\n value,\n multiple,\n dropdownWidth,\n onChange,\n onCancel,\n className,\n footer,\n lockedIds = [],\n renderItem,\n renderSelectedTag,\n filterItem,\n}: IProps) => {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const { getUsersByIds, getUsersByKeywords } = ConfigProvider.useGetUserList();\n const [selectedUserList, setSelectedUserList] = useState<TUser>([]);\n const [searchUserList, setSearchUserList] = useState<TUser>([]);\n const [searchString, setSearchString] = useState<string>('');\n\n const onSearchValueChange = useCallback((v: string) => {\n setSearchString(v);\n }, []);\n\n const queryByKeywords = useMemo(() => {\n if (getUsersByKeywords) {\n return getUsersByKeywords;\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 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 const totalUserList: TUser = useMemo(() => {\n const totalUsers = searchUserList\n .concat(selectedUserList)\n .filter((item) => {\n if (filterItem) {\n return filterItem(item);\n }\n return true;\n });\n return _.uniqBy(totalUsers, (data: IUser | IUserGroup) => {\n if (data.type === EUserType.USER) return data.userId;\n return data.groupId;\n });\n }, [searchUserList, selectedUserList, filterItem]);\n\n useEffect(() => {\n run();\n }, [run, searchString]);\n\n useEffect(() => {\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 return;\n }\n if (!Array.isArray(value)) {\n param = [value];\n } else {\n param = value;\n }\n queryByIds(param).then((result) => {\n setSelectedUserList(result);\n });\n }\n }, [value, queryByIds]);\n\n const onSelectedChange = useCallback(\n (users: TUser) => {\n if (multiple) {\n onChange?.(users);\n } else {\n onChange?.(users[0]);\n }\n },\n [multiple, onChange],\n );\n\n return (\n <Panel\n type={type}\n value={selectedUserList}\n dataList={totalUserList}\n multiple={multiple}\n loading={loading}\n dropdownWidth={dropdownWidth}\n onSearchValueChange={onSearchValueChange}\n searchValue={searchString}\n showSearch\n onChange={onSelectedChange}\n className={className}\n onCancel={onCancel}\n lockedIds={lockedIds}\n footer={footer}\n renderItem={renderItem}\n renderSelectedTag={renderSelectedTag}\n ></Panel>\n );\n};\n\nexport default PanelWrapper;\n"],"mappings":";;;;;;;;;;;;AAoDA,IAAa,gBAAgB,EAC3B,OAAO,cAAc,MACrB,OACA,UACA,eACA,UACA,UACA,WACA,QACA,YAAY,EAAE,EACd,YACA,mBACA,iBACY;CACZ,MAAM,EAAE,WAAW,WAAW,cAAc;CAC5C,MAAM,IAAI,cAAc,OAAO;CAE/B,MAAM,EAAE,eAAe,uBAAuB,wBAAe,gBAAgB;CAC7E,MAAM,CAAC,kBAAkB,uBAAuB,SAAgB,EAAE,CAAC;CACnE,MAAM,CAAC,gBAAgB,qBAAqB,SAAgB,EAAE,CAAC;CAC/D,MAAM,CAAC,cAAc,mBAAmB,SAAiB,GAAG;CAE5D,MAAM,sBAAsB,aAAa,MAAc;AACrD,kBAAgB,EAAE;IACjB,EAAE,CAAC;CAEN,MAAM,kBAAkB,cAAc;AACpC,MAAI,mBACF,QAAO;AAET,UAAQ,UAAU,EAAE,KAClB,QAAQ,OAAO,EACb,SAAS,EAAE,aAAa,qCACzB,CAAC;IACH,CAAC,oBAAoB,EAAE,aAAa,oCAAoC,CAAC;CAC5E,MAAM,aAAa,cAAc;AAC/B,MAAI,cACF,QAAO;AAET,UAAQ,UAAU,EAAE,KAClB,QAAQ,OAAO,EACb,SAAS,EAAE,aAAa,gCACzB,CAAC;IACH,CAAC,eAAe,EAAE,aAAa,+BAA+B,CAAC;CAClE,MAAM,EAAE,SAAS,QAAQ,iBAAiB,gBAAgB,aAAa,EAAE;EACvE,aAAa,CAAC,aAAa;EAC3B,QAAQ;EACR,UAAU;EACV,WAAW,MAAO,KAAK;EACvB,YAAY,WAAW;AACrB,qBAAkB,OAAO;;EAE3B,UAAU,UAAU;AAClB,WAAQ,MAAM,MAAM,QAAQ;;EAE/B,CAAC;CACF,MAAM,gBAAuB,cAAc;EACzC,MAAM,aAAa,eAChB,OAAO,iBAAiB,CACxB,QAAQ,SAAS;AAChB,OAAI,WACF,QAAO,WAAW,KAAK;AAEzB,UAAO;IACP;AACJ,SAAO,EAAE,OAAO,aAAa,SAA6B;AACxD,OAAI,KAAK,SAAS,UAAU,KAAM,QAAO,KAAK;AAC9C,UAAO,KAAK;IACZ;IACD;EAAC;EAAgB;EAAkB;EAAW,CAAC;AAElD,iBAAgB;AACd,OAAK;IACJ,CAAC,KAAK,aAAa,CAAC;AAEvB,iBAAgB;AACd,MAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,MAAM,GAAG,IAAI,YAAY,MAAM,GAAG,EACpE,qBAAoB,MAAe;WAC1B,OAAO,MAAM,IAAI,YAAY,MAAM,CAC5C,qBAAoB,CAAC,MAAM,CAAC;OACvB;GACL,IAAI,QAA6C,EAAE;AACnD,OAAI,CAAC,MAAO;AACZ,OAAI,MAAM,QAAQ,MAAM,IAAI,MAAM,WAAW,GAAG;AAC9C,wBAAoB,EAAE,CAAC;AACvB;;AAEF,OAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,SAAQ,CAAC,MAAM;OAEf,SAAQ;AAEV,cAAW,MAAM,CAAC,MAAM,WAAW;AACjC,wBAAoB,OAAO;KAC3B;;IAEH,CAAC,OAAO,WAAW,CAAC;AAavB,QACE,oBAAC,OAAD;EACQ;EACN,OAAO;EACP,UAAU;EACA;EACD;EACM;EACM;EACrB,aAAa;EACb,YAAA;EACA,UAtBqB,aACtB,UAAiB;AAChB,OAAI,SACF,YAAW,MAAM;OAEjB,YAAW,MAAM,GAAG;KAGxB,CAAC,UAAU,SAAS,CACrB;EAcc;EACD;EACC;EACH;EACI;EACO;EACZ,CAAA"}
1
+ {"version":3,"file":"PanelWrapper.js","names":[],"sources":["../../../src/MemberPicker/components/PanelWrapper.tsx"],"sourcesContent":["import useMemberSearch from '../useMemberSearch';\nimport SearchFeedback from './SearchFeedback';\nimport _ from 'lodash';\nimport React, {\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\nimport ConfigProvider from '../../ConfigProvider';\nimport {\n EUserType,\n IUserGroup,\n TUser,\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { EMemberPicker, IUser, TMemberPickerValue } from '../interface';\nimport { isUser, isUserGroup } from '../utils/getUsersWithUserId';\nimport Panel from './Panel';\n\ninterface IProps {\n type?: EMemberPicker;\n multiple?: boolean;\n onChange?(v: TUser | (IUser | IUserGroup)): void;\n dropdownWidth?: number;\n value?: TMemberPickerValue;\n className?: string;\n onCancel?: () => void;\n lockedIds?: Array<TUserValue | TUserGroupValue>;\n showUserId?: boolean;\n footer?: ReactNode;\n renderItem?: (\n item: IUser | IUserGroup,\n context: {\n isSelected: boolean;\n disabled: boolean;\n onClick: () => void;\n onNextLevel?: () => void;\n originNode: ReactNode;\n },\n ) => ReactNode;\n renderSelectedTag?: (\n user: IUser | IUserGroup,\n originNode: ReactNode,\n ) => ReactNode;\n filterItem?: (item: IUser | IUserGroup) => boolean;\n}\n\nexport const PanelWrapper = ({\n type = EMemberPicker.USER,\n value,\n multiple,\n dropdownWidth,\n onChange,\n onCancel,\n className,\n footer,\n lockedIds = [],\n renderItem,\n renderSelectedTag,\n filterItem,\n}: IProps) => {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const {\n getUsersByIds,\n getUsersByKeywords,\n getUsersByKeywordsWithMeta,\n getNextLevelGroup,\n getNextLevelGroupWithMeta,\n } = ConfigProvider.useGetUserList();\n const usesGroupQuery =\n (type === EMemberPicker.GROUP ||\n (!getUsersByKeywords && !getUsersByKeywordsWithMeta)) &&\n !!(getNextLevelGroup || getNextLevelGroupWithMeta);\n const [selectedUserList, setSelectedUserList] = useState<TUser>([]);\n const [searchString, setSearchString] = useState<string>('');\n\n const onSearchValueChange = useCallback((v: string) => {\n setSearchString(v);\n }, []);\n\n const queryByKeywords = useMemo(() => {\n if (getUsersByKeywordsWithMeta) return getUsersByKeywordsWithMeta;\n if (getUsersByKeywords) {\n return getUsersByKeywords;\n }\n return (_params = {}) =>\n Promise.reject({\n message: t.MemberPicker.pleaseConfigGetUserByKeywordsMethod,\n });\n }, [\n getUsersByKeywords,\n getUsersByKeywordsWithMeta,\n t.MemberPicker.pleaseConfigGetUserByKeywordsMethod,\n ]);\n const queryByIds = useMemo(() => {\n if (getUsersByIds) {\n return getUsersByIds;\n }\n return (_params = {}) =>\n Promise.reject({\n message: t.MemberPicker.pleaseConfigGetUserByIdsMethod,\n });\n }, [getUsersByIds, t.MemberPicker.pleaseConfigGetUserByIdsMethod]);\n const {\n result: searchResult,\n loading,\n failed,\n retry,\n } = useMemberSearch<IUser | IUserGroup>(\n queryByKeywords,\n searchString,\n !usesGroupQuery,\n );\n const searchUserList = searchResult.items;\n\n const totalUserList: TUser = useMemo(() => {\n const totalUsers = searchUserList\n .concat(selectedUserList)\n .filter((item) => {\n if (filterItem) {\n return filterItem(item);\n }\n return true;\n });\n return _.uniqBy(totalUsers, (data: IUser | IUserGroup) => {\n if (data.type === EUserType.USER) return data.userId;\n return data.groupId;\n });\n }, [searchUserList, selectedUserList, filterItem]);\n\n useEffect(() => {\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 return;\n }\n if (!Array.isArray(value)) {\n param = [value];\n } else {\n param = value;\n }\n queryByIds(param).then((result) => {\n setSelectedUserList(result);\n });\n }\n }, [value, queryByIds]);\n\n const onSelectedChange = useCallback(\n (users: TUser) => {\n if (multiple) {\n onChange?.(users);\n } else {\n onChange?.(users[0]);\n }\n },\n [multiple, onChange],\n );\n\n return (\n <Panel\n searchFailed={failed}\n useProvidedGroupSearch={type === EMemberPicker.BOTH && !usesGroupQuery}\n searchFeedback={\n !usesGroupQuery && (\n <SearchFeedback\n failed={failed}\n hasMore={searchResult.hasMore}\n pathWarningCode={searchResult.pathWarningCode}\n retry={retry}\n />\n )\n }\n type={type}\n value={selectedUserList}\n dataList={totalUserList}\n multiple={multiple}\n loading={loading}\n dropdownWidth={dropdownWidth}\n onSearchValueChange={onSearchValueChange}\n searchValue={searchString}\n showSearch\n onChange={onSelectedChange}\n className={className}\n onCancel={onCancel}\n lockedIds={lockedIds}\n footer={footer}\n renderItem={renderItem}\n renderSelectedTag={renderSelectedTag}\n ></Panel>\n );\n};\n\nexport default PanelWrapper;\n"],"mappings":";;;;;;;;;;;;AAoDA,IAAa,gBAAgB,EAC3B,OAAO,cAAc,MACrB,OACA,UACA,eACA,UACA,UACA,WACA,QACA,YAAY,EAAE,EACd,YACA,mBACA,iBACY;CACZ,MAAM,EAAE,WAAW,WAAW,cAAc;CAC5C,MAAM,IAAI,cAAc,OAAO;CAE/B,MAAM,EACJ,eACA,oBACA,4BACA,mBACA,8BACE,wBAAe,gBAAgB;CACnC,MAAM,kBACH,SAAS,cAAc,SACrB,CAAC,sBAAsB,CAAC,+BAC3B,CAAC,EAAE,qBAAqB;CAC1B,MAAM,CAAC,kBAAkB,uBAAuB,SAAgB,EAAE,CAAC;CACnE,MAAM,CAAC,cAAc,mBAAmB,SAAiB,GAAG;CAE5D,MAAM,sBAAsB,aAAa,MAAc;AACrD,kBAAgB,EAAE;IACjB,EAAE,CAAC;CAEN,MAAM,kBAAkB,cAAc;AACpC,MAAI,2BAA4B,QAAO;AACvC,MAAI,mBACF,QAAO;AAET,UAAQ,UAAU,EAAE,KAClB,QAAQ,OAAO,EACb,SAAS,EAAE,aAAa,qCACzB,CAAC;IACH;EACD;EACA;EACA,EAAE,aAAa;EAChB,CAAC;CACF,MAAM,aAAa,cAAc;AAC/B,MAAI,cACF,QAAO;AAET,UAAQ,UAAU,EAAE,KAClB,QAAQ,OAAO,EACb,SAAS,EAAE,aAAa,gCACzB,CAAC;IACH,CAAC,eAAe,EAAE,aAAa,+BAA+B,CAAC;CAClE,MAAM,EACJ,QAAQ,cACR,SACA,QACA,UACE,gBACF,iBACA,cACA,CAAC,eACF;CACD,MAAM,iBAAiB,aAAa;CAEpC,MAAM,gBAAuB,cAAc;EACzC,MAAM,aAAa,eAChB,OAAO,iBAAiB,CACxB,QAAQ,SAAS;AAChB,OAAI,WACF,QAAO,WAAW,KAAK;AAEzB,UAAO;IACP;AACJ,SAAO,EAAE,OAAO,aAAa,SAA6B;AACxD,OAAI,KAAK,SAAS,UAAU,KAAM,QAAO,KAAK;AAC9C,UAAO,KAAK;IACZ;IACD;EAAC;EAAgB;EAAkB;EAAW,CAAC;AAElD,iBAAgB;AACd,MAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,MAAM,GAAG,IAAI,YAAY,MAAM,GAAG,EACpE,qBAAoB,MAAe;WAC1B,OAAO,MAAM,IAAI,YAAY,MAAM,CAC5C,qBAAoB,CAAC,MAAM,CAAC;OACvB;GACL,IAAI,QAA6C,EAAE;AACnD,OAAI,CAAC,MAAO;AACZ,OAAI,MAAM,QAAQ,MAAM,IAAI,MAAM,WAAW,GAAG;AAC9C,wBAAoB,EAAE,CAAC;AACvB;;AAEF,OAAI,CAAC,MAAM,QAAQ,MAAM,CACvB,SAAQ,CAAC,MAAM;OAEf,SAAQ;AAEV,cAAW,MAAM,CAAC,MAAM,WAAW;AACjC,wBAAoB,OAAO;KAC3B;;IAEH,CAAC,OAAO,WAAW,CAAC;CAEvB,MAAM,mBAAmB,aACtB,UAAiB;AAChB,MAAI,SACF,YAAW,MAAM;MAEjB,YAAW,MAAM,GAAG;IAGxB,CAAC,UAAU,SAAS,CACrB;AAED,QACE,oBAAC,OAAD;EACE,cAAc;EACd,wBAAwB,SAAS,cAAc,QAAQ,CAAC;EACxD,gBACE,CAAC,kBACC,oBAAC,gBAAD;GACU;GACR,SAAS,aAAa;GACtB,iBAAiB,aAAa;GACvB;GACP,CAAA;EAGA;EACN,OAAO;EACP,UAAU;EACA;EACD;EACM;EACM;EACrB,aAAa;EACb,YAAA;EACA,UAAU;EACC;EACD;EACC;EACH;EACI;EACO;EACZ,CAAA"}
@@ -0,0 +1,7 @@
1
+ /** 只展示当前请求的可恢复状态,不重复弹出业务层已上报的错误。 */
2
+ export default function SearchFeedback({ failed, hasMore, pathWarningCode, retry, }: {
3
+ failed?: boolean;
4
+ hasMore?: boolean;
5
+ pathWarningCode?: string | null;
6
+ retry: () => void;
7
+ }): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,27 @@
1
+ import { LocaleContext, getTranslator } from "../../locale/default.js";
2
+ import TextLink from "../../TextLink/index.js";
3
+ import { useContext } from "react";
4
+ import { jsx, jsxs } from "react/jsx-runtime";
5
+ //#region src/MemberPicker/components/SearchFeedback.tsx
6
+ /** 只展示当前请求的可恢复状态,不重复弹出业务层已上报的错误。 */
7
+ function SearchFeedback({ failed, hasMore, pathWarningCode, retry }) {
8
+ const { locale } = useContext(LocaleContext);
9
+ const t = getTranslator(locale);
10
+ if (!failed && !hasMore && !pathWarningCode) return null;
11
+ return /* @__PURE__ */ jsxs("div", {
12
+ role: "status",
13
+ children: [
14
+ failed && /* @__PURE__ */ jsx("span", { children: t.MemberPicker.searchFailed }),
15
+ !failed && pathWarningCode && /* @__PURE__ */ jsx("span", { children: t.MemberPicker.pathUnavailable }),
16
+ hasMore && /* @__PURE__ */ jsx("span", { children: t.MemberPicker.moreResults }),
17
+ (failed || pathWarningCode) && /* @__PURE__ */ jsx(TextLink, {
18
+ onClick: retry,
19
+ children: t.MemberPicker.retry
20
+ })
21
+ ]
22
+ });
23
+ }
24
+ //#endregion
25
+ export { SearchFeedback as default };
26
+
27
+ //# sourceMappingURL=SearchFeedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchFeedback.js","names":[],"sources":["../../../src/MemberPicker/components/SearchFeedback.tsx"],"sourcesContent":["import React, { useContext } from 'react';\nimport TextLink from '../../TextLink';\nimport { LocaleContext, getTranslator } from '../../locale/default';\n\n/** 只展示当前请求的可恢复状态,不重复弹出业务层已上报的错误。 */\nexport default function SearchFeedback({\n failed,\n hasMore,\n pathWarningCode,\n retry,\n}: {\n failed?: boolean;\n hasMore?: boolean;\n pathWarningCode?: string | null;\n retry: () => void;\n}) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n if (!failed && !hasMore && !pathWarningCode) return null;\n return (\n <div role=\"status\">\n {failed && <span>{t.MemberPicker.searchFailed}</span>}\n {!failed && pathWarningCode && (\n <span>{t.MemberPicker.pathUnavailable}</span>\n )}\n {hasMore && <span>{t.MemberPicker.moreResults}</span>}\n {(failed || pathWarningCode) && (\n <TextLink onClick={retry}>{t.MemberPicker.retry}</TextLink>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;AAKA,SAAwB,eAAe,EACrC,QACA,SACA,iBACA,SAMC;CACD,MAAM,EAAE,WAAW,WAAW,cAAc;CAC5C,MAAM,IAAI,cAAc,OAAO;AAC/B,KAAI,CAAC,UAAU,CAAC,WAAW,CAAC,gBAAiB,QAAO;AACpD,QACE,qBAAC,OAAD;EAAK,MAAK;YAAV;GACG,UAAU,oBAAC,QAAD,EAAA,UAAO,EAAE,aAAa,cAAoB,CAAA;GACpD,CAAC,UAAU,mBACV,oBAAC,QAAD,EAAA,UAAO,EAAE,aAAa,iBAAuB,CAAA;GAE9C,WAAW,oBAAC,QAAD,EAAA,UAAO,EAAE,aAAa,aAAmB,CAAA;IACnD,UAAU,oBACV,oBAAC,UAAD;IAAU,SAAS;cAAQ,EAAE,aAAa;IAAiB,CAAA;GAEzD"}
@@ -9,6 +9,7 @@ interface IMultipleOptionProps {
9
9
  onNextLevel?: (userGroup: IUserGroup) => void;
10
10
  hasNextLevel?: boolean;
11
11
  showUserId?: boolean;
12
+ searchValue?: string;
12
13
  }
13
14
  export default function SingleOption(params: IMultipleOptionProps): import("react/jsx-runtime").JSX.Element;
14
15
  export {};
@@ -14,7 +14,7 @@ function SingleOption(params) {
14
14
  const { locale } = useContext(LocaleContext);
15
15
  const t = getTranslator(locale);
16
16
  const { getMemberPickerItemMoreInfoKey } = AldCustomConfigProvider.useGetUserList();
17
- const { disabled, user, selected, onChange, className, onNextLevel, hasNextLevel = true, showUserId } = params;
17
+ const { disabled, user, selected, onChange, className, onNextLevel, hasNextLevel = true, searchValue, showUserId } = params;
18
18
  const onClick = () => {
19
19
  if (disabled) return;
20
20
  if (selected) onChange?.(selected, user);
@@ -40,6 +40,8 @@ function SingleOption(params) {
40
40
  children: /* @__PURE__ */ jsxs("div", {
41
41
  className: "ald-member-picker-option-content",
42
42
  children: [/* @__PURE__ */ jsx(NickLabel_default, {
43
+ searchValue,
44
+ path: isUserGroup(user) ? user.path : void 0,
43
45
  type: user.type,
44
46
  id: getId(user),
45
47
  name: user.name,
@@ -1 +1 @@
1
- {"version":3,"file":"SingleOption.js","names":[],"sources":["../../../src/MemberPicker/components/SingleOption.tsx"],"sourcesContent":["import { cn } from '../../lib/utils';\nimport React, { useContext } from 'react';\nimport Badge from '../../Badge';\nimport ConfigProvider from '../../ConfigProvider';\nimport { EUserType, IUserGroup } from '../../ConfigProvider/getUserList';\nimport TextLink from '../../TextLink/index';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { IUser } from '../interface';\nimport { getAccount, getId, getPhoto } from '../utils';\nimport { isUser, isUserGroup } from '../utils/getUsersWithUserId';\nimport NickLabel from './NickLabel';\ninterface IMultipleOptionProps {\n selected: boolean;\n disabled?: boolean;\n user: IUser | IUserGroup;\n onChange?: (selected: boolean, user: IUser | IUserGroup) => void;\n className?: string;\n onNextLevel?: (userGroup: IUserGroup) => void;\n hasNextLevel?: boolean;\n showUserId?: boolean;\n}\nexport default function SingleOption(params: IMultipleOptionProps) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const { getMemberPickerItemMoreInfoKey } = ConfigProvider.useGetUserList();\n\n const {\n disabled,\n user,\n selected,\n onChange,\n className,\n onNextLevel,\n hasNextLevel = true,\n showUserId,\n } = params;\n\n const onClick = () => {\n if (disabled) return;\n\n if (selected) {\n onChange?.(selected, user);\n } else onChange?.(!selected, user);\n };\n\n return (\n <div\n role=\"option\"\n id={`ald-member-picker-option-${getId(user)}`}\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n tabIndex={-1}\n className={cn('ald-member-picker-option', className, {\n ['ald-member-picker-option-disabled']: disabled,\n })}\n onClick={onClick}\n onKeyDown={(event) => {\n if (disabled) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onClick();\n }\n }}\n >\n <div className={'ald-member-picker-label'}>\n <div className={'ald-member-picker-option-content'}>\n <NickLabel\n type={user.type}\n id={getId(user)}\n name={user.name as string}\n photo={getPhoto(user)}\n account={getAccount(user)}\n addonBefore={\n showUserId &&\n user.type === EUserType.USER && (\n <span className={'ald-member-picker-option-id'}>\n {getMemberPickerItemMoreInfoKey\n ? getMemberPickerItemMoreInfoKey(user)\n : user.userId}\n </span>\n )\n }\n ></NickLabel>\n {/* 如果是用户的话并且user.ban为true,则展示 已停用 Tag */}\n {isUser(user) && user.ban && (\n <Badge\n status=\"default\"\n count={t.MemberPicker.ban}\n className={'ald-member-picker-ban-badge'}\n ></Badge>\n )}\n </div>\n </div>\n {isUserGroup(user) && hasNextLevel && (\n <TextLink\n className=\"ald-member-picker-btn\"\n size=\"small\"\n disabled={disabled}\n onClick={(e) => {\n onNextLevel?.(user);\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n {t.MemberPicker.subLevel}\n </TextLink>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAqBA,SAAwB,aAAa,QAA8B;CACjE,MAAM,EAAE,WAAW,WAAW,cAAc;CAC5C,MAAM,IAAI,cAAc,OAAO;CAE/B,MAAM,EAAE,mCAAmC,wBAAe,gBAAgB;CAE1E,MAAM,EACJ,UACA,MACA,UACA,UACA,WACA,aACA,eAAe,MACf,eACE;CAEJ,MAAM,gBAAgB;AACpB,MAAI,SAAU;AAEd,MAAI,SACF,YAAW,UAAU,KAAK;MACrB,YAAW,CAAC,UAAU,KAAK;;AAGpC,QACE,qBAAC,OAAD;EACE,MAAK;EACL,IAAI,4BAA4B,MAAM,KAAK;EAC3C,iBAAe;EACf,iBAAe,YAAY;EAC3B,UAAU;EACV,WAAW,GAAG,4BAA4B,WAAW,GAClD,sCAAsC,UACxC,CAAC;EACO;EACT,YAAY,UAAU;AACpB,OAAI,SAAU;AACd,OAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,UAAM,gBAAgB;AACtB,aAAS;;;YAdf,CAkBE,oBAAC,OAAD;GAAK,WAAW;aACd,qBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,oBAAC,mBAAD;KACE,MAAM,KAAK;KACX,IAAI,MAAM,KAAK;KACf,MAAM,KAAK;KACX,OAAO,SAAS,KAAK;KACrB,SAAS,WAAW,KAAK;KACzB,aACE,cACA,KAAK,SAAS,UAAU,QACtB,oBAAC,QAAD;MAAM,WAAW;gBACd,iCACG,+BAA+B,KAAK,GACpC,KAAK;MACJ,CAAA;KAGA,CAAA,EAEZ,OAAO,KAAK,IAAI,KAAK,OACpB,oBAAC,OAAD;KACE,QAAO;KACP,OAAO,EAAE,aAAa;KACtB,WAAW;KACJ,CAAA,CAEP;;GACF,CAAA,EACL,YAAY,KAAK,IAAI,gBACpB,oBAAC,UAAD;GACE,WAAU;GACV,MAAK;GACK;GACV,UAAU,MAAM;AACd,kBAAc,KAAK;AACnB,MAAE,iBAAiB;AACnB,MAAE,gBAAgB;;aAGnB,EAAE,aAAa;GACP,CAAA,CAET"}
1
+ {"version":3,"file":"SingleOption.js","names":[],"sources":["../../../src/MemberPicker/components/SingleOption.tsx"],"sourcesContent":["import { cn } from '../../lib/utils';\nimport React, { useContext } from 'react';\nimport Badge from '../../Badge';\nimport ConfigProvider from '../../ConfigProvider';\nimport { EUserType, IUserGroup } from '../../ConfigProvider/getUserList';\nimport TextLink from '../../TextLink/index';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { IUser } from '../interface';\nimport { getAccount, getId, getPhoto } from '../utils';\nimport { isUser, isUserGroup } from '../utils/getUsersWithUserId';\nimport NickLabel from './NickLabel';\ninterface IMultipleOptionProps {\n selected: boolean;\n disabled?: boolean;\n user: IUser | IUserGroup;\n onChange?: (selected: boolean, user: IUser | IUserGroup) => void;\n className?: string;\n onNextLevel?: (userGroup: IUserGroup) => void;\n hasNextLevel?: boolean;\n showUserId?: boolean;\n searchValue?: string;\n}\nexport default function SingleOption(params: IMultipleOptionProps) {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const { getMemberPickerItemMoreInfoKey } = ConfigProvider.useGetUserList();\n\n const {\n disabled,\n user,\n selected,\n onChange,\n className,\n onNextLevel,\n hasNextLevel = true,\n searchValue,\n showUserId,\n } = params;\n\n const onClick = () => {\n if (disabled) return;\n\n if (selected) {\n onChange?.(selected, user);\n } else onChange?.(!selected, user);\n };\n\n return (\n <div\n role=\"option\"\n id={`ald-member-picker-option-${getId(user)}`}\n aria-selected={selected}\n aria-disabled={disabled || undefined}\n tabIndex={-1}\n className={cn('ald-member-picker-option', className, {\n ['ald-member-picker-option-disabled']: disabled,\n })}\n onClick={onClick}\n onKeyDown={(event) => {\n if (disabled) return;\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n onClick();\n }\n }}\n >\n <div className={'ald-member-picker-label'}>\n <div className={'ald-member-picker-option-content'}>\n <NickLabel\n searchValue={searchValue}\n path={isUserGroup(user) ? user.path : undefined}\n type={user.type}\n id={getId(user)}\n name={user.name as string}\n photo={getPhoto(user)}\n account={getAccount(user)}\n addonBefore={\n showUserId &&\n user.type === EUserType.USER && (\n <span className={'ald-member-picker-option-id'}>\n {getMemberPickerItemMoreInfoKey\n ? getMemberPickerItemMoreInfoKey(user)\n : user.userId}\n </span>\n )\n }\n ></NickLabel>\n {/* 如果是用户的话并且user.ban为true,则展示 已停用 Tag */}\n {isUser(user) && user.ban && (\n <Badge\n status=\"default\"\n count={t.MemberPicker.ban}\n className={'ald-member-picker-ban-badge'}\n ></Badge>\n )}\n </div>\n </div>\n {isUserGroup(user) && hasNextLevel && (\n <TextLink\n className=\"ald-member-picker-btn\"\n size=\"small\"\n disabled={disabled}\n onClick={(e) => {\n onNextLevel?.(user);\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n {t.MemberPicker.subLevel}\n </TextLink>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;AAsBA,SAAwB,aAAa,QAA8B;CACjE,MAAM,EAAE,WAAW,WAAW,cAAc;CAC5C,MAAM,IAAI,cAAc,OAAO;CAE/B,MAAM,EAAE,mCAAmC,wBAAe,gBAAgB;CAE1E,MAAM,EACJ,UACA,MACA,UACA,UACA,WACA,aACA,eAAe,MACf,aACA,eACE;CAEJ,MAAM,gBAAgB;AACpB,MAAI,SAAU;AAEd,MAAI,SACF,YAAW,UAAU,KAAK;MACrB,YAAW,CAAC,UAAU,KAAK;;AAGpC,QACE,qBAAC,OAAD;EACE,MAAK;EACL,IAAI,4BAA4B,MAAM,KAAK;EAC3C,iBAAe;EACf,iBAAe,YAAY;EAC3B,UAAU;EACV,WAAW,GAAG,4BAA4B,WAAW,GAClD,sCAAsC,UACxC,CAAC;EACO;EACT,YAAY,UAAU;AACpB,OAAI,SAAU;AACd,OAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,UAAM,gBAAgB;AACtB,aAAS;;;YAdf,CAkBE,oBAAC,OAAD;GAAK,WAAW;aACd,qBAAC,OAAD;IAAK,WAAW;cAAhB,CACE,oBAAC,mBAAD;KACe;KACb,MAAM,YAAY,KAAK,GAAG,KAAK,OAAO;KACtC,MAAM,KAAK;KACX,IAAI,MAAM,KAAK;KACf,MAAM,KAAK;KACX,OAAO,SAAS,KAAK;KACrB,SAAS,WAAW,KAAK;KACzB,aACE,cACA,KAAK,SAAS,UAAU,QACtB,oBAAC,QAAD;MAAM,WAAW;gBACd,iCACG,+BAA+B,KAAK,GACpC,KAAK;MACJ,CAAA;KAGA,CAAA,EAEZ,OAAO,KAAK,IAAI,KAAK,OACpB,oBAAC,OAAD;KACE,QAAO;KACP,OAAO,EAAE,aAAa;KACtB,WAAW;KACJ,CAAA,CAEP;;GACF,CAAA,EACL,YAAY,KAAK,IAAI,gBACpB,oBAAC,UAAD;GACE,WAAU;GACV,MAAK;GACK;GACV,UAAU,MAAM;AACd,kBAAc,KAAK;AACnB,MAAE,iBAAiB;AACnB,MAAE,gBAAgB;;aAGnB,EAAE,aAAa;GACP,CAAA,CAET"}
@@ -1,6 +1,9 @@
1
1
  import { default as React } from 'react';
2
2
  import { IUserGroup, TUserGroupValue, TUserValue } from '../../ConfigProvider/getUserList';
3
3
  interface IProps {
4
+ active?: boolean;
5
+ useProvidedSearch?: boolean;
6
+ parentSearchFailed?: boolean;
4
7
  className?: string;
5
8
  userGroupList: IUserGroup[];
6
9
  multiple?: boolean;
@@ -21,5 +24,5 @@ interface IProps {
21
24
  originNode: React.ReactNode;
22
25
  }) => React.ReactNode;
23
26
  }
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;
27
+ declare const UserGroupSelection: ({ active, useProvidedSearch, parentSearchFailed, className, userGroupList, multiple, onChange, selectedUsersGroup: selectedUsersGroups, loading, onSearchValueChange, width, lockedIds, filterItem, searchValue, showSearch, renderItem, }: IProps) => import("react/jsx-runtime").JSX.Element;
25
28
  export default UserGroupSelection;
@@ -8,42 +8,40 @@ import Empty from "../../Empty/index.js";
8
8
  import ScrollArea_default from "../../ScrollArea/index.js";
9
9
  import GetUserListContext from "../../ConfigProvider/getUserList.js";
10
10
  import CustomSpin from "../../Spin/index.js";
11
+ import SearchFeedback from "./SearchFeedback.js";
12
+ import useMemberSearch from "../useMemberSearch.js";
11
13
  import { isUserGroup } from "../utils/getUsersWithUserId.js";
12
14
  import MultipleList from "./MultipleOption.js";
13
15
  import SingleOption from "./SingleOption.js";
14
- import { useContext, useEffect, useMemo, useState } from "react";
16
+ import { useCallback, useContext, useMemo, useState } from "react";
15
17
  import { jsx, jsxs } from "react/jsx-runtime";
16
18
  import _ from "lodash";
17
19
  //#region src/MemberPicker/components/UserGroupSelection.tsx
18
- var UserGroupSelection = ({ className, userGroupList, multiple, onChange, selectedUsersGroup: selectedUsersGroups, loading, onSearchValueChange, width, lockedIds, filterItem, searchValue = "", showSearch, renderItem }) => {
20
+ var UserGroupSelection = ({ active = true, useProvidedSearch = false, parentSearchFailed = false, className, userGroupList, multiple, onChange, selectedUsersGroup: selectedUsersGroups, loading, onSearchValueChange, width, lockedIds, filterItem, searchValue = "", showSearch, renderItem }) => {
19
21
  const { locale } = useContext(LocaleContext);
20
22
  const t = getTranslator(locale);
21
- const { getNextLevelGroup } = useContext(GetUserListContext);
22
- const isAsync = !!getNextLevelGroup;
23
+ const { getNextLevelGroup, getNextLevelGroupWithMeta } = useContext(GetUserListContext);
24
+ const isAsync = !!(getNextLevelGroup || getNextLevelGroupWithMeta);
23
25
  const [groupPath, setGroupPath] = useState([]);
24
- const [asyncUserGroupList, setAsyncUserGroupList] = useState([]);
25
26
  const parentGroupId = _.last(groupPath)?.groupId;
26
- useEffect(() => {
27
- if (!getNextLevelGroup) return;
28
- let ignore = false;
29
- getNextLevelGroup({
27
+ const { result, loading: groupLoading, failed, retry } = useMemberSearch(useCallback((keyword) => {
28
+ const params = {
30
29
  parentGroupId,
31
- keyword: searchValue
32
- }).then((userGroups) => {
33
- if (!ignore) setAsyncUserGroupList(userGroups);
34
- });
35
- return () => {
36
- ignore = true;
30
+ keyword
37
31
  };
32
+ if (getNextLevelGroupWithMeta) return getNextLevelGroupWithMeta(params);
33
+ return getNextLevelGroup ? getNextLevelGroup(params) : Promise.resolve([]);
38
34
  }, [
39
35
  getNextLevelGroup,
40
- parentGroupId,
41
- searchValue
42
- ]);
36
+ getNextLevelGroupWithMeta,
37
+ parentGroupId
38
+ ]), searchValue, isAsync && active && !useProvidedSearch);
39
+ const asyncUserGroupList = result.items;
43
40
  const filterUserList = useMemo(() => {
44
41
  let currentLevelGroups = asyncUserGroupList;
45
- if (!isAsync) {
42
+ if (!isAsync || useProvidedSearch) {
46
43
  currentLevelGroups = userGroupList.filter((userGroup) => {
44
+ if (searchValue.trim()) return true;
47
45
  if (groupPath.length === 0) return !userGroup.parentId;
48
46
  return userGroup.parentId === parentGroupId;
49
47
  });
@@ -62,6 +60,7 @@ var UserGroupSelection = ({ className, userGroupList, multiple, onChange, select
62
60
  filterItem,
63
61
  groupPath.length,
64
62
  isAsync,
63
+ useProvidedSearch,
65
64
  parentGroupId,
66
65
  searchValue,
67
66
  userGroupList
@@ -77,7 +76,7 @@ var UserGroupSelection = ({ className, userGroupList, multiple, onChange, select
77
76
  value: searchValue,
78
77
  onChange: (event) => onSearchValueChange?.(event.target.value)
79
78
  }),
80
- userGroupList.length === 0 && !loading && /* @__PURE__ */ jsx(Empty, {
79
+ filterUserList.length === 0 && !loading && !(useProvidedSearch ? parentSearchFailed : groupLoading || failed) && /* @__PURE__ */ jsx(Empty, {
81
80
  title: t.MemberPicker.noData,
82
81
  size: "small",
83
82
  image: Empty.PRESENTED_IMAGE_SEARCH,
@@ -111,13 +110,19 @@ var UserGroupSelection = ({ className, userGroupList, multiple, onChange, select
111
110
  }, group.groupId))]
112
111
  })
113
112
  }),
113
+ isAsync && !useProvidedSearch && /* @__PURE__ */ jsx(SearchFeedback, {
114
+ failed,
115
+ hasMore: result.hasMore,
116
+ pathWarningCode: result.pathWarningCode,
117
+ retry
118
+ }),
114
119
  /* @__PURE__ */ jsx(CustomSpin, {
115
120
  tip: "Loading",
116
- spinning: loading,
121
+ spinning: loading || !useProvidedSearch && groupLoading,
117
122
  size: "small",
118
123
  className: "ald-member-picker-user-list",
119
124
  children: /* @__PURE__ */ jsx(ScrollArea_default, {
120
- className: cn("ald-member-picker-member-list", { "ald-member-picker-member-list-null": userGroupList.length === 0 && !loading }),
125
+ className: cn("ald-member-picker-member-list", { "ald-member-picker-member-list-null": filterUserList.length === 0 && !loading && !groupLoading }),
121
126
  innerClassName: "ald-member-picker-member-scroll",
122
127
  children: /* @__PURE__ */ jsx("div", {
123
128
  role: "listbox",
@@ -140,6 +145,7 @@ var UserGroupSelection = ({ className, userGroupList, multiple, onChange, select
140
145
  onSearchValueChange?.("");
141
146
  };
142
147
  const originNode = multiple ? /* @__PURE__ */ jsx(MultipleList, {
148
+ searchValue,
143
149
  user: userGroup,
144
150
  disabled,
145
151
  selected: isSelected,
@@ -149,6 +155,7 @@ var UserGroupSelection = ({ className, userGroupList, multiple, onChange, select
149
155
  hasNextLevel,
150
156
  onNextLevel
151
157
  }, userGroup.groupId) : /* @__PURE__ */ jsx(SingleOption, {
158
+ searchValue,
152
159
  user: userGroup,
153
160
  disabled,
154
161
  selected: isSelected,
@@ -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, { 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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"}
1
+ {"version":3,"file":"UserGroupSelection.js","names":[],"sources":["../../../src/MemberPicker/components/UserGroupSelection.tsx"],"sourcesContent":["import { useCallback } from 'react';\nimport useMemberSearch from '../useMemberSearch';\nimport SearchFeedback from './SearchFeedback';\nimport Breadcrumb from '../../Breadcrumb';\nimport { cn } from '../../lib/utils';\nimport _ from 'lodash';\nimport React, { useContext, 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 active?: boolean;\n useProvidedSearch?: boolean;\n parentSearchFailed?: boolean;\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 active = true,\n useProvidedSearch = false,\n parentSearchFailed = false,\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, getNextLevelGroupWithMeta } =\n useContext(GetUserListContext);\n\n const isAsync = !!(getNextLevelGroup || getNextLevelGroupWithMeta);\n\n const [groupPath, setGroupPath] = useState<IUserGroup[]>([]);\n const parentGroupId = _.last(groupPath)?.groupId;\n const queryGroups = useCallback(\n (keyword: string) => {\n const params = { parentGroupId, keyword };\n if (getNextLevelGroupWithMeta) return getNextLevelGroupWithMeta(params);\n return getNextLevelGroup\n ? getNextLevelGroup(params)\n : Promise.resolve([]);\n },\n [getNextLevelGroup, getNextLevelGroupWithMeta, parentGroupId],\n );\n const {\n result,\n loading: groupLoading,\n failed,\n retry,\n } = useMemberSearch<IUserGroup>(\n queryGroups,\n searchValue,\n isAsync && active && !useProvidedSearch,\n );\n const asyncUserGroupList = result.items;\n\n const filterUserList = useMemo(() => {\n let currentLevelGroups = asyncUserGroupList;\n\n if (!isAsync || useProvidedSearch) {\n currentLevelGroups = userGroupList.filter((userGroup) => {\n if (searchValue.trim()) return true;\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 useProvidedSearch,\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 {filterUserList.length === 0 &&\n !loading &&\n !(useProvidedSearch ? parentSearchFailed : groupLoading || failed) && (\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 {isAsync && !useProvidedSearch && (\n <SearchFeedback\n failed={failed}\n hasMore={result.hasMore}\n pathWarningCode={result.pathWarningCode}\n retry={retry}\n />\n )}\n <Spin\n tip=\"Loading\"\n spinning={loading || (!useProvidedSearch && groupLoading)}\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 filterUserList.length === 0 && !loading && !groupLoading,\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 searchValue={searchValue}\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 searchValue={searchValue}\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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"}
@@ -0,0 +1,5 @@
1
+ import { ReactNode } from 'react';
2
+ /** 两栏分隔器仅持有比例;指针与键盘共用边界,避免全屏切换后像素宽度失效。 */
3
+ export default function DialogColumns({ children, }: {
4
+ children: [ReactNode, ReactNode];
5
+ }): import("react/jsx-runtime").JSX.Element;