@aloudata/aloudata-design 3.1.6 → 3.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ConfigProvider/getUserList.d.ts +47 -0
- package/dist/ConfigProvider/getUserList.js.map +1 -1
- package/dist/ConfigProvider/hooks/useGetUserList.d.ts +7 -0
- package/dist/ConfigProvider/hooks/useGetUserList.js +5 -1
- package/dist/ConfigProvider/hooks/useGetUserList.js.map +1 -1
- package/dist/ConfigProvider/index.d.ts +5 -1
- package/dist/ConfigProvider/index.js +6 -2
- package/dist/ConfigProvider/index.js.map +1 -1
- package/dist/Dropdown/index.d.ts +7 -2
- package/dist/Dropdown/index.js +52 -18
- package/dist/Dropdown/index.js.map +1 -1
- package/dist/MemberPicker/components/MultipleOption.d.ts +1 -0
- package/dist/MemberPicker/components/MultipleOption.js +3 -1
- package/dist/MemberPicker/components/MultipleOption.js.map +1 -1
- package/dist/MemberPicker/components/NickLabel.d.ts +5 -0
- package/dist/MemberPicker/components/NickLabel.js +14 -4
- package/dist/MemberPicker/components/NickLabel.js.map +1 -1
- package/dist/MemberPicker/components/Panel.d.ts +6 -1
- package/dist/MemberPicker/components/Panel.js +17 -5
- package/dist/MemberPicker/components/Panel.js.map +1 -1
- package/dist/MemberPicker/components/PanelWrapper.d.ts +3 -2
- package/dist/MemberPicker/components/PanelWrapper.js +27 -25
- package/dist/MemberPicker/components/PanelWrapper.js.map +1 -1
- package/dist/MemberPicker/components/SearchFeedback.d.ts +7 -0
- package/dist/MemberPicker/components/SearchFeedback.js +27 -0
- package/dist/MemberPicker/components/SearchFeedback.js.map +1 -0
- package/dist/MemberPicker/components/SingleOption.d.ts +1 -0
- package/dist/MemberPicker/components/SingleOption.js +3 -1
- package/dist/MemberPicker/components/SingleOption.js.map +1 -1
- package/dist/MemberPicker/components/UserGroupSelection.d.ts +6 -1
- package/dist/MemberPicker/components/UserGroupSelection.js +30 -23
- package/dist/MemberPicker/components/UserGroupSelection.js.map +1 -1
- package/dist/MemberPicker/dialog/DialogColumns.d.ts +5 -0
- package/dist/MemberPicker/dialog/DialogColumns.js +59 -0
- package/dist/MemberPicker/dialog/DialogColumns.js.map +1 -0
- package/dist/MemberPicker/dialog/DialogContent.d.ts +3 -0
- package/dist/MemberPicker/dialog/DialogContent.js +109 -0
- package/dist/MemberPicker/dialog/DialogContent.js.map +1 -0
- package/dist/MemberPicker/dialog/MemberOption.d.ts +16 -0
- package/dist/MemberPicker/dialog/MemberOption.js +101 -0
- package/dist/MemberPicker/dialog/MemberOption.js.map +1 -0
- package/dist/MemberPicker/dialog/MemberPickerDialog.d.ts +11 -0
- package/dist/MemberPicker/dialog/MemberPickerDialog.js +11 -0
- package/dist/MemberPicker/dialog/MemberPickerDialog.js.map +1 -0
- package/dist/MemberPicker/dialog/SelectedMemberPanel.d.ts +12 -0
- package/dist/MemberPicker/dialog/SelectedMemberPanel.js +37 -0
- package/dist/MemberPicker/dialog/SelectedMemberPanel.js.map +1 -0
- package/dist/MemberPicker/dialog/UserCandidatePanel.d.ts +13 -0
- package/dist/MemberPicker/dialog/UserCandidatePanel.js +168 -0
- package/dist/MemberPicker/dialog/UserCandidatePanel.js.map +1 -0
- package/dist/MemberPicker/dialog/UserGroupCandidatePanel.d.ts +14 -0
- package/dist/MemberPicker/dialog/UserGroupCandidatePanel.js +134 -0
- package/dist/MemberPicker/dialog/UserGroupCandidatePanel.js.map +1 -0
- package/dist/MemberPicker/dialog/helper.d.ts +20 -0
- package/dist/MemberPicker/dialog/helper.js +61 -0
- package/dist/MemberPicker/dialog/helper.js.map +1 -0
- package/dist/MemberPicker/dialog/types.d.ts +41 -0
- package/dist/MemberPicker/dialog/types.js +7 -0
- package/dist/MemberPicker/dialog/types.js.map +1 -0
- package/dist/MemberPicker/dialog/useDialogLocale.d.ts +103 -0
- package/dist/MemberPicker/dialog/useDialogLocale.js +12 -0
- package/dist/MemberPicker/dialog/useDialogLocale.js.map +1 -0
- package/dist/MemberPicker/dialog/useMemberPickerDraft.d.ts +27 -0
- package/dist/MemberPicker/dialog/useMemberPickerDraft.js +95 -0
- package/dist/MemberPicker/dialog/useMemberPickerDraft.js.map +1 -0
- package/dist/MemberPicker/dialog/useUserGroupCandidates.d.ts +29 -0
- package/dist/MemberPicker/dialog/useUserGroupCandidates.js +443 -0
- package/dist/MemberPicker/dialog/useUserGroupCandidates.js.map +1 -0
- package/dist/MemberPicker/index.d.ts +2 -0
- package/dist/MemberPicker/index.js +61 -35
- package/dist/MemberPicker/index.js.map +1 -1
- package/dist/MemberPicker/interface.d.ts +6 -0
- package/dist/MemberPicker/interface.js.map +1 -1
- package/dist/MemberPicker/useMemberSearch.d.ts +8 -0
- package/dist/MemberPicker/useMemberSearch.js +51 -0
- package/dist/MemberPicker/useMemberSearch.js.map +1 -0
- package/dist/Menu/index.d.ts +6 -0
- package/dist/Menu/index.js +21 -9
- package/dist/Menu/index.js.map +1 -1
- package/dist/Modal/index.js +1 -1
- package/dist/Modal/index.js.map +1 -1
- package/dist/aloudata-design.css +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +2 -2
- package/dist/locale/default.d.ts +29 -0
- package/dist/locale/en_US.d.ts +29 -0
- package/dist/locale/en_US.js +29 -0
- package/dist/locale/en_US.js.map +1 -1
- package/dist/locale/zh_CN.d.ts +29 -0
- package/dist/locale/zh_CN.js +29 -0
- package/dist/locale/zh_CN.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { EMemberPicker, TMemberPickerValue as MemberPickerValue } from '../interface';
|
|
2
|
+
import { TUserGroupValue, TUserValue, TUser } from '../../ConfigProvider/getUserList';
|
|
3
|
+
import { TMember, TMemberKey, TMemberPickerTab } from './types.js';
|
|
4
|
+
export interface IUseMemberPickerDraftOptions {
|
|
5
|
+
value?: MemberPickerValue;
|
|
6
|
+
type?: EMemberPicker;
|
|
7
|
+
lockedIds?: Array<TUserValue | TUserGroupValue>;
|
|
8
|
+
onChange?: (members: TUser) => void;
|
|
9
|
+
}
|
|
10
|
+
export interface IMemberPickerDraftResult {
|
|
11
|
+
activeTab: TMemberPickerTab;
|
|
12
|
+
selectedMembers: TUser;
|
|
13
|
+
selectedByKey: Map<TMemberKey, TMember>;
|
|
14
|
+
hydrating: boolean;
|
|
15
|
+
setActiveTab: (tab: TMemberPickerTab) => void;
|
|
16
|
+
toggleMember: (member: TMember) => void;
|
|
17
|
+
toggleMembers: (members: readonly TMember[], selected: boolean) => void;
|
|
18
|
+
removeMember: (member: TMember) => void;
|
|
19
|
+
confirm: () => void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 管理单次弹窗内的成员选择草稿。
|
|
23
|
+
*
|
|
24
|
+
* 外部 value 仅用于初始化,增删不会提前触发 onChange;弹窗取消时卸载本 hook,
|
|
25
|
+
* 只有 confirm 会按 Map 的稳定插入顺序一次性提交。
|
|
26
|
+
*/
|
|
27
|
+
export declare function useMemberPickerDraft({ value, type, lockedIds, onChange, }: IUseMemberPickerDraftOptions): IMemberPickerDraftResult;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { EUserType } from "../../ConfigProvider/getUserList.js";
|
|
2
|
+
import AldCustomConfigProvider from "../../ConfigProvider/index.js";
|
|
3
|
+
import { EMemberPicker } from "../interface.js";
|
|
4
|
+
import { addSelectedMember, createSelectedByKey, getMemberKey, isMemberLocked, removeSelectedMember, setMembersSelected } from "./helper.js";
|
|
5
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
6
|
+
//#region src/MemberPicker/dialog/useMemberPickerDraft.ts
|
|
7
|
+
var EMPTY_LOCKED_IDS = [];
|
|
8
|
+
var toValueArray = (value) => {
|
|
9
|
+
if (!value) return [];
|
|
10
|
+
return Array.isArray(value) ? [...value] : [value];
|
|
11
|
+
};
|
|
12
|
+
/** 历史值可能只有 ID;占位名称保证不可见对象不会被静默丢弃。 */
|
|
13
|
+
var toMemberPlaceholder = (value) => {
|
|
14
|
+
if (value.type === EUserType.USER) return {
|
|
15
|
+
...value,
|
|
16
|
+
type: EUserType.USER,
|
|
17
|
+
name: value.name ?? value.nickname ?? value.account ?? value.userId
|
|
18
|
+
};
|
|
19
|
+
return {
|
|
20
|
+
...value,
|
|
21
|
+
type: EUserType.USER_GROUP,
|
|
22
|
+
name: value.name ?? value.groupId,
|
|
23
|
+
parentId: value.parentId ?? null,
|
|
24
|
+
frontId: value.frontId ?? null
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
var needsHydration = (value) => {
|
|
28
|
+
if (value.type === EUserType.USER) return !value.name && !value.nickname && !value.account;
|
|
29
|
+
return !value.name;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* 管理单次弹窗内的成员选择草稿。
|
|
33
|
+
*
|
|
34
|
+
* 外部 value 仅用于初始化,增删不会提前触发 onChange;弹窗取消时卸载本 hook,
|
|
35
|
+
* 只有 confirm 会按 Map 的稳定插入顺序一次性提交。
|
|
36
|
+
*/
|
|
37
|
+
function useMemberPickerDraft({ value, type = EMemberPicker.BOTH, lockedIds = EMPTY_LOCKED_IDS, onChange }) {
|
|
38
|
+
const { getUsersByIds } = AldCustomConfigProvider.useGetUserList();
|
|
39
|
+
const initialValuesRef = useRef(toValueArray(value));
|
|
40
|
+
const missingValuesRef = useRef(initialValuesRef.current.filter(needsHydration));
|
|
41
|
+
const [selectedByKey, setSelectedByKey] = useState(() => createSelectedByKey(initialValuesRef.current.map(toMemberPlaceholder)));
|
|
42
|
+
const [hydrating, setHydrating] = useState(missingValuesRef.current.length > 0 && Boolean(getUsersByIds));
|
|
43
|
+
const [activeTab, setActiveTabState] = useState(type === EMemberPicker.GROUP ? EMemberPicker.GROUP : EMemberPicker.USER);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
const missingValues = missingValuesRef.current;
|
|
46
|
+
if (!missingValues.length || !getUsersByIds) {
|
|
47
|
+
setHydrating(false);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
let active = true;
|
|
51
|
+
getUsersByIds(missingValues).then((hydratedMembers) => {
|
|
52
|
+
if (!active) return;
|
|
53
|
+
const hydratedByKey = createSelectedByKey(hydratedMembers.map((member) => toMemberPlaceholder(member)));
|
|
54
|
+
setSelectedByKey((currentSelected) => new Map(Array.from(currentSelected).map(([key, member]) => [key, hydratedByKey.get(key) ?? member])));
|
|
55
|
+
}).catch(() => void 0).finally(() => {
|
|
56
|
+
if (active) setHydrating(false);
|
|
57
|
+
});
|
|
58
|
+
return () => {
|
|
59
|
+
active = false;
|
|
60
|
+
};
|
|
61
|
+
}, [getUsersByIds]);
|
|
62
|
+
const setActiveTab = useCallback((tab) => {
|
|
63
|
+
if (type === EMemberPicker.BOTH) setActiveTabState(tab);
|
|
64
|
+
}, [type]);
|
|
65
|
+
const removeMember = useCallback((member) => {
|
|
66
|
+
setSelectedByKey((currentSelected) => removeSelectedMember(currentSelected, member, lockedIds));
|
|
67
|
+
}, [lockedIds]);
|
|
68
|
+
const toggleMember = useCallback((member) => {
|
|
69
|
+
if (isMemberLocked(member, lockedIds)) return;
|
|
70
|
+
setSelectedByKey((currentSelected) => {
|
|
71
|
+
const key = getMemberKey(member);
|
|
72
|
+
return currentSelected.has(key) ? removeSelectedMember(currentSelected, member, lockedIds) : addSelectedMember(currentSelected, member);
|
|
73
|
+
});
|
|
74
|
+
}, [lockedIds]);
|
|
75
|
+
const toggleMembers = useCallback((members, selected) => {
|
|
76
|
+
setSelectedByKey((currentSelected) => setMembersSelected(currentSelected, members, selected, lockedIds));
|
|
77
|
+
}, [lockedIds]);
|
|
78
|
+
return {
|
|
79
|
+
activeTab,
|
|
80
|
+
selectedMembers: useMemo(() => Array.from(selectedByKey.values()), [selectedByKey]),
|
|
81
|
+
selectedByKey,
|
|
82
|
+
hydrating,
|
|
83
|
+
setActiveTab,
|
|
84
|
+
toggleMember,
|
|
85
|
+
toggleMembers,
|
|
86
|
+
removeMember,
|
|
87
|
+
confirm: useCallback(() => {
|
|
88
|
+
onChange?.(Array.from(selectedByKey.values()));
|
|
89
|
+
}, [onChange, selectedByKey])
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//#endregion
|
|
93
|
+
export { useMemberPickerDraft };
|
|
94
|
+
|
|
95
|
+
//# sourceMappingURL=useMemberPickerDraft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useMemberPickerDraft.js","names":[],"sources":["../../../src/MemberPicker/dialog/useMemberPickerDraft.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport ConfigProvider from '../../ConfigProvider';\nimport { EMemberPicker } from '../interface';\nimport { EUserType } from '../../ConfigProvider/getUserList';\nimport type { TMemberPickerValue as MemberPickerValue } from '../interface';\nimport type {\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport type { TUser } from '../../ConfigProvider/getUserList';\nimport {\n addSelectedMember,\n createSelectedByKey,\n getMemberKey,\n isMemberLocked,\n removeSelectedMember,\n setMembersSelected,\n} from './helper';\nimport type { TMember, TMemberKey, TMemberPickerTab } from './types';\n\nconst EMPTY_LOCKED_IDS: Array<TUserValue | TUserGroupValue> = [];\n\nconst toValueArray = (\n value?: MemberPickerValue,\n): Array<TUserValue | TUserGroupValue> => {\n if (!value) {\n return [];\n }\n return Array.isArray(value) ? [...value] : [value];\n};\n\n/** 历史值可能只有 ID;占位名称保证不可见对象不会被静默丢弃。 */\nconst toMemberPlaceholder = (value: TUserValue | TUserGroupValue): TMember => {\n if (value.type === EUserType.USER) {\n return {\n ...value,\n type: EUserType.USER,\n name: value.name ?? value.nickname ?? value.account ?? value.userId,\n };\n }\n return {\n ...value,\n type: EUserType.USER_GROUP,\n name: value.name ?? value.groupId,\n parentId: value.parentId ?? null,\n frontId: value.frontId ?? null,\n };\n};\n\nconst needsHydration = (value: TUserValue | TUserGroupValue): boolean => {\n if (value.type === EUserType.USER) {\n return !value.name && !value.nickname && !value.account;\n }\n return !value.name;\n};\n\nexport interface IUseMemberPickerDraftOptions {\n value?: MemberPickerValue;\n type?: EMemberPicker;\n lockedIds?: Array<TUserValue | TUserGroupValue>;\n onChange?: (members: TUser) => void;\n}\n\nexport interface IMemberPickerDraftResult {\n activeTab: TMemberPickerTab;\n selectedMembers: TUser;\n selectedByKey: Map<TMemberKey, TMember>;\n hydrating: boolean;\n setActiveTab: (tab: TMemberPickerTab) => void;\n toggleMember: (member: TMember) => void;\n toggleMembers: (members: readonly TMember[], selected: boolean) => void;\n removeMember: (member: TMember) => void;\n confirm: () => void;\n}\n\n/**\n * 管理单次弹窗内的成员选择草稿。\n *\n * 外部 value 仅用于初始化,增删不会提前触发 onChange;弹窗取消时卸载本 hook,\n * 只有 confirm 会按 Map 的稳定插入顺序一次性提交。\n */\nexport function useMemberPickerDraft({\n value,\n type = EMemberPicker.BOTH,\n lockedIds = EMPTY_LOCKED_IDS,\n onChange,\n}: IUseMemberPickerDraftOptions): IMemberPickerDraftResult {\n const { getUsersByIds } = ConfigProvider.useGetUserList();\n const initialValuesRef = useRef(toValueArray(value));\n const missingValuesRef = useRef(\n initialValuesRef.current.filter(needsHydration),\n );\n const [selectedByKey, setSelectedByKey] = useState(() =>\n createSelectedByKey(initialValuesRef.current.map(toMemberPlaceholder)),\n );\n const [hydrating, setHydrating] = useState(\n missingValuesRef.current.length > 0 && Boolean(getUsersByIds),\n );\n const [activeTab, setActiveTabState] = useState<TMemberPickerTab>(\n type === EMemberPicker.GROUP ? EMemberPicker.GROUP : EMemberPicker.USER,\n );\n\n useEffect(() => {\n const missingValues = missingValuesRef.current;\n if (!missingValues.length || !getUsersByIds) {\n setHydrating(false);\n return undefined;\n }\n\n let active = true;\n getUsersByIds(missingValues)\n .then((hydratedMembers) => {\n if (!active) {\n return;\n }\n const hydratedByKey = createSelectedByKey(\n hydratedMembers.map((member) => toMemberPlaceholder(member)),\n );\n setSelectedByKey(\n (currentSelected) =>\n new Map(\n Array.from(currentSelected).map(([key, member]) => [\n key,\n hydratedByKey.get(key) ?? member,\n ]),\n ),\n );\n })\n .catch(() => undefined)\n .finally(() => {\n if (active) {\n setHydrating(false);\n }\n });\n\n return () => {\n active = false;\n };\n }, [getUsersByIds]);\n\n const setActiveTab = useCallback(\n (tab: TMemberPickerTab) => {\n if (type === EMemberPicker.BOTH) {\n setActiveTabState(tab);\n }\n },\n [type],\n );\n\n const removeMember = useCallback(\n (member: TMember) => {\n setSelectedByKey((currentSelected) =>\n removeSelectedMember(currentSelected, member, lockedIds),\n );\n },\n [lockedIds],\n );\n\n const toggleMember = useCallback(\n (member: TMember) => {\n if (isMemberLocked(member, lockedIds)) {\n return;\n }\n setSelectedByKey((currentSelected) => {\n const key = getMemberKey(member);\n return currentSelected.has(key)\n ? removeSelectedMember(currentSelected, member, lockedIds)\n : addSelectedMember(currentSelected, member);\n });\n },\n [lockedIds],\n );\n\n const toggleMembers = useCallback(\n (members: readonly TMember[], selected: boolean) => {\n setSelectedByKey((currentSelected) =>\n setMembersSelected(currentSelected, members, selected, lockedIds),\n );\n },\n [lockedIds],\n );\n\n const selectedMembers = useMemo<TUser>(\n () => Array.from(selectedByKey.values()),\n [selectedByKey],\n );\n\n const confirm = useCallback(() => {\n onChange?.(Array.from(selectedByKey.values()));\n }, [onChange, selectedByKey]);\n\n return {\n activeTab,\n selectedMembers,\n selectedByKey,\n hydrating,\n setActiveTab,\n toggleMember,\n toggleMembers,\n removeMember,\n confirm,\n };\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { IUserGroup } from '../../ConfigProvider/getUserList';
|
|
2
|
+
export interface IUserGroupCandidatesResult {
|
|
3
|
+
breadcrumbPath: IUserGroup[];
|
|
4
|
+
items: IUserGroup[];
|
|
5
|
+
keyword: string;
|
|
6
|
+
pathWarningCode?: string | null;
|
|
7
|
+
truncated?: boolean;
|
|
8
|
+
loading: boolean;
|
|
9
|
+
loadingMore: boolean;
|
|
10
|
+
error: boolean;
|
|
11
|
+
loadMoreError: boolean;
|
|
12
|
+
hasMore: boolean;
|
|
13
|
+
/** 当前层已保存的滚动位置,供候选面板在层级切换后恢复。 */
|
|
14
|
+
scrollTop: number;
|
|
15
|
+
setKeyword: (keyword: string) => void;
|
|
16
|
+
enterGroup: (group: IUserGroup, scrollTop: number) => void;
|
|
17
|
+
returnToBreadcrumb: (index: number, scrollTop: number) => void;
|
|
18
|
+
loadMore: () => void;
|
|
19
|
+
retry: () => void;
|
|
20
|
+
retryLoadMore: () => void;
|
|
21
|
+
updateScrollTop: (scrollTop: number) => void;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 管理受限用户组树与跨层搜索。
|
|
25
|
+
*
|
|
26
|
+
* 树层级缓存和搜索结果分别持有;所有异步响应都受版本号保护,关闭弹窗、
|
|
27
|
+
* 换词、清空或切换层级后,旧响应只能结束自身,不能覆盖当前界面。
|
|
28
|
+
*/
|
|
29
|
+
export declare function useUserGroupCandidates(): IUserGroupCandidatesResult;
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import AldCustomConfigProvider from "../../ConfigProvider/index.js";
|
|
2
|
+
import useDialogLocale from "./useDialogLocale.js";
|
|
3
|
+
import { hasMoreGroupPages, mergeGroupPages } from "./helper.js";
|
|
4
|
+
import "./types.js";
|
|
5
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
6
|
+
//#region src/MemberPicker/dialog/useUserGroupCandidates.ts
|
|
7
|
+
var GROUP_PAGE_SIZE = 100;
|
|
8
|
+
var SEARCH_DEBOUNCE_MS = 300;
|
|
9
|
+
var ROOT_BREADCRUMB_INDEX = -1;
|
|
10
|
+
var createEmptyLevel = (parentGroupId) => ({
|
|
11
|
+
parentGroupId,
|
|
12
|
+
items: [],
|
|
13
|
+
pageNumber: 0,
|
|
14
|
+
hasMore: false,
|
|
15
|
+
scrollTop: 0,
|
|
16
|
+
loadingMore: false,
|
|
17
|
+
loadMoreError: false
|
|
18
|
+
});
|
|
19
|
+
var createEmptySearchState = (keyword = "") => ({
|
|
20
|
+
keyword,
|
|
21
|
+
items: [],
|
|
22
|
+
pageNumber: 0,
|
|
23
|
+
hasMore: false,
|
|
24
|
+
loading: false,
|
|
25
|
+
loadingMore: false,
|
|
26
|
+
error: false,
|
|
27
|
+
loadMoreError: false
|
|
28
|
+
});
|
|
29
|
+
var getLevelKey = (parentGroupId) => parentGroupId ?? "__ROOT_GROUP__";
|
|
30
|
+
/**
|
|
31
|
+
* 管理受限用户组树与跨层搜索。
|
|
32
|
+
*
|
|
33
|
+
* 树层级缓存和搜索结果分别持有;所有异步响应都受版本号保护,关闭弹窗、
|
|
34
|
+
* 换词、清空或切换层级后,旧响应只能结束自身,不能覆盖当前界面。
|
|
35
|
+
*/
|
|
36
|
+
function useUserGroupCandidates() {
|
|
37
|
+
const t = useDialogLocale();
|
|
38
|
+
const { getMemberPickerGroupPage, getNextLevelGroup, getNextLevelGroupWithMeta } = AldCustomConfigProvider.useGetUserList();
|
|
39
|
+
const queryUserGroupsPage = useCallback(async (request) => {
|
|
40
|
+
if (getMemberPickerGroupPage) return getMemberPickerGroupPage(request);
|
|
41
|
+
const params = {
|
|
42
|
+
parentGroupId: request.parentGroupId,
|
|
43
|
+
keyword: request.keyword ?? ""
|
|
44
|
+
};
|
|
45
|
+
if (getNextLevelGroupWithMeta) {
|
|
46
|
+
const result = await getNextLevelGroupWithMeta(params);
|
|
47
|
+
return {
|
|
48
|
+
data: result.items,
|
|
49
|
+
pageNumber: request.pager.pageNumber,
|
|
50
|
+
hasMore: false,
|
|
51
|
+
pathWarningCode: result.pathWarningCode,
|
|
52
|
+
truncated: result.hasMore
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (getNextLevelGroup) return {
|
|
56
|
+
data: await getNextLevelGroup(params),
|
|
57
|
+
pageNumber: request.pager.pageNumber,
|
|
58
|
+
hasMore: false
|
|
59
|
+
};
|
|
60
|
+
throw new Error(t.MemberPickerDialog.missingGroupSource);
|
|
61
|
+
}, [
|
|
62
|
+
getMemberPickerGroupPage,
|
|
63
|
+
getNextLevelGroup,
|
|
64
|
+
getNextLevelGroupWithMeta,
|
|
65
|
+
t.MemberPickerDialog.missingGroupSource
|
|
66
|
+
]);
|
|
67
|
+
const [breadcrumbPath, setBreadcrumbPath] = useState([]);
|
|
68
|
+
const breadcrumbPathRef = useRef([]);
|
|
69
|
+
const [levelsByParent, setLevelsByParent] = useState(/* @__PURE__ */ new Map());
|
|
70
|
+
const levelsByParentRef = useRef(levelsByParent);
|
|
71
|
+
const activeParentGroupIdRef = useRef();
|
|
72
|
+
const [treeLoading, setTreeLoading] = useState(true);
|
|
73
|
+
const [treeError, setTreeError] = useState(false);
|
|
74
|
+
const [keyword, setKeywordState] = useState("");
|
|
75
|
+
const keywordRef = useRef("");
|
|
76
|
+
const [searchState, setSearchState] = useState(() => createEmptySearchState());
|
|
77
|
+
const searchStateRef = useRef(searchState);
|
|
78
|
+
const requestVersionRef = useRef(0);
|
|
79
|
+
const mountedRef = useRef(true);
|
|
80
|
+
const searchEffectInitializedRef = useRef(false);
|
|
81
|
+
const updateLevels = useCallback((updater) => {
|
|
82
|
+
setLevelsByParent((currentLevels) => {
|
|
83
|
+
const nextLevels = updater(currentLevels);
|
|
84
|
+
levelsByParentRef.current = nextLevels;
|
|
85
|
+
return nextLevels;
|
|
86
|
+
});
|
|
87
|
+
}, []);
|
|
88
|
+
const cancelTreePagination = useCallback(() => {
|
|
89
|
+
updateLevels((levels) => new Map(Array.from(levels, ([key, level]) => [key, level.loadingMore ? {
|
|
90
|
+
...level,
|
|
91
|
+
loadingMore: false
|
|
92
|
+
} : level])));
|
|
93
|
+
}, [updateLevels]);
|
|
94
|
+
const updateSearchState = useCallback((updater) => {
|
|
95
|
+
setSearchState((currentState) => {
|
|
96
|
+
const nextState = updater(currentState);
|
|
97
|
+
searchStateRef.current = nextState;
|
|
98
|
+
return nextState;
|
|
99
|
+
});
|
|
100
|
+
}, []);
|
|
101
|
+
const isCurrentRequest = useCallback((version) => mountedRef.current && requestVersionRef.current === version, []);
|
|
102
|
+
const loadTreeFirstPage = useCallback((parentGroupId) => {
|
|
103
|
+
const version = requestVersionRef.current + 1;
|
|
104
|
+
requestVersionRef.current = version;
|
|
105
|
+
setTreeLoading(true);
|
|
106
|
+
setTreeError(false);
|
|
107
|
+
queryUserGroupsPage({
|
|
108
|
+
parentGroupId,
|
|
109
|
+
keyword: void 0,
|
|
110
|
+
pager: {
|
|
111
|
+
pageNumber: 1,
|
|
112
|
+
pageSize: GROUP_PAGE_SIZE
|
|
113
|
+
}
|
|
114
|
+
}).then((page) => {
|
|
115
|
+
if (!isCurrentRequest(version)) return;
|
|
116
|
+
updateLevels((currentLevels) => {
|
|
117
|
+
const key = getLevelKey(parentGroupId);
|
|
118
|
+
const previousLevel = currentLevels.get(key);
|
|
119
|
+
return new Map(currentLevels).set(key, {
|
|
120
|
+
parentGroupId,
|
|
121
|
+
items: [...page.data],
|
|
122
|
+
pageNumber: page.pageNumber,
|
|
123
|
+
hasMore: hasMoreGroupPages(page),
|
|
124
|
+
pathWarningCode: page.pathWarningCode,
|
|
125
|
+
truncated: page.truncated,
|
|
126
|
+
scrollTop: previousLevel?.scrollTop ?? 0,
|
|
127
|
+
loadingMore: false,
|
|
128
|
+
loadMoreError: false
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
setTreeLoading(false);
|
|
132
|
+
}).catch(() => {
|
|
133
|
+
if (!isCurrentRequest(version)) return;
|
|
134
|
+
setTreeLoading(false);
|
|
135
|
+
setTreeError(true);
|
|
136
|
+
});
|
|
137
|
+
}, [
|
|
138
|
+
isCurrentRequest,
|
|
139
|
+
queryUserGroupsPage,
|
|
140
|
+
updateLevels
|
|
141
|
+
]);
|
|
142
|
+
useEffect(() => {
|
|
143
|
+
mountedRef.current = true;
|
|
144
|
+
loadTreeFirstPage();
|
|
145
|
+
return () => {
|
|
146
|
+
mountedRef.current = false;
|
|
147
|
+
requestVersionRef.current += 1;
|
|
148
|
+
};
|
|
149
|
+
}, [loadTreeFirstPage]);
|
|
150
|
+
useEffect(() => {
|
|
151
|
+
if (!searchEffectInitializedRef.current) {
|
|
152
|
+
searchEffectInitializedRef.current = true;
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const normalizedKeyword = keyword.trim();
|
|
156
|
+
cancelTreePagination();
|
|
157
|
+
const version = requestVersionRef.current + 1;
|
|
158
|
+
requestVersionRef.current = version;
|
|
159
|
+
if (!normalizedKeyword) {
|
|
160
|
+
updateSearchState(() => createEmptySearchState(keyword));
|
|
161
|
+
const activeKey = getLevelKey(activeParentGroupIdRef.current);
|
|
162
|
+
if (!levelsByParentRef.current.has(activeKey)) loadTreeFirstPage(activeParentGroupIdRef.current);
|
|
163
|
+
else {
|
|
164
|
+
setTreeLoading(false);
|
|
165
|
+
setTreeError(false);
|
|
166
|
+
}
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
updateSearchState(() => ({
|
|
170
|
+
...createEmptySearchState(normalizedKeyword),
|
|
171
|
+
loading: true
|
|
172
|
+
}));
|
|
173
|
+
const timer = window.setTimeout(() => {
|
|
174
|
+
queryUserGroupsPage({
|
|
175
|
+
parentGroupId: void 0,
|
|
176
|
+
keyword: normalizedKeyword,
|
|
177
|
+
pager: {
|
|
178
|
+
pageNumber: 1,
|
|
179
|
+
pageSize: GROUP_PAGE_SIZE
|
|
180
|
+
}
|
|
181
|
+
}).then((page) => {
|
|
182
|
+
if (!isCurrentRequest(version)) return;
|
|
183
|
+
updateSearchState((currentState) => ({
|
|
184
|
+
...currentState,
|
|
185
|
+
keyword: normalizedKeyword,
|
|
186
|
+
items: [...page.data],
|
|
187
|
+
pageNumber: page.pageNumber,
|
|
188
|
+
hasMore: hasMoreGroupPages(page),
|
|
189
|
+
pathWarningCode: page.pathWarningCode,
|
|
190
|
+
truncated: page.truncated,
|
|
191
|
+
loading: false,
|
|
192
|
+
error: false
|
|
193
|
+
}));
|
|
194
|
+
}).catch(() => {
|
|
195
|
+
if (!isCurrentRequest(version)) return;
|
|
196
|
+
updateSearchState((currentState) => ({
|
|
197
|
+
...currentState,
|
|
198
|
+
loading: false,
|
|
199
|
+
error: true
|
|
200
|
+
}));
|
|
201
|
+
});
|
|
202
|
+
}, SEARCH_DEBOUNCE_MS);
|
|
203
|
+
return () => window.clearTimeout(timer);
|
|
204
|
+
}, [
|
|
205
|
+
cancelTreePagination,
|
|
206
|
+
isCurrentRequest,
|
|
207
|
+
keyword,
|
|
208
|
+
loadTreeFirstPage,
|
|
209
|
+
queryUserGroupsPage,
|
|
210
|
+
updateSearchState
|
|
211
|
+
]);
|
|
212
|
+
const updateCurrentLevel = useCallback((updater) => {
|
|
213
|
+
const parentGroupId = activeParentGroupIdRef.current;
|
|
214
|
+
const key = getLevelKey(parentGroupId);
|
|
215
|
+
updateLevels((currentLevels) => {
|
|
216
|
+
const level = currentLevels.get(key) ?? createEmptyLevel(parentGroupId);
|
|
217
|
+
return new Map(currentLevels).set(key, updater(level));
|
|
218
|
+
});
|
|
219
|
+
}, [updateLevels]);
|
|
220
|
+
const updateScrollTop = useCallback((scrollTop) => {
|
|
221
|
+
updateCurrentLevel((level) => ({
|
|
222
|
+
...level,
|
|
223
|
+
scrollTop
|
|
224
|
+
}));
|
|
225
|
+
}, [updateCurrentLevel]);
|
|
226
|
+
const enterGroup = useCallback((group, scrollTop) => {
|
|
227
|
+
updateScrollTop(scrollTop);
|
|
228
|
+
cancelTreePagination();
|
|
229
|
+
const nextBreadcrumbPath = [...breadcrumbPathRef.current, group];
|
|
230
|
+
breadcrumbPathRef.current = nextBreadcrumbPath;
|
|
231
|
+
setBreadcrumbPath(nextBreadcrumbPath);
|
|
232
|
+
activeParentGroupIdRef.current = group.groupId;
|
|
233
|
+
const nextKey = getLevelKey(group.groupId);
|
|
234
|
+
requestVersionRef.current += 1;
|
|
235
|
+
if (levelsByParentRef.current.has(nextKey)) {
|
|
236
|
+
setTreeLoading(false);
|
|
237
|
+
setTreeError(false);
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
loadTreeFirstPage(group.groupId);
|
|
241
|
+
}, [
|
|
242
|
+
cancelTreePagination,
|
|
243
|
+
loadTreeFirstPage,
|
|
244
|
+
updateScrollTop
|
|
245
|
+
]);
|
|
246
|
+
const returnToBreadcrumb = useCallback((index, scrollTop) => {
|
|
247
|
+
updateScrollTop(scrollTop);
|
|
248
|
+
cancelTreePagination();
|
|
249
|
+
const currentPath = breadcrumbPathRef.current;
|
|
250
|
+
const nextPath = index === ROOT_BREADCRUMB_INDEX ? [] : currentPath.slice(0, index + 1);
|
|
251
|
+
const parentGroupId = nextPath[nextPath.length - 1]?.groupId;
|
|
252
|
+
breadcrumbPathRef.current = nextPath;
|
|
253
|
+
setBreadcrumbPath(nextPath);
|
|
254
|
+
activeParentGroupIdRef.current = parentGroupId;
|
|
255
|
+
requestVersionRef.current += 1;
|
|
256
|
+
const targetKey = getLevelKey(parentGroupId);
|
|
257
|
+
if (levelsByParentRef.current.has(targetKey)) {
|
|
258
|
+
setTreeLoading(false);
|
|
259
|
+
setTreeError(false);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
loadTreeFirstPage(parentGroupId);
|
|
263
|
+
}, [
|
|
264
|
+
cancelTreePagination,
|
|
265
|
+
loadTreeFirstPage,
|
|
266
|
+
updateScrollTop
|
|
267
|
+
]);
|
|
268
|
+
const loadTreeMore = useCallback(() => {
|
|
269
|
+
const parentGroupId = activeParentGroupIdRef.current;
|
|
270
|
+
const key = getLevelKey(parentGroupId);
|
|
271
|
+
const level = levelsByParentRef.current.get(key);
|
|
272
|
+
if (!level || !level.hasMore || level.loadingMore) return;
|
|
273
|
+
const nextPageNumber = level.pageNumber + 1;
|
|
274
|
+
const version = requestVersionRef.current + 1;
|
|
275
|
+
requestVersionRef.current = version;
|
|
276
|
+
updateCurrentLevel((currentLevel) => ({
|
|
277
|
+
...currentLevel,
|
|
278
|
+
loadingMore: true,
|
|
279
|
+
loadMoreError: false
|
|
280
|
+
}));
|
|
281
|
+
queryUserGroupsPage({
|
|
282
|
+
parentGroupId,
|
|
283
|
+
keyword: void 0,
|
|
284
|
+
pager: {
|
|
285
|
+
pageNumber: nextPageNumber,
|
|
286
|
+
pageSize: GROUP_PAGE_SIZE
|
|
287
|
+
}
|
|
288
|
+
}).then((page) => {
|
|
289
|
+
if (!isCurrentRequest(version)) return;
|
|
290
|
+
updateCurrentLevel((currentLevel) => ({
|
|
291
|
+
...currentLevel,
|
|
292
|
+
items: mergeGroupPages(currentLevel.items, page.data),
|
|
293
|
+
pageNumber: page.pageNumber,
|
|
294
|
+
hasMore: hasMoreGroupPages(page),
|
|
295
|
+
pathWarningCode: currentLevel.pathWarningCode || page.pathWarningCode,
|
|
296
|
+
truncated: currentLevel.truncated || page.truncated,
|
|
297
|
+
loadingMore: false,
|
|
298
|
+
loadMoreError: false
|
|
299
|
+
}));
|
|
300
|
+
}).catch(() => {
|
|
301
|
+
if (!isCurrentRequest(version)) return;
|
|
302
|
+
updateCurrentLevel((currentLevel) => ({
|
|
303
|
+
...currentLevel,
|
|
304
|
+
loadingMore: false,
|
|
305
|
+
loadMoreError: true
|
|
306
|
+
}));
|
|
307
|
+
});
|
|
308
|
+
}, [
|
|
309
|
+
isCurrentRequest,
|
|
310
|
+
queryUserGroupsPage,
|
|
311
|
+
updateCurrentLevel
|
|
312
|
+
]);
|
|
313
|
+
const loadSearchMore = useCallback(() => {
|
|
314
|
+
const currentSearch = searchStateRef.current;
|
|
315
|
+
const normalizedKeyword = keywordRef.current.trim();
|
|
316
|
+
if (!normalizedKeyword || currentSearch.loading || !currentSearch.hasMore || currentSearch.loadingMore) return;
|
|
317
|
+
const nextPageNumber = currentSearch.pageNumber + 1;
|
|
318
|
+
const version = requestVersionRef.current + 1;
|
|
319
|
+
requestVersionRef.current = version;
|
|
320
|
+
updateSearchState((state) => ({
|
|
321
|
+
...state,
|
|
322
|
+
loadingMore: true,
|
|
323
|
+
loadMoreError: false
|
|
324
|
+
}));
|
|
325
|
+
queryUserGroupsPage({
|
|
326
|
+
parentGroupId: void 0,
|
|
327
|
+
keyword: normalizedKeyword,
|
|
328
|
+
pager: {
|
|
329
|
+
pageNumber: nextPageNumber,
|
|
330
|
+
pageSize: GROUP_PAGE_SIZE
|
|
331
|
+
}
|
|
332
|
+
}).then((page) => {
|
|
333
|
+
if (!isCurrentRequest(version)) return;
|
|
334
|
+
updateSearchState((state) => ({
|
|
335
|
+
...state,
|
|
336
|
+
items: mergeGroupPages(state.items, page.data),
|
|
337
|
+
pageNumber: page.pageNumber,
|
|
338
|
+
hasMore: hasMoreGroupPages(page),
|
|
339
|
+
pathWarningCode: state.pathWarningCode || page.pathWarningCode,
|
|
340
|
+
truncated: state.truncated || page.truncated,
|
|
341
|
+
loadingMore: false,
|
|
342
|
+
loadMoreError: false
|
|
343
|
+
}));
|
|
344
|
+
}).catch(() => {
|
|
345
|
+
if (!isCurrentRequest(version)) return;
|
|
346
|
+
updateSearchState((state) => ({
|
|
347
|
+
...state,
|
|
348
|
+
loadingMore: false,
|
|
349
|
+
loadMoreError: true
|
|
350
|
+
}));
|
|
351
|
+
});
|
|
352
|
+
}, [
|
|
353
|
+
isCurrentRequest,
|
|
354
|
+
queryUserGroupsPage,
|
|
355
|
+
updateSearchState
|
|
356
|
+
]);
|
|
357
|
+
const setKeyword = useCallback((nextKeyword) => {
|
|
358
|
+
keywordRef.current = nextKeyword;
|
|
359
|
+
setKeywordState(nextKeyword);
|
|
360
|
+
}, []);
|
|
361
|
+
const isSearching = keyword.trim().length > 0;
|
|
362
|
+
const loadMore = useCallback(() => {
|
|
363
|
+
if (keywordRef.current.trim()) {
|
|
364
|
+
loadSearchMore();
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
loadTreeMore();
|
|
368
|
+
}, [loadSearchMore, loadTreeMore]);
|
|
369
|
+
const retry = useCallback(() => {
|
|
370
|
+
const normalizedKeyword = keywordRef.current.trim();
|
|
371
|
+
if (normalizedKeyword) {
|
|
372
|
+
const version = requestVersionRef.current + 1;
|
|
373
|
+
requestVersionRef.current = version;
|
|
374
|
+
updateSearchState((state) => ({
|
|
375
|
+
...state,
|
|
376
|
+
loading: true,
|
|
377
|
+
loadingMore: false,
|
|
378
|
+
loadMoreError: false,
|
|
379
|
+
hasMore: false,
|
|
380
|
+
error: false
|
|
381
|
+
}));
|
|
382
|
+
queryUserGroupsPage({
|
|
383
|
+
parentGroupId: void 0,
|
|
384
|
+
keyword: normalizedKeyword,
|
|
385
|
+
pager: {
|
|
386
|
+
pageNumber: 1,
|
|
387
|
+
pageSize: GROUP_PAGE_SIZE
|
|
388
|
+
}
|
|
389
|
+
}).then((page) => {
|
|
390
|
+
if (!isCurrentRequest(version)) return;
|
|
391
|
+
updateSearchState((state) => ({
|
|
392
|
+
...state,
|
|
393
|
+
items: [...page.data],
|
|
394
|
+
pageNumber: page.pageNumber,
|
|
395
|
+
hasMore: hasMoreGroupPages(page),
|
|
396
|
+
pathWarningCode: page.pathWarningCode,
|
|
397
|
+
truncated: page.truncated,
|
|
398
|
+
loading: false,
|
|
399
|
+
error: false
|
|
400
|
+
}));
|
|
401
|
+
}).catch(() => {
|
|
402
|
+
if (!isCurrentRequest(version)) return;
|
|
403
|
+
updateSearchState((state) => ({
|
|
404
|
+
...state,
|
|
405
|
+
loading: false,
|
|
406
|
+
error: true
|
|
407
|
+
}));
|
|
408
|
+
});
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
loadTreeFirstPage(activeParentGroupIdRef.current);
|
|
412
|
+
}, [
|
|
413
|
+
isCurrentRequest,
|
|
414
|
+
loadTreeFirstPage,
|
|
415
|
+
queryUserGroupsPage,
|
|
416
|
+
updateSearchState
|
|
417
|
+
]);
|
|
418
|
+
const currentLevel = useMemo(() => levelsByParent.get(getLevelKey(activeParentGroupIdRef.current)), [levelsByParent]);
|
|
419
|
+
return {
|
|
420
|
+
breadcrumbPath,
|
|
421
|
+
pathWarningCode: isSearching ? searchState.pathWarningCode : currentLevel?.pathWarningCode,
|
|
422
|
+
truncated: isSearching ? searchState.truncated : currentLevel?.truncated,
|
|
423
|
+
items: isSearching ? searchState.items : currentLevel?.items ?? [],
|
|
424
|
+
keyword,
|
|
425
|
+
loading: isSearching ? searchState.loading : treeLoading,
|
|
426
|
+
loadingMore: isSearching ? searchState.loadingMore : currentLevel?.loadingMore ?? false,
|
|
427
|
+
error: isSearching ? searchState.error : treeError,
|
|
428
|
+
loadMoreError: isSearching ? searchState.loadMoreError : currentLevel?.loadMoreError ?? false,
|
|
429
|
+
hasMore: isSearching ? searchState.hasMore : currentLevel?.hasMore ?? false,
|
|
430
|
+
scrollTop: currentLevel?.scrollTop ?? 0,
|
|
431
|
+
setKeyword,
|
|
432
|
+
enterGroup,
|
|
433
|
+
returnToBreadcrumb,
|
|
434
|
+
loadMore,
|
|
435
|
+
retry,
|
|
436
|
+
retryLoadMore: loadMore,
|
|
437
|
+
updateScrollTop
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
//#endregion
|
|
441
|
+
export { useUserGroupCandidates };
|
|
442
|
+
|
|
443
|
+
//# sourceMappingURL=useUserGroupCandidates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUserGroupCandidates.js","names":[],"sources":["../../../src/MemberPicker/dialog/useUserGroupCandidates.ts"],"sourcesContent":["import useDialogLocale from './useDialogLocale';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport ConfigProvider from '../../ConfigProvider';\nimport type {\n IUserGroup,\n MemberGroupPageRequest,\n MemberGroupPage,\n} from '../../ConfigProvider/getUserList';\nimport { hasMoreGroupPages, mergeGroupPages } from './helper';\nimport {\n ROOT_GROUP_CACHE_KEY,\n type IGroupLevelCache,\n type IGroupSearchState,\n} from './types';\n\nconst GROUP_PAGE_SIZE = 100;\nconst SEARCH_DEBOUNCE_MS = 300;\nconst ROOT_BREADCRUMB_INDEX = -1;\n\nconst createEmptyLevel = (parentGroupId?: string): IGroupLevelCache => ({\n parentGroupId,\n items: [],\n pageNumber: 0,\n hasMore: false,\n scrollTop: 0,\n loadingMore: false,\n loadMoreError: false,\n});\n\nconst createEmptySearchState = (keyword = ''): IGroupSearchState => ({\n keyword,\n items: [],\n pageNumber: 0,\n hasMore: false,\n loading: false,\n loadingMore: false,\n error: false,\n loadMoreError: false,\n});\n\nconst getLevelKey = (parentGroupId?: string): string =>\n parentGroupId ?? ROOT_GROUP_CACHE_KEY;\n\nexport interface IUserGroupCandidatesResult {\n breadcrumbPath: IUserGroup[];\n items: IUserGroup[];\n keyword: string;\n pathWarningCode?: string | null;\n truncated?: boolean;\n loading: boolean;\n loadingMore: boolean;\n error: boolean;\n loadMoreError: boolean;\n hasMore: boolean;\n /** 当前层已保存的滚动位置,供候选面板在层级切换后恢复。 */\n scrollTop: number;\n setKeyword: (keyword: string) => void;\n enterGroup: (group: IUserGroup, scrollTop: number) => void;\n returnToBreadcrumb: (index: number, scrollTop: number) => void;\n loadMore: () => void;\n retry: () => void;\n retryLoadMore: () => void;\n updateScrollTop: (scrollTop: number) => void;\n}\n\n/**\n * 管理受限用户组树与跨层搜索。\n *\n * 树层级缓存和搜索结果分别持有;所有异步响应都受版本号保护,关闭弹窗、\n * 换词、清空或切换层级后,旧响应只能结束自身,不能覆盖当前界面。\n */\nexport function useUserGroupCandidates(): IUserGroupCandidatesResult {\n const t = useDialogLocale();\n const {\n getMemberPickerGroupPage,\n getNextLevelGroup,\n getNextLevelGroupWithMeta,\n } = ConfigProvider.useGetUserList();\n const queryUserGroupsPage = useCallback(\n async (request: MemberGroupPageRequest): Promise<MemberGroupPage> => {\n if (getMemberPickerGroupPage) return getMemberPickerGroupPage(request);\n const params = {\n parentGroupId: request.parentGroupId,\n keyword: request.keyword ?? '',\n };\n if (getNextLevelGroupWithMeta) {\n const result = await getNextLevelGroupWithMeta(params);\n // 旧接口没有页码能力:保留截断提示,不反复获取同一页。\n return {\n data: result.items,\n pageNumber: request.pager.pageNumber,\n hasMore: false,\n pathWarningCode: result.pathWarningCode,\n truncated: result.hasMore,\n };\n }\n if (getNextLevelGroup)\n return {\n data: await getNextLevelGroup(params),\n pageNumber: request.pager.pageNumber,\n hasMore: false,\n };\n throw new Error(t.MemberPickerDialog.missingGroupSource);\n },\n [\n getMemberPickerGroupPage,\n getNextLevelGroup,\n getNextLevelGroupWithMeta,\n t.MemberPickerDialog.missingGroupSource,\n ],\n );\n const [breadcrumbPath, setBreadcrumbPath] = useState<IUserGroup[]>([]);\n const breadcrumbPathRef = useRef<IUserGroup[]>([]);\n const [levelsByParent, setLevelsByParent] = useState<\n Map<string, IGroupLevelCache>\n >(new Map());\n const levelsByParentRef = useRef(levelsByParent);\n const activeParentGroupIdRef = useRef<string>();\n const [treeLoading, setTreeLoading] = useState(true);\n const [treeError, setTreeError] = useState(false);\n const [keyword, setKeywordState] = useState('');\n const keywordRef = useRef('');\n const [searchState, setSearchState] = useState<IGroupSearchState>(() =>\n createEmptySearchState(),\n );\n const searchStateRef = useRef(searchState);\n const requestVersionRef = useRef(0);\n const mountedRef = useRef(true);\n const searchEffectInitializedRef = useRef(false);\n\n const updateLevels = useCallback(\n (\n updater: (\n levels: Map<string, IGroupLevelCache>,\n ) => Map<string, IGroupLevelCache>,\n ) => {\n setLevelsByParent((currentLevels) => {\n const nextLevels = updater(currentLevels);\n levelsByParentRef.current = nextLevels;\n return nextLevels;\n });\n },\n [],\n );\n\n // 切层或转搜索会废弃当前请求,同时释放缓存层的分页锁,返回该层仍可继续加载。\n const cancelTreePagination = useCallback(() => {\n updateLevels(\n (levels) =>\n new Map(\n Array.from(levels, ([key, level]) => [\n key,\n level.loadingMore ? { ...level, loadingMore: false } : level,\n ]),\n ),\n );\n }, [updateLevels]);\n\n const updateSearchState = useCallback(\n (updater: (state: IGroupSearchState) => IGroupSearchState) => {\n setSearchState((currentState) => {\n const nextState = updater(currentState);\n searchStateRef.current = nextState;\n return nextState;\n });\n },\n [],\n );\n\n const isCurrentRequest = useCallback(\n (version: number): boolean =>\n mountedRef.current && requestVersionRef.current === version,\n [],\n );\n\n const loadTreeFirstPage = useCallback(\n (parentGroupId?: string) => {\n const version = requestVersionRef.current + 1;\n requestVersionRef.current = version;\n setTreeLoading(true);\n setTreeError(false);\n queryUserGroupsPage({\n parentGroupId,\n keyword: undefined,\n pager: { pageNumber: 1, pageSize: GROUP_PAGE_SIZE },\n })\n .then((page) => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateLevels((currentLevels) => {\n const key = getLevelKey(parentGroupId);\n const previousLevel = currentLevels.get(key);\n return new Map(currentLevels).set(key, {\n parentGroupId,\n items: [...page.data],\n pageNumber: page.pageNumber,\n hasMore: hasMoreGroupPages(page),\n pathWarningCode: page.pathWarningCode,\n truncated: page.truncated,\n scrollTop: previousLevel?.scrollTop ?? 0,\n loadingMore: false,\n loadMoreError: false,\n });\n });\n setTreeLoading(false);\n })\n .catch(() => {\n if (!isCurrentRequest(version)) {\n return;\n }\n setTreeLoading(false);\n setTreeError(true);\n });\n },\n [isCurrentRequest, queryUserGroupsPage, updateLevels],\n );\n\n useEffect(() => {\n mountedRef.current = true;\n loadTreeFirstPage();\n return () => {\n mountedRef.current = false;\n requestVersionRef.current += 1;\n };\n }, [loadTreeFirstPage]);\n\n useEffect(() => {\n if (!searchEffectInitializedRef.current) {\n searchEffectInitializedRef.current = true;\n return undefined;\n }\n\n const normalizedKeyword = keyword.trim();\n cancelTreePagination();\n const version = requestVersionRef.current + 1;\n requestVersionRef.current = version;\n if (!normalizedKeyword) {\n updateSearchState(() => createEmptySearchState(keyword));\n const activeKey = getLevelKey(activeParentGroupIdRef.current);\n if (!levelsByParentRef.current.has(activeKey)) {\n loadTreeFirstPage(activeParentGroupIdRef.current);\n } else {\n setTreeLoading(false);\n setTreeError(false);\n }\n return undefined;\n }\n\n updateSearchState(() => ({\n ...createEmptySearchState(normalizedKeyword),\n loading: true,\n }));\n const timer = window.setTimeout(() => {\n queryUserGroupsPage({\n parentGroupId: undefined,\n keyword: normalizedKeyword,\n pager: { pageNumber: 1, pageSize: GROUP_PAGE_SIZE },\n })\n .then((page) => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateSearchState((currentState) => ({\n ...currentState,\n keyword: normalizedKeyword,\n items: [...page.data],\n pageNumber: page.pageNumber,\n hasMore: hasMoreGroupPages(page),\n pathWarningCode: page.pathWarningCode,\n truncated: page.truncated,\n loading: false,\n error: false,\n }));\n })\n .catch(() => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateSearchState((currentState) => ({\n ...currentState,\n loading: false,\n error: true,\n }));\n });\n }, SEARCH_DEBOUNCE_MS);\n\n return () => window.clearTimeout(timer);\n }, [\n cancelTreePagination,\n isCurrentRequest,\n keyword,\n loadTreeFirstPage,\n queryUserGroupsPage,\n updateSearchState,\n ]);\n\n const updateCurrentLevel = useCallback(\n (updater: (level: IGroupLevelCache) => IGroupLevelCache) => {\n const parentGroupId = activeParentGroupIdRef.current;\n const key = getLevelKey(parentGroupId);\n updateLevels((currentLevels) => {\n const level = currentLevels.get(key) ?? createEmptyLevel(parentGroupId);\n return new Map(currentLevels).set(key, updater(level));\n });\n },\n [updateLevels],\n );\n\n const updateScrollTop = useCallback(\n (scrollTop: number) => {\n updateCurrentLevel((level) => ({ ...level, scrollTop }));\n },\n [updateCurrentLevel],\n );\n\n const enterGroup = useCallback(\n (group: IUserGroup, scrollTop: number) => {\n updateScrollTop(scrollTop);\n cancelTreePagination();\n const nextBreadcrumbPath = [...breadcrumbPathRef.current, group];\n breadcrumbPathRef.current = nextBreadcrumbPath;\n setBreadcrumbPath(nextBreadcrumbPath);\n activeParentGroupIdRef.current = group.groupId;\n const nextKey = getLevelKey(group.groupId);\n requestVersionRef.current += 1;\n if (levelsByParentRef.current.has(nextKey)) {\n setTreeLoading(false);\n setTreeError(false);\n return;\n }\n loadTreeFirstPage(group.groupId);\n },\n [cancelTreePagination, loadTreeFirstPage, updateScrollTop],\n );\n\n const returnToBreadcrumb = useCallback(\n (index: number, scrollTop: number) => {\n updateScrollTop(scrollTop);\n cancelTreePagination();\n const currentPath = breadcrumbPathRef.current;\n const nextPath =\n index === ROOT_BREADCRUMB_INDEX ? [] : currentPath.slice(0, index + 1);\n const parentGroupId = nextPath[nextPath.length - 1]?.groupId;\n breadcrumbPathRef.current = nextPath;\n setBreadcrumbPath(nextPath);\n activeParentGroupIdRef.current = parentGroupId;\n requestVersionRef.current += 1;\n const targetKey = getLevelKey(parentGroupId);\n if (levelsByParentRef.current.has(targetKey)) {\n setTreeLoading(false);\n setTreeError(false);\n return;\n }\n loadTreeFirstPage(parentGroupId);\n },\n [cancelTreePagination, loadTreeFirstPage, updateScrollTop],\n );\n\n const loadTreeMore = useCallback(() => {\n const parentGroupId = activeParentGroupIdRef.current;\n const key = getLevelKey(parentGroupId);\n const level = levelsByParentRef.current.get(key);\n if (!level || !level.hasMore || level.loadingMore) {\n return;\n }\n const nextPageNumber = level.pageNumber + 1;\n const version = requestVersionRef.current + 1;\n requestVersionRef.current = version;\n updateCurrentLevel((currentLevel) => ({\n ...currentLevel,\n loadingMore: true,\n loadMoreError: false,\n }));\n queryUserGroupsPage({\n parentGroupId,\n keyword: undefined,\n pager: { pageNumber: nextPageNumber, pageSize: GROUP_PAGE_SIZE },\n })\n .then((page) => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateCurrentLevel((currentLevel) => ({\n ...currentLevel,\n items: mergeGroupPages(currentLevel.items, page.data),\n pageNumber: page.pageNumber,\n hasMore: hasMoreGroupPages(page),\n pathWarningCode: currentLevel.pathWarningCode || page.pathWarningCode,\n truncated: currentLevel.truncated || page.truncated,\n loadingMore: false,\n loadMoreError: false,\n }));\n })\n .catch(() => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateCurrentLevel((currentLevel) => ({\n ...currentLevel,\n loadingMore: false,\n loadMoreError: true,\n }));\n });\n }, [isCurrentRequest, queryUserGroupsPage, updateCurrentLevel]);\n\n const loadSearchMore = useCallback(() => {\n const currentSearch = searchStateRef.current;\n const normalizedKeyword = keywordRef.current.trim();\n if (\n !normalizedKeyword ||\n currentSearch.loading ||\n !currentSearch.hasMore ||\n currentSearch.loadingMore\n ) {\n return;\n }\n const nextPageNumber = currentSearch.pageNumber + 1;\n const version = requestVersionRef.current + 1;\n requestVersionRef.current = version;\n updateSearchState((state) => ({\n ...state,\n loadingMore: true,\n loadMoreError: false,\n }));\n queryUserGroupsPage({\n parentGroupId: undefined,\n keyword: normalizedKeyword,\n pager: { pageNumber: nextPageNumber, pageSize: GROUP_PAGE_SIZE },\n })\n .then((page) => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateSearchState((state) => ({\n ...state,\n items: mergeGroupPages(state.items, page.data),\n pageNumber: page.pageNumber,\n hasMore: hasMoreGroupPages(page),\n pathWarningCode: state.pathWarningCode || page.pathWarningCode,\n truncated: state.truncated || page.truncated,\n loadingMore: false,\n loadMoreError: false,\n }));\n })\n .catch(() => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateSearchState((state) => ({\n ...state,\n loadingMore: false,\n loadMoreError: true,\n }));\n });\n }, [isCurrentRequest, queryUserGroupsPage, updateSearchState]);\n\n const setKeyword = useCallback((nextKeyword: string) => {\n keywordRef.current = nextKeyword;\n setKeywordState(nextKeyword);\n }, []);\n\n const isSearching = keyword.trim().length > 0;\n const loadMore = useCallback(() => {\n if (keywordRef.current.trim()) {\n loadSearchMore();\n return;\n }\n loadTreeMore();\n }, [loadSearchMore, loadTreeMore]);\n\n const retry = useCallback(() => {\n const normalizedKeyword = keywordRef.current.trim();\n if (normalizedKeyword) {\n const version = requestVersionRef.current + 1;\n requestVersionRef.current = version;\n updateSearchState((state) => ({\n ...state,\n loading: true,\n loadingMore: false,\n loadMoreError: false,\n hasMore: false,\n error: false,\n }));\n queryUserGroupsPage({\n parentGroupId: undefined,\n keyword: normalizedKeyword,\n pager: { pageNumber: 1, pageSize: GROUP_PAGE_SIZE },\n })\n .then((page) => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateSearchState((state) => ({\n ...state,\n items: [...page.data],\n pageNumber: page.pageNumber,\n hasMore: hasMoreGroupPages(page),\n pathWarningCode: page.pathWarningCode,\n truncated: page.truncated,\n loading: false,\n error: false,\n }));\n })\n .catch(() => {\n if (!isCurrentRequest(version)) {\n return;\n }\n updateSearchState((state) => ({\n ...state,\n loading: false,\n error: true,\n }));\n });\n return;\n }\n loadTreeFirstPage(activeParentGroupIdRef.current);\n }, [\n isCurrentRequest,\n loadTreeFirstPage,\n queryUserGroupsPage,\n updateSearchState,\n ]);\n\n const currentLevel = useMemo(\n () => levelsByParent.get(getLevelKey(activeParentGroupIdRef.current)),\n [levelsByParent],\n );\n\n return {\n breadcrumbPath,\n pathWarningCode: isSearching\n ? searchState.pathWarningCode\n : currentLevel?.pathWarningCode,\n truncated: isSearching ? searchState.truncated : currentLevel?.truncated,\n items: isSearching ? searchState.items : currentLevel?.items ?? [],\n keyword,\n loading: isSearching ? searchState.loading : treeLoading,\n loadingMore: isSearching\n ? searchState.loadingMore\n : currentLevel?.loadingMore ?? false,\n error: isSearching ? searchState.error : treeError,\n loadMoreError: isSearching\n ? searchState.loadMoreError\n : currentLevel?.loadMoreError ?? false,\n hasMore: isSearching ? searchState.hasMore : currentLevel?.hasMore ?? false,\n scrollTop: currentLevel?.scrollTop ?? 0,\n setKeyword,\n enterGroup,\n returnToBreadcrumb,\n loadMore,\n retry,\n retryLoadMore: loadMore,\n updateScrollTop,\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import { default as MemberPickerDialog } from './dialog/MemberPickerDialog.js';
|
|
1
2
|
import { default as React } from 'react';
|
|
2
3
|
import { default as MemberPanel } from './components/PanelWrapper.js';
|
|
3
4
|
import { IMemberPickerProps } from './interface.js';
|
|
4
5
|
declare const MemberSelector: React.FC<IMemberPickerProps> & {
|
|
5
6
|
MemberPanel: typeof MemberPanel;
|
|
7
|
+
Dialog: typeof MemberPickerDialog;
|
|
6
8
|
};
|
|
7
9
|
export default MemberSelector;
|