@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 CHANGED
@@ -319,35 +319,36 @@ export default {
319
319
 
320
320
  ### Props 属性
321
321
 
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
- | renderTag | 自定义标签渲染函数 | `(h, userInfo) => VNode` | - | 否 |
340
- | renderListItem | 自定义列表项渲染函数 | `(h, userInfo) => VNode` | - | 否 |
341
- | excludeUserIds | 排除的用户 ID 列表 | `string[]` | `[]` | 否 |
342
- | recentUserIds | 最近选择用户 ID 列表,传入后在下拉右侧展示最近选择 | `string[]` | `[]` | 否 |
343
- | enableMultiTenantMode | 是否启用多租户模式 | `boolean` | `true` | 否 |
344
- | allowCreate | 是否允许自定义输入,按 Enter 确认 | `boolean` | `false` | 否 |
345
- | freePaste | 是否允许粘贴任意文本 | `boolean` | `false` | 否 |
346
- | maxCount | 最大可选数量(0 表示不限制) | `number` | `0` | 否 |
347
- | type | 输入框类型 | `'input'` / `'textarea'` | `'input'` | 否 |
348
- | rows | 默认行数(仅 textarea 模式生效) | `number` | `4` | 否 |
349
- | resize | 是否允许拖拽调整高度(仅 textarea 模式生效) | `boolean` | `true` | 否 |
350
- | autoFocus | 是否自动聚焦 | `boolean` | `false` | 否 |
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: 使用 `excludeUserIds` 属性传入需要排除的用户 ID 数组。
564
+ A: 如果希望用户不出现在搜索结果中,使用 `excludeUserIds`;如果希望用户仍展示但不可选择,使用 `disabledUserIds`。
564
565
 
565
566
  ### Q: 如何获取完整的用户信息?
566
567
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blueking/bk-user-selector",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "description": "蓝鲸用户选择器",
5
5
  "license": "MIT",
6
6
  "author": "Tencent BlueKing",
@@ -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;
@@ -32,6 +32,7 @@ declare const __VLS_export: import("vue").DefineComponent<UserSelectorProps, {
32
32
  freePaste: boolean;
33
33
  maxCount: number;
34
34
  excludeUserIds: string[];
35
+ disabledUserIds: string[];
35
36
  resize: boolean;
36
37
  hasAvatar: boolean;
37
38
  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
  }
@@ -67,6 +67,10 @@ export interface BaseSelectorProps {
67
67
  * 是否禁用
68
68
  */
69
69
  disabled?: boolean;
70
+ /**
71
+ * 禁用的用户 ID 列表,用户仍展示但不可选择
72
+ */
73
+ disabledUserIds?: string[];
70
74
  /**
71
75
  * 无匹配人员时的提示文本
72
76
  */
@@ -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
- class: normalizeClass(["user-option", { "is-highlighted": $setup.isHighlighted(user) }]),
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
- class: normalizeClass(["user-option", { "is-highlighted": $setup.isHighlighted(user) }]),
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 normalUsers = displayOptions.value.filter((user) => user.data_source_type !== USER_TYPE.VIRTUAL);
14332
- const virtualUsers = displayOptions.value.filter((user) => user.data_source_type === USER_TYPE.VIRTUAL);
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",