@blueking/bk-user-selector 0.0.38 → 0.0.39-beta.2

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.
@@ -3,7 +3,7 @@
3
3
  })(this, function(exports2, vue, bkuiVue) {
4
4
  "use strict";
5
5
  var __vite_style__ = document.createElement("style");
6
- __vite_style__.textContent = ".me-tag[data-v-44fec2ba] {\n position: absolute;\n top: 50%;\n right: 8px;\n z-index: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0 8px;\n font-size: 12px;\n color: #4d4f56;\n cursor: pointer;\n background-color: #e1ecff;\n border-radius: 50%;\n transform: translateY(-50%);\n white-space: nowrap;\n}\n.me-tag[data-v-44fec2ba]:hover {\n color: #3a84ff;\n background-color: #cddffe;\n}\n.me-tag.disabled[data-v-44fec2ba] {\n color: #c4c6cc;\n cursor: not-allowed;\n background-color: #f0f1f5;\n}.dropdown-content[data-v-e11d7af7] {\n min-height: 40px;\n max-height: 300px;\n padding: 5px 0;\n overflow-y: auto;\n}\n.dropdown-content .no-data[data-v-e11d7af7] {\n padding: 10px;\n color: #979ba5;\n text-align: center;\n}\n.dropdown-content .user-group .group-header[data-v-e11d7af7] {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n color: #979ba5;\n}\n.dropdown-content .user-group .group-header .group-count[data-v-e11d7af7] {\n margin-left: 4px;\n}\n.dropdown-content .user-option[data-v-e11d7af7] {\n display: flex;\n align-items: center;\n height: 32px;\n padding: 8px 12px;\n cursor: pointer;\n}\n.dropdown-content .user-option[data-v-e11d7af7]:hover {\n background-color: #f5f7fa;\n}.bk-user-selector-popover.bk-user-selector-pop2-content {\n padding: 0;\n}.user-tag[data-v-3ff46050] {\n margin-right: 4px;\n margin-left: 0;\n}\n.user-tag.draggable[data-v-3ff46050] {\n cursor: move;\n}\n.user-tag.active[data-v-3ff46050] {\n background-color: #e1ecff;\n border-color: #3a84ff;\n}\n.user-tag.is-custom[data-v-3ff46050] {\n color: #ea3636;\n background-color: #feebea;\n border-color: rgba(234, 53, 54, 0.3019607843);\n}\n.user-tag.is-custom[data-v-3ff46050]:hover {\n background-color: #fedddc;\n}\n.user-tag .tag-content .user-name[data-v-3ff46050] {\n overflow: hidden;\n font-size: 12px;\n text-overflow: ellipsis;\n white-space: nowrap;\n}.multiple-selector[data-v-49f3716b] {\n position: relative;\n width: 100%;\n}\n.multiple-selector.is-disabled[data-v-49f3716b] {\n pointer-events: none;\n}\n.multiple-selector .tags-container[data-v-49f3716b] {\n min-height: 32px;\n padding: 1px 10px 1px 8px;\n background-color: #fff;\n border: 1px solid #c4c6cc;\n border-radius: 2px;\n transition: all 0.2s ease;\n}\n.multiple-selector .tags-container.focused[data-v-49f3716b] {\n border-color: #3a84ff;\n box-shadow: 0 0 0 2px rgba(58, 132, 255, 0.1);\n}\n.multiple-selector .tags-container.collapsed[data-v-49f3716b] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n}\n.multiple-selector .tag-list[data-v-49f3716b] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n}\n.multiple-selector .tag-wrapper[data-v-49f3716b] {\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n}\n.multiple-selector .search-input[data-v-49f3716b] {\n min-width: 10px;\n height: 28px;\n background: transparent;\n border: none;\n outline: none;\n}\n.multiple-selector .search-input[data-v-49f3716b]::placeholder {\n color: #c4c6cc;\n}\n.multiple-selector .search-input.inline[data-v-49f3716b] {\n min-width: 10px;\n}\n.multiple-selector .search-input.last[data-v-49f3716b], .multiple-selector .search-input.collapsed[data-v-49f3716b] {\n flex: 1;\n}\n.hidden-users[data-v-49f3716b] {\n padding: 6px 10px;\n}.single-selector[data-v-726a967e] {\n position: relative;\n width: 100%;\n}\n.single-selector.is-disabled[data-v-726a967e] {\n pointer-events: none;\n}\n.input-container[data-v-726a967e] {\n position: relative;\n display: flex;\n align-items: center;\n min-height: 32px;\n padding: 0 8px;\n background-color: #fff;\n border: 1px solid #c4c6cc;\n border-radius: 2px;\n}\n.input-container[data-v-726a967e]:focus-within {\n border-color: #3a84ff;\n box-shadow: 0 0 0 2px rgba(58, 132, 255, 0.1);\n}\n.search-input[data-v-726a967e] {\n flex: 1;\n height: 30px;\n background: transparent;\n border: none;\n outline: none;\n}\n.search-input[data-v-726a967e]::placeholder {\n color: #c4c6cc;\n}.bk-user-selector[data-v-879a2fa1] {\n position: relative;\n width: 100%;\n font-size: 12px;\n}\n.bk-user-selector.is-disabled[data-v-879a2fa1] {\n cursor: not-allowed;\n background-color: #dcdee5;\n}";
6
+ __vite_style__.textContent = ".me-tag[data-v-ef4a05c4] {\n position: absolute;\n top: 50%;\n right: 8px;\n z-index: 1;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n padding: 0 8px;\n font-size: 12px;\n color: #4d4f56;\n white-space: nowrap;\n cursor: pointer;\n background-color: #e1ecff;\n border-radius: 50%;\n transform: translateY(-50%);\n}\n.me-tag[data-v-ef4a05c4]:hover {\n color: #3a84ff;\n background-color: #cddffe;\n}\n.me-tag.disabled[data-v-ef4a05c4] {\n color: #c4c6cc;\n cursor: not-allowed;\n background-color: #f0f1f5;\n}.dropdown-content[data-v-78875ea6] {\n min-height: 40px;\n max-height: 300px;\n padding: 5px 0;\n overflow-y: auto;\n}\n.dropdown-content .no-data[data-v-78875ea6] {\n padding: 10px;\n color: #979ba5;\n text-align: center;\n}\n.dropdown-content .user-group .group-header[data-v-78875ea6] {\n display: flex;\n align-items: center;\n padding: 8px 12px;\n color: #979ba5;\n}\n.dropdown-content .user-group .group-header .group-count[data-v-78875ea6] {\n margin-left: 4px;\n}\n.dropdown-content .user-option[data-v-78875ea6] {\n display: flex;\n align-items: center;\n height: 32px;\n padding: 8px 12px;\n cursor: pointer;\n}\n.dropdown-content .user-option[data-v-78875ea6]:hover {\n background-color: #f5f7fa;\n}.user-tag[data-v-48ac8fc1] {\n margin-right: 4px;\n margin-left: 0;\n}\n.user-tag.draggable[data-v-48ac8fc1] {\n cursor: move;\n}\n.user-tag.active[data-v-48ac8fc1] {\n background-color: #e1ecff;\n border-color: #3a84ff;\n}\n.user-tag.is-custom[data-v-48ac8fc1] {\n color: #ea3636;\n background-color: #feebea;\n border-color: rgba(234, 53, 54, 0.3019607843);\n}\n.user-tag.is-custom[data-v-48ac8fc1]:hover {\n background-color: #fedddc;\n}\n.user-tag .tag-content .user-name[data-v-48ac8fc1] {\n overflow: hidden;\n text-overflow: ellipsis;\n font-size: 12px;\n white-space: nowrap;\n}.multiple-selector[data-v-2a532f24] {\n position: relative;\n width: 100%;\n}\n.multiple-selector.is-disabled[data-v-2a532f24] {\n pointer-events: none;\n}\n.multiple-selector .tags-container[data-v-2a532f24] {\n min-height: 32px;\n padding: 1px 10px 1px 8px;\n background-color: #fff;\n border: 1px solid #c4c6cc;\n border-radius: 2px;\n transition: all 0.2s ease;\n}\n.multiple-selector .tags-container.focused[data-v-2a532f24] {\n border-color: #3a84ff;\n box-shadow: 0 0 0 2px rgba(58, 132, 255, 0.1);\n}\n.multiple-selector .tags-container.collapsed[data-v-2a532f24] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n}\n.multiple-selector .tag-list[data-v-2a532f24] {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n}\n.multiple-selector .tag-wrapper[data-v-2a532f24] {\n display: inline-flex;\n align-items: center;\n max-width: 100%;\n}\n.multiple-selector .search-input[data-v-2a532f24] {\n min-width: 10px;\n height: 28px;\n outline: none;\n background: transparent;\n border: none;\n}\n.multiple-selector .search-input[data-v-2a532f24]::placeholder {\n color: #c4c6cc;\n}\n.multiple-selector .search-input.inline[data-v-2a532f24] {\n min-width: 10px;\n}\n.multiple-selector .search-input.last[data-v-2a532f24], .multiple-selector .search-input.collapsed[data-v-2a532f24] {\n flex: 1;\n}\n.hidden-users[data-v-2a532f24] {\n padding: 6px 10px;\n}.single-selector[data-v-cbe352a6] {\n position: relative;\n width: 100%;\n}\n.single-selector.is-disabled[data-v-cbe352a6] {\n pointer-events: none;\n}\n.input-container[data-v-cbe352a6] {\n position: relative;\n display: flex;\n align-items: center;\n min-height: 32px;\n padding: 0 8px;\n background-color: #fff;\n border: 1px solid #c4c6cc;\n border-radius: 2px;\n}\n.input-container[data-v-cbe352a6]:focus-within {\n border-color: #3a84ff;\n box-shadow: 0 0 0 2px rgba(58, 132, 255, 0.1);\n}\n.search-input[data-v-cbe352a6] {\n flex: 1;\n height: 30px;\n outline: none;\n background: transparent;\n border: none;\n}\n.search-input[data-v-cbe352a6]::placeholder {\n color: #c4c6cc;\n}.bk-user-selector[data-v-f29cda5a] {\n position: relative;\n width: 100%;\n font-size: 12px;\n}\n.bk-user-selector.is-disabled[data-v-f29cda5a] {\n cursor: not-allowed;\n background-color: #dcdee5;\n}.bk-user-selector-popover.bk-user-selector-pop2-content {\n padding: 0;\n}";
7
7
  document.head.appendChild(__vite_style__);
8
8
  const generateCallbackName = () => {
9
9
  const timestamp = Date.now();
@@ -13,15 +13,11 @@
13
13
  const jsonpRequest = (requestUrl, options = {}) => {
14
14
  return new Promise((resolve, reject) => {
15
15
  const url = vue.unref(requestUrl);
16
- const { timeout = 1e3 * 60 * 2, params, withCredentials = true } = options;
16
+ const { timeout = 1e3 * 60 * 2, params } = options;
17
17
  const callbackName = generateCallbackName();
18
18
  const script = document.createElement("script");
19
- let timeoutId;
20
- if (withCredentials) {
21
- script.crossOrigin = "use-credentials";
22
- } else {
23
- script.crossOrigin = "anonymous";
24
- }
19
+ let timeoutId = null;
20
+ script.setAttribute("type", "text/javascript");
25
21
  const cleanup = () => {
26
22
  if (timeoutId) {
27
23
  clearTimeout(timeoutId);
@@ -3267,7 +3263,7 @@
3267
3263
  }
3268
3264
  return target;
3269
3265
  };
3270
- const MeTag = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-44fec2ba"]]);
3266
+ const MeTag = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-ef4a05c4"]]);
3271
3267
  const UserRender = vue.defineComponent({
3272
3268
  name: "UserRender",
3273
3269
  props: {
@@ -3442,22 +3438,22 @@
3442
3438
  };
3443
3439
  return (_ctx, _cache) => {
3444
3440
  return vue.openBlock(), vue.createBlock(vue.unref(bkuiVue.Popover), {
3445
- "ext-cls": "bk-user-selector-popover",
3446
3441
  arrow: false,
3442
+ "ext-cls": "bk-user-selector-popover",
3447
3443
  "is-show": __props.isShow,
3448
3444
  offset: { mainAxis: 4, crossAxis: __props.crossAxisOffset },
3449
- width: __props.containerWidth,
3450
3445
  placement: "bottom-start",
3451
3446
  theme: "light",
3452
3447
  trigger: "manual",
3448
+ width: __props.containerWidth,
3453
3449
  onClickoutside: handleClickOutside
3454
3450
  }, {
3455
3451
  content: vue.withCtx(() => [
3456
3452
  vue.createVNode(vue.unref(bkuiVue.Loading), {
3457
3453
  class: "dropdown-content",
3458
3454
  loading: __props.loading,
3459
- size: "mini",
3460
- mode: "spin"
3455
+ mode: "spin",
3456
+ size: "mini"
3461
3457
  }, {
3462
3458
  default: vue.withCtx(() => [
3463
3459
  __props.options.length === 0 && __props.userGroup.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$2, [
@@ -3473,8 +3469,8 @@
3473
3469
  { key: 1 },
3474
3470
  vue.renderList(groupedUsers.value, (group, groupName) => {
3475
3471
  return vue.openBlock(), vue.createElementBlock("div", {
3476
- class: "user-group",
3477
- key: groupName
3472
+ key: groupName,
3473
+ class: "user-group"
3478
3474
  }, [
3479
3475
  Object.keys(groupedUsers.value).length > 1 || group.some((user) => user.type === "userGroup") ? (vue.openBlock(), vue.createElementBlock("div", {
3480
3476
  key: 0,
@@ -3502,8 +3498,8 @@
3502
3498
  null,
3503
3499
  vue.renderList(group, (user) => {
3504
3500
  return vue.openBlock(), vue.createElementBlock("div", {
3505
- class: "user-option",
3506
3501
  key: user.id,
3502
+ class: "user-option",
3507
3503
  onClick: vue.withModifiers(($event) => selectUser(user), ["prevent"])
3508
3504
  }, [
3509
3505
  vue.createVNode(vue.unref(UserRender), {
@@ -3536,20 +3532,20 @@
3536
3532
  };
3537
3533
  }
3538
3534
  });
3539
- const SelectionPopover = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-e11d7af7"]]);
3535
+ const SelectionPopover = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-78875ea6"]]);
3540
3536
  const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
3541
3537
  ...{
3542
3538
  name: "UserTag"
3543
3539
  },
3544
3540
  __name: "user-tag",
3545
3541
  props: {
3546
- user: {},
3547
- tenants: {},
3542
+ active: { type: Boolean },
3548
3543
  currentTenantId: {},
3549
3544
  draggable: { type: Boolean },
3550
- active: { type: Boolean },
3545
+ renderTag: { type: Function },
3551
3546
  showTenant: { type: Boolean },
3552
- renderTag: { type: Function }
3547
+ tenants: {},
3548
+ user: {}
3553
3549
  },
3554
3550
  emits: ["click", "close"],
3555
3551
  setup(__props, { emit: __emit }) {
@@ -3582,7 +3578,7 @@
3582
3578
  };
3583
3579
  }
3584
3580
  });
3585
- const UserTag = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-3ff46050"]]);
3581
+ const UserTag = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-48ac8fc1"]]);
3586
3582
  const _hoisted_1$1 = ["onClick"];
3587
3583
  const _hoisted_2$1 = ["placeholder"];
3588
3584
  const _hoisted_3 = { class: "hidden-users" };
@@ -3593,24 +3589,25 @@
3593
3589
  },
3594
3590
  __name: "multiple-selector",
3595
3591
  props: {
3596
- modelValue: { default: () => [] },
3597
3592
  draggable: { type: Boolean, default: false },
3593
+ freePaste: { type: Boolean, default: false },
3594
+ modelValue: { default: () => [] },
3598
3595
  selectedUsers: { default: () => [] },
3599
3596
  tenants: { default: () => ({}) },
3597
+ allowCreate: { type: Boolean, default: false },
3600
3598
  apiBaseUrl: { default: "" },
3601
- tenantId: { default: "" },
3602
- placeholder: { default: "" },
3603
3599
  currentUserId: { default: "" },
3600
+ disabled: { type: Boolean },
3601
+ emptyText: { default: "" },
3602
+ enableMultiTenantMode: { type: Boolean },
3604
3603
  exactSearchKey: { default: "bk_username" },
3605
- userGroup: { default: () => [] },
3604
+ excludeUserIds: { default: () => [] },
3605
+ placeholder: { default: "" },
3606
+ tenantId: { default: "" },
3606
3607
  userGroupName: { default: "" },
3607
- emptyText: { default: "" },
3608
- disabled: { type: Boolean },
3609
3608
  renderListItem: {},
3610
3609
  renderTag: {},
3611
- excludeUserIds: { default: () => [] },
3612
- enableMultiTenantMode: { type: Boolean },
3613
- allowCreate: { type: Boolean, default: false }
3610
+ userGroup: { default: () => [] }
3614
3611
  },
3615
3612
  emits: [
3616
3613
  "update:selectedUsers",
@@ -3711,7 +3708,6 @@
3711
3708
  });
3712
3709
  };
3713
3710
  const handleClickOutside = (event) => {
3714
- event.stopPropagation();
3715
3711
  const target = event.target;
3716
3712
  const container = containerRef.value;
3717
3713
  if ((container == null ? void 0 : container.contains(target)) || container === target) {
@@ -3813,7 +3809,37 @@
3813
3809
  }
3814
3810
  });
3815
3811
  const updatedUsers = Array.from(userMap.values());
3816
- emit("update:selectedUsers", updatedUsers);
3812
+ if (props.freePaste) {
3813
+ const pastedUsers = usersList.map((user) => ({
3814
+ id: user,
3815
+ name: user,
3816
+ type: "custom",
3817
+ tenantId: "",
3818
+ login_name: user
3819
+ }));
3820
+ pastedUsers.forEach((user) => {
3821
+ if (!updatedUsers.some((item) => item.login_name === user.login_name)) {
3822
+ addUser(user);
3823
+ }
3824
+ });
3825
+ } else {
3826
+ emit("update:selectedUsers", updatedUsers);
3827
+ }
3828
+ } else {
3829
+ if (props.freePaste) {
3830
+ const pastedUsers = usersList.map((user) => ({
3831
+ id: user,
3832
+ name: user,
3833
+ type: "custom",
3834
+ tenantId: "",
3835
+ login_name: user
3836
+ }));
3837
+ pastedUsers.forEach((user) => {
3838
+ if (!props.selectedUsers.some((item) => item.login_name === user.login_name)) {
3839
+ addUser(user);
3840
+ }
3841
+ });
3842
+ }
3817
3843
  }
3818
3844
  } catch (error) {
3819
3845
  console.error("精准查找用户失败:", error);
@@ -3835,7 +3861,13 @@
3835
3861
  removeUser(lastUser);
3836
3862
  }
3837
3863
  } else if (event.key === "Enter" && props.allowCreate) {
3838
- addUser({ id: searchQuery.value, name: searchQuery.value, type: "custom", tenantId: "" });
3864
+ addUser({
3865
+ id: searchQuery.value,
3866
+ name: searchQuery.value,
3867
+ type: "custom",
3868
+ tenantId: "",
3869
+ login_name: searchQuery.value
3870
+ });
3839
3871
  }
3840
3872
  };
3841
3873
  const addUser = (user) => {
@@ -3959,8 +3991,8 @@
3959
3991
  null,
3960
3992
  vue.renderList(_ctx.selectedUsers, (user, index) => {
3961
3993
  return vue.openBlock(), vue.createElementBlock("div", {
3962
- class: "tag-wrapper",
3963
3994
  key: user.id,
3995
+ class: "tag-wrapper",
3964
3996
  onClick: vue.withModifiers(($event) => handleTagClick(index), ["stop"])
3965
3997
  }, [
3966
3998
  vue.createVNode(UserTag, {
@@ -3981,8 +4013,8 @@
3981
4013
  ref_for: true,
3982
4014
  ref_key: "inlineInputRef",
3983
4015
  ref: inlineInputRef,
3984
- class: "search-input inline",
3985
4016
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => vue.isRef(searchQuery) ? searchQuery.value = $event : null),
4017
+ class: "search-input inline",
3986
4018
  onFocus: handleInputFocus,
3987
4019
  onInput: handleInput,
3988
4020
  onKeydown: handleKeyDown,
@@ -4004,8 +4036,8 @@
4004
4036
  key: 0,
4005
4037
  ref_key: "lastInputRef",
4006
4038
  ref: lastInputRef,
4007
- class: "search-input last",
4008
4039
  "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => vue.isRef(searchQuery) ? searchQuery.value = $event : null),
4040
+ class: "search-input last",
4009
4041
  placeholder: !_ctx.selectedUsers.length ? _ctx.placeholder : "",
4010
4042
  onFocus: handleInputFocus,
4011
4043
  onInput: handleInput,
@@ -4046,8 +4078,8 @@
4046
4078
  null,
4047
4079
  vue.renderList(visibleUsers.value, (user) => {
4048
4080
  return vue.openBlock(), vue.createBlock(UserTag, {
4049
- "current-tenant-id": _ctx.tenantId,
4050
4081
  key: user.id,
4082
+ "current-tenant-id": _ctx.tenantId,
4051
4083
  "render-tag": _ctx.renderTag,
4052
4084
  "show-tenant": true,
4053
4085
  tenants: _ctx.tenants,
@@ -4102,8 +4134,8 @@
4102
4134
  vue.withDirectives(vue.createElementVNode("input", {
4103
4135
  ref_key: "collapsedInputRef",
4104
4136
  ref: collapsedInputRef,
4105
- class: "search-input collapsed",
4106
4137
  "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => vue.isRef(searchQuery) ? searchQuery.value = $event : null),
4138
+ class: "search-input collapsed",
4107
4139
  placeholder: !_ctx.selectedUsers.length ? _ctx.placeholder : "",
4108
4140
  onFocus: handleFocus
4109
4141
  }, null, 40, _hoisted_4), [
@@ -4134,7 +4166,7 @@
4134
4166
  };
4135
4167
  }
4136
4168
  });
4137
- const MultipleSelector = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-49f3716b"]]);
4169
+ const MultipleSelector = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-2a532f24"]]);
4138
4170
  const _hoisted_1 = { class: "input-container" };
4139
4171
  const _hoisted_2 = ["placeholder"];
4140
4172
  const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
@@ -4145,20 +4177,21 @@
4145
4177
  props: {
4146
4178
  modelValue: { default: "" },
4147
4179
  tenants: {},
4180
+ allowCreate: { type: Boolean },
4148
4181
  apiBaseUrl: { default: "" },
4149
- tenantId: { default: "" },
4150
- placeholder: { default: "" },
4151
4182
  currentUserId: { default: "" },
4183
+ disabled: { type: Boolean },
4184
+ emptyText: { default: "" },
4185
+ enableMultiTenantMode: { type: Boolean },
4152
4186
  exactSearchKey: { default: "bk_username" },
4153
- userGroup: { default: () => [] },
4187
+ excludeUserIds: { default: () => [] },
4188
+ freePaste: { type: Boolean },
4189
+ placeholder: { default: "" },
4190
+ tenantId: { default: "" },
4154
4191
  userGroupName: { default: "" },
4155
- emptyText: { default: "" },
4156
- disabled: { type: Boolean },
4157
4192
  renderListItem: {},
4158
4193
  renderTag: {},
4159
- excludeUserIds: { default: () => [] },
4160
- enableMultiTenantMode: { type: Boolean },
4161
- allowCreate: { type: Boolean }
4194
+ userGroup: { default: () => [] }
4162
4195
  },
4163
4196
  emits: ["update:modelValue", "change", "focus", "blur"],
4164
4197
  setup(__props, { emit: __emit }) {
@@ -4256,6 +4289,7 @@
4256
4289
  const fetchUsers = async (keyword = "") => {
4257
4290
  if (!(keyword == null ? void 0 : keyword.length)) {
4258
4291
  options.value = [];
4292
+ isLoading.value = false;
4259
4293
  return;
4260
4294
  }
4261
4295
  isLoading.value = true;
@@ -4288,6 +4322,18 @@
4288
4322
  }
4289
4323
  }
4290
4324
  };
4325
+ const handlePaste = (event) => {
4326
+ var _a;
4327
+ event.preventDefault();
4328
+ const pastedText = ((_a = event.clipboardData) == null ? void 0 : _a.getData("text").trim()) || "";
4329
+ if (props.freePaste) {
4330
+ const customUser = { id: pastedText, name: pastedText, type: "custom", tenantId: "", login_name: pastedText };
4331
+ if (!options.value.some((item) => item.login_name === customUser.login_name)) {
4332
+ options.value.push(customUser);
4333
+ }
4334
+ addUser(customUser);
4335
+ }
4336
+ };
4291
4337
  const addUser = (user) => {
4292
4338
  selectedUser.value = user.id;
4293
4339
  searchQuery.value = "";
@@ -4303,9 +4349,14 @@
4303
4349
  }
4304
4350
  emit("focus");
4305
4351
  };
4352
+ let timer = null;
4306
4353
  const handleInput = () => {
4307
- fetchUsers(searchQuery.value);
4308
4354
  showDropdown.value = searchQuery.value.length >= 1;
4355
+ isLoading.value = true;
4356
+ clearTimeout(timer);
4357
+ timer = setTimeout(() => {
4358
+ fetchUsers(searchQuery.value);
4359
+ }, 300);
4309
4360
  };
4310
4361
  const handleClickOutside = () => {
4311
4362
  setTimeout(() => {
@@ -4364,13 +4415,14 @@
4364
4415
  vue.withDirectives(vue.createElementVNode("input", {
4365
4416
  ref_key: "inputRef",
4366
4417
  ref: inputRef,
4367
- class: "search-input",
4368
4418
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchQuery.value = $event),
4419
+ class: "search-input",
4369
4420
  placeholder: selectedUserInfo.value ? "" : _ctx.placeholder,
4370
4421
  onBlur: _cache[1] || (_cache[1] = ($event) => emit("blur")),
4371
4422
  onFocus: handleInputFocus,
4372
4423
  onInput: handleInput,
4373
- onKeydown: handleKeyDown
4424
+ onKeydown: handleKeyDown,
4425
+ onPaste: handlePaste
4374
4426
  }, null, 40, _hoisted_2), [
4375
4427
  [vue.vModelText, searchQuery.value]
4376
4428
  ]),
@@ -4394,30 +4446,31 @@
4394
4446
  };
4395
4447
  }
4396
4448
  });
4397
- const SingleSelector = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-726a967e"]]);
4449
+ const SingleSelector = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-cbe352a6"]]);
4398
4450
  const _sfc_main = /* @__PURE__ */ vue.defineComponent({
4399
4451
  ...{
4400
4452
  name: "BkUserSelector"
4401
4453
  },
4402
4454
  __name: "user-selector",
4403
4455
  props: {
4404
- modelValue: { default: "" },
4405
4456
  draggable: { type: Boolean, default: false },
4457
+ modelValue: { default: "" },
4406
4458
  multiple: { type: Boolean, default: false },
4459
+ allowCreate: { type: Boolean, default: false },
4407
4460
  apiBaseUrl: { default: "" },
4408
- tenantId: { default: "" },
4409
- placeholder: { default: "" },
4410
4461
  currentUserId: { default: "" },
4462
+ disabled: { type: Boolean, default: false },
4463
+ emptyText: { default: "" },
4464
+ enableMultiTenantMode: { type: Boolean, default: true },
4411
4465
  exactSearchKey: { default: "bk_username" },
4412
- userGroup: { default: () => [] },
4466
+ excludeUserIds: { default: () => [] },
4467
+ freePaste: { type: Boolean, default: false },
4468
+ placeholder: { default: "" },
4469
+ tenantId: { default: "" },
4413
4470
  userGroupName: { default: "" },
4414
- emptyText: { default: "" },
4415
- disabled: { type: Boolean, default: false },
4416
4471
  renderListItem: {},
4417
4472
  renderTag: {},
4418
- excludeUserIds: { default: () => [] },
4419
- enableMultiTenantMode: { type: Boolean, default: true },
4420
- allowCreate: { type: Boolean, default: false }
4473
+ userGroup: { default: () => [] }
4421
4474
  },
4422
4475
  emits: ["update:modelValue", "change", "dragStart", "dragEnd", "focus", "blur"],
4423
4476
  setup(__props, { emit: __emit }) {
@@ -4540,10 +4593,11 @@
4540
4593
  tenants: vue.unref(tenants),
4541
4594
  "user-group": _ctx.userGroup,
4542
4595
  "user-group-name": userGroupName.value,
4596
+ "free-paste": _ctx.freePaste,
4543
4597
  onBlur: handleBlur,
4544
4598
  onChange: handleUpdateUser,
4545
4599
  onFocus: handleFocus
4546
- }, null, 8, ["modelValue", "allow-create", "api-base-url", "current-user-id", "disabled", "empty-text", "enable-multi-tenant-mode", "exact-search-key", "exclude-user-ids", "placeholder", "render-list-item", "render-tag", "tenant-id", "tenants", "user-group", "user-group-name"])) : (vue.openBlock(), vue.createElementBlock(
4600
+ }, null, 8, ["modelValue", "allow-create", "api-base-url", "current-user-id", "disabled", "empty-text", "enable-multi-tenant-mode", "exact-search-key", "exclude-user-ids", "placeholder", "render-list-item", "render-tag", "tenant-id", "tenants", "user-group", "user-group-name", "free-paste"])) : (vue.openBlock(), vue.createElementBlock(
4547
4601
  vue.Fragment,
4548
4602
  { key: 1 },
4549
4603
  [
@@ -4568,12 +4622,13 @@
4568
4622
  tenants: vue.unref(tenants),
4569
4623
  "user-group": _ctx.userGroup,
4570
4624
  "user-group-name": userGroupName.value,
4625
+ "free-paste": _ctx.freePaste,
4571
4626
  onBlur: handleBlur,
4572
4627
  onDragEnd: _cache[2] || (_cache[2] = ($event) => _ctx.$emit("dragEnd", $event)),
4573
4628
  onDragStart: _cache[3] || (_cache[3] = ($event) => _ctx.$emit("dragStart", $event)),
4574
4629
  onFocus: handleFocus,
4575
4630
  "onUpdate:selectedUsers": handleUpdateSelectedUsers
4576
- }, null, 8, ["modelValue", "allow-create", "api-base-url", "current-user-id", "disabled", "draggable", "empty-text", "enable-multi-tenant-mode", "exact-search-key", "exclude-user-ids", "placeholder", "render-list-item", "render-tag", "selected-users", "tenant-id", "tenants", "user-group", "user-group-name"])
4631
+ }, null, 8, ["modelValue", "allow-create", "api-base-url", "current-user-id", "disabled", "draggable", "empty-text", "enable-multi-tenant-mode", "exact-search-key", "exclude-user-ids", "placeholder", "render-list-item", "render-tag", "selected-users", "tenant-id", "tenants", "user-group", "user-group-name", "free-paste"])
4577
4632
  ],
4578
4633
  2112
4579
4634
  /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
@@ -4585,7 +4640,7 @@
4585
4640
  };
4586
4641
  }
4587
4642
  });
4588
- const BkUserSelector = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-879a2fa1"]]);
4643
+ const BkUserSelector = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-f29cda5a"]]);
4589
4644
  exports2.BkUserSelector = BkUserSelector;
4590
4645
  exports2.default = BkUserSelector;
4591
4646
  Object.defineProperties(exports2, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
package/vue3/vue3.css CHANGED
@@ -1,4 +1,4 @@
1
- .me-tag[data-v-44fec2ba] {
1
+ .me-tag[data-v-ef4a05c4] {
2
2
  position: absolute;
3
3
  top: 50%;
4
4
  right: 8px;
@@ -11,83 +11,81 @@
11
11
  padding: 0 8px;
12
12
  font-size: 12px;
13
13
  color: #4d4f56;
14
+ white-space: nowrap;
14
15
  cursor: pointer;
15
16
  background-color: #e1ecff;
16
17
  border-radius: 50%;
17
18
  transform: translateY(-50%);
18
- white-space: nowrap;
19
19
  }
20
- .me-tag[data-v-44fec2ba]:hover {
20
+ .me-tag[data-v-ef4a05c4]:hover {
21
21
  color: #3a84ff;
22
22
  background-color: #cddffe;
23
23
  }
24
- .me-tag.disabled[data-v-44fec2ba] {
24
+ .me-tag.disabled[data-v-ef4a05c4] {
25
25
  color: #c4c6cc;
26
26
  cursor: not-allowed;
27
27
  background-color: #f0f1f5;
28
- }.dropdown-content[data-v-e11d7af7] {
28
+ }.dropdown-content[data-v-78875ea6] {
29
29
  min-height: 40px;
30
30
  max-height: 300px;
31
31
  padding: 5px 0;
32
32
  overflow-y: auto;
33
33
  }
34
- .dropdown-content .no-data[data-v-e11d7af7] {
34
+ .dropdown-content .no-data[data-v-78875ea6] {
35
35
  padding: 10px;
36
36
  color: #979ba5;
37
37
  text-align: center;
38
38
  }
39
- .dropdown-content .user-group .group-header[data-v-e11d7af7] {
39
+ .dropdown-content .user-group .group-header[data-v-78875ea6] {
40
40
  display: flex;
41
41
  align-items: center;
42
42
  padding: 8px 12px;
43
43
  color: #979ba5;
44
44
  }
45
- .dropdown-content .user-group .group-header .group-count[data-v-e11d7af7] {
45
+ .dropdown-content .user-group .group-header .group-count[data-v-78875ea6] {
46
46
  margin-left: 4px;
47
47
  }
48
- .dropdown-content .user-option[data-v-e11d7af7] {
48
+ .dropdown-content .user-option[data-v-78875ea6] {
49
49
  display: flex;
50
50
  align-items: center;
51
51
  height: 32px;
52
52
  padding: 8px 12px;
53
53
  cursor: pointer;
54
54
  }
55
- .dropdown-content .user-option[data-v-e11d7af7]:hover {
55
+ .dropdown-content .user-option[data-v-78875ea6]:hover {
56
56
  background-color: #f5f7fa;
57
- }.bk-user-selector-popover.bk-user-selector-pop2-content {
58
- padding: 0;
59
- }.user-tag[data-v-3ff46050] {
57
+ }.user-tag[data-v-48ac8fc1] {
60
58
  margin-right: 4px;
61
59
  margin-left: 0;
62
60
  }
63
- .user-tag.draggable[data-v-3ff46050] {
61
+ .user-tag.draggable[data-v-48ac8fc1] {
64
62
  cursor: move;
65
63
  }
66
- .user-tag.active[data-v-3ff46050] {
64
+ .user-tag.active[data-v-48ac8fc1] {
67
65
  background-color: #e1ecff;
68
66
  border-color: #3a84ff;
69
67
  }
70
- .user-tag.is-custom[data-v-3ff46050] {
68
+ .user-tag.is-custom[data-v-48ac8fc1] {
71
69
  color: #ea3636;
72
70
  background-color: #feebea;
73
71
  border-color: rgba(234, 53, 54, 0.3019607843);
74
72
  }
75
- .user-tag.is-custom[data-v-3ff46050]:hover {
73
+ .user-tag.is-custom[data-v-48ac8fc1]:hover {
76
74
  background-color: #fedddc;
77
75
  }
78
- .user-tag .tag-content .user-name[data-v-3ff46050] {
76
+ .user-tag .tag-content .user-name[data-v-48ac8fc1] {
79
77
  overflow: hidden;
80
- font-size: 12px;
81
78
  text-overflow: ellipsis;
79
+ font-size: 12px;
82
80
  white-space: nowrap;
83
- }.multiple-selector[data-v-49f3716b] {
81
+ }.multiple-selector[data-v-2a532f24] {
84
82
  position: relative;
85
83
  width: 100%;
86
84
  }
87
- .multiple-selector.is-disabled[data-v-49f3716b] {
85
+ .multiple-selector.is-disabled[data-v-2a532f24] {
88
86
  pointer-events: none;
89
87
  }
90
- .multiple-selector .tags-container[data-v-49f3716b] {
88
+ .multiple-selector .tags-container[data-v-2a532f24] {
91
89
  min-height: 32px;
92
90
  padding: 1px 10px 1px 8px;
93
91
  background-color: #fff;
@@ -95,51 +93,51 @@
95
93
  border-radius: 2px;
96
94
  transition: all 0.2s ease;
97
95
  }
98
- .multiple-selector .tags-container.focused[data-v-49f3716b] {
96
+ .multiple-selector .tags-container.focused[data-v-2a532f24] {
99
97
  border-color: #3a84ff;
100
98
  box-shadow: 0 0 0 2px rgba(58, 132, 255, 0.1);
101
99
  }
102
- .multiple-selector .tags-container.collapsed[data-v-49f3716b] {
100
+ .multiple-selector .tags-container.collapsed[data-v-2a532f24] {
103
101
  display: flex;
104
102
  flex-wrap: wrap;
105
103
  align-items: center;
106
104
  }
107
- .multiple-selector .tag-list[data-v-49f3716b] {
105
+ .multiple-selector .tag-list[data-v-2a532f24] {
108
106
  display: flex;
109
107
  flex-wrap: wrap;
110
108
  align-items: center;
111
109
  }
112
- .multiple-selector .tag-wrapper[data-v-49f3716b] {
110
+ .multiple-selector .tag-wrapper[data-v-2a532f24] {
113
111
  display: inline-flex;
114
112
  align-items: center;
115
113
  max-width: 100%;
116
114
  }
117
- .multiple-selector .search-input[data-v-49f3716b] {
115
+ .multiple-selector .search-input[data-v-2a532f24] {
118
116
  min-width: 10px;
119
117
  height: 28px;
118
+ outline: none;
120
119
  background: transparent;
121
120
  border: none;
122
- outline: none;
123
121
  }
124
- .multiple-selector .search-input[data-v-49f3716b]::placeholder {
122
+ .multiple-selector .search-input[data-v-2a532f24]::placeholder {
125
123
  color: #c4c6cc;
126
124
  }
127
- .multiple-selector .search-input.inline[data-v-49f3716b] {
125
+ .multiple-selector .search-input.inline[data-v-2a532f24] {
128
126
  min-width: 10px;
129
127
  }
130
- .multiple-selector .search-input.last[data-v-49f3716b], .multiple-selector .search-input.collapsed[data-v-49f3716b] {
128
+ .multiple-selector .search-input.last[data-v-2a532f24], .multiple-selector .search-input.collapsed[data-v-2a532f24] {
131
129
  flex: 1;
132
130
  }
133
- .hidden-users[data-v-49f3716b] {
131
+ .hidden-users[data-v-2a532f24] {
134
132
  padding: 6px 10px;
135
- }.single-selector[data-v-726a967e] {
133
+ }.single-selector[data-v-cbe352a6] {
136
134
  position: relative;
137
135
  width: 100%;
138
136
  }
139
- .single-selector.is-disabled[data-v-726a967e] {
137
+ .single-selector.is-disabled[data-v-cbe352a6] {
140
138
  pointer-events: none;
141
139
  }
142
- .input-container[data-v-726a967e] {
140
+ .input-container[data-v-cbe352a6] {
143
141
  position: relative;
144
142
  display: flex;
145
143
  align-items: center;
@@ -149,25 +147,27 @@
149
147
  border: 1px solid #c4c6cc;
150
148
  border-radius: 2px;
151
149
  }
152
- .input-container[data-v-726a967e]:focus-within {
150
+ .input-container[data-v-cbe352a6]:focus-within {
153
151
  border-color: #3a84ff;
154
152
  box-shadow: 0 0 0 2px rgba(58, 132, 255, 0.1);
155
153
  }
156
- .search-input[data-v-726a967e] {
154
+ .search-input[data-v-cbe352a6] {
157
155
  flex: 1;
158
156
  height: 30px;
157
+ outline: none;
159
158
  background: transparent;
160
159
  border: none;
161
- outline: none;
162
160
  }
163
- .search-input[data-v-726a967e]::placeholder {
161
+ .search-input[data-v-cbe352a6]::placeholder {
164
162
  color: #c4c6cc;
165
- }.bk-user-selector[data-v-879a2fa1] {
163
+ }.bk-user-selector[data-v-f29cda5a] {
166
164
  position: relative;
167
165
  width: 100%;
168
166
  font-size: 12px;
169
167
  }
170
- .bk-user-selector.is-disabled[data-v-879a2fa1] {
168
+ .bk-user-selector.is-disabled[data-v-f29cda5a] {
171
169
  cursor: not-allowed;
172
170
  background-color: #dcdee5;
171
+ }.bk-user-selector-popover.bk-user-selector-pop2-content {
172
+ padding: 0;
173
173
  }