@blueking/bk-user-selector 0.1.8 → 0.1.9
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/README.md +31 -30
- package/package.json +1 -1
- package/typings/components/selection-popover.vue.d.ts +6 -0
- package/typings/components/user-selector.vue.d.ts +1 -0
- package/typings/hooks/use-input-handler.d.ts +2 -0
- package/typings/hooks/use-user-selection.d.ts +8 -0
- package/typings/types/index.d.ts +4 -0
- package/vue2/index.es.min.js +95 -17
- package/vue2/index.iife.min.js +96 -18
- package/vue2/index.umd.min.js +96 -18
- package/vue2/vue2.css +7 -0
- package/vue3/index.es.min.js +95 -17
- package/vue3/index.iife.min.js +96 -18
- package/vue3/index.umd.min.js +96 -18
- package/vue3/vue3.css +7 -0
package/README.md
CHANGED
|
@@ -319,35 +319,36 @@ export default {
|
|
|
319
319
|
|
|
320
320
|
### Props 属性
|
|
321
321
|
|
|
322
|
-
| 参数 | 说明
|
|
323
|
-
| --------------------- |
|
|
324
|
-
| modelValue / v-model | 绑定值,单选为字符串,多选为数组
|
|
325
|
-
| apiBaseUrl | API 基础 URL
|
|
326
|
-
| tenantId | 租户 ID
|
|
327
|
-
| hasAvatar | 是否显示头像
|
|
328
|
-
| avatarBaseUrl | 头像基础 URL
|
|
329
|
-
| label | 文本标签
|
|
330
|
-
| placeholder | 占位文本
|
|
331
|
-
| multiple | 是否多选
|
|
332
|
-
| draggable | 是否可拖拽排序(仅多选模式有效)
|
|
333
|
-
| exactSearchKey | 精确查找 key
|
|
334
|
-
| currentUserId | 当前用户 ID(用于快速选择"我")
|
|
335
|
-
| userGroup | 用户组列表
|
|
336
|
-
| userGroupName | 用户组分类名称
|
|
337
|
-
| emptyText | 无匹配人员时的提示文本
|
|
338
|
-
| disabled | 是否禁用
|
|
339
|
-
|
|
|
340
|
-
|
|
|
341
|
-
|
|
|
342
|
-
|
|
|
343
|
-
|
|
|
344
|
-
|
|
|
345
|
-
|
|
|
346
|
-
|
|
|
347
|
-
|
|
|
348
|
-
|
|
|
349
|
-
|
|
|
350
|
-
|
|
|
322
|
+
| 参数 | 说明 | 类型 | 默认值 | 必填 |
|
|
323
|
+
| --------------------- | ------------------------------------------------------------------ | ------------------------------------------------ | ---------------------- | ---- |
|
|
324
|
+
| modelValue / v-model | 绑定值,单选为字符串,多选为数组 | `string` / `string[]` | `''` / `[]` | 是 |
|
|
325
|
+
| apiBaseUrl | API 基础 URL | `string` | `''` | 是 |
|
|
326
|
+
| tenantId | 租户 ID | `string` | `'default'` | 否 |
|
|
327
|
+
| hasAvatar | 是否显示头像 | `boolean` | `false` | 否 |
|
|
328
|
+
| avatarBaseUrl | 头像基础 URL | `string` | `` | 否 |
|
|
329
|
+
| label | 文本标签 | `string` | `'人员选择'` | 否 |
|
|
330
|
+
| placeholder | 占位文本 | `string` | `'请输入人员名称搜索'` | 否 |
|
|
331
|
+
| multiple | 是否多选 | `boolean` | `false` | 否 |
|
|
332
|
+
| draggable | 是否可拖拽排序(仅多选模式有效) | `boolean` | `false` | 否 |
|
|
333
|
+
| exactSearchKey | 精确查找 key | `'bk_username'` / `'login_name'` / `'full_name'` | `'bk_username'` | 否 |
|
|
334
|
+
| currentUserId | 当前用户 ID(用于快速选择"我") | `string` | `''` | 否 |
|
|
335
|
+
| userGroup | 用户组列表 | `UserGroupItem[]` | `[]` | 否 |
|
|
336
|
+
| userGroupName | 用户组分类名称 | `string` | `'用户群组'` | 否 |
|
|
337
|
+
| emptyText | 无匹配人员时的提示文本 | `string` | `'无匹配人员'` | 否 |
|
|
338
|
+
| disabled | 是否禁用 | `boolean` | `false` | 否 |
|
|
339
|
+
| disabledUserIds | 禁用的用户 ID 或 `exactSearchKey` 字段值列表,用户仍展示但不可选择 | `string[]` | `[]` | 否 |
|
|
340
|
+
| renderTag | 自定义标签渲染函数 | `(h, userInfo) => VNode` | - | 否 |
|
|
341
|
+
| renderListItem | 自定义列表项渲染函数 | `(h, userInfo) => VNode` | - | 否 |
|
|
342
|
+
| excludeUserIds | 排除的用户 ID 列表 | `string[]` | `[]` | 否 |
|
|
343
|
+
| recentUserIds | 最近选择用户 ID 列表,传入后在下拉右侧展示最近选择 | `string[]` | `[]` | 否 |
|
|
344
|
+
| enableMultiTenantMode | 是否启用多租户模式 | `boolean` | `true` | 否 |
|
|
345
|
+
| allowCreate | 是否允许自定义输入,按 Enter 确认 | `boolean` | `false` | 否 |
|
|
346
|
+
| freePaste | 是否允许粘贴任意文本 | `boolean` | `false` | 否 |
|
|
347
|
+
| maxCount | 最大可选数量(0 表示不限制) | `number` | `0` | 否 |
|
|
348
|
+
| type | 输入框类型 | `'input'` / `'textarea'` | `'input'` | 否 |
|
|
349
|
+
| rows | 默认行数(仅 textarea 模式生效) | `number` | `4` | 否 |
|
|
350
|
+
| resize | 是否允许拖拽调整高度(仅 textarea 模式生效) | `boolean` | `true` | 否 |
|
|
351
|
+
| autoFocus | 是否自动聚焦 | `boolean` | `false` | 否 |
|
|
351
352
|
|
|
352
353
|
#### exactSearchKey 说明
|
|
353
354
|
|
|
@@ -560,7 +561,7 @@ import '@blueking/bk-user-selector/vue2/vue2.css';
|
|
|
560
561
|
|
|
561
562
|
### Q: 如何禁止选择某些用户?
|
|
562
563
|
|
|
563
|
-
A:
|
|
564
|
+
A: 如果希望用户不出现在搜索结果中,使用 `excludeUserIds`;如果希望用户仍展示但不可选择,使用 `disabledUserIds`。
|
|
564
565
|
|
|
565
566
|
### Q: 如何获取完整的用户信息?
|
|
566
567
|
|
package/package.json
CHANGED
|
@@ -7,6 +7,10 @@ interface SelectionPopoverProps {
|
|
|
7
7
|
avatarBaseUrl?: string;
|
|
8
8
|
/** 容器宽度 */
|
|
9
9
|
containerWidth?: number | string;
|
|
10
|
+
/** 用于匹配禁用用户的字段 */
|
|
11
|
+
disabledUserFields?: string[];
|
|
12
|
+
/** 禁用的用户 ID 列表 */
|
|
13
|
+
disabledUserIds?: string[];
|
|
10
14
|
/** 无匹配人员时的提示文本 */
|
|
11
15
|
emptyText?: string;
|
|
12
16
|
/** 扁平化选项列表(用于键盘导航高亮) */
|
|
@@ -52,6 +56,8 @@ declare const __VLS_base: import("vue").DefineComponent<SelectionPopoverProps, {
|
|
|
52
56
|
userGroup: UserGroupConfig[];
|
|
53
57
|
tenantId: string;
|
|
54
58
|
searchQuery: string;
|
|
59
|
+
disabledUserFields: string[];
|
|
60
|
+
disabledUserIds: string[];
|
|
55
61
|
tenants: TenantMap;
|
|
56
62
|
hasAvatar: boolean;
|
|
57
63
|
avatarBaseUrl: string;
|
|
@@ -21,6 +21,8 @@ export interface UseInputHandlerOptions {
|
|
|
21
21
|
selectedUsers: Ref<FormattedUser[]>;
|
|
22
22
|
/** 租户 ID */
|
|
23
23
|
tenantId: string;
|
|
24
|
+
/** 判断用户是否禁用 */
|
|
25
|
+
isUserDisabled?: (user: FormattedUser | string) => boolean;
|
|
24
26
|
/** 添加用户回调 */
|
|
25
27
|
onAddUser: (user: FormattedUser) => void;
|
|
26
28
|
/** 批量添加用户回调(用于粘贴) */
|
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
import { type ComputedRef, type Ref } from 'vue';
|
|
6
6
|
import type { FormattedUser, UserGroupConfig } from '../types';
|
|
7
7
|
export interface UseUserSelectionOptions {
|
|
8
|
+
/** 用于匹配禁用用户的字段 */
|
|
9
|
+
disabledUserFields?: Ref<string[]>;
|
|
10
|
+
/** 禁用的用户ID列表 */
|
|
11
|
+
disabledUserIds?: Ref<string[]>;
|
|
8
12
|
/** 排除的用户ID列表 */
|
|
9
13
|
excludeUserIds?: Ref<string[]>;
|
|
10
14
|
/** 搜索关键词 */
|
|
@@ -19,8 +23,12 @@ export interface UseUserSelectionReturn {
|
|
|
19
23
|
filteredUserGroup: ComputedRef<UserGroupConfig[]>;
|
|
20
24
|
/** 创建自定义用户 */
|
|
21
25
|
createCustomUser: (loginName: string) => FormattedUser;
|
|
26
|
+
/** 过滤可导航选项(在展示过滤基础上排除禁用用户) */
|
|
27
|
+
filterNavigableOptions: (options: FormattedUser[]) => FormattedUser[];
|
|
22
28
|
/** 过滤选项(排除已选和排除列表) */
|
|
23
29
|
filterOptions: (options: FormattedUser[]) => FormattedUser[];
|
|
30
|
+
/** 检查用户是否禁用 */
|
|
31
|
+
isUserDisabled: (user: FormattedUser | string) => boolean;
|
|
24
32
|
/** 检查用户是否已选中 */
|
|
25
33
|
isUserSelected: (userId: string) => boolean;
|
|
26
34
|
}
|
package/typings/types/index.d.ts
CHANGED
package/vue2/index.es.min.js
CHANGED
|
@@ -13013,7 +13013,7 @@ var use_i18n_default = () => {
|
|
|
13013
13013
|
* @returns 输入处理相关方法
|
|
13014
13014
|
*/
|
|
13015
13015
|
var useInputHandler = (options) => {
|
|
13016
|
-
const { apiBaseUrl, tenantId, searchQuery, selectedUsers, allowCreate = false, freePaste = false, enableMultiTenantMode = true, maxCount = 0, onAddUser, onBatchAddUsers } = options;
|
|
13016
|
+
const { apiBaseUrl, tenantId, searchQuery, selectedUsers, allowCreate = false, freePaste = false, enableMultiTenantMode = true, maxCount = 0, isUserDisabled = () => false, onAddUser, onBatchAddUsers } = options;
|
|
13017
13017
|
const isPasting = ref(false);
|
|
13018
13018
|
/** 单次粘贴最多处理数量(后端限制) */
|
|
13019
13019
|
const MAX_PASTE_USERS = 100;
|
|
@@ -13065,7 +13065,7 @@ var useInputHandler = (options) => {
|
|
|
13065
13065
|
const handleEnterCreate = (event) => {
|
|
13066
13066
|
if (event.key !== "Enter" || !allowCreate || !searchQuery.value.trim()) return;
|
|
13067
13067
|
const customUser = createCustomUser(searchQuery.value.trim());
|
|
13068
|
-
if (!selectedUsers.value.some((user) => user.id === customUser.id)) onAddUser(customUser);
|
|
13068
|
+
if (!selectedUsers.value.some((user) => user.id === customUser.id) && !isUserDisabled(customUser)) onAddUser(customUser);
|
|
13069
13069
|
};
|
|
13070
13070
|
/**
|
|
13071
13071
|
* 处理粘贴事件
|
|
@@ -13091,11 +13091,11 @@ var useInputHandler = (options) => {
|
|
|
13091
13091
|
});
|
|
13092
13092
|
lookupResults.push(...result);
|
|
13093
13093
|
}
|
|
13094
|
-
const formattedUsers = formatUsers(lookupResults, enableMultiTenantMode);
|
|
13094
|
+
const formattedUsers = formatUsers(lookupResults, enableMultiTenantMode).filter((user) => !isUserDisabled(user));
|
|
13095
13095
|
if (onBatchAddUsers) {
|
|
13096
13096
|
let mergedUsers = mergeUsers(selectedUsers.value, formattedUsers);
|
|
13097
13097
|
if (freePaste) {
|
|
13098
|
-
for (const loginName of usersList) if (!mergedUsers.some((item) => item.login_name === loginName || item.id === loginName)) mergedUsers.push(createCustomUser(loginName));
|
|
13098
|
+
for (const loginName of usersList) if (!mergedUsers.some((item) => item.login_name === loginName || item.id === loginName) && !isUserDisabled(loginName)) mergedUsers.push(createCustomUser(loginName));
|
|
13099
13099
|
}
|
|
13100
13100
|
if (maxCount > 0 && mergedUsers.length > maxCount) mergedUsers = mergedUsers.slice(0, maxCount);
|
|
13101
13101
|
onBatchAddUsers(mergedUsers);
|
|
@@ -13342,7 +13342,7 @@ var useUserSearch = (apiBaseUrl, tenantId, enableMultiTenantMode = true) => {
|
|
|
13342
13342
|
* @returns 用户选择相关方法
|
|
13343
13343
|
*/
|
|
13344
13344
|
var useUserSelection = (options) => {
|
|
13345
|
-
const { selectedUserIds, excludeUserIds, userGroup, searchQuery } = options;
|
|
13345
|
+
const { selectedUserIds, excludeUserIds, disabledUserFields, disabledUserIds, userGroup, searchQuery } = options;
|
|
13346
13346
|
/**
|
|
13347
13347
|
* 创建自定义用户对象
|
|
13348
13348
|
* @param loginName - 用户登录名
|
|
@@ -13362,15 +13362,38 @@ var useUserSelection = (options) => {
|
|
|
13362
13362
|
return selectedUserIds.value.includes(userId);
|
|
13363
13363
|
};
|
|
13364
13364
|
/**
|
|
13365
|
+
* 检查用户是否被禁用
|
|
13366
|
+
* @param user - 用户对象或用户ID
|
|
13367
|
+
*/
|
|
13368
|
+
const isUserDisabled = (user) => {
|
|
13369
|
+
const ids = disabledUserIds?.value ?? [];
|
|
13370
|
+
if (typeof user === "string") return ids.includes(user);
|
|
13371
|
+
const fields = disabledUserFields?.value?.length ? disabledUserFields.value : ["id"];
|
|
13372
|
+
const indexedUser = user;
|
|
13373
|
+
return fields.some((field) => {
|
|
13374
|
+
const value = field === "id" ? user.id : indexedUser[field];
|
|
13375
|
+
return value !== void 0 && value !== null && ids.includes(String(value));
|
|
13376
|
+
});
|
|
13377
|
+
};
|
|
13378
|
+
/**
|
|
13365
13379
|
* 过滤选项(排除已选和排除列表)
|
|
13366
13380
|
* @param options - 原始选项列表
|
|
13367
13381
|
*/
|
|
13368
13382
|
const filterOptions = (options) => {
|
|
13369
13383
|
return options.filter((user) => !isUserSelected(user.id)).filter((user) => !excludeUserIds?.value?.includes(user.id));
|
|
13370
13384
|
};
|
|
13385
|
+
/**
|
|
13386
|
+
* 过滤可导航选项(排除已选、排除列表和禁用列表)
|
|
13387
|
+
* @param options - 原始选项列表
|
|
13388
|
+
*/
|
|
13389
|
+
const filterNavigableOptions = (options) => {
|
|
13390
|
+
return filterOptions(options).filter((user) => !isUserDisabled(user));
|
|
13391
|
+
};
|
|
13371
13392
|
return {
|
|
13372
13393
|
createCustomUser,
|
|
13394
|
+
filterNavigableOptions,
|
|
13373
13395
|
isUserSelected,
|
|
13396
|
+
isUserDisabled,
|
|
13374
13397
|
filterOptions,
|
|
13375
13398
|
filteredUserGroup: computed(() => {
|
|
13376
13399
|
if (!userGroup?.value?.length) return [];
|
|
@@ -13551,6 +13574,16 @@ var selection_popover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
|
|
|
13551
13574
|
required: false,
|
|
13552
13575
|
default: "auto"
|
|
13553
13576
|
},
|
|
13577
|
+
disabledUserFields: {
|
|
13578
|
+
type: Array,
|
|
13579
|
+
required: false,
|
|
13580
|
+
default: () => ["id"]
|
|
13581
|
+
},
|
|
13582
|
+
disabledUserIds: {
|
|
13583
|
+
type: Array,
|
|
13584
|
+
required: false,
|
|
13585
|
+
default: () => []
|
|
13586
|
+
},
|
|
13554
13587
|
emptyText: {
|
|
13555
13588
|
type: String,
|
|
13556
13589
|
required: false,
|
|
@@ -13671,9 +13704,20 @@ var selection_popover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
|
|
|
13671
13704
|
return props.flatOptions[props.highlightedIndex] === user;
|
|
13672
13705
|
};
|
|
13673
13706
|
/**
|
|
13707
|
+
* 判断用户是否禁用
|
|
13708
|
+
*/
|
|
13709
|
+
const isUserDisabled = (user) => {
|
|
13710
|
+
const indexedUser = user;
|
|
13711
|
+
return props.disabledUserFields.some((field) => {
|
|
13712
|
+
const value = field === "id" ? user.id : indexedUser[field];
|
|
13713
|
+
return value !== void 0 && value !== null && props.disabledUserIds.includes(String(value));
|
|
13714
|
+
});
|
|
13715
|
+
};
|
|
13716
|
+
/**
|
|
13674
13717
|
* 选择用户
|
|
13675
13718
|
*/
|
|
13676
13719
|
const selectUser = (user) => {
|
|
13720
|
+
if (isUserDisabled(user)) return;
|
|
13677
13721
|
emit("select-user", user);
|
|
13678
13722
|
};
|
|
13679
13723
|
/**
|
|
@@ -13710,6 +13754,7 @@ var selection_popover_vue_vue_type_script_setup_true_lang_default = /* @__PURE__
|
|
|
13710
13754
|
hasRecentUsers,
|
|
13711
13755
|
hasDropdownOptions,
|
|
13712
13756
|
isHighlighted,
|
|
13757
|
+
isUserDisabled,
|
|
13713
13758
|
selectUser,
|
|
13714
13759
|
handleClickOutside,
|
|
13715
13760
|
get Loading() {
|
|
@@ -13742,14 +13787,14 @@ var _hoisted_3$1 = {
|
|
|
13742
13787
|
};
|
|
13743
13788
|
var _hoisted_4$1 = { class: "group-name" };
|
|
13744
13789
|
var _hoisted_5 = { class: "group-count" };
|
|
13745
|
-
var _hoisted_6 = ["onClick"];
|
|
13790
|
+
var _hoisted_6 = ["aria-disabled", "onClick"];
|
|
13746
13791
|
var _hoisted_7 = {
|
|
13747
13792
|
key: 1,
|
|
13748
13793
|
class: "dropdown-panel dropdown-panel-recent"
|
|
13749
13794
|
};
|
|
13750
13795
|
var _hoisted_8 = { class: "group-name" };
|
|
13751
13796
|
var _hoisted_9 = { class: "group-count" };
|
|
13752
|
-
var _hoisted_10 = ["onClick"];
|
|
13797
|
+
var _hoisted_10 = ["aria-disabled", "onClick"];
|
|
13753
13798
|
var _hoisted_11 = { ref: "slotContainerRef" };
|
|
13754
13799
|
function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
|
|
13755
13800
|
return openBlock(), createBlock($setup["Popover"], {
|
|
@@ -13783,7 +13828,11 @@ function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
13783
13828
|
}, [createElementVNode("span", _hoisted_4$1, toDisplayString(groupName), 1), createElementVNode("span", _hoisted_5, "(" + toDisplayString(group.length) + ")", 1)])) : createCommentVNode("v-if", true), (openBlock(true), createElementBlock(Fragment, null, renderList(group, (user) => {
|
|
13784
13829
|
return openBlock(), createElementBlock("div", {
|
|
13785
13830
|
key: user.id,
|
|
13786
|
-
|
|
13831
|
+
"aria-disabled": $setup.isUserDisabled(user),
|
|
13832
|
+
class: normalizeClass(["user-option", {
|
|
13833
|
+
"is-highlighted": $setup.isHighlighted(user),
|
|
13834
|
+
"is-disabled": $setup.isUserDisabled(user)
|
|
13835
|
+
}]),
|
|
13787
13836
|
onClick: withModifiers(($event) => $setup.selectUser(user), ["prevent"]),
|
|
13788
13837
|
onMousedown: _cache[1] || (_cache[1] = withModifiers(() => {}, ["prevent"]))
|
|
13789
13838
|
}, [createVNode($setup["UserRender"], {
|
|
@@ -13809,7 +13858,11 @@ function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
13809
13858
|
}, [createElementVNode("span", _hoisted_8, toDisplayString($props.recentUsersName), 1), createElementVNode("span", _hoisted_9, "(" + toDisplayString($props.recentUsers.length) + ")", 1)])) : createCommentVNode("v-if", true), (openBlock(true), createElementBlock(Fragment, null, renderList($props.recentUsers, (user) => {
|
|
13810
13859
|
return openBlock(), createElementBlock("div", {
|
|
13811
13860
|
key: user.id,
|
|
13812
|
-
|
|
13861
|
+
"aria-disabled": $setup.isUserDisabled(user),
|
|
13862
|
+
class: normalizeClass(["user-option", {
|
|
13863
|
+
"is-highlighted": $setup.isHighlighted(user),
|
|
13864
|
+
"is-disabled": $setup.isUserDisabled(user)
|
|
13865
|
+
}]),
|
|
13813
13866
|
onClick: withModifiers(($event) => $setup.selectUser(user), ["prevent"]),
|
|
13814
13867
|
onMousedown: _cache[3] || (_cache[3] = withModifiers(() => {}, ["prevent"]))
|
|
13815
13868
|
}, [createVNode($setup["UserRender"], {
|
|
@@ -14048,6 +14101,11 @@ var user_selector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
|
|
|
14048
14101
|
required: false,
|
|
14049
14102
|
default: false
|
|
14050
14103
|
},
|
|
14104
|
+
disabledUserIds: {
|
|
14105
|
+
type: Array,
|
|
14106
|
+
required: false,
|
|
14107
|
+
default: () => []
|
|
14108
|
+
},
|
|
14051
14109
|
emptyText: {
|
|
14052
14110
|
type: String,
|
|
14053
14111
|
required: false,
|
|
@@ -14239,6 +14297,13 @@ var user_selector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
|
|
|
14239
14297
|
const getLookupFields = (exactSearchKey) => {
|
|
14240
14298
|
return exactSearchKey.split(",").map((field) => field.trim()).filter(Boolean);
|
|
14241
14299
|
};
|
|
14300
|
+
const disabledUserFields = computed(() => [...new Set([
|
|
14301
|
+
"id",
|
|
14302
|
+
...getLookupFields(props.exactSearchKey),
|
|
14303
|
+
DEFAULT_EXACT_SEARCH_KEY,
|
|
14304
|
+
"login_name",
|
|
14305
|
+
"username"
|
|
14306
|
+
])]);
|
|
14242
14307
|
const findUserByLookupId = (users, lookupId, lookupFields) => {
|
|
14243
14308
|
return users.find((user) => {
|
|
14244
14309
|
if (user.id === lookupId) return true;
|
|
@@ -14283,7 +14348,7 @@ var user_selector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
|
|
|
14283
14348
|
/**
|
|
14284
14349
|
* "我"标签是否禁用(已选中当前用户时禁用,或已达到最大数量)
|
|
14285
14350
|
*/
|
|
14286
|
-
const isMeTagDisabled = computed(() => isMaxCountReached.value || !!props.currentUserId && selectedUsers.value.some((user) => user[props.exactSearchKey] === props.currentUserId));
|
|
14351
|
+
const isMeTagDisabled = computed(() => isMaxCountReached.value || !!props.currentUserId && props.disabledUserIds.includes(props.currentUserId) || !!props.currentUserId && selectedUsers.value.some((user) => user[props.exactSearchKey] === props.currentUserId));
|
|
14287
14352
|
/**
|
|
14288
14353
|
* UserTag 公共属性
|
|
14289
14354
|
*/
|
|
@@ -14297,8 +14362,10 @@ var user_selector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
|
|
|
14297
14362
|
/**
|
|
14298
14363
|
* 使用用户选择公共逻辑 hook
|
|
14299
14364
|
*/
|
|
14300
|
-
const { filteredUserGroup, filterOptions, createCustomUser } = useUserSelection({
|
|
14365
|
+
const { filteredUserGroup, filterOptions, filterNavigableOptions, createCustomUser, isUserDisabled } = useUserSelection({
|
|
14301
14366
|
selectedUserIds,
|
|
14367
|
+
disabledUserFields,
|
|
14368
|
+
disabledUserIds: toRef(props, "disabledUserIds"),
|
|
14302
14369
|
excludeUserIds: toRef(props, "excludeUserIds"),
|
|
14303
14370
|
userGroup: toRef(props, "userGroup"),
|
|
14304
14371
|
searchQuery
|
|
@@ -14315,6 +14382,7 @@ var user_selector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
|
|
|
14315
14382
|
freePaste: props.freePaste,
|
|
14316
14383
|
enableMultiTenantMode: props.enableMultiTenantMode,
|
|
14317
14384
|
maxCount: props.maxCount,
|
|
14385
|
+
isUserDisabled,
|
|
14318
14386
|
onAddUser: addUser,
|
|
14319
14387
|
onBatchAddUsers: props.multiple ? updateSelectedUsers : void 0
|
|
14320
14388
|
});
|
|
@@ -14323,13 +14391,14 @@ var user_selector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
|
|
|
14323
14391
|
*/
|
|
14324
14392
|
const displayOptions = computed(() => filterOptions(searchResults.value));
|
|
14325
14393
|
const mainNavigableUsers = computed(() => {
|
|
14326
|
-
const userGroupOptions = filteredUserGroup.value.map((group) => ({
|
|
14394
|
+
const userGroupOptions = filterNavigableOptions(filteredUserGroup.value.map((group) => ({
|
|
14327
14395
|
...group,
|
|
14328
14396
|
tenantId: "",
|
|
14329
14397
|
type: USER_TYPE.USER_GROUP
|
|
14330
|
-
}));
|
|
14331
|
-
const
|
|
14332
|
-
const
|
|
14398
|
+
})));
|
|
14399
|
+
const selectableOptions = filterNavigableOptions(displayOptions.value);
|
|
14400
|
+
const normalUsers = selectableOptions.filter((user) => user.data_source_type !== USER_TYPE.VIRTUAL);
|
|
14401
|
+
const virtualUsers = selectableOptions.filter((user) => user.data_source_type === USER_TYPE.VIRTUAL);
|
|
14333
14402
|
return [
|
|
14334
14403
|
...userGroupOptions,
|
|
14335
14404
|
...normalUsers,
|
|
@@ -14352,7 +14421,7 @@ var user_selector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
|
|
|
14352
14421
|
* 用户群组 → 普通用户 → 虚拟账号 → 最近选择
|
|
14353
14422
|
*/
|
|
14354
14423
|
const flatOptions = computed(() => {
|
|
14355
|
-
return [...mainNavigableUsers.value, ...filteredRecentUsers.value];
|
|
14424
|
+
return [...mainNavigableUsers.value, ...filterNavigableOptions(filteredRecentUsers.value)];
|
|
14356
14425
|
});
|
|
14357
14426
|
/**
|
|
14358
14427
|
* 输入框宽度(根据输入内容动态计算)
|
|
@@ -14554,10 +14623,11 @@ var user_selector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
|
|
|
14554
14623
|
* 添加当前用户("我")
|
|
14555
14624
|
*/
|
|
14556
14625
|
const addCurrentUser = async () => {
|
|
14557
|
-
if (!props.currentUserId || selectedUsers.value.some((user) => user[props.exactSearchKey] === props.currentUserId)) return;
|
|
14626
|
+
if (!props.currentUserId || props.disabledUserIds.includes(props.currentUserId) || selectedUsers.value.some((user) => user[props.exactSearchKey] === props.currentUserId)) return;
|
|
14558
14627
|
if (props.multiple && isMaxCountReached.value) return;
|
|
14559
14628
|
const currentUser = await fetchCurrentUser();
|
|
14560
14629
|
if (currentUser) {
|
|
14630
|
+
if (isUserDisabled(currentUser)) return;
|
|
14561
14631
|
if (!props.multiple) updateSelectedUsers([currentUser]);
|
|
14562
14632
|
else if (!selectedUsers.value.some((item) => item.id === currentUser.id)) updateSelectedUsers([...selectedUsers.value, currentUser]);
|
|
14563
14633
|
clearSearch();
|
|
@@ -14629,6 +14699,7 @@ var user_selector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
|
|
|
14629
14699
|
*/
|
|
14630
14700
|
function addUser(user) {
|
|
14631
14701
|
if (!user?.id) return;
|
|
14702
|
+
if (isUserDisabled(user)) return;
|
|
14632
14703
|
if (props.multiple && isMaxCountReached.value) {
|
|
14633
14704
|
clearSearch();
|
|
14634
14705
|
highlightedIndex.value = -1;
|
|
@@ -14800,6 +14871,7 @@ var user_selector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
|
|
|
14800
14871
|
selectedUserIds,
|
|
14801
14872
|
isUserMatchedByQuery,
|
|
14802
14873
|
getLookupFields,
|
|
14874
|
+
disabledUserFields,
|
|
14803
14875
|
findUserByLookupId,
|
|
14804
14876
|
sortUsersByLookupIds,
|
|
14805
14877
|
lookupFormattedUsersByIds,
|
|
@@ -14808,7 +14880,9 @@ var user_selector_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
|
|
|
14808
14880
|
userTagCommonProps,
|
|
14809
14881
|
filteredUserGroup,
|
|
14810
14882
|
filterOptions,
|
|
14883
|
+
filterNavigableOptions,
|
|
14811
14884
|
createCustomUser,
|
|
14885
|
+
isUserDisabled,
|
|
14812
14886
|
handlePaste,
|
|
14813
14887
|
displayOptions,
|
|
14814
14888
|
mainNavigableUsers,
|
|
@@ -14880,6 +14954,8 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
14880
14954
|
}, [createCommentVNode(" 下拉选项列表 "), createVNode($setup["SelectionPopover"], {
|
|
14881
14955
|
"avatar-base-url": $props.avatarBaseUrl,
|
|
14882
14956
|
"container-width": $setup.containerRef ? $setup.containerRef.offsetWidth : "auto",
|
|
14957
|
+
"disabled-user-fields": $setup.disabledUserFields,
|
|
14958
|
+
"disabled-user-ids": $props.disabledUserIds,
|
|
14883
14959
|
"empty-text": $setup.computedEmptyText,
|
|
14884
14960
|
"flat-options": $setup.flatOptions,
|
|
14885
14961
|
"has-avatar": $props.hasAvatar,
|
|
@@ -15033,6 +15109,8 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
|
|
|
15033
15109
|
}, 8, [
|
|
15034
15110
|
"avatar-base-url",
|
|
15035
15111
|
"container-width",
|
|
15112
|
+
"disabled-user-fields",
|
|
15113
|
+
"disabled-user-ids",
|
|
15036
15114
|
"empty-text",
|
|
15037
15115
|
"flat-options",
|
|
15038
15116
|
"has-avatar",
|