@blueking/bk-user-selector 0.0.38-beta.6 → 0.0.39-beta.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/README.md CHANGED
@@ -144,15 +144,16 @@ export default {
144
144
  | excludeUserIds | 排除的用户ID列表 | Array | [] |
145
145
  | enableMultiTenantMode | 是否启用多租户模式,关闭后则使用原有用户管理接口查询 | Boolean | true |
146
146
  | allowCreate | 是否允许自定义用户输入,按 Enter 确认 | Boolean | false |
147
+ | freePaste | 是否允许粘贴任意文本 | Boolean | false |
147
148
 
148
149
  ### 事件
149
150
 
150
- | 事件名称 | 说明 | 回调参数 |
151
- | ----------------- | ---------------- | ---------------- |
152
- | update:modelValue | 绑定值变化时触发 | 变化后的值 |
153
- | change | 选中值变化时触发 | 变化后的用户信息 |
154
- | focus | 输入框获得焦点时触发 | - |
155
- | blur | 输入框失去焦点时触发 | - |
151
+ | 事件名称 | 说明 | 回调参数 |
152
+ | ----------------- | -------------------- | ---------------- |
153
+ | update:modelValue | 绑定值变化时触发 | 变化后的值 |
154
+ | change | 选中值变化时触发 | 变化后的用户信息 |
155
+ | focus | 输入框获得焦点时触发 | - |
156
+ | blur | 输入框失去焦点时触发 | - |
156
157
 
157
158
  ## 功能说明
158
159
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blueking/bk-user-selector",
3
- "version": "0.0.38-beta.6",
3
+ "version": "0.0.39-beta.1",
4
4
  "description": "蓝鲸用户选择器",
5
5
  "license": "MIT",
6
6
  "author": "Tencent BlueKing",
@@ -66,4 +66,4 @@
66
66
  "engines": {
67
67
  "node": ">=18.16.0"
68
68
  }
69
- }
69
+ }
@@ -33,6 +33,7 @@ declare const _default: import("vue").DefineComponent<MultipleSelectorProps, {},
33
33
  userGroupName: string;
34
34
  emptyText: string;
35
35
  draggable: boolean;
36
+ freePaste: boolean;
36
37
  modelValue: string[];
37
38
  selectedUsers: FormattedUser[];
38
39
  allowCreate: boolean;
@@ -33,6 +33,7 @@ declare const _default: import("vue").DefineComponent<UserSelectorProps, {}, {},
33
33
  userGroupName: string;
34
34
  emptyText: string;
35
35
  draggable: boolean;
36
+ freePaste: boolean;
36
37
  modelValue: string | string[];
37
38
  allowCreate: boolean;
38
39
  excludeUserIds: string[];
@@ -29,6 +29,10 @@ export interface FormattedUser {
29
29
  * 多选模式属性
30
30
  */
31
31
  export interface MultipleSelectorProps extends BaseSelectorProps {
32
+ /**
33
+ * 是否允许粘贴任意文本
34
+ */
35
+ freePaste?: boolean;
32
36
  /**
33
37
  * 是否支持拖拽排序
34
38
  */
@@ -130,6 +134,10 @@ interface BaseSelectorProps {
130
134
  * 是否允许创建用户
131
135
  */
132
136
  allowCreate?: boolean;
137
+ /**
138
+ * 是否允许粘贴任意文本
139
+ */
140
+ freePaste?: boolean;
133
141
  /**
134
142
  * 接口基础URL
135
143
  */
@@ -4546,6 +4546,10 @@ __webpack_require__$7.d(__webpack_exports__$7, {
4546
4546
  /* reexport */
4547
4547
  lang_en
4548
4548
  ),
4549
+ jp: () => (
4550
+ /* reexport */
4551
+ ja_jp
4552
+ ),
4549
4553
  zhCn: () => (
4550
4554
  /* reexport */
4551
4555
  zh_cn
@@ -4733,6 +4737,145 @@ var en = {
4733
4737
  }
4734
4738
  };
4735
4739
  const lang_en = en;
4740
+ var jp = {
4741
+ lang: "ja",
4742
+ steps: {
4743
+ step1: "ステップ1",
4744
+ step2: "ステップ2",
4745
+ step3: "ステップ3"
4746
+ },
4747
+ datePicker: {
4748
+ selectDate: "日付を選択",
4749
+ selectTime: "時間を選択",
4750
+ clear: "クリア",
4751
+ ok: "OK",
4752
+ weekdays: {
4753
+ sun: "日",
4754
+ mon: "月",
4755
+ tue: "火",
4756
+ wed: "水",
4757
+ thu: "木",
4758
+ fri: "金",
4759
+ sat: "土"
4760
+ },
4761
+ hour: "時間",
4762
+ min: "分",
4763
+ sec: "秒",
4764
+ toNow: "現在まで"
4765
+ },
4766
+ dialog: {
4767
+ ok: "OK",
4768
+ cancel: "キャンセル",
4769
+ prev: "前へ",
4770
+ next: "次へ"
4771
+ },
4772
+ popConfirm: {
4773
+ ok: "OK",
4774
+ cancel: "キャンセル"
4775
+ },
4776
+ form: {
4777
+ notBeEmpty: "空にできません",
4778
+ incorrectFormat: "形式が正しくありません",
4779
+ max: "最大値",
4780
+ min: "最小値",
4781
+ maxLen: "最大長",
4782
+ verifyError: "検証エラー"
4783
+ },
4784
+ pagination: {
4785
+ eachPage: "各ページ",
4786
+ strip: "",
4787
+ total: "合計"
4788
+ },
4789
+ process: {
4790
+ step1: "ステップ1",
4791
+ step2: "ステップ2",
4792
+ step3: "ステップ3",
4793
+ step4: "ステップ4"
4794
+ },
4795
+ searchSelect: {
4796
+ pleaseSelect: "選択してください",
4797
+ loading: "ロード中...",
4798
+ filterQueryMustHasValue: "フィルタークエリに値を含める必要があります",
4799
+ ok: "OK",
4800
+ cancel: "キャンセル",
4801
+ or: "または",
4802
+ and: "そして",
4803
+ logical: "論理:"
4804
+ },
4805
+ select: {
4806
+ noData: "データなし",
4807
+ noMatchedData: "一致するデータがありません",
4808
+ loading: "読み込み中...",
4809
+ pleaseSelect: "選んでください",
4810
+ enterKeywords: "キーワードを入力してください",
4811
+ all: "すべて",
4812
+ selectAll: "すべて選択"
4813
+ },
4814
+ table: {
4815
+ emptyText: "データがありません",
4816
+ confirm: "確認",
4817
+ reset: "リセット",
4818
+ sort: "ソート",
4819
+ setting: {
4820
+ title: "テーブル設定",
4821
+ fields: {
4822
+ title: "表示フィールド設定",
4823
+ subtitle: function subtitle2(max2) {
4824
+ return "(".concat(max2, "フィールド最大)");
4825
+ },
4826
+ selectAll: "すべて選択"
4827
+ },
4828
+ lineHeight: {
4829
+ title: "テーブル行の高さ",
4830
+ small: "小",
4831
+ medium: "中",
4832
+ large: "大"
4833
+ },
4834
+ options: {
4835
+ ok: "OK",
4836
+ cancel: "キャンセル"
4837
+ }
4838
+ }
4839
+ },
4840
+ transfer: {
4841
+ sourceList: "ソースリスト",
4842
+ targetList: "ターゲットリスト",
4843
+ removeAll: "すべて削除",
4844
+ selectAll: "すべて選択",
4845
+ noData: "データがありません",
4846
+ noSelected: "選択されていません",
4847
+ search: "検索"
4848
+ },
4849
+ upload: {
4850
+ uploadSuccess: "アップロード成功",
4851
+ uploadFailed: "アップロード失敗",
4852
+ drapFileOr: "ここにファイルをドラッグまたは",
4853
+ clickUpload: "クリックしてアップロード",
4854
+ uploadLabel: "ファイルをアップロード"
4855
+ },
4856
+ input: {
4857
+ placeholder: "入力してください",
4858
+ maxlengthLimitTips: "文字数制限に達しました"
4859
+ },
4860
+ tagInput: {
4861
+ placeholder: "入力してEnterキーで終了"
4862
+ },
4863
+ message: {
4864
+ assistant: "アシスタント",
4865
+ details: "詳細",
4866
+ copySuccess: "コピー成功",
4867
+ copyFailed: "コピー失敗"
4868
+ },
4869
+ cascader: {
4870
+ pleaseSelect: "選択してください",
4871
+ noData: "データがありません",
4872
+ emptyText: "データがありません"
4873
+ },
4874
+ versionLog: {
4875
+ current: "現在のバージョン"
4876
+ }
4877
+ };
4878
+ const ja_jp = jp;
4736
4879
  var zhCn = {
4737
4880
  lang: "zh-cn",
4738
4881
  steps: {
@@ -4817,7 +4960,7 @@ var zhCn = {
4817
4960
  title: "表格设置",
4818
4961
  fields: {
4819
4962
  title: "字段显示设置",
4820
- subtitle: function subtitle2(max2) {
4963
+ subtitle: function subtitle3(max2) {
4821
4964
  return "(最多".concat(max2, "项)");
4822
4965
  },
4823
4966
  selectAll: "全选"
@@ -4916,6 +5059,7 @@ var zhCn = {
4916
5059
  };
4917
5060
  const zh_cn = zhCn;
4918
5061
  __webpack_exports__$7.en;
5062
+ __webpack_exports__$7.jp;
4919
5063
  var __webpack_exports__zhCn = __webpack_exports__$7.zhCn;
4920
5064
  var __webpack_require__$6 = {};
4921
5065
  (() => {
@@ -10473,9 +10617,6 @@ var __webpack_exports__ = {};
10473
10617
  hide2(el);
10474
10618
  }, 100);
10475
10619
  });
10476
- el.addEventListener("click", function() {
10477
- hide2(el);
10478
- });
10479
10620
  popper2.addEventListener("mouseleave", function() {
10480
10621
  clearTimeout(delayTimeout);
10481
10622
  hideTimeout = setTimeout(function() {
@@ -10489,7 +10630,7 @@ var __webpack_exports__ = {};
10489
10630
  show(el);
10490
10631
  clearTimeout(delayTimeout);
10491
10632
  }, opts.delay);
10492
- } else if (popper2.hasAttribute("data-show")) {
10633
+ } else if (!el.contains(event.target) && popper2.hasAttribute("data-show")) {
10493
10634
  hide2(el);
10494
10635
  }
10495
10636
  });
@@ -10678,11 +10819,15 @@ const generateCallbackName = () => {
10678
10819
  const jsonpRequest = (requestUrl, options = {}) => {
10679
10820
  return new Promise((resolve, reject) => {
10680
10821
  const url = unref(requestUrl);
10681
- const { timeout = 1e3 * 60 * 2, params } = options;
10822
+ const { timeout = 1e3 * 60 * 2, params, withCredentials = true } = options;
10682
10823
  const callbackName = generateCallbackName();
10683
10824
  const script = document.createElement("script");
10684
- let timeoutId = null;
10685
- script.setAttribute("type", "text/javascript");
10825
+ let timeoutId;
10826
+ if (withCredentials) {
10827
+ script.crossOrigin = "use-credentials";
10828
+ } else {
10829
+ script.crossOrigin = "anonymous";
10830
+ }
10686
10831
  const cleanup = () => {
10687
10832
  if (timeoutId) {
10688
10833
  clearTimeout(timeoutId);
@@ -14250,6 +14395,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
14250
14395
  },
14251
14396
  __name: "multiple-selector",
14252
14397
  props: {
14398
+ freePaste: { type: Boolean, default: false },
14253
14399
  draggable: { type: Boolean, default: false },
14254
14400
  modelValue: { default: () => [] },
14255
14401
  selectedUsers: { default: () => [] },
@@ -14469,7 +14615,37 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
14469
14615
  }
14470
14616
  });
14471
14617
  const updatedUsers = Array.from(userMap.values());
14472
- emit("update:selectedUsers", updatedUsers);
14618
+ if (props2.freePaste) {
14619
+ const pastedUsers = usersList.map((user) => ({
14620
+ id: user,
14621
+ name: user,
14622
+ type: "custom",
14623
+ tenantId: "",
14624
+ login_name: user
14625
+ }));
14626
+ pastedUsers.forEach((user) => {
14627
+ if (!updatedUsers.some((item) => item.login_name === user.login_name)) {
14628
+ addUser(user);
14629
+ }
14630
+ });
14631
+ } else {
14632
+ emit("update:selectedUsers", updatedUsers);
14633
+ }
14634
+ } else {
14635
+ if (props2.freePaste) {
14636
+ const pastedUsers = usersList.map((user) => ({
14637
+ id: user,
14638
+ name: user,
14639
+ type: "custom",
14640
+ tenantId: "",
14641
+ login_name: user
14642
+ }));
14643
+ pastedUsers.forEach((user) => {
14644
+ if (!props2.selectedUsers.some((item) => item.login_name === user.login_name)) {
14645
+ addUser(user);
14646
+ }
14647
+ });
14648
+ }
14473
14649
  }
14474
14650
  } catch (error3) {
14475
14651
  console.error("精准查找用户失败:", error3);
@@ -14491,7 +14667,13 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
14491
14667
  removeUser(lastUser);
14492
14668
  }
14493
14669
  } else if (event.key === "Enter" && props2.allowCreate) {
14494
- addUser({ id: searchQuery.value, name: searchQuery.value, type: "custom", tenantId: "" });
14670
+ addUser({
14671
+ id: searchQuery.value,
14672
+ name: searchQuery.value,
14673
+ type: "custom",
14674
+ tenantId: "",
14675
+ login_name: searchQuery.value
14676
+ });
14495
14677
  }
14496
14678
  };
14497
14679
  const addUser = (user) => {
@@ -14790,7 +14972,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
14790
14972
  };
14791
14973
  }
14792
14974
  });
14793
- const MultipleSelector = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-6c9ac297"]]);
14975
+ const MultipleSelector = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-2a532f24"]]);
14794
14976
  const _hoisted_1 = { class: "input-container" };
14795
14977
  const _hoisted_2 = ["placeholder"];
14796
14978
  const _sfc_main$1 = /* @__PURE__ */ defineComponent({
@@ -14802,6 +14984,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
14802
14984
  modelValue: { default: "" },
14803
14985
  tenants: {},
14804
14986
  allowCreate: { type: Boolean },
14987
+ freePaste: { type: Boolean },
14805
14988
  apiBaseUrl: { default: "" },
14806
14989
  currentUserId: { default: "" },
14807
14990
  disabled: { type: Boolean },
@@ -14944,6 +15127,18 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
14944
15127
  }
14945
15128
  }
14946
15129
  };
15130
+ const handlePaste = (event) => {
15131
+ var _a;
15132
+ event.preventDefault();
15133
+ const pastedText = ((_a = event.clipboardData) == null ? void 0 : _a.getData("text").trim()) || "";
15134
+ if (props2.freePaste) {
15135
+ const customUser = { id: pastedText, name: pastedText, type: "custom", tenantId: "", login_name: pastedText };
15136
+ if (!options.value.some((item) => item.login_name === customUser.login_name)) {
15137
+ options.value.push(customUser);
15138
+ }
15139
+ addUser(customUser);
15140
+ }
15141
+ };
14947
15142
  const addUser = (user) => {
14948
15143
  selectedUser.value = user.id;
14949
15144
  searchQuery.value = "";
@@ -15026,7 +15221,8 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
15026
15221
  onBlur: _cache[1] || (_cache[1] = ($event) => emit("blur")),
15027
15222
  onFocus: handleInputFocus,
15028
15223
  onInput: handleInput,
15029
- onKeydown: handleKeyDown
15224
+ onKeydown: handleKeyDown,
15225
+ onPaste: handlePaste
15030
15226
  }, null, 40, _hoisted_2), [
15031
15227
  [vModelText, searchQuery.value]
15032
15228
  ]),
@@ -15050,7 +15246,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
15050
15246
  };
15051
15247
  }
15052
15248
  });
15053
- const SingleSelector = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-2a791ec6"]]);
15249
+ const SingleSelector = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__scopeId", "data-v-633b6466"]]);
15054
15250
  const _sfc_main = /* @__PURE__ */ defineComponent({
15055
15251
  ...{
15056
15252
  name: "BkUserSelector"
@@ -15061,6 +15257,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
15061
15257
  modelValue: { default: "" },
15062
15258
  multiple: { type: Boolean, default: false },
15063
15259
  allowCreate: { type: Boolean, default: false },
15260
+ freePaste: { type: Boolean, default: false },
15064
15261
  apiBaseUrl: { default: "" },
15065
15262
  currentUserId: { default: "" },
15066
15263
  disabled: { type: Boolean, default: false },
@@ -15196,10 +15393,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
15196
15393
  tenants: unref(tenants),
15197
15394
  "user-group": _ctx.userGroup,
15198
15395
  "user-group-name": userGroupName.value,
15396
+ "free-paste": _ctx.freePaste,
15199
15397
  onBlur: handleBlur,
15200
15398
  onChange: handleUpdateUser,
15201
15399
  onFocus: handleFocus
15202
- }, 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"])) : (openBlock(), createElementBlock(
15400
+ }, 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"])) : (openBlock(), createElementBlock(
15203
15401
  Fragment,
15204
15402
  { key: 1 },
15205
15403
  [
@@ -15224,12 +15422,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
15224
15422
  tenants: unref(tenants),
15225
15423
  "user-group": _ctx.userGroup,
15226
15424
  "user-group-name": userGroupName.value,
15425
+ "free-paste": _ctx.freePaste,
15227
15426
  onBlur: handleBlur,
15228
15427
  onDragEnd: _cache[2] || (_cache[2] = ($event) => _ctx.$emit("dragEnd", $event)),
15229
15428
  onDragStart: _cache[3] || (_cache[3] = ($event) => _ctx.$emit("dragStart", $event)),
15230
15429
  onFocus: handleFocus,
15231
15430
  "onUpdate:selectedUsers": handleUpdateSelectedUsers
15232
- }, 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"])
15431
+ }, 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"])
15233
15432
  ],
15234
15433
  2112
15235
15434
  /* STABLE_FRAGMENT, DEV_ROOT_FRAGMENT */
@@ -15241,7 +15440,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
15241
15440
  };
15242
15441
  }
15243
15442
  });
15244
- const BkUserSelector = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-f4c00173"]]);
15443
+ const BkUserSelector = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-37ff6c88"]]);
15245
15444
  const vue2 = {
15246
15445
  model: {
15247
15446
  prop: "modelValue",