@aloudata/aloudata-design 3.1.0 → 3.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AProgress/index.js +10 -0
- package/dist/AProgress/index.js.map +1 -1
- package/dist/Alert/index.js +3 -1
- package/dist/Alert/index.js.map +1 -1
- package/dist/Badge/index.js +37 -11
- package/dist/Badge/index.js.map +1 -1
- package/dist/Breadcrumb/index.js +12 -2
- package/dist/Breadcrumb/index.js.map +1 -1
- package/dist/Button/index.d.ts +1 -1
- package/dist/Button/index.js +20 -6
- package/dist/Button/index.js.map +1 -1
- package/dist/Card/index.js +1 -1
- package/dist/Card/index.js.map +1 -1
- package/dist/Carousel/index.js +9 -1
- package/dist/Carousel/index.js.map +1 -1
- package/dist/Checkbox/index.js +17 -2
- package/dist/Checkbox/index.js.map +1 -1
- package/dist/Checkbox/type.d.ts +10 -2
- package/dist/ColorPicker/index.js +112 -46
- package/dist/ColorPicker/index.js.map +1 -1
- package/dist/DataPreviewTable/components/Body/Cell.d.ts +2 -0
- package/dist/DataPreviewTable/components/Body/Cell.js +9 -1
- package/dist/DataPreviewTable/components/Body/Cell.js.map +1 -1
- package/dist/DataPreviewTable/components/Body/index.d.ts +1 -0
- package/dist/DataPreviewTable/components/Body/index.js +35 -23
- package/dist/DataPreviewTable/components/Body/index.js.map +1 -1
- package/dist/DataPreviewTable/components/Header/index.d.ts +1 -0
- package/dist/DataPreviewTable/components/Header/index.js +36 -28
- package/dist/DataPreviewTable/components/Header/index.js.map +1 -1
- package/dist/DataPreviewTable/index.js +19 -2
- package/dist/DataPreviewTable/index.js.map +1 -1
- package/dist/Drawer/index.d.ts +4 -0
- package/dist/Drawer/index.js +91 -78
- package/dist/Drawer/index.js.map +1 -1
- package/dist/Dropdown/index.d.ts +1 -1
- package/dist/Dropdown/index.js +64 -13
- package/dist/Dropdown/index.js.map +1 -1
- package/dist/Form/FormItemContext.d.ts +1 -1
- package/dist/Form/FormItemContext.js.map +1 -1
- package/dist/Form/index.js +50 -7
- package/dist/Form/index.js.map +1 -1
- package/dist/IconButton/index.d.ts +2 -2
- package/dist/IconButton/index.js +9 -3
- package/dist/IconButton/index.js.map +1 -1
- package/dist/Input/components/Input/index.js +18 -8
- package/dist/Input/components/Input/index.js.map +1 -1
- package/dist/Input/components/TextArea/index.js +18 -7
- package/dist/Input/components/TextArea/index.js.map +1 -1
- package/dist/Input/privateSemanticOwner.d.ts +2 -0
- package/dist/Input/privateSemanticOwner.js +1 -0
- package/dist/InputNumber/index.js +16 -9
- package/dist/InputNumber/index.js.map +1 -1
- package/dist/InputNumber/type.d.ts +2 -2
- package/dist/LogicTree/components/LogicItem/index.d.ts +2 -1
- package/dist/LogicTree/components/LogicItem/index.js +13 -2
- package/dist/LogicTree/components/LogicItem/index.js.map +1 -1
- package/dist/LogicTree/index.js +2 -0
- package/dist/LogicTree/index.js.map +1 -1
- package/dist/MemberPicker/components/MemberSelection.d.ts +1 -0
- package/dist/MemberPicker/components/MemberSelection.js +83 -94
- package/dist/MemberPicker/components/MemberSelection.js.map +1 -1
- package/dist/MemberPicker/components/MultipleOption.js +12 -0
- package/dist/MemberPicker/components/MultipleOption.js.map +1 -1
- package/dist/MemberPicker/components/Panel.d.ts +1 -0
- package/dist/MemberPicker/components/Panel.js +4 -1
- package/dist/MemberPicker/components/Panel.js.map +1 -1
- package/dist/MemberPicker/components/SelectedMemberTags.js +14 -6
- package/dist/MemberPicker/components/SelectedMemberTags.js.map +1 -1
- package/dist/MemberPicker/components/SingleOption.js +12 -0
- package/dist/MemberPicker/components/SingleOption.js.map +1 -1
- package/dist/MemberPicker/components/UserGroupSelection.d.ts +2 -1
- package/dist/MemberPicker/components/UserGroupSelection.js +61 -48
- package/dist/MemberPicker/components/UserGroupSelection.js.map +1 -1
- package/dist/MemberPicker/index.js +134 -108
- package/dist/MemberPicker/index.js.map +1 -1
- package/dist/Menu/index.d.ts +8 -0
- package/dist/Menu/index.js +33 -3
- package/dist/Menu/index.js.map +1 -1
- package/dist/Modal/index.d.ts +4 -0
- package/dist/Modal/index.js +55 -66
- package/dist/Modal/index.js.map +1 -1
- package/dist/OverflowCount/index.js +10 -0
- package/dist/OverflowCount/index.js.map +1 -1
- package/dist/Pagination/index.js +1 -0
- package/dist/Pagination/index.js.map +1 -1
- package/dist/Popconfirm/index.js +9 -1
- package/dist/Popconfirm/index.js.map +1 -1
- package/dist/Popover/index.js +52 -1
- package/dist/Popover/index.js.map +1 -1
- package/dist/Progress/index.js +4 -0
- package/dist/Progress/index.js.map +1 -1
- package/dist/Radio/components/Group/index.d.ts +5 -1
- package/dist/Radio/components/Group/index.js +7 -2
- package/dist/Radio/components/Group/index.js.map +1 -1
- package/dist/Radio/components/Radio/index.js +26 -0
- package/dist/Radio/components/Radio/index.js.map +1 -1
- package/dist/Radio/interface/radio.d.ts +7 -0
- package/dist/Radio/interface/radioGroup.d.ts +2 -0
- package/dist/RenameInput/index.js +11 -0
- package/dist/RenameInput/index.js.map +1 -1
- package/dist/Select/BaseSelect.d.ts +3 -0
- package/dist/Select/BaseSelect.js +229 -32
- package/dist/Select/BaseSelect.js.map +1 -1
- package/dist/Select/SelectTrigger.d.ts +2 -0
- package/dist/Select/SelectTrigger.js +13 -5
- package/dist/Select/SelectTrigger.js.map +1 -1
- package/dist/Select/components/OptionCollection.d.ts +41 -0
- package/dist/Select/components/OptionCollection.js +124 -0
- package/dist/Select/components/OptionCollection.js.map +1 -0
- package/dist/Select/index.js +45 -3
- package/dist/Select/index.js.map +1 -1
- package/dist/Select/interface.d.ts +1 -1
- package/dist/Skeleton/index.js +1 -1
- package/dist/Skeleton/index.js.map +1 -1
- package/dist/Spin/index.d.ts +1 -1
- package/dist/Spin/index.js +22 -7
- package/dist/Spin/index.js.map +1 -1
- package/dist/Switch/index.d.ts +5 -0
- package/dist/Switch/index.js +15 -5
- package/dist/Switch/index.js.map +1 -1
- package/dist/Table/components/Header.js +0 -1
- package/dist/Table/components/Header.js.map +1 -1
- package/dist/Table/index.js +42 -27
- package/dist/Table/index.js.map +1 -1
- package/dist/Tabs/index.js +1 -0
- package/dist/Tabs/index.js.map +1 -1
- package/dist/Tag/index.js +20 -1
- package/dist/Tag/index.js.map +1 -1
- package/dist/Tooltip/index.js +34 -5
- package/dist/Tooltip/index.js.map +1 -1
- package/dist/Tour/index.js +13 -1
- package/dist/Tour/index.js.map +1 -1
- package/dist/Tree/Tree2.js +2 -0
- package/dist/Tree/Tree2.js.map +1 -1
- package/dist/_utils/dialogAccessibility.d.ts +17 -0
- package/dist/_utils/dialogAccessibility.js +110 -0
- package/dist/_utils/dialogAccessibility.js.map +1 -0
- package/dist/_utils/formControlSemanticOwner.d.ts +3 -0
- package/dist/_utils/formControlSemanticOwner.js +17 -0
- package/dist/_utils/formControlSemanticOwner.js.map +1 -0
- package/dist/_utils/overlayCoordinator.js +1 -11
- package/dist/_utils/overlayCoordinator.js.map +1 -1
- package/dist/aloudata-design.css +1 -1
- package/dist/theme/contract/baselineResolvedTokenValueManifest.d.ts +1 -1
- package/dist/theme/contract/darkResolvedTokenValueManifest.d.ts +1 -1
- package/dist/theme/generator/acceptedColorValues.d.ts +2 -1
- package/dist/theme/generator/baselineTokenValueDelivery.d.ts +9 -1
- package/dist/theme/generator/minimalAcceptedColorValues.d.ts +2 -2
- package/dist/theme/generator/neutralSourceResolver.d.ts +28 -0
- package/dist/theme/generator/neutralSourceResolver.js +2 -0
- package/dist/theme/generator/neutralSourceValues.d.ts +27 -0
- package/dist/theme/generator/neutralSourceValues.js +2 -0
- package/dist/theme/index.d.ts +2 -0
- package/dist/theme/index.js +1 -0
- package/dist/theme/neutralSourceContract.d.ts +3 -0
- package/dist/theme/neutralSourceContract.js +11 -0
- package/dist/theme/neutralSourceContract.js.map +1 -0
- package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.d.ts +1 -1
- package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js +45 -45
- package/dist/theme/runtime/colorValueMode/generated/darkBaselineDeclarations.js.map +1 -1
- package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.d.ts +3 -0
- package/dist/theme/runtime/colorValueMode/generated/slateDarkDeclarations.js +2 -0
- package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.d.ts +3 -0
- package/dist/theme/runtime/colorValueMode/generated/slateLightDeclarations.js +2 -0
- package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.d.ts +3 -0
- package/dist/theme/runtime/colorValueMode/generated/stoneDarkDeclarations.js +2 -0
- package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.d.ts +3 -0
- package/dist/theme/runtime/colorValueMode/generated/stoneLightDeclarations.js +2 -0
- package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.d.ts +1 -1
- package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js +41 -41
- package/dist/theme/runtime/colorValueMode/generated/v3BaselineDeclarations.js.map +1 -1
- package/dist/theme/runtime/colorValueMode/index.js +2 -12
- package/dist/theme/runtime/colorValueMode/index.js.map +1 -1
- package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.d.ts +2 -0
- package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js +48 -0
- package/dist/theme/runtime/colorValueMode/legacyNeutralCompatibility.js.map +1 -0
- package/dist/theme/runtime/colorValueMode/registry.d.ts +1 -1
- package/dist/theme/runtime/colorValueMode/registry.js +2 -1
- package/dist/theme/runtime/colorValueMode/registry.js.map +1 -1
- package/dist/theme/runtime/initAldTheme.js +1 -3
- package/dist/theme/runtime/initAldTheme.js.map +1 -1
- package/dist/theme/runtime/neutralSource/index.d.ts +6 -0
- package/dist/theme/runtime/neutralSource/index.js +11 -0
- package/dist/theme/runtime/neutralSource/index.js.map +1 -0
- package/dist/theme/runtime/neutralSource.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelectedMemberTags.js","names":[],"sources":["../../../src/MemberPicker/components/SelectedMemberTags.tsx"],"sourcesContent":["import { cn } from '../../lib/utils';\nimport _ from 'lodash';\nimport React, { ReactNode, useContext } from 'react';\nimport Badge from '../../Badge';\nimport ConfigProvider from '../../ConfigProvider';\nimport {\n IUserGroup,\n TUser,\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport { CloseMLine } from '../../Icon';\nimport ScrollArea from '../../ScrollArea';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { IUser } from '../interface';\nimport { getAccount, getId, getPhoto } from '../utils';\nimport { isUser } from '../utils/getUsersWithUserId';\nimport NickLabel from './NickLabel';\ninterface ISelectedMemberTagsProps {\n className?: string;\n selectedUsers: TUser;\n onRemove?: (user: IUser | IUserGroup) => void;\n width: number;\n lockedIds: Array<TUserValue | TUserGroupValue>;\n userList: TUser;\n renderSelectedTag?: (\n user: IUser | IUserGroup,\n originNode: ReactNode,\n ) => ReactNode;\n}\n\nexport default function SelectedMemberTags(props: ISelectedMemberTagsProps) {\n const {\n className,\n selectedUsers,\n width,\n lockedIds = [],\n renderSelectedTag,\n } = props;\n\n const { getMemberPickerItemMoreInfoKey } = ConfigProvider.useGetUserList();\n\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n return (\n <div\n className={cn(className, 'ald-member-picker-selected-member-tags-wrap')}\n >\n <div className={'ald-member-picker-has-selected'}>\n {t.MemberPicker.selectedTotal(selectedUsers.length)}\n </div>\n <ScrollArea className={'ald-member-selected-member-wrapper'}>\n <div className={'ald-member-picker-tags'} style={{ width: width - 17 }}>\n {selectedUsers.map((user) => {\n let hasLocked = false;\n\n if (user && Object.prototype.hasOwnProperty.call(user, 'groupId')) {\n const index = _.findIndex(lockedIds, {\n groupId: (user as TUserGroupValue).groupId,\n type: (user as TUserGroupValue).type,\n });\n hasLocked = index !== -1;\n } else {\n const index = _.findIndex(lockedIds, {\n userId: (user as TUserValue).userId,\n type: (user as TUserValue).type,\n });\n\n hasLocked = index !== -1;\n }\n\n const originNode = (\n <div\n className={'ald-member-picker-selected-member-tag'}\n key={getId(user)}\n >\n <div className={'ald-member-picker-selected-member-tag-user'}>\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 user.type === 'USER' && (\n <span className=\"ald-member-picker-option-id\">\n {getMemberPickerItemMoreInfoKey\n ? getMemberPickerItemMoreInfoKey(user)\n : user.userId}\n </span>\n )\n }\n ></NickLabel>\n </div>\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 {!hasLocked && (\n <
|
|
1
|
+
{"version":3,"file":"SelectedMemberTags.js","names":[],"sources":["../../../src/MemberPicker/components/SelectedMemberTags.tsx"],"sourcesContent":["import { cn } from '../../lib/utils';\nimport _ from 'lodash';\nimport React, { ReactNode, useContext } from 'react';\nimport Badge from '../../Badge';\nimport ConfigProvider from '../../ConfigProvider';\nimport {\n IUserGroup,\n TUser,\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport { CloseMLine } from '../../Icon';\nimport ScrollArea from '../../ScrollArea';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { IUser } from '../interface';\nimport { getAccount, getId, getPhoto } from '../utils';\nimport { isUser } from '../utils/getUsersWithUserId';\nimport NickLabel from './NickLabel';\ninterface ISelectedMemberTagsProps {\n className?: string;\n selectedUsers: TUser;\n onRemove?: (user: IUser | IUserGroup) => void;\n width: number;\n lockedIds: Array<TUserValue | TUserGroupValue>;\n userList: TUser;\n renderSelectedTag?: (\n user: IUser | IUserGroup,\n originNode: ReactNode,\n ) => ReactNode;\n}\n\nexport default function SelectedMemberTags(props: ISelectedMemberTagsProps) {\n const {\n className,\n selectedUsers,\n width,\n lockedIds = [],\n renderSelectedTag,\n } = props;\n\n const { getMemberPickerItemMoreInfoKey } = ConfigProvider.useGetUserList();\n\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n return (\n <div\n className={cn(className, 'ald-member-picker-selected-member-tags-wrap')}\n >\n <div className={'ald-member-picker-has-selected'}>\n {t.MemberPicker.selectedTotal(selectedUsers.length)}\n </div>\n <ScrollArea className={'ald-member-selected-member-wrapper'}>\n <div className={'ald-member-picker-tags'} style={{ width: width - 17 }}>\n {selectedUsers.map((user) => {\n let hasLocked = false;\n\n if (user && Object.prototype.hasOwnProperty.call(user, 'groupId')) {\n const index = _.findIndex(lockedIds, {\n groupId: (user as TUserGroupValue).groupId,\n type: (user as TUserGroupValue).type,\n });\n hasLocked = index !== -1;\n } else {\n const index = _.findIndex(lockedIds, {\n userId: (user as TUserValue).userId,\n type: (user as TUserValue).type,\n });\n\n hasLocked = index !== -1;\n }\n\n const originNode = (\n <div\n className={'ald-member-picker-selected-member-tag'}\n key={getId(user)}\n >\n <div className={'ald-member-picker-selected-member-tag-user'}>\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 user.type === 'USER' && (\n <span className=\"ald-member-picker-option-id\">\n {getMemberPickerItemMoreInfoKey\n ? getMemberPickerItemMoreInfoKey(user)\n : user.userId}\n </span>\n )\n }\n ></NickLabel>\n </div>\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 {!hasLocked && (\n <button\n type=\"button\"\n aria-label={`Remove ${user.name as string}`}\n className={'ald-member-picker-close'}\n style={{ border: 0, background: 'transparent', padding: 0 }}\n onClick={() => props.onRemove?.(user)}\n >\n <CloseMLine\n size={20}\n color=\"var(--content-tertiary)\"\n aria-hidden=\"true\"\n />\n </button>\n )}\n </div>\n );\n\n if (renderSelectedTag) {\n return renderSelectedTag(user, originNode);\n }\n\n return originNode;\n })}\n </div>\n </ScrollArea>\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AA+BA,SAAwB,mBAAmB,OAAiC;CAC1E,MAAM,EACJ,WACA,eACA,OACA,YAAY,EAAE,EACd,sBACE;CAEJ,MAAM,EAAE,mCAAmC,wBAAe,gBAAgB;CAE1E,MAAM,EAAE,WAAW,WAAW,cAAc;CAC5C,MAAM,IAAI,cAAc,OAAO;AAE/B,QACE,qBAAC,OAAD;EACE,WAAW,GAAG,WAAW,8CAA8C;YADzE,CAGE,oBAAC,OAAD;GAAK,WAAW;aACb,EAAE,aAAa,cAAc,cAAc,OAAO;GAC/C,CAAA,EACN,oBAAC,oBAAD;GAAY,WAAW;aACrB,oBAAC,OAAD;IAAK,WAAW;IAA0B,OAAO,EAAE,OAAO,QAAQ,IAAI;cACnE,cAAc,KAAK,SAAS;KAC3B,IAAI,YAAY;AAEhB,SAAI,QAAQ,OAAO,UAAU,eAAe,KAAK,MAAM,UAAU,CAK/D,aAJc,EAAE,UAAU,WAAW;MACnC,SAAU,KAAyB;MACnC,MAAO,KAAyB;MACjC,CAAC,KACoB;SAOtB,aALc,EAAE,UAAU,WAAW;MACnC,QAAS,KAAoB;MAC7B,MAAO,KAAoB;MAC5B,CAAC,KAEoB;KAGxB,MAAM,aACJ,qBAAC,OAAD;MACE,WAAW;gBADb;OAIE,oBAAC,OAAD;QAAK,WAAW;kBACd,oBAAC,mBAAD;SACE,MAAM,KAAK;SACX,IAAI,MAAM,KAAK;SACf,MAAM,KAAK;SACX,OAAO,SAAS,KAAK;SACrB,SAAS,WAAW,KAAK;SACzB,aACE,KAAK,SAAS,UACZ,oBAAC,QAAD;UAAM,WAAU;oBACb,iCACG,+BAA+B,KAAK,GACpC,KAAK;UACJ,CAAA;SAGA,CAAA;QACT,CAAA;OAEL,OAAO,KAAK,IAAI,KAAK,OACpB,oBAAC,OAAD;QACE,QAAO;QACP,OAAO,EAAE,aAAa;QACtB,WAAW;QACJ,CAAA;OAEV,CAAC,aACA,oBAAC,UAAD;QACE,MAAK;QACL,cAAY,UAAU,KAAK;QAC3B,WAAW;QACX,OAAO;SAAE,QAAQ;SAAG,YAAY;SAAe,SAAS;SAAG;QAC3D,eAAe,MAAM,WAAW,KAAK;kBAErC,oBAAC,MAAD;SACE,MAAM;SACN,OAAM;SACN,eAAY;SACZ,CAAA;QACK,CAAA;OAEP;QA3CC,MAAM,KAAK,CA2CZ;AAGR,SAAI,kBACF,QAAO,kBAAkB,MAAM,WAAW;AAG5C,YAAO;MACP;IACE,CAAA;GACK,CAAA,CACT"}
|
|
@@ -21,8 +21,20 @@ function SingleOption(params) {
|
|
|
21
21
|
else onChange?.(!selected, user);
|
|
22
22
|
};
|
|
23
23
|
return /* @__PURE__ */ jsxs("div", {
|
|
24
|
+
role: "option",
|
|
25
|
+
id: `ald-member-picker-option-${getId(user)}`,
|
|
26
|
+
"aria-selected": selected,
|
|
27
|
+
"aria-disabled": disabled || void 0,
|
|
28
|
+
tabIndex: -1,
|
|
24
29
|
className: cn("ald-member-picker-option", className, { ["ald-member-picker-option-disabled"]: disabled }),
|
|
25
30
|
onClick,
|
|
31
|
+
onKeyDown: (event) => {
|
|
32
|
+
if (disabled) return;
|
|
33
|
+
if (event.key === "Enter" || event.key === " ") {
|
|
34
|
+
event.preventDefault();
|
|
35
|
+
onClick();
|
|
36
|
+
}
|
|
37
|
+
},
|
|
26
38
|
children: [/* @__PURE__ */ jsx("div", {
|
|
27
39
|
className: "ald-member-picker-label",
|
|
28
40
|
children: /* @__PURE__ */ jsxs("div", {
|
|
@@ -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 className={cn('ald-member-picker-option', className, {\n ['ald-member-picker-option-disabled']: disabled,\n })}\n onClick={onClick}\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,WAAW,GAAG,4BAA4B,WAAW,GAClD,sCAAsC,UACxC,CAAC;EACO;
|
|
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"}
|
|
@@ -11,6 +11,7 @@ interface IProps {
|
|
|
11
11
|
width: number;
|
|
12
12
|
lockedIds: Array<TUserValue | TUserGroupValue>;
|
|
13
13
|
filterItem?: (item: IUserGroup) => boolean;
|
|
14
|
+
searchValue?: string;
|
|
14
15
|
renderItem?: (item: IUserGroup, context: {
|
|
15
16
|
isSelected: boolean;
|
|
16
17
|
disabled: boolean;
|
|
@@ -19,5 +20,5 @@ interface IProps {
|
|
|
19
20
|
originNode: React.ReactNode;
|
|
20
21
|
}) => React.ReactNode;
|
|
21
22
|
}
|
|
22
|
-
declare const UserGroupSelection: ({ className, userGroupList, multiple, onChange, selectedUsersGroup: selectedUsersGroups, loading, width, lockedIds, filterItem, renderItem, }: IProps) => import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
declare const UserGroupSelection: ({ className, userGroupList, multiple, onChange, selectedUsersGroup: selectedUsersGroups, loading, onSearchValueChange, width, lockedIds, filterItem, searchValue, renderItem, }: IProps) => import("react/jsx-runtime").JSX.Element;
|
|
23
24
|
export default UserGroupSelection;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { cn } from "../../lib/utils.js";
|
|
2
2
|
import Memo from "../../Icon/components/ChevronLeftLine.js";
|
|
3
|
-
import Memo$1 from "../../Icon/components/SearchLine.js";
|
|
4
3
|
import Breadcrumb from "../../Breadcrumb/index.js";
|
|
5
4
|
import { LocaleContext, getTranslator } from "../../locale/default.js";
|
|
6
|
-
import Input from "../../Input/index.js";
|
|
7
5
|
import Empty from "../../Empty/index.js";
|
|
8
6
|
import ScrollArea_default from "../../ScrollArea/index.js";
|
|
9
7
|
import GetUserListContext from "../../ConfigProvider/getUserList.js";
|
|
@@ -11,58 +9,64 @@ import CustomSpin from "../../Spin/index.js";
|
|
|
11
9
|
import { isUserGroup } from "../utils/getUsersWithUserId.js";
|
|
12
10
|
import MultipleList from "./MultipleOption.js";
|
|
13
11
|
import SingleOption from "./SingleOption.js";
|
|
14
|
-
import {
|
|
12
|
+
import { useContext, useEffect, useMemo, useState } from "react";
|
|
15
13
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
16
14
|
import _ from "lodash";
|
|
17
15
|
//#region src/MemberPicker/components/UserGroupSelection.tsx
|
|
18
|
-
var UserGroupSelection = ({ className, userGroupList, multiple, onChange, selectedUsersGroup: selectedUsersGroups, loading, width, lockedIds, filterItem, renderItem }) => {
|
|
16
|
+
var UserGroupSelection = ({ className, userGroupList, multiple, onChange, selectedUsersGroup: selectedUsersGroups, loading, onSearchValueChange, width, lockedIds, filterItem, searchValue = "", renderItem }) => {
|
|
19
17
|
const { locale } = useContext(LocaleContext);
|
|
20
18
|
const t = getTranslator(locale);
|
|
21
19
|
const { getNextLevelGroup } = useContext(GetUserListContext);
|
|
22
20
|
const isAsync = !!getNextLevelGroup;
|
|
23
|
-
const [searchKey, setSearchKey] = useState("");
|
|
24
21
|
const [groupPath, setGroupPath] = useState([]);
|
|
25
|
-
const [
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}).filter((group) => {
|
|
36
|
-
if (!normalizedKeyword) return true;
|
|
37
|
-
return group.name.toLowerCase().includes(normalizedKeyword);
|
|
22
|
+
const [asyncUserGroupList, setAsyncUserGroupList] = useState([]);
|
|
23
|
+
const parentGroupId = _.last(groupPath)?.groupId;
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
if (!getNextLevelGroup) return;
|
|
26
|
+
let ignore = false;
|
|
27
|
+
getNextLevelGroup({
|
|
28
|
+
parentGroupId,
|
|
29
|
+
keyword: searchValue
|
|
30
|
+
}).then((userGroups) => {
|
|
31
|
+
if (!ignore) setAsyncUserGroupList(userGroups);
|
|
38
32
|
});
|
|
33
|
+
return () => {
|
|
34
|
+
ignore = true;
|
|
35
|
+
};
|
|
39
36
|
}, [
|
|
40
|
-
isAsync,
|
|
41
|
-
searchKey,
|
|
42
|
-
userGroupList,
|
|
43
37
|
getNextLevelGroup,
|
|
44
|
-
|
|
38
|
+
parentGroupId,
|
|
39
|
+
searchValue
|
|
45
40
|
]);
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return
|
|
51
|
-
|
|
41
|
+
const filterUserList = useMemo(() => {
|
|
42
|
+
let currentLevelGroups = asyncUserGroupList;
|
|
43
|
+
if (!isAsync) {
|
|
44
|
+
currentLevelGroups = userGroupList.filter((userGroup) => {
|
|
45
|
+
if (groupPath.length === 0) return !userGroup.parentId;
|
|
46
|
+
return userGroup.parentId === parentGroupId;
|
|
47
|
+
});
|
|
48
|
+
const normalizedKeyword = searchValue.trim().toLowerCase();
|
|
49
|
+
currentLevelGroups = currentLevelGroups.filter((group) => {
|
|
50
|
+
if (!normalizedKeyword) return true;
|
|
51
|
+
return group.name.toLowerCase().includes(normalizedKeyword);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return currentLevelGroups.filter((userGroup) => {
|
|
55
|
+
if (filterItem) return filterItem(userGroup);
|
|
56
|
+
return true;
|
|
52
57
|
});
|
|
53
|
-
}, [
|
|
58
|
+
}, [
|
|
59
|
+
asyncUserGroupList,
|
|
60
|
+
filterItem,
|
|
61
|
+
groupPath.length,
|
|
62
|
+
isAsync,
|
|
63
|
+
parentGroupId,
|
|
64
|
+
searchValue,
|
|
65
|
+
userGroupList
|
|
66
|
+
]);
|
|
54
67
|
return /* @__PURE__ */ jsxs("div", {
|
|
55
68
|
className: cn(className, "ald-member-picker-member-list-wrap"),
|
|
56
69
|
children: [
|
|
57
|
-
/* @__PURE__ */ jsx(Input, {
|
|
58
|
-
prefix: /* @__PURE__ */ jsx(Memo$1, { size: 16 }),
|
|
59
|
-
className: "ald-member-picker-search-input",
|
|
60
|
-
autoFocus: true,
|
|
61
|
-
value: searchKey,
|
|
62
|
-
onChange: (e) => {
|
|
63
|
-
setSearchKey(e.target.value);
|
|
64
|
-
}
|
|
65
|
-
}),
|
|
66
70
|
userGroupList.length === 0 && !loading && /* @__PURE__ */ jsx(Empty, {
|
|
67
71
|
title: t.MemberPicker.noData,
|
|
68
72
|
size: "small",
|
|
@@ -106,6 +110,9 @@ var UserGroupSelection = ({ className, userGroupList, multiple, onChange, select
|
|
|
106
110
|
className: cn("ald-member-picker-member-list", { "ald-member-picker-member-list-null": userGroupList.length === 0 && !loading }),
|
|
107
111
|
innerClassName: "ald-member-picker-member-scroll",
|
|
108
112
|
children: /* @__PURE__ */ jsx("div", {
|
|
113
|
+
role: "listbox",
|
|
114
|
+
"aria-label": "Groups",
|
|
115
|
+
"aria-multiselectable": multiple || void 0,
|
|
109
116
|
className: "ald-member-picker-member-list-inner",
|
|
110
117
|
style: {
|
|
111
118
|
width: multiple ? width : void 0,
|
|
@@ -120,7 +127,7 @@ var UserGroupSelection = ({ className, userGroupList, multiple, onChange, select
|
|
|
120
127
|
const hasNextLevel = userGroupList.some((group) => group.parentId === userGroup.groupId) || isAsync;
|
|
121
128
|
const onNextLevel = () => {
|
|
122
129
|
setGroupPath((prev) => [...prev, userGroup]);
|
|
123
|
-
|
|
130
|
+
onSearchValueChange?.("");
|
|
124
131
|
};
|
|
125
132
|
const originNode = multiple ? /* @__PURE__ */ jsx(MultipleList, {
|
|
126
133
|
user: userGroup,
|
|
@@ -141,15 +148,21 @@ var UserGroupSelection = ({ className, userGroupList, multiple, onChange, select
|
|
|
141
148
|
hasNextLevel,
|
|
142
149
|
onNextLevel
|
|
143
150
|
}, userGroup.groupId);
|
|
144
|
-
if (renderItem) return /* @__PURE__ */ jsx("div", {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
if (renderItem) return /* @__PURE__ */ jsx("div", {
|
|
152
|
+
role: "option",
|
|
153
|
+
id: `ald-member-picker-option-${userGroup.groupId}`,
|
|
154
|
+
"aria-selected": isSelected,
|
|
155
|
+
"aria-disabled": disabled || void 0,
|
|
156
|
+
children: renderItem(userGroup, {
|
|
157
|
+
isSelected,
|
|
158
|
+
disabled,
|
|
159
|
+
onClick: () => {
|
|
160
|
+
if (isUserGroup(userGroup) && !disabled) onChange(!isSelected, userGroup);
|
|
161
|
+
},
|
|
162
|
+
onNextLevel: hasNextLevel ? onNextLevel : void 0,
|
|
163
|
+
originNode
|
|
164
|
+
})
|
|
165
|
+
}, userGroup.groupId);
|
|
153
166
|
return originNode;
|
|
154
167
|
})
|
|
155
168
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserGroupSelection.js","names":[],"sources":["../../../src/MemberPicker/components/UserGroupSelection.tsx"],"sourcesContent":["import Breadcrumb from '../../Breadcrumb';\nimport { cn } from '../../lib/utils';\nimport _ from 'lodash';\nimport React, { useCallback, useContext, useEffect, useState } from 'react';\nimport GetUserListContext, {\n IUserGroup,\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport Empty from '../../Empty';\nimport { ChevronLeftLine, SearchLine } from '../../Icon';\nimport Input from '../../Input';\nimport ScrollArea from '../../ScrollArea';\nimport Spin from '../../Spin';\nimport { LocaleContext, getTranslator } from '../../locale/default';\nimport { isUserGroup } from '../utils/getUsersWithUserId';\nimport MultipleOption from './MultipleOption';\nimport SingleOption from './SingleOption';\n\ninterface IProps {\n className?: string;\n userGroupList: IUserGroup[];\n multiple?: boolean;\n onChange: (selected: boolean, userGroup: IUserGroup) => void;\n selectedUsersGroup: IUserGroup[];\n loading: boolean;\n onSearchValueChange?: (value: string) => void;\n width: number;\n lockedIds: Array<TUserValue | TUserGroupValue>;\n filterItem?: (item: IUserGroup) => boolean;\n renderItem?: (\n item: IUserGroup,\n context: {\n isSelected: boolean;\n disabled: boolean;\n onClick: () => void;\n onNextLevel?: () => void;\n originNode: React.ReactNode;\n },\n ) => React.ReactNode;\n}\n\nconst UserGroupSelection = ({\n className,\n userGroupList,\n multiple,\n onChange,\n selectedUsersGroup: selectedUsersGroups,\n loading,\n width,\n lockedIds,\n filterItem,\n renderItem,\n}: IProps) => {\n const { locale } = useContext(LocaleContext);\n const t = getTranslator(locale);\n\n const { getNextLevelGroup } = useContext(GetUserListContext);\n\n const isAsync = !!getNextLevelGroup;\n\n const [searchKey, setSearchKey] = useState('');\n const [groupPath, setGroupPath] = useState<IUserGroup[]>([]);\n\n const [filterUserList, setFilterUserList] = useState<IUserGroup[]>([]);\n\n const getFilterUserList = useCallback(async () => {\n if (isAsync) {\n const nextLevelGroup = await getNextLevelGroup({\n parentGroupId: _.last(groupPath)?.groupId,\n keyword: searchKey,\n });\n return nextLevelGroup;\n }\n\n const normalizedKeyword = searchKey.trim().toLowerCase();\n\n const currentLevelGroups = userGroupList.filter((userGroup) => {\n if (groupPath.length === 0) {\n return !userGroup.parentId;\n }\n\n return userGroup.parentId === _.last(groupPath)?.groupId;\n });\n\n return currentLevelGroups.filter((group) => {\n if (!normalizedKeyword) {\n return true;\n }\n\n return group.name.toLowerCase().includes(normalizedKeyword);\n });\n }, [isAsync, searchKey, userGroupList, getNextLevelGroup, groupPath]);\n\n useEffect(() => {\n getFilterUserList().then((userGroups) => {\n setFilterUserList(\n userGroups.filter((userGroup) => {\n if (filterItem) {\n return filterItem(userGroup);\n }\n return true;\n }),\n );\n });\n }, [filterItem, getFilterUserList]);\n\n return (\n <div className={cn(className, 'ald-member-picker-member-list-wrap')}>\n <Input\n prefix={<SearchLine size={16} />}\n className={'ald-member-picker-search-input'}\n autoFocus={true}\n value={searchKey}\n onChange={(e) => {\n setSearchKey(e.target.value);\n }}\n ></Input>\n {userGroupList.length === 0 && !loading && (\n <Empty\n title={t.MemberPicker.noData}\n size=\"small\"\n image={Empty.PRESENTED_IMAGE_SEARCH}\n className=\"ald-member-picker-member-list-empty\"\n />\n )}\n {groupPath.length !== 0 && (\n <ScrollArea className=\"ald-member-picker-breadcrumb-scroll\">\n <Breadcrumb className=\"ald-member-picker-breadcrumb\">\n <Breadcrumb.Item\n className=\"ald-member-picker-breadcrumb-item\"\n onClick={() => {\n setGroupPath([]);\n }}\n >\n <div className=\"ald-member-picker-breadcrumb-item-inner\">\n <ChevronLeftLine size={16} />\n {t.MemberPicker.userGroups}\n </div>\n </Breadcrumb.Item>\n {groupPath.map((group) => (\n <Breadcrumb.Item\n className=\"ald-member-picker-breadcrumb-item\"\n key={group.groupId}\n onClick={() => {\n setGroupPath((groups) => {\n const groupIndex = groups.findIndex(\n (tempGroup) => tempGroup.groupId === group.groupId,\n );\n return groups.filter(\n (tempGroup, index) => index <= groupIndex,\n );\n });\n }}\n >\n <div className=\"ald-member-picker-breadcrumb-item-inner\">\n {group.name}\n </div>\n </Breadcrumb.Item>\n ))}\n </Breadcrumb>\n </ScrollArea>\n )}\n <Spin\n tip=\"Loading\"\n spinning={loading}\n size=\"small\"\n className=\"ald-member-picker-user-list\"\n >\n <ScrollArea\n className={cn('ald-member-picker-member-list', {\n 'ald-member-picker-member-list-null':\n userGroupList.length === 0 && !loading,\n })}\n innerClassName=\"ald-member-picker-member-scroll\"\n >\n <div\n className=\"ald-member-picker-member-list-inner\"\n style={{ width: multiple ? width : undefined, overflow: 'hidden' }}\n >\n {filterUserList.map((userGroup) => {\n const isSelected = selectedUsersGroups.some(\n (selectUserGroup) =>\n selectUserGroup.groupId === userGroup.groupId,\n );\n\n const index = _.findIndex(lockedIds, {\n groupId: userGroup.groupId,\n type: userGroup.type,\n });\n const disabled = index !== -1;\n\n const hasNextLevel =\n userGroupList.some(\n (group) => group.parentId === userGroup.groupId,\n ) || isAsync;\n const onNextLevel = () => {\n setGroupPath((prev) => [...prev, userGroup]);\n setSearchKey('');\n };\n\n const originNode = multiple ? (\n <MultipleOption\n key={userGroup.groupId}\n user={userGroup}\n disabled={disabled}\n selected={isSelected}\n onChange={(selected, userGroup) => {\n if (isUserGroup(userGroup)) {\n onChange(selected, userGroup);\n }\n }}\n hasNextLevel={hasNextLevel}\n onNextLevel={onNextLevel}\n ></MultipleOption>\n ) : (\n <SingleOption\n key={userGroup.groupId}\n user={userGroup}\n disabled={disabled}\n selected={isSelected}\n onChange={(selected, userGroup) => {\n if (isUserGroup(userGroup)) {\n onChange(selected, userGroup);\n }\n }}\n hasNextLevel={hasNextLevel}\n onNextLevel={onNextLevel}\n ></SingleOption>\n );\n\n if (renderItem) {\n return (\n <div key={userGroup.groupId}>\n {renderItem(userGroup, {\n isSelected,\n disabled,\n onClick: () => {\n if (isUserGroup(userGroup) && !disabled) {\n onChange(!isSelected, userGroup);\n }\n },\n onNextLevel: hasNextLevel ? onNextLevel : undefined,\n originNode,\n })}\n </div>\n );\n }\n\n return originNode;\n })}\n </div>\n </ScrollArea>\n </Spin>\n </div>\n );\n};\n\nexport default UserGroupSelection;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UserGroupSelection.js","names":[],"sources":["../../../src/MemberPicker/components/UserGroupSelection.tsx"],"sourcesContent":["import Breadcrumb from '../../Breadcrumb';\nimport { cn } from '../../lib/utils';\nimport _ from 'lodash';\nimport React, { useContext, useEffect, useMemo, useState } from 'react';\nimport GetUserListContext, {\n IUserGroup,\n TUserGroupValue,\n TUserValue,\n} from '../../ConfigProvider/getUserList';\nimport Empty from '../../Empty';\nimport { ChevronLeftLine } from '../../Icon';\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 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 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 {userGroupList.length === 0 && !loading && (\n <Empty\n title={t.MemberPicker.noData}\n size=\"small\"\n image={Empty.PRESENTED_IMAGE_SEARCH}\n className=\"ald-member-picker-member-list-empty\"\n />\n )}\n {groupPath.length !== 0 && (\n <ScrollArea className=\"ald-member-picker-breadcrumb-scroll\">\n <Breadcrumb className=\"ald-member-picker-breadcrumb\">\n <Breadcrumb.Item\n className=\"ald-member-picker-breadcrumb-item\"\n onClick={() => {\n setGroupPath([]);\n }}\n >\n <div className=\"ald-member-picker-breadcrumb-item-inner\">\n <ChevronLeftLine size={16} />\n {t.MemberPicker.userGroups}\n </div>\n </Breadcrumb.Item>\n {groupPath.map((group) => (\n <Breadcrumb.Item\n className=\"ald-member-picker-breadcrumb-item\"\n key={group.groupId}\n onClick={() => {\n setGroupPath((groups) => {\n const groupIndex = groups.findIndex(\n (tempGroup) => tempGroup.groupId === group.groupId,\n );\n return groups.filter(\n (tempGroup, index) => index <= groupIndex,\n );\n });\n }}\n >\n <div className=\"ald-member-picker-breadcrumb-item-inner\">\n {group.name}\n </div>\n </Breadcrumb.Item>\n ))}\n </Breadcrumb>\n </ScrollArea>\n )}\n <Spin\n tip=\"Loading\"\n spinning={loading}\n size=\"small\"\n className=\"ald-member-picker-user-list\"\n >\n <ScrollArea\n className={cn('ald-member-picker-member-list', {\n 'ald-member-picker-member-list-null':\n userGroupList.length === 0 && !loading,\n })}\n innerClassName=\"ald-member-picker-member-scroll\"\n >\n <div\n role=\"listbox\"\n aria-label=\"Groups\"\n aria-multiselectable={multiple || undefined}\n className=\"ald-member-picker-member-list-inner\"\n style={{ width: multiple ? width : undefined, overflow: 'hidden' }}\n >\n {filterUserList.map((userGroup) => {\n const isSelected = selectedUsersGroups.some(\n (selectUserGroup) =>\n selectUserGroup.groupId === userGroup.groupId,\n );\n\n const index = _.findIndex(lockedIds, {\n groupId: userGroup.groupId,\n type: userGroup.type,\n });\n const disabled = index !== -1;\n\n const hasNextLevel =\n userGroupList.some(\n (group) => group.parentId === userGroup.groupId,\n ) || isAsync;\n const onNextLevel = () => {\n setGroupPath((prev) => [...prev, userGroup]);\n onSearchValueChange?.('');\n };\n\n const originNode = multiple ? (\n <MultipleOption\n key={userGroup.groupId}\n user={userGroup}\n disabled={disabled}\n selected={isSelected}\n onChange={(selected, userGroup) => {\n if (isUserGroup(userGroup)) {\n onChange(selected, userGroup);\n }\n }}\n hasNextLevel={hasNextLevel}\n onNextLevel={onNextLevel}\n ></MultipleOption>\n ) : (\n <SingleOption\n key={userGroup.groupId}\n user={userGroup}\n disabled={disabled}\n selected={isSelected}\n onChange={(selected, userGroup) => {\n if (isUserGroup(userGroup)) {\n onChange(selected, userGroup);\n }\n }}\n hasNextLevel={hasNextLevel}\n onNextLevel={onNextLevel}\n ></SingleOption>\n );\n\n if (renderItem) {\n return (\n <div\n key={userGroup.groupId}\n role=\"option\"\n id={`ald-member-picker-option-${userGroup.groupId}`}\n aria-selected={isSelected}\n aria-disabled={disabled || undefined}\n >\n {renderItem(userGroup, {\n isSelected,\n disabled,\n onClick: () => {\n if (isUserGroup(userGroup) && !disabled) {\n onChange(!isSelected, userGroup);\n }\n },\n onNextLevel: hasNextLevel ? onNextLevel : undefined,\n originNode,\n })}\n </div>\n );\n }\n\n return originNode;\n })}\n </div>\n </ScrollArea>\n </Spin>\n </div>\n );\n};\n\nexport default UserGroupSelection;\n"],"mappings":"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"}
|
|
@@ -7,10 +7,11 @@ import Select_default from "../Select/index.js";
|
|
|
7
7
|
/* empty css */
|
|
8
8
|
import message from "../message/index.js";
|
|
9
9
|
import { EMemberPicker } from "./interface.js";
|
|
10
|
+
import { getId } from "./utils/index.js";
|
|
10
11
|
import { isUser, isUserGroup } from "./utils/getUsersWithUserId.js";
|
|
11
12
|
import Panel from "./components/Panel.js";
|
|
12
13
|
import PanelWrapper from "./components/PanelWrapper.js";
|
|
13
|
-
import { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
14
|
+
import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react";
|
|
14
15
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
15
16
|
import _ from "lodash";
|
|
16
17
|
import { usePrevious, useRequest } from "ahooks";
|
|
@@ -27,6 +28,7 @@ var Component = (props) => {
|
|
|
27
28
|
const [searchUserList, setSearchUserList] = useState([]);
|
|
28
29
|
const [searchString, setSearchString] = useState("");
|
|
29
30
|
const [dropdownContentWidth, setDropdownContentWidth] = useState(dropdownWidth);
|
|
31
|
+
const selectOwnerRef = useRef(null);
|
|
30
32
|
const panelWidth = dropdownWidth ?? (multiple ? DEFAULT_MULTIPLE_DROPDOWN_WIDTH : true);
|
|
31
33
|
const triggerRef = useRef(null);
|
|
32
34
|
const onSearchValueChange = useCallback((v) => {
|
|
@@ -150,9 +152,6 @@ var Component = (props) => {
|
|
|
150
152
|
setDropdownOpen(open);
|
|
151
153
|
onOpenChange?.(open);
|
|
152
154
|
}, [onOpenChange]);
|
|
153
|
-
const panelKey = useMemo(() => {
|
|
154
|
-
if (dropdownOpen) return _.sampleSize("abcdefghijklmnopqrstuvwxyz0123456789", 8).join("");
|
|
155
|
-
}, [dropdownOpen]);
|
|
156
155
|
const mode = useMemo(() => {
|
|
157
156
|
if (multiple === true) {
|
|
158
157
|
if (typeof propsMode === "object") return {
|
|
@@ -168,115 +167,142 @@ var Component = (props) => {
|
|
|
168
167
|
return multiple ? multiple : propsMode;
|
|
169
168
|
}, [multiple, propsMode]);
|
|
170
169
|
const selectOpen = typeof open === "boolean" ? open : dropdownOpen;
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
"
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
170
|
+
const listboxId = `ald-member-picker-listbox-${React.useId().replace(/:/g, "")}`;
|
|
171
|
+
const activeMember = totalUserList[0];
|
|
172
|
+
const activeMemberId = activeMember ? `ald-member-picker-option-${getId(activeMember)}` : void 0;
|
|
173
|
+
useEffect(() => {
|
|
174
|
+
const owner = selectOwnerRef.current?.querySelector("[role=\"combobox\"], input");
|
|
175
|
+
if (!owner) return;
|
|
176
|
+
owner.setAttribute("aria-controls", listboxId);
|
|
177
|
+
if (selectOpen && activeMemberId) owner.setAttribute("aria-activedescendant", activeMemberId);
|
|
178
|
+
else owner.removeAttribute("aria-activedescendant");
|
|
179
|
+
}, [
|
|
180
|
+
activeMemberId,
|
|
181
|
+
listboxId,
|
|
182
|
+
selectOpen
|
|
183
|
+
]);
|
|
184
|
+
return /* @__PURE__ */ jsx("div", {
|
|
185
|
+
ref: selectOwnerRef,
|
|
186
|
+
style: { display: "contents" },
|
|
187
|
+
children: /* @__PURE__ */ jsx(Select_default, {
|
|
188
|
+
prefix: propPrefix,
|
|
189
|
+
...restProps,
|
|
190
|
+
"data-testid": dataTestId,
|
|
191
|
+
"aria-label": ariaLabel,
|
|
192
|
+
showSearch: true,
|
|
193
|
+
searchValue: searchString,
|
|
194
|
+
onSearch: onSearchValueChange,
|
|
195
|
+
"aria-controls": listboxId,
|
|
196
|
+
"aria-activedescendant": selectOpen ? activeMemberId : void 0,
|
|
197
|
+
size,
|
|
198
|
+
className: cn("ald-member-picker-select", className),
|
|
199
|
+
value: selectedUserList.map((item) => {
|
|
200
|
+
if (item.type === EUserType.USER_GROUP) return item.groupId;
|
|
201
|
+
else return item.userId;
|
|
202
|
+
}),
|
|
203
|
+
onChange: (value) => {
|
|
204
|
+
if (_.isEmpty(value)) {
|
|
205
|
+
setSelectedUserList([]);
|
|
206
|
+
if (multiple) onChange?.([]);
|
|
207
|
+
else onChange?.();
|
|
198
208
|
} else {
|
|
199
|
-
const
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
209
|
+
const valueList = Array.isArray(value) ? value : [value];
|
|
210
|
+
if (multiple) {
|
|
211
|
+
const users = valueList.map((item) => {
|
|
212
|
+
return totalUserList.find((user) => {
|
|
213
|
+
if (user.type === EUserType.USER) return user.userId === item;
|
|
214
|
+
return user.groupId === item;
|
|
215
|
+
});
|
|
216
|
+
}).filter(Boolean);
|
|
217
|
+
setSelectedUserList(users);
|
|
218
|
+
onChange?.(users);
|
|
206
219
|
} else {
|
|
207
|
-
|
|
208
|
-
|
|
220
|
+
const user = totalUserList.find((user) => {
|
|
221
|
+
if (user.type === EUserType.USER) return user.userId === value;
|
|
222
|
+
return user.groupId === value;
|
|
223
|
+
});
|
|
224
|
+
if (user) {
|
|
225
|
+
setSelectedUserList([user]);
|
|
226
|
+
onChange?.(user);
|
|
227
|
+
} else {
|
|
228
|
+
setSelectedUserList([]);
|
|
229
|
+
onChange?.();
|
|
230
|
+
}
|
|
209
231
|
}
|
|
210
232
|
}
|
|
233
|
+
},
|
|
234
|
+
disabled,
|
|
235
|
+
allowClear,
|
|
236
|
+
onClear: () => {
|
|
237
|
+
setSelectedUserList([]);
|
|
238
|
+
if (multiple) onChange?.([]);
|
|
239
|
+
else onChange?.();
|
|
240
|
+
onClear?.();
|
|
241
|
+
},
|
|
242
|
+
popupClassName: cn("ald-member-picker-popup", allowOverlap && "ald-member-picker-popup-adaptive", props.popupClassName),
|
|
243
|
+
mode,
|
|
244
|
+
options: selectedUserList.map((item) => {
|
|
245
|
+
if (item.type === EUserType.USER_GROUP) return {
|
|
246
|
+
label: item.name || item.groupId,
|
|
247
|
+
value: item.groupId,
|
|
248
|
+
tag: /* @__PURE__ */ jsxs("div", {
|
|
249
|
+
className: "ald-member-picker-tag",
|
|
250
|
+
children: [/* @__PURE__ */ jsx(Avatar, {
|
|
251
|
+
type: "team",
|
|
252
|
+
size: 20,
|
|
253
|
+
children: item.name || item.groupId
|
|
254
|
+
}), item.name || item.groupId]
|
|
255
|
+
})
|
|
256
|
+
};
|
|
257
|
+
return {
|
|
258
|
+
label: item.nickname || item.name || item.userId,
|
|
259
|
+
value: item.userId,
|
|
260
|
+
tag: /* @__PURE__ */ jsxs("div", {
|
|
261
|
+
className: "ald-member-picker-tag",
|
|
262
|
+
children: [/* @__PURE__ */ jsx(Avatar, {
|
|
263
|
+
size: 20,
|
|
264
|
+
src: item.photo,
|
|
265
|
+
type: item.type === EUserType.USER ? "user" : "team",
|
|
266
|
+
children: item.nickname || item.name || item.userId
|
|
267
|
+
}), item.nickname || item.name || item.userId]
|
|
268
|
+
})
|
|
269
|
+
};
|
|
270
|
+
}),
|
|
271
|
+
optionLabelProp: multiple ? "label" : "tag",
|
|
272
|
+
open: selectOpen,
|
|
273
|
+
onOpenChange: onDropdownOpenChange,
|
|
274
|
+
popupMatchSelectWidth: panelWidth,
|
|
275
|
+
allowOverlap,
|
|
276
|
+
placeholder,
|
|
277
|
+
dropdownRender: () => {
|
|
278
|
+
return /* @__PURE__ */ jsx("div", {
|
|
279
|
+
ref: triggerRef,
|
|
280
|
+
id: listboxId,
|
|
281
|
+
role: "group",
|
|
282
|
+
"aria-label": "Member selection results",
|
|
283
|
+
className: cn({ "ald-member-picker-popup-body": allowOverlap }),
|
|
284
|
+
children: /* @__PURE__ */ jsx(Panel, {
|
|
285
|
+
type,
|
|
286
|
+
footer,
|
|
287
|
+
value: selectedUserList,
|
|
288
|
+
dataList: totalUserList,
|
|
289
|
+
lockedIds,
|
|
290
|
+
multiple: !!multiple,
|
|
291
|
+
loading,
|
|
292
|
+
dropdownWidth: dropdownContentWidth,
|
|
293
|
+
onSearchValueChange,
|
|
294
|
+
onChange: onSelectedChange,
|
|
295
|
+
onCancel: () => {
|
|
296
|
+
onCancel?.();
|
|
297
|
+
setDropdownOpen(false);
|
|
298
|
+
},
|
|
299
|
+
renderItem,
|
|
300
|
+
renderSelectedTag,
|
|
301
|
+
searchValue: searchString
|
|
302
|
+
})
|
|
303
|
+
});
|
|
211
304
|
}
|
|
212
|
-
}
|
|
213
|
-
disabled,
|
|
214
|
-
allowClear,
|
|
215
|
-
onClear: () => {
|
|
216
|
-
setSelectedUserList([]);
|
|
217
|
-
if (multiple) onChange?.([]);
|
|
218
|
-
else onChange?.();
|
|
219
|
-
onClear?.();
|
|
220
|
-
},
|
|
221
|
-
popupClassName: cn("ald-member-picker-popup", allowOverlap && "ald-member-picker-popup-adaptive", props.popupClassName),
|
|
222
|
-
mode,
|
|
223
|
-
options: selectedUserList.map((item) => {
|
|
224
|
-
if (item.type === EUserType.USER_GROUP) return {
|
|
225
|
-
label: item.name || item.groupId,
|
|
226
|
-
value: item.groupId,
|
|
227
|
-
tag: /* @__PURE__ */ jsxs("div", {
|
|
228
|
-
className: "ald-member-picker-tag",
|
|
229
|
-
children: [/* @__PURE__ */ jsx(Avatar, {
|
|
230
|
-
type: "team",
|
|
231
|
-
size: 20,
|
|
232
|
-
children: item.name || item.groupId
|
|
233
|
-
}), item.name || item.groupId]
|
|
234
|
-
})
|
|
235
|
-
};
|
|
236
|
-
return {
|
|
237
|
-
label: item.nickname || item.name || item.userId,
|
|
238
|
-
value: item.userId,
|
|
239
|
-
tag: /* @__PURE__ */ jsxs("div", {
|
|
240
|
-
className: "ald-member-picker-tag",
|
|
241
|
-
children: [/* @__PURE__ */ jsx(Avatar, {
|
|
242
|
-
size: 20,
|
|
243
|
-
src: item.photo,
|
|
244
|
-
type: item.type === EUserType.USER ? "user" : "team",
|
|
245
|
-
children: item.nickname || item.name || item.userId
|
|
246
|
-
}), item.nickname || item.name || item.userId]
|
|
247
|
-
})
|
|
248
|
-
};
|
|
249
|
-
}),
|
|
250
|
-
optionLabelProp: multiple ? "label" : "tag",
|
|
251
|
-
open: selectOpen,
|
|
252
|
-
onOpenChange: onDropdownOpenChange,
|
|
253
|
-
popupMatchSelectWidth: panelWidth,
|
|
254
|
-
allowOverlap,
|
|
255
|
-
placeholder,
|
|
256
|
-
dropdownRender: () => {
|
|
257
|
-
return /* @__PURE__ */ jsx("div", {
|
|
258
|
-
ref: triggerRef,
|
|
259
|
-
className: cn({ "ald-member-picker-popup-body": allowOverlap }),
|
|
260
|
-
children: /* @__PURE__ */ jsx(Panel, {
|
|
261
|
-
type,
|
|
262
|
-
footer,
|
|
263
|
-
value: selectedUserList,
|
|
264
|
-
dataList: totalUserList,
|
|
265
|
-
lockedIds,
|
|
266
|
-
multiple: !!multiple,
|
|
267
|
-
loading,
|
|
268
|
-
dropdownWidth: dropdownContentWidth,
|
|
269
|
-
onSearchValueChange,
|
|
270
|
-
onChange: onSelectedChange,
|
|
271
|
-
onCancel: () => {
|
|
272
|
-
onCancel?.();
|
|
273
|
-
setDropdownOpen(false);
|
|
274
|
-
},
|
|
275
|
-
renderItem,
|
|
276
|
-
renderSelectedTag
|
|
277
|
-
}, panelKey)
|
|
278
|
-
});
|
|
279
|
-
}
|
|
305
|
+
})
|
|
280
306
|
});
|
|
281
307
|
};
|
|
282
308
|
var MemberSelector = Component;
|