bkui-vue 0.0.1-beta.27 → 0.0.1-beta.28

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.
@@ -82,6 +82,7 @@ var __publicField = (obj, key, value) => {
82
82
  var pagination = "";
83
83
  var timeline = "";
84
84
  var resizeLayout = "";
85
+ var tagInput = "";
85
86
  const BKLAYERD_INDEX_EFAULT_VALUE = {
86
87
  ["bottom"]: 0,
87
88
  ["content"]: 1,
@@ -10373,7 +10374,7 @@ ${$(r2)}`), n2;
10373
10374
  unregister
10374
10375
  };
10375
10376
  }
10376
- function useDebouncedRef(value, delay = 200) {
10377
+ function useDebouncedRef$1(value, delay = 200) {
10377
10378
  let timeout;
10378
10379
  let innerValue = value;
10379
10380
  return vue.customRef((track, trigger) => ({
@@ -10417,7 +10418,7 @@ ${$(r2)}`), n2;
10417
10418
  };
10418
10419
  }
10419
10420
  function useRemoteSearch(method) {
10420
- const searchKey = useDebouncedRef("");
10421
+ const searchKey = useDebouncedRef$1("");
10421
10422
  const searchLoading = vue.ref(false);
10422
10423
  vue.watch(searchKey, async () => {
10423
10424
  searchLoading.value = true;
@@ -12828,6 +12829,939 @@ ${$(r2)}`), n2;
12828
12829
  }
12829
12830
  });
12830
12831
  const BkTable = withInstall(Component$4);
12832
+ const INPUT_MIN_WIDTH = 12;
12833
+ function useDebouncedRef(value, delay = 200) {
12834
+ let timeout;
12835
+ let innerValue = value;
12836
+ return vue.customRef((track, trigger) => ({
12837
+ get() {
12838
+ track();
12839
+ return innerValue;
12840
+ },
12841
+ set(newValue) {
12842
+ clearTimeout(timeout);
12843
+ timeout = setTimeout(() => {
12844
+ innerValue = newValue;
12845
+ trigger();
12846
+ }, delay);
12847
+ }
12848
+ }));
12849
+ }
12850
+ function usePage(pageSize) {
12851
+ const state = vue.reactive({
12852
+ curPage: 1,
12853
+ totalSize: 0,
12854
+ totalPage: 0,
12855
+ pageSize,
12856
+ isPageLoading: false,
12857
+ curPageList: [],
12858
+ renderListPaged: []
12859
+ });
12860
+ const initPage = (allList = []) => {
12861
+ state.curPage = 1;
12862
+ state.totalSize = allList.length;
12863
+ state.totalPage = Math.ceil(state.totalSize / state.pageSize) || 1;
12864
+ const list = [];
12865
+ if (state.pageSize > 0) {
12866
+ for (let i2 = 0; i2 < state.totalSize; i2 += state.pageSize) {
12867
+ list.push(allList.slice(i2, i2 + state.pageSize));
12868
+ }
12869
+ }
12870
+ state.renderListPaged.splice(0, state.renderListPaged.length, ...list);
12871
+ state.curPageList.splice(0, state.curPageList.length, ...state.renderListPaged[state.curPage - 1] || []);
12872
+ };
12873
+ const pageChange = (page) => {
12874
+ state.curPage = page;
12875
+ state.curPageList.splice(state.curPageList.length, 0, ...state.renderListPaged[state.curPage - 1] || []);
12876
+ state.isPageLoading = false;
12877
+ };
12878
+ return {
12879
+ pageState: state,
12880
+ initPage,
12881
+ pageChange
12882
+ };
12883
+ }
12884
+ function useFlatList(props) {
12885
+ const {
12886
+ useGroup,
12887
+ saveKey,
12888
+ displayKey,
12889
+ list
12890
+ } = vue.toRefs(props);
12891
+ const flatList = vue.reactive([]);
12892
+ vue.watch([useGroup, saveKey, displayKey, list], () => {
12893
+ let formatList = list.value;
12894
+ if (useGroup.value) {
12895
+ formatList = list.value.reduce((formatList2, item) => {
12896
+ let children = [];
12897
+ if (item.children) {
12898
+ children = item.children.map((child) => __spreadValues({
12899
+ group: {
12900
+ groupId: item[saveKey.value],
12901
+ groupName: item[displayKey.value]
12902
+ }
12903
+ }, child));
12904
+ }
12905
+ return formatList2.concat(children);
12906
+ }, []);
12907
+ }
12908
+ flatList.splice(0, flatList.length, ...formatList);
12909
+ }, { immediate: true, deep: true });
12910
+ return flatList;
12911
+ }
12912
+ const getCharLength = (str) => {
12913
+ const len = str.length;
12914
+ let bitLen = 0;
12915
+ for (let i2 = 0; i2 < len; i2++) {
12916
+ if ((str.charCodeAt(i2) & 65280) !== 0) {
12917
+ bitLen += 1;
12918
+ }
12919
+ bitLen += 1;
12920
+ }
12921
+ return bitLen;
12922
+ };
12923
+ var ListTagRender = vue.defineComponent({
12924
+ name: "ListTagRender",
12925
+ props: {
12926
+ node: PropTypes.object,
12927
+ searchKey: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]),
12928
+ displayKey: PropTypes.string,
12929
+ searchKeyword: PropTypes.string,
12930
+ tpl: {
12931
+ type: Function,
12932
+ default: null
12933
+ }
12934
+ },
12935
+ render() {
12936
+ const highlightKeyword = (value) => {
12937
+ if (this.searchKeyword) {
12938
+ const keywordReg = new RegExp(`(${this.searchKeyword})`, "i");
12939
+ return value.replace(keywordReg, '<strong class="highlight-text">$1</strong>');
12940
+ }
12941
+ return value;
12942
+ };
12943
+ if (this.tpl) {
12944
+ return this.tpl(this.node, highlightKeyword, vue.h, this);
12945
+ }
12946
+ const displayText = this.node[this.displayKey];
12947
+ return vue.createVNode("div", {
12948
+ "class": "bk-selector-node"
12949
+ }, [vue.createVNode("span", {
12950
+ "class": "text",
12951
+ "innerHTML": highlightKeyword(displayText)
12952
+ }, [displayText])]);
12953
+ }
12954
+ });
12955
+ const tagProps = () => ({
12956
+ modelValue: PropTypes.arrayOf(PropTypes.string).def([]),
12957
+ placeholder: PropTypes.string.def("\u8BF7\u8F93\u5165\u5E76\u6309 Enter \u7ED3\u675F"),
12958
+ list: PropTypes.arrayOf(PropTypes.object).def([]),
12959
+ disabled: PropTypes.bool.def(false),
12960
+ tooltipKey: PropTypes.string.def(""),
12961
+ saveKey: PropTypes.string.def("id"),
12962
+ displayKey: PropTypes.string.def("name"),
12963
+ hasDeleteIcon: PropTypes.bool.def(false),
12964
+ clearable: PropTypes.bool.def(true),
12965
+ trigger: PropTypes.commonType(["focus", "search"]).def("search"),
12966
+ searchKey: PropTypes.oneOfType([PropTypes.string, PropTypes.arrayOf(PropTypes.string)]).def("name"),
12967
+ useGroup: PropTypes.bool.def(false),
12968
+ allowCreate: PropTypes.bool.def(false),
12969
+ maxData: PropTypes.number.def(-1),
12970
+ maxResult: PropTypes.number.def(10),
12971
+ contentMaxHeight: PropTypes.number.def(300),
12972
+ contentWidth: PropTypes.number.def(190),
12973
+ separator: PropTypes.string.def(""),
12974
+ allowNextFocus: PropTypes.bool.def(true),
12975
+ allowAutoMatch: PropTypes.bool.def(false),
12976
+ showClearOnlyHover: PropTypes.bool.def(false),
12977
+ leftSpace: PropTypes.number.def(0),
12978
+ createTagValidator: {
12979
+ type: Function,
12980
+ default: null
12981
+ },
12982
+ filterCallback: {
12983
+ type: Function,
12984
+ default: null
12985
+ },
12986
+ tagTpl: {
12987
+ type: Function,
12988
+ default: null
12989
+ },
12990
+ tpl: {
12991
+ type: Function,
12992
+ default: null
12993
+ },
12994
+ pasteFn: {
12995
+ type: Function,
12996
+ default: null
12997
+ }
12998
+ });
12999
+ var TagRender = vue.defineComponent({
13000
+ name: "TagRender",
13001
+ props: {
13002
+ node: PropTypes.object,
13003
+ displayKey: PropTypes.string,
13004
+ tpl: {
13005
+ type: Function,
13006
+ default: null
13007
+ }
13008
+ },
13009
+ render() {
13010
+ if (this.tpl) {
13011
+ return this.tpl(this.node, vue.h, this);
13012
+ }
13013
+ return vue.createVNode("div", {
13014
+ "class": "tag"
13015
+ }, [vue.createVNode("span", {
13016
+ "class": "text"
13017
+ }, [this.node[this.displayKey]])]);
13018
+ }
13019
+ });
13020
+ var TagInput = vue.defineComponent({
13021
+ name: "BkTagInput",
13022
+ directives: {
13023
+ bkTooltips: tooltips
13024
+ },
13025
+ props: tagProps(),
13026
+ emits: ["update:modelValue", "change", "select", "blur", "remove", "removeAll"],
13027
+ setup(props, {
13028
+ emit
13029
+ }) {
13030
+ const state = vue.reactive({
13031
+ isEdit: false,
13032
+ isHover: false,
13033
+ focusItemIndex: props.allowCreate ? -1 : 0
13034
+ });
13035
+ const popoverProps = vue.reactive({
13036
+ isShow: false,
13037
+ width: 190,
13038
+ modifiers: [{
13039
+ name: "offset",
13040
+ options: {
13041
+ offset: [0, 4]
13042
+ }
13043
+ }]
13044
+ });
13045
+ const {
13046
+ maxResult
13047
+ } = vue.toRefs(props);
13048
+ const {
13049
+ pageState,
13050
+ initPage,
13051
+ pageChange
13052
+ } = usePage(maxResult);
13053
+ const curInputValue = useDebouncedRef("", 150);
13054
+ const tagInputRef = vue.ref(null);
13055
+ const bkTagSelectorRef = vue.ref(null);
13056
+ const tagListRef = vue.ref(null);
13057
+ const tagInputItemRef = vue.ref(null);
13058
+ const selectorListRef = vue.ref(null);
13059
+ const popoverRef = vue.ref(null);
13060
+ const timer = vue.ref(null);
13061
+ const showTagClose = vue.computed(() => !props.disabled && props.hasDeleteIcon);
13062
+ const isSingleSelect = vue.computed(() => props.maxData === 1);
13063
+ const isShowPlaceholder = vue.computed(() => listState.selectedTagList.length === 0 && curInputValue.value === "" && !state.isEdit);
13064
+ const isShowClear = vue.computed(() => props.clearable && !props.disabled && listState.selectedTagList.length !== 0 && (props.showClearOnlyHover ? state.isHover : true));
13065
+ const triggerClass = vue.computed(() => ({
13066
+ "bk-tag-input-trigger": true,
13067
+ active: state.isEdit,
13068
+ disabled: props.disabled
13069
+ }));
13070
+ vue.watch([() => [...props.modelValue], () => [...props.list]], () => {
13071
+ initData();
13072
+ });
13073
+ vue.watch(curInputValue, (value) => {
13074
+ const hasShowCount = pageState.curPageList.length !== 0;
13075
+ if (value !== "" && hasShowCount || value === "" && props.trigger === "focus") {
13076
+ popoverProps.isShow = true;
13077
+ } else if (props.trigger !== "focus" || !hasShowCount) {
13078
+ popoverProps.isShow = false;
13079
+ }
13080
+ });
13081
+ vue.watch(() => popoverProps.isShow, (show) => {
13082
+ changePopoverOffset();
13083
+ if (show) {
13084
+ if (selectorListRef.value) {
13085
+ vue.nextTick(() => {
13086
+ selectorListRef.value.scrollTop = 0;
13087
+ });
13088
+ selectorListRef.value.removeEventListener("scroll", scrollHandler);
13089
+ selectorListRef.value.addEventListener("scroll", scrollHandler);
13090
+ }
13091
+ }
13092
+ });
13093
+ const changePopoverOffset = () => {
13094
+ var _a, _b;
13095
+ const left2 = isSingleSelect.value ? 0 : (_a = tagInputItemRef.value) == null ? void 0 : _a.offsetLeft;
13096
+ popoverProps.modifiers = [{
13097
+ name: "offset",
13098
+ options: {
13099
+ offset: [left2, 4]
13100
+ }
13101
+ }];
13102
+ (_b = popoverRef.value) == null ? void 0 : _b.update();
13103
+ };
13104
+ const scrollHandler = () => {
13105
+ if (pageState.isPageLoading || selectorListRef.value.scrollTop === 0) {
13106
+ return;
13107
+ }
13108
+ const {
13109
+ scrollTop,
13110
+ offsetHeight,
13111
+ scrollHeight
13112
+ } = selectorListRef.value;
13113
+ if (scrollTop + offsetHeight >= scrollHeight) {
13114
+ const curPage = pageState.curPage + 1;
13115
+ if (curPage <= pageState.totalPage) {
13116
+ pageState.isPageLoading = true;
13117
+ setTimeout(() => {
13118
+ pageChange(curPage);
13119
+ }, 500);
13120
+ }
13121
+ }
13122
+ };
13123
+ const getSelectedTagNodes = () => {
13124
+ var _a;
13125
+ const nodes = Array.from(((_a = tagListRef.value) == null ? void 0 : _a.childNodes) || []);
13126
+ return nodes.filter((node) => node.nodeType !== Node.TEXT_NODE);
13127
+ };
13128
+ const focusInputTrigger = (e) => {
13129
+ if (props.disabled)
13130
+ return;
13131
+ if (e == null ? void 0 : e.target) {
13132
+ const {
13133
+ className
13134
+ } = e.target;
13135
+ if (className.indexOf("bk-tag-input-trigger") > -1 || className.indexOf("tag-list") > -1) {
13136
+ tagListRef.value.appendChild(tagInputItemRef.value);
13137
+ }
13138
+ }
13139
+ clearTimeout(timer.value);
13140
+ if (isSingleSelect.value && tagList.value.length) {
13141
+ listState.tagListCache = [...tagList.value];
13142
+ listState.selectedTagListCache = [...listState.selectedTagList];
13143
+ curInputValue.value = listState.selectedTagListCache[0][props.saveKey];
13144
+ removeTag(listState.selectedTagList[0], 0);
13145
+ handleInput();
13146
+ }
13147
+ state.isEdit = true;
13148
+ vue.nextTick(() => {
13149
+ var _a;
13150
+ (_a = tagInputRef.value) == null ? void 0 : _a.focus();
13151
+ if (props.trigger === "focus" && listState.localList.length !== 0) {
13152
+ filterData();
13153
+ if (popoverProps.isShow) {
13154
+ changePopoverOffset();
13155
+ } else {
13156
+ popoverProps.isShow = true;
13157
+ }
13158
+ }
13159
+ });
13160
+ };
13161
+ const listState = vue.reactive({
13162
+ localList: [],
13163
+ tagListCache: [],
13164
+ selectedTagList: [],
13165
+ selectedTagListCache: []
13166
+ });
13167
+ const tagList = vue.computed(() => listState.selectedTagList.map((tag2) => tag2[props.saveKey]));
13168
+ const formatList = useFlatList(props);
13169
+ const renderList = vue.computed(() => {
13170
+ if (props.useGroup) {
13171
+ const groupMap = {};
13172
+ pageState.curPageList.forEach((item, index) => {
13173
+ item.__index__ = index;
13174
+ if (!groupMap[item.group.groupId]) {
13175
+ groupMap[item.group.groupId] = {
13176
+ id: item.group.groupId,
13177
+ name: item.group.groupName,
13178
+ children: []
13179
+ };
13180
+ }
13181
+ groupMap[item.group.groupId].children.push(item);
13182
+ });
13183
+ return Object.keys(groupMap).map((key) => groupMap[key]);
13184
+ }
13185
+ return pageState.curPageList;
13186
+ });
13187
+ const initData = () => {
13188
+ const {
13189
+ saveKey,
13190
+ modelValue,
13191
+ displayKey,
13192
+ allowCreate,
13193
+ trigger
13194
+ } = props;
13195
+ listState.selectedTagList = [];
13196
+ listState.localList = [...formatList];
13197
+ if (modelValue.length) {
13198
+ modelValue.forEach((tag2) => {
13199
+ const value = listState.localList.find((val) => tag2 === val[saveKey]);
13200
+ if (value !== void 0) {
13201
+ listState.selectedTagList.push(value);
13202
+ } else if (allowCreate && !tagList.value.includes(tag2)) {
13203
+ listState.selectedTagList.push({
13204
+ [saveKey]: tag2,
13205
+ [displayKey]: tag2
13206
+ });
13207
+ }
13208
+ });
13209
+ if (!isSingleSelect.value) {
13210
+ listState.localList = listState.localList.filter((val) => !modelValue.includes(val[saveKey]));
13211
+ }
13212
+ }
13213
+ if (trigger === "focus") {
13214
+ filterData();
13215
+ }
13216
+ };
13217
+ const filterData = (value = "") => {
13218
+ const {
13219
+ searchKey,
13220
+ filterCallback
13221
+ } = props;
13222
+ const lowerCaseValue = value.toLowerCase();
13223
+ let filterData2 = [];
13224
+ if (typeof filterCallback === "function") {
13225
+ filterData2 = filterCallback(lowerCaseValue, searchKey, listState.localList) || [];
13226
+ } else {
13227
+ if (Array.isArray(searchKey)) {
13228
+ const filterDataList = searchKey.map((searchKey2) => listState.localList.filter((item) => item[searchKey2].toLowerCase().indexOf(lowerCaseValue) !== -1));
13229
+ filterData2 = Array.from(new Set(filterDataList.flat()));
13230
+ } else {
13231
+ filterData2 = listState.localList.filter((item) => item[searchKey].toLowerCase().indexOf(lowerCaseValue) !== -1);
13232
+ }
13233
+ }
13234
+ initPage(filterData2);
13235
+ };
13236
+ const activeClass = (data2, index) => {
13237
+ const style = {
13238
+ "bk-selector-actived": false,
13239
+ "bk-selector-selected": tagList.value.includes(data2[props.saveKey])
13240
+ };
13241
+ if (props.useGroup) {
13242
+ style["bk-selector-actived"] = data2.__index__ === state.focusItemIndex;
13243
+ } else {
13244
+ style["bk-selector-actived"] = index === state.focusItemIndex;
13245
+ }
13246
+ return style;
13247
+ };
13248
+ vue.onMounted(() => {
13249
+ initData();
13250
+ });
13251
+ const clearSingleCache = () => {
13252
+ listState.tagListCache = [];
13253
+ listState.selectedTagListCache = [];
13254
+ listState.selectedTagList = [];
13255
+ };
13256
+ const clearInput = () => {
13257
+ curInputValue.value = "";
13258
+ };
13259
+ const getTagInputItemSite = () => {
13260
+ if (isSingleSelect.value) {
13261
+ return 0;
13262
+ }
13263
+ const childNodes = getSelectedTagNodes();
13264
+ const index = childNodes.findIndex(({
13265
+ id
13266
+ }) => id === "tagInputItem");
13267
+ return index >= 0 ? index : 0;
13268
+ };
13269
+ const swapElementPositions = (newNode, referenceNode, isNextElementSibling = false) => {
13270
+ if (!referenceNode || !newNode)
13271
+ return;
13272
+ let swap = referenceNode;
13273
+ if (isNextElementSibling) {
13274
+ swap = referenceNode.nextElementSibling || null;
13275
+ }
13276
+ referenceNode.parentNode.insertBefore(newNode, swap);
13277
+ };
13278
+ const handleInput = (e) => {
13279
+ const {
13280
+ maxData,
13281
+ trigger,
13282
+ allowCreate
13283
+ } = props;
13284
+ if (maxData === -1 || maxData > tagList.value.length) {
13285
+ const {
13286
+ value
13287
+ } = (e == null ? void 0 : e.target) ? e.target : curInputValue;
13288
+ const charLen = getCharLength(value);
13289
+ if (charLen) {
13290
+ filterData(value);
13291
+ tagInputRef.value.style.width = `${charLen * INPUT_MIN_WIDTH}px`;
13292
+ } else {
13293
+ if (trigger === "focus") {
13294
+ filterData();
13295
+ }
13296
+ }
13297
+ } else {
13298
+ handleBlur();
13299
+ curInputValue.value = "";
13300
+ popoverProps.isShow = false;
13301
+ }
13302
+ state.isEdit = true;
13303
+ state.focusItemIndex = allowCreate ? -1 : 0;
13304
+ };
13305
+ const handleFocus = () => {
13306
+ var _a;
13307
+ popoverProps.width = isSingleSelect.value ? (_a = bkTagSelectorRef.value) == null ? void 0 : _a.clientWidth : props.contentWidth;
13308
+ };
13309
+ const handleBlur = () => {
13310
+ timer.value = setTimeout(() => {
13311
+ const inputValue = curInputValue.value;
13312
+ clearInput();
13313
+ state.isEdit = false;
13314
+ if (isSingleSelect.value) {
13315
+ const [oldValue] = listState.tagListCache;
13316
+ if (inputValue && inputValue === oldValue && listState.selectedTagListCache.length) {
13317
+ addTag(listState.selectedTagListCache[0], "select");
13318
+ } else {
13319
+ handleChange("remove");
13320
+ }
13321
+ } else if (props.allowAutoMatch && inputValue) {
13322
+ const matchItem = pageState.curPageList.find((item) => {
13323
+ if (Array.isArray(props.searchKey)) {
13324
+ const searchValue = props.searchKey.map((key) => item[key]);
13325
+ return searchValue.includes(inputValue);
13326
+ }
13327
+ return item[props.searchKey] === inputValue;
13328
+ });
13329
+ if (matchItem) {
13330
+ handleTagSelected(matchItem, "select");
13331
+ } else if (props.allowCreate) {
13332
+ handleTagSelected(inputValue, "custom");
13333
+ }
13334
+ }
13335
+ popoverProps.isShow = false;
13336
+ emit("blur", inputValue, tagList.value);
13337
+ }, 50);
13338
+ };
13339
+ const handleTagSelected = (item, type, e) => {
13340
+ e == null ? void 0 : e.stopPropagation();
13341
+ if (!item || item.disabled) {
13342
+ return;
13343
+ }
13344
+ if (isSingleSelect.value) {
13345
+ clearSingleCache();
13346
+ }
13347
+ addTag(item, type);
13348
+ handleChange("select");
13349
+ clearInput();
13350
+ popoverProps.isShow = false;
13351
+ };
13352
+ const handleTagRemove = (data2, index, e) => {
13353
+ e == null ? void 0 : e.stopPropagation();
13354
+ removeTag(data2, index);
13355
+ clearInput();
13356
+ handleChange("remove");
13357
+ tagInputRef.value.style.width = `${INPUT_MIN_WIDTH}px`;
13358
+ };
13359
+ const handleChange = (type) => {
13360
+ emit("change", tagList.value);
13361
+ emit(type);
13362
+ emit("update:modelValue", tagList.value);
13363
+ };
13364
+ const handleClear = (e) => {
13365
+ e.stopPropagation();
13366
+ const removeList = listState.selectedTagList;
13367
+ listState.selectedTagList = [];
13368
+ const existList = formatList.filter((item) => removeList.some((removeItem) => removeItem[props.saveKey] === item[props.saveKey]));
13369
+ if ((props.allowCreate && existList.length !== 0 || !props.allowCreate) && !isSingleSelect.value) {
13370
+ listState.localList.push(...existList);
13371
+ }
13372
+ handleChange("removeAll");
13373
+ };
13374
+ const updateScrollTop = () => {
13375
+ const panelInfo = {
13376
+ height: selectorListRef.value.clientHeight,
13377
+ yAxis: selectorListRef.value.getBoundingClientRect().y
13378
+ };
13379
+ vue.nextTick(() => {
13380
+ const activeObj = selectorListRef.value.querySelector(".bk-selector-actived");
13381
+ if (!activeObj) {
13382
+ return;
13383
+ }
13384
+ const activeInfo = {
13385
+ height: activeObj.clientHeight,
13386
+ yAxis: activeObj.getBoundingClientRect().y
13387
+ };
13388
+ if (activeInfo.yAxis < panelInfo.yAxis) {
13389
+ selectorListRef.value.scrollTop = selectorListRef.value.scrollTop - (panelInfo.yAxis - activeInfo.yAxis);
13390
+ }
13391
+ const distanceToBottom = activeInfo.yAxis + activeInfo.height - panelInfo.yAxis;
13392
+ if (distanceToBottom > panelInfo.height) {
13393
+ selectorListRef.value.scrollTop = selectorListRef.value.scrollTop + distanceToBottom - panelInfo.height;
13394
+ }
13395
+ });
13396
+ };
13397
+ const backspaceHandler = (index, target) => {
13398
+ const nodes = getSelectedTagNodes();
13399
+ swapElementPositions(tagInputItemRef.value, nodes[index - 1]);
13400
+ listState.selectedTagList.splice(index - 1, 1);
13401
+ focusInputTrigger();
13402
+ const isExistInit = formatList.some((item) => item === target[props.saveKey]);
13403
+ if ((props.allowCreate && isExistInit || !props.allowCreate) && !isSingleSelect.value) {
13404
+ listState.localList.push(target);
13405
+ }
13406
+ tagInputRef.value = `${INPUT_MIN_WIDTH}px`;
13407
+ handleChange("remove");
13408
+ };
13409
+ const handleKeydown = (e) => {
13410
+ if (pageState.isPageLoading) {
13411
+ return;
13412
+ }
13413
+ let target;
13414
+ const val = e.target.value;
13415
+ const valLen = getCharLength(val);
13416
+ const tagInputItemIndex = getTagInputItemSite();
13417
+ const nodes = getSelectedTagNodes();
13418
+ switch (e.code) {
13419
+ case "ArrowUp":
13420
+ e.preventDefault();
13421
+ if (!popoverProps.isShow) {
13422
+ return;
13423
+ }
13424
+ state.focusItemIndex = state.focusItemIndex - 1;
13425
+ state.focusItemIndex = state.focusItemIndex < 0 ? -1 : state.focusItemIndex;
13426
+ if (state.focusItemIndex === -1) {
13427
+ state.focusItemIndex = pageState.curPageList.length - 1;
13428
+ }
13429
+ updateScrollTop();
13430
+ break;
13431
+ case "ArrowDown":
13432
+ e.preventDefault();
13433
+ if (!popoverProps.isShow) {
13434
+ return;
13435
+ }
13436
+ state.focusItemIndex = state.focusItemIndex + 1;
13437
+ state.focusItemIndex = state.focusItemIndex > pageState.curPageList.length - 1 ? pageState.curPageList.length : state.focusItemIndex;
13438
+ if (state.focusItemIndex === pageState.curPageList.length) {
13439
+ state.focusItemIndex = 0;
13440
+ }
13441
+ updateScrollTop();
13442
+ break;
13443
+ case "ArrowLeft":
13444
+ state.isEdit = true;
13445
+ if (!valLen) {
13446
+ if (tagInputItemIndex < 1) {
13447
+ return;
13448
+ }
13449
+ swapElementPositions(tagInputItemRef.value, nodes[tagInputItemIndex - 1]);
13450
+ focusInputTrigger();
13451
+ }
13452
+ break;
13453
+ case "ArrowRight":
13454
+ state.isEdit = true;
13455
+ if (!valLen) {
13456
+ if (tagInputItemIndex === nodes.length - 1) {
13457
+ return;
13458
+ }
13459
+ swapElementPositions(nodes[tagInputItemIndex + 1], tagInputItemRef.value);
13460
+ focusInputTrigger();
13461
+ }
13462
+ break;
13463
+ case "Enter":
13464
+ case "NumpadEnter":
13465
+ if (!props.allowCreate && popoverProps.isShow || props.allowCreate && state.focusItemIndex >= 0 && popoverProps.isShow) {
13466
+ handleTagSelected(pageState.curPageList[state.focusItemIndex], "select", e);
13467
+ } else if (props.allowCreate) {
13468
+ handleTagSelected(curInputValue.value, "custom", e);
13469
+ }
13470
+ e.preventDefault();
13471
+ break;
13472
+ case "Backspace":
13473
+ if (tagInputItemIndex !== 0 && !curInputValue.value) {
13474
+ target = listState.selectedTagList[tagInputItemIndex - 1];
13475
+ backspaceHandler(tagInputItemIndex, target);
13476
+ }
13477
+ break;
13478
+ }
13479
+ };
13480
+ const defaultPasteFn = (value) => {
13481
+ const target = [];
13482
+ const textArr = value.split(";");
13483
+ textArr.forEach((item) => {
13484
+ if (item.match(/^[a-zA-Z][a-zA-Z_]+/g)) {
13485
+ const finalItem = item.match(/^[a-zA-Z][a-zA-Z_]+/g).join("");
13486
+ target.push({
13487
+ [props.saveKey]: finalItem,
13488
+ [props.displayKey]: finalItem
13489
+ });
13490
+ }
13491
+ });
13492
+ return target;
13493
+ };
13494
+ const handlePaste = (e) => {
13495
+ e.preventDefault();
13496
+ if (isSingleSelect.value) {
13497
+ return false;
13498
+ }
13499
+ const {
13500
+ maxData,
13501
+ saveKey,
13502
+ pasteFn
13503
+ } = props;
13504
+ const value = e.clipboardData.getData("text");
13505
+ const valArr = pasteFn ? pasteFn(value) : defaultPasteFn(value);
13506
+ let tags = valArr.map((value2) => value2[saveKey]);
13507
+ if (tags.length) {
13508
+ const nodes = getSelectedTagNodes();
13509
+ const index = getTagInputItemSite();
13510
+ const localInitData = listState.localList.map((data2) => data2[saveKey]);
13511
+ tags = tags.filter((tag2) => (tag2 == null ? void 0 : tag2.trim()) && !tagList.value.includes(tag2) && localInitData.includes(tag2));
13512
+ if (maxData !== -1) {
13513
+ const selectedLength = listState.selectedTagList.length;
13514
+ if (selectedLength < maxData) {
13515
+ const differ = maxData - selectedLength;
13516
+ if (tags.length > differ) {
13517
+ tags = [...tags.slice(0, differ)];
13518
+ }
13519
+ } else {
13520
+ tags = [];
13521
+ }
13522
+ }
13523
+ const localTags = listState.localList.filter((tag2) => tags.includes(tag2[saveKey]));
13524
+ if (tags.length) {
13525
+ listState.selectedTagList.splice(index, 0, ...localTags);
13526
+ swapElementPositions(tagInputItemRef.value, nodes[index]);
13527
+ tagInputRef.value.style.width = `${INPUT_MIN_WIDTH}px`;
13528
+ listState.localList = listState.localList.filter((val) => !tags.includes(val[saveKey]));
13529
+ handleChange("select");
13530
+ focusInputTrigger();
13531
+ }
13532
+ }
13533
+ };
13534
+ const tagFocus = (e) => {
13535
+ if (props.disabled) {
13536
+ return;
13537
+ }
13538
+ swapElementPositions(tagInputItemRef.value, e.currentTarget, true);
13539
+ tagInputRef.value.style.width = `${INPUT_MIN_WIDTH}px`;
13540
+ popoverProps.isShow && changePopoverOffset();
13541
+ };
13542
+ const addTag = (item, type) => {
13543
+ if (listState.selectedTagList.length >= props.maxData && props.maxData !== -1)
13544
+ return;
13545
+ const {
13546
+ separator,
13547
+ saveKey,
13548
+ displayKey,
13549
+ createTagValidator
13550
+ } = props;
13551
+ const targetIndex = getTagInputItemSite();
13552
+ let moveCount = 1;
13553
+ let isSelected = false;
13554
+ let newValue;
13555
+ const validateTag = (value) => {
13556
+ if (typeof createTagValidator === "function") {
13557
+ return createTagValidator(value);
13558
+ }
13559
+ return true;
13560
+ };
13561
+ const existTag = (value) => listState.localList.find((tag2) => tag2[saveKey] === value);
13562
+ if (type === "custom") {
13563
+ if (separator) {
13564
+ let tags = item.split(separator);
13565
+ tags = tags.filter((tag2) => (tag2 == null ? void 0 : tag2.trim()) && !tagList.value.includes(tag2) && validateTag(tag2));
13566
+ const localTags = tags.map((tag2) => existTag(tag2) || {
13567
+ [saveKey]: tag2,
13568
+ [displayKey]: tag2
13569
+ });
13570
+ if (tags.length) {
13571
+ listState.selectedTagList.splice(targetIndex, 0, ...localTags);
13572
+ moveCount = localTags.length;
13573
+ isSelected = true;
13574
+ }
13575
+ } else {
13576
+ const isObject2 = typeof item === "object";
13577
+ newValue = isObject2 ? item[saveKey] : item.trim();
13578
+ newValue = newValue.replace(/\s+/g, "");
13579
+ if (newValue !== void 0 && !tagList.value.includes(newValue) && validateTag(newValue)) {
13580
+ const localItem = existTag(newValue) || (isObject2 ? item : {
13581
+ [saveKey]: newValue,
13582
+ [displayKey]: newValue
13583
+ });
13584
+ listState.selectedTagList.splice(targetIndex, 0, localItem);
13585
+ isSelected = true;
13586
+ }
13587
+ }
13588
+ } else if (item) {
13589
+ newValue = item[saveKey];
13590
+ if (newValue !== void 0 && !tagList.value.includes(newValue)) {
13591
+ listState.selectedTagList.splice(targetIndex, 0, item);
13592
+ isSelected = true;
13593
+ }
13594
+ }
13595
+ if (isSelected) {
13596
+ vue.nextTick(() => {
13597
+ for (let count = 1; count <= moveCount; count++) {
13598
+ const nodes = getSelectedTagNodes();
13599
+ const site = nodes[targetIndex + count];
13600
+ swapElementPositions(site, tagInputItemRef.value);
13601
+ }
13602
+ tagInputRef.value.style.width = `${INPUT_MIN_WIDTH}px`;
13603
+ if (!isSingleSelect.value) {
13604
+ props.allowNextFocus && focusInputTrigger();
13605
+ listState.localList = listState.localList.filter((val) => !tagList.value.includes(val[saveKey]));
13606
+ }
13607
+ });
13608
+ }
13609
+ };
13610
+ const removeTag = (data2, index) => {
13611
+ listState.selectedTagList.splice(index, 1);
13612
+ const isExistInit = formatList.some((item) => item === data2[props.saveKey]);
13613
+ if ((props.allowCreate && isExistInit || !props.allowCreate) && !isSingleSelect.value) {
13614
+ listState.localList.push(data2);
13615
+ }
13616
+ };
13617
+ return __spreadProps(__spreadValues(__spreadValues(__spreadValues({
13618
+ popoverProps
13619
+ }, vue.toRefs(state)), vue.toRefs(listState)), vue.toRefs(pageState)), {
13620
+ isShowPlaceholder,
13621
+ isShowClear,
13622
+ curInputValue,
13623
+ formatList,
13624
+ renderList,
13625
+ showTagClose,
13626
+ tagInputRef,
13627
+ bkTagSelectorRef,
13628
+ tagListRef,
13629
+ tagInputItemRef,
13630
+ selectorListRef,
13631
+ popoverRef,
13632
+ triggerClass,
13633
+ focusInputTrigger,
13634
+ activeClass,
13635
+ handleInput,
13636
+ handleFocus,
13637
+ handleBlur,
13638
+ handleTagSelected,
13639
+ handleTagRemove,
13640
+ handleClear,
13641
+ tagFocus,
13642
+ handleKeydown,
13643
+ handlePaste
13644
+ });
13645
+ },
13646
+ render() {
13647
+ const renderSelectorList = () => {
13648
+ if (this.useGroup) {
13649
+ return this.renderList.map((group) => vue.createVNode("li", {
13650
+ "class": "bk-selector-group-item"
13651
+ }, [vue.createVNode("span", {
13652
+ "class": "group-name"
13653
+ }, [group.name, vue.createTextVNode(" ("), group.children.length, vue.createTextVNode(")")]), vue.createVNode("ul", {
13654
+ "class": "bk-selector-group-list-item"
13655
+ }, [group.children.map((item, index) => vue.createVNode("li", {
13656
+ "class": ["bk-selector-list-item", {
13657
+ disabled: item.disabled
13658
+ }, this.activeClass(item, index)],
13659
+ "onClick": this.handleTagSelected.bind(this, item, "select")
13660
+ }, [vue.createVNode(ListTagRender, {
13661
+ "node": item,
13662
+ "displayKey": this.displayKey,
13663
+ "tpl": this.tpl,
13664
+ "searchKey": this.searchKey,
13665
+ "searchKeyword": this.curInputValue
13666
+ }, null)]))])]));
13667
+ }
13668
+ return this.renderList.map((item, index) => vue.createVNode("li", {
13669
+ "class": ["bk-selector-list-item", {
13670
+ disabled: item.disabled
13671
+ }, this.activeClass(item, index)],
13672
+ "onClick": this.handleTagSelected.bind(this, item, "select")
13673
+ }, [vue.createVNode(ListTagRender, {
13674
+ "node": item,
13675
+ "displayKey": this.displayKey,
13676
+ "tpl": this.tpl,
13677
+ "searchKey": this.searchKey,
13678
+ "searchKeyword": this.curInputValue
13679
+ }, null)]));
13680
+ };
13681
+ return vue.createVNode("div", {
13682
+ "class": "bk-tag-input",
13683
+ "ref": "bkTagSelectorRef",
13684
+ "onClick": this.focusInputTrigger,
13685
+ "onMouseenter": () => this.isHover = true,
13686
+ "onMouseleave": () => this.isHover = false
13687
+ }, [vue.createVNode(BkPopover, {
13688
+ "ref": "popoverRef",
13689
+ "theme": "light",
13690
+ "trigger": "manual",
13691
+ "placement": "bottom-start",
13692
+ "arrow": false,
13693
+ "width": this.popoverProps.width,
13694
+ "isShow": this.popoverProps.isShow,
13695
+ "modifiers": this.popoverProps.modifiers
13696
+ }, {
13697
+ default: () => vue.createVNode("div", {
13698
+ "class": this.triggerClass
13699
+ }, [vue.createVNode("ul", {
13700
+ "class": "tag-list",
13701
+ "ref": "tagListRef",
13702
+ "style": {
13703
+ marginLeft: `${this.leftSpace}px`
13704
+ }
13705
+ }, [this.selectedTagList.map((item, index) => {
13706
+ const tooltips2 = {
13707
+ boundary: "window",
13708
+ theme: "light",
13709
+ distance: 12,
13710
+ content: item[this.tooltipKey],
13711
+ disabled: !this.tooltipKey
13712
+ };
13713
+ return vue.withDirectives(vue.createVNode("li", {
13714
+ "class": "tag-item",
13715
+ "onClick": this.tagFocus
13716
+ }, [vue.createVNode(TagRender, {
13717
+ "node": item,
13718
+ "tpl": this.tagTpl,
13719
+ "displayKey": this.displayKey
13720
+ }, null), this.showTagClose ? vue.createVNode(error, {
13721
+ "class": "remove-tag",
13722
+ "onClick": this.handleTagRemove.bind(this, item, index)
13723
+ }, null) : null]), [[vue.resolveDirective("bk-tooltips"), tooltips2]]);
13724
+ }), vue.withDirectives(vue.createVNode("li", {
13725
+ "ref": "tagInputItemRef",
13726
+ "id": "tagInputItem",
13727
+ "class": "tag-input-item",
13728
+ "role": "input"
13729
+ }, [vue.withDirectives(vue.createVNode("input", {
13730
+ "type": "text",
13731
+ "class": "tag-input",
13732
+ "ref": "tagInputRef",
13733
+ "onUpdate:modelValue": ($event) => this.curInputValue = $event,
13734
+ "onInput": this.handleInput,
13735
+ "onFocus": this.handleFocus,
13736
+ "onBlur": this.handleBlur,
13737
+ "onKeydown": this.handleKeydown,
13738
+ "onPaste": this.handlePaste
13739
+ }, null), [[vue.vModelText, this.curInputValue]])]), [[vue.vShow, this.isEdit]])]), vue.withDirectives(vue.createVNode("p", {
13740
+ "class": "placeholder"
13741
+ }, [this.placeholder]), [[vue.vShow, this.isShowPlaceholder]]), this.isShowClear ? vue.createVNode(close$1, {
13742
+ "class": "clear-icon",
13743
+ "onClick": this.handleClear
13744
+ }, null) : null]),
13745
+ content: () => vue.createVNode("div", {
13746
+ "class": "bk-selector-list"
13747
+ }, [vue.createVNode("ul", {
13748
+ "ref": "selectorListRef",
13749
+ "style": {
13750
+ "max-height": `${this.contentMaxHeight}px`
13751
+ },
13752
+ "class": "outside-ul"
13753
+ }, [renderSelectorList(), this.isPageLoading ? vue.createVNode("li", {
13754
+ "class": "bk-selector-list-item loading"
13755
+ }, [vue.createVNode(BkLoading, {
13756
+ "theme": "primary",
13757
+ "size": BkLoadingSize.Small
13758
+ }, null)]) : null])])
13759
+ })]);
13760
+ }
13761
+ });
13762
+ TagInput.install = (Vue) => {
13763
+ Vue.component(TagInput.name, TagInput);
13764
+ };
12831
13765
  var bkDivider = vue.defineComponent({
12832
13766
  name: "Divider",
12833
13767
  props: {
@@ -18469,35 +19403,41 @@ ${$(r2)}`), n2;
18469
19403
  const outputData = [];
18470
19404
  let order2 = 0;
18471
19405
  const schema = /* @__PURE__ */ new Map();
18472
- function isCachedTreeNodeOpened(uuid2, node) {
19406
+ function getCachedTreeNodeAttr(uuid2, node, attr, cachedAttr) {
18473
19407
  const cached = (cachedSchema || []).find((item) => item.__uuid === uuid2);
18474
19408
  if (cached) {
18475
- return cached.__isOpen;
19409
+ return cached[cachedAttr];
18476
19410
  }
18477
- return node.isOpen;
19411
+ return node[attr];
19412
+ }
19413
+ function isCachedTreeNodeOpened(uuid2, node) {
19414
+ return getCachedTreeNodeAttr(uuid2, node, "isOpen", "__isOpen");
19415
+ }
19416
+ function isCachedTreeNodeChecked(uuid2, node) {
19417
+ return getCachedTreeNodeAttr(uuid2, node, "checked", "__checked");
18478
19418
  }
18479
19419
  function flatten(array, depth = 0, parent = null, path = null) {
18480
- for (let i2 = 0; i2 < array.length; i2++) {
19420
+ const arrLength = array.length;
19421
+ for (let i2 = 0; i2 < arrLength; i2++) {
18481
19422
  const item = array[i2];
18482
19423
  if (Array.isArray(item)) {
18483
19424
  flatten(item, depth, parent, path);
18484
19425
  } else {
18485
19426
  if (typeof item === "object" && item !== null) {
18486
19427
  const uuid2 = item.__uuid || uuid_1.v4();
18487
- const isOpen = isCachedTreeNodeOpened(uuid2, item);
18488
19428
  const currentPath = path !== null ? `${path}-${i2}` : `${i2}`;
19429
+ const hasChildren = !!(item[children] || []).length;
18489
19430
  const attrs = {
18490
19431
  __depth: depth,
18491
19432
  __index: i2,
18492
19433
  __uuid: uuid2,
18493
19434
  __parentId: parent,
18494
- __parentPath: path,
18495
- __hasChild: !!(item[children] || []).length,
19435
+ __hasChild: hasChildren,
18496
19436
  __path: currentPath,
18497
19437
  __isRoot: parent === null,
18498
19438
  __order: order2,
18499
- __isOpen: isOpen,
18500
- __checked: !!item.checked,
19439
+ __isOpen: isCachedTreeNodeOpened(uuid2, item) && hasChildren,
19440
+ __checked: isCachedTreeNodeChecked(uuid2, item),
18501
19441
  [children]: null
18502
19442
  };
18503
19443
  Object.assign(item, { __uuid: uuid2 });
@@ -19183,6 +20123,7 @@ ${$(r2)}`), n2;
19183
20123
  Switcher: BkSwitcher,
19184
20124
  Table: BkTable,
19185
20125
  Tag: BkTag,
20126
+ TagInput,
19186
20127
  Divider: BkDivider,
19187
20128
  Tab: BKTab,
19188
20129
  TabPanel: BKTabPanel,
@@ -19257,6 +20198,7 @@ ${$(r2)}`), n2;
19257
20198
  exports2.TabPanel = BKTabPanel;
19258
20199
  exports2.Table = BkTable;
19259
20200
  exports2.Tag = BkTag;
20201
+ exports2.TagInput = TagInput;
19260
20202
  exports2.Transfer = Transfer;
19261
20203
  exports2.Tree = BkTree;
19262
20204
  exports2.VirtualRender = BkVirtualRender;