@cmstops/pro-compo 3.9.1 → 3.9.2-alpha.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.
Files changed (29) hide show
  1. package/dist/index.css +39 -4
  2. package/dist/index.min.css +1 -1
  3. package/es/config.js +1 -1
  4. package/es/hooks/useAttachement.js +2 -9
  5. package/es/hooks/usePopper.d.ts +1 -1
  6. package/es/hooks/usePopper.js +3 -3
  7. package/es/index.css +39 -4
  8. package/es/selectResourceModal/__demo__/module/DivWrapper.d.ts +268 -0
  9. package/es/selectResourceModal/__demo__/module/basic.d.ts +299 -0
  10. package/es/selectResourceModal/components/List/ListNormal/Filter.js +169 -86
  11. package/es/selectResourceModal/components/List/ListNormal/index.js +21 -6
  12. package/es/selectResourceModal/hooks/useResponsiveFilter.d.ts +21 -0
  13. package/es/selectResourceModal/hooks/useResponsiveFilter.js +142 -0
  14. package/es/selectResourceModal/scripts/useCompoLf.js +1 -1
  15. package/es/selectResourceModal/style/index.css +39 -4
  16. package/es/selectResourceModal/style/index.less +5 -0
  17. package/es/selectResourceModal/style/list.less +39 -4
  18. package/lib/config.js +1 -1
  19. package/lib/hooks/useAttachement.js +2 -9
  20. package/lib/hooks/usePopper.js +3 -3
  21. package/lib/index.css +39 -4
  22. package/lib/selectResourceModal/components/List/ListNormal/Filter.js +166 -83
  23. package/lib/selectResourceModal/components/List/ListNormal/index.js +20 -5
  24. package/lib/selectResourceModal/hooks/useResponsiveFilter.js +144 -0
  25. package/lib/selectResourceModal/scripts/useCompoLf.js +1 -1
  26. package/lib/selectResourceModal/style/index.css +39 -4
  27. package/lib/selectResourceModal/style/index.less +5 -0
  28. package/lib/selectResourceModal/style/list.less +39 -4
  29. package/package.json +1 -1
@@ -1,30 +1,47 @@
1
- import { defineComponent, inject, computed, ref, watch, onMounted, openBlock, createElementBlock, createElementVNode, createCommentVNode, createVNode, unref, withCtx, createTextVNode, toDisplayString, Fragment, renderList, createBlock, normalizeClass } from "vue";
2
- import { Input, Dropdown, Doption, Button, Select, Option, TreeSelect, RangePicker } from "@arco-design/web-vue";
3
- import { IconUpload } from "@arco-design/web-vue/es/icon";
1
+ import { defineComponent, inject, computed, ref, watch, onMounted, openBlock, createElementBlock, createCommentVNode, createElementVNode, withDirectives, createVNode, unref, withModifiers, withCtx, createTextVNode, vShow, toDisplayString, Fragment, renderList, createBlock, normalizeClass } from "vue";
2
+ import { Button, Input, Dropdown, Doption, TreeSelect, Select, Option, RangePicker } from "@arco-design/web-vue";
3
+ import { IconCaretDown, IconUpload } from "@arco-design/web-vue/es/icon";
4
4
  import useSelection from "../../../../hooks/useSelection.js";
5
5
  import { useDirectory } from "../../../../hooks/useAttachement.js";
6
6
  import { RESOURCE_SOURCE_OPTIONS, RESOURCE_CATALOG_OPTIONS } from "../../../../utils/typeMap.js";
7
7
  import { getAccountList } from "../../../scripts/selectionApis.js";
8
8
  import { keywordsSelection } from "../../../../utils/resource.js";
9
+ import { useResponsiveFilter } from "../../../hooks/useResponsiveFilter.js";
9
10
  const _hoisted_1 = { class: "list-filter-wrapper" };
10
11
  const _hoisted_2 = { class: "list-filter" };
11
- const _hoisted_3 = { class: "filter-list" };
12
- const _hoisted_4 = { style: { "width": "200px" } };
12
+ const _hoisted_3 = { class: "more-btn" };
13
+ const _hoisted_4 = { class: "right-prefix" };
13
14
  const _hoisted_5 = {
14
15
  class: "filter-item",
15
16
  style: { "width": "200px" }
16
17
  };
17
- const _hoisted_6 = { class: "filter-item" };
18
+ const _hoisted_6 = {
19
+ class: "filter-item",
20
+ style: { "width": "180px" }
21
+ };
18
22
  const _hoisted_7 = {
23
+ class: "filter-item",
24
+ style: { "width": "170px" }
25
+ };
26
+ const _hoisted_8 = {
27
+ class: "filter-item",
28
+ style: { "width": "240px" }
29
+ };
30
+ const _hoisted_9 = {
31
+ class: "filter-item",
32
+ style: { "width": "240px" }
33
+ };
34
+ const _hoisted_10 = {
19
35
  key: 0,
20
36
  class: "filter-item"
21
37
  };
22
- const _hoisted_8 = { class: "filter-extra" };
23
- const _hoisted_9 = {
38
+ const _hoisted_11 = { class: "filter-extra" };
39
+ const _hoisted_12 = { class: "filter-item" };
40
+ const _hoisted_13 = {
24
41
  key: 0,
25
42
  class: "list-filter-tags"
26
43
  };
27
- const _hoisted_10 = ["onClick"];
44
+ const _hoisted_14 = ["onClick"];
28
45
  const _sfc_main = defineComponent({
29
46
  __name: "Filter",
30
47
  props: {
@@ -38,6 +55,16 @@ const _sfc_main = defineComponent({
38
55
  const baseAPI = inject("baseAPI");
39
56
  const filterOptions = inject("filterOptions");
40
57
  const domainId = computed(() => userInfo == null ? void 0 : userInfo.value.domain_id);
58
+ const filterItemsRef = ref();
59
+ const {
60
+ moreBtnRef,
61
+ popperPanelRef,
62
+ hiddenElementList,
63
+ visible,
64
+ show,
65
+ hide,
66
+ refreshLayout
67
+ } = useResponsiveFilter(filterItemsRef);
41
68
  const { options, loading, load, loadMore, handleSearch } = useSelection({
42
69
  labelStr: "alias",
43
70
  valueStr: "id",
@@ -57,7 +84,7 @@ const _sfc_main = defineComponent({
57
84
  });
58
85
  const resourceSource = RESOURCE_SOURCE_OPTIONS;
59
86
  const resourceCatalog = RESOURCE_CATALOG_OPTIONS;
60
- const { tree, loadMore: loadDirMore } = useDirectory({
87
+ const { tree } = useDirectory({
61
88
  BASE_API: baseAPI
62
89
  });
63
90
  const originFilter = {
@@ -116,82 +143,123 @@ const _sfc_main = defineComponent({
116
143
  filter.value.keyword = val;
117
144
  filter.value.precise_keyword = "";
118
145
  }
146
+ filter.value.sf = "";
119
147
  }
120
148
  });
121
- watch(
122
- () => searchType.value,
123
- () => {
124
- searchInput.value = filter.value.keyword || filter.value.precise_keyword;
125
- }
126
- );
127
149
  const isEmpty = computed(() => {
128
- return Object.keys(filter.value).every((key) => {
150
+ return Object.keys(originFilter).every((key) => {
151
+ if (key === "catalog") {
152
+ const currentCatalog = filter.value[key] || [];
153
+ const originCatalog = originFilter[key] || [];
154
+ return currentCatalog.length === originCatalog.length && currentCatalog.every((v) => originCatalog.includes(v));
155
+ }
129
156
  return filter.value[key] === originFilter[key];
130
157
  });
131
158
  });
132
159
  watch(
133
160
  () => filter.value,
134
- () => {
135
- const result = { ...filter.value };
161
+ (val) => {
162
+ const result = { ...val };
136
163
  Object.keys(result).forEach((key) => {
137
164
  if (props.disableUploadBy && key === "upload_by")
138
165
  delete result[key];
139
- if (!result[key])
140
- delete result[key];
166
+ if (result[key] === "" || result[key] === null || result[key] === void 0) {
167
+ if (key !== "catalog") {
168
+ delete result[key];
169
+ }
170
+ }
141
171
  });
142
- if (!result.catalog)
143
- result.catalog = "image,video,audio";
144
- else
145
- result.catalog = result.catalog.join(",");
146
- emits("change", result);
147
- },
148
- { deep: true, immediate: true }
149
- );
150
- watch(
151
- () => filterOptions == null ? void 0 : filterOptions.value,
152
- () => {
153
- var _a;
154
- if ((_a = filterOptions == null ? void 0 : filterOptions.value) == null ? void 0 : _a.mediaType) {
155
- filter.value.catalog = filterOptions == null ? void 0 : filterOptions.value.mediaType.split(",");
156
- if (filterOptions == null ? void 0 : filterOptions.value.mediaTypeStrict) {
157
- originFilter.catalog = filterOptions == null ? void 0 : filterOptions.value.mediaType.split(",");
172
+ if (result.catalog && Array.isArray(result.catalog)) {
173
+ if (result.catalog.length > 0) {
174
+ result.catalog = result.catalog.join(",");
175
+ } else {
176
+ delete result.catalog;
158
177
  }
159
178
  }
179
+ emits("change", result);
180
+ refreshLayout();
160
181
  },
161
- { immediate: true, deep: true }
182
+ { deep: true, immediate: true }
162
183
  );
163
184
  onMounted(() => {
185
+ var _a;
164
186
  load();
187
+ if ((_a = filterOptions == null ? void 0 : filterOptions.value) == null ? void 0 : _a.mediaType) {
188
+ const initialCatalog = filterOptions.value.mediaType.split(",");
189
+ filter.value.catalog = initialCatalog;
190
+ if (filterOptions.value.mediaTypeStrict) {
191
+ originFilter.catalog = initialCatalog;
192
+ }
193
+ }
165
194
  });
166
195
  __expose({
167
- resetFilter: handleReset
196
+ filter,
197
+ handleReset
168
198
  });
169
199
  return (_ctx, _cache) => {
170
200
  var _a;
171
201
  return openBlock(), createElementBlock("div", _hoisted_1, [
202
+ createCommentVNode(" Use filterItemsRef's parentElement as the container for boundary checks "),
172
203
  createElementVNode("div", _hoisted_2, [
173
- createElementVNode("div", _hoisted_3, [
204
+ createCommentVNode(" Filter Items Container "),
205
+ createElementVNode("div", {
206
+ id: "resource-filter-pannel",
207
+ ref_key: "filterItemsRef",
208
+ ref: filterItemsRef,
209
+ class: "filter-list"
210
+ }, [
211
+ createCommentVNode(" More Filters Button and Popper Panel "),
212
+ createElementVNode("div", _hoisted_3, [
213
+ createElementVNode("div", {
214
+ ref_key: "moreBtnRef",
215
+ ref: moreBtnRef
216
+ }, [
217
+ withDirectives(createVNode(unref(Button), {
218
+ style: { marginRight: "10px" },
219
+ onClick: _cache[0] || (_cache[0] = withModifiers(() => unref(visible) ? unref(hide)() : unref(show)(), ["stop"]))
220
+ }, {
221
+ default: withCtx(() => [
222
+ createElementVNode("span", _hoisted_4, [
223
+ _cache[10] || (_cache[10] = createTextVNode(" \u66F4\u591A\u7B5B\u9009 ")),
224
+ createVNode(unref(IconCaretDown))
225
+ ])
226
+ ]),
227
+ _: 1
228
+ }, 512), [
229
+ [vShow, unref(hiddenElementList).length]
230
+ ])
231
+ ], 512),
232
+ withDirectives(createElementVNode("div", {
233
+ ref_key: "popperPanelRef",
234
+ ref: popperPanelRef,
235
+ class: "filter-pannel",
236
+ onClick: _cache[1] || (_cache[1] = withModifiers(() => {
237
+ }, ["stop"]))
238
+ }, null, 512), [
239
+ [vShow, unref(visible)]
240
+ ])
241
+ ]),
174
242
  createCommentVNode(" \u5173\u952E\u8BCD "),
175
- createElementVNode("div", _hoisted_4, [
243
+ createElementVNode("div", _hoisted_5, [
176
244
  createVNode(unref(Input), {
177
245
  modelValue: searchInput.value,
178
- "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => searchInput.value = $event),
246
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => searchInput.value = $event),
179
247
  "allow-clear": "",
180
248
  placeholder: "\u8BF7\u8F93\u5165\u5173\u952E\u8BCD"
181
249
  }, {
182
250
  prepend: withCtx(() => [
183
251
  createVNode(unref(Dropdown), {
184
- onSelect: _cache[0] || (_cache[0] = (e) => searchType.value = e)
252
+ onSelect: _cache[2] || (_cache[2] = (e) => searchType.value = e)
185
253
  }, {
186
254
  content: withCtx(() => [
187
255
  createVNode(unref(Doption), { value: 0 }, {
188
- default: withCtx(() => _cache[8] || (_cache[8] = [
256
+ default: withCtx(() => _cache[11] || (_cache[11] = [
189
257
  createTextVNode("\u7CBE\u51C6\u641C")
190
258
  ])),
191
259
  _: 1
192
260
  }),
193
261
  createVNode(unref(Doption), { value: 1 }, {
194
- default: withCtx(() => _cache[9] || (_cache[9] = [
262
+ default: withCtx(() => _cache[12] || (_cache[12] = [
195
263
  createTextVNode("\u6A21\u7CCA\u641C")
196
264
  ])),
197
265
  _: 1
@@ -211,15 +279,32 @@ const _sfc_main = defineComponent({
211
279
  _: 1
212
280
  }, 8, ["modelValue"])
213
281
  ]),
282
+ createCommentVNode(" \u76EE\u5F55 "),
283
+ createElementVNode("div", _hoisted_6, [
284
+ createVNode(unref(TreeSelect), {
285
+ modelValue: filter.value.directory_id,
286
+ "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => filter.value.directory_id = $event),
287
+ data: unref(tree),
288
+ "popup-container": "#resource-filter-pannel",
289
+ placeholder: "\u8BF7\u9009\u62E9\u76EE\u5F55",
290
+ "field-names": {
291
+ title: "alias",
292
+ key: "id"
293
+ },
294
+ "allow-clear": ""
295
+ }, null, 8, ["modelValue", "data"])
296
+ ]),
214
297
  createCommentVNode(" \u7D20\u6750\u7C7B\u578B "),
215
- createElementVNode("div", _hoisted_5, [
298
+ createElementVNode("div", _hoisted_7, [
216
299
  createVNode(unref(Select), {
217
300
  modelValue: filter.value.catalog,
218
- "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => filter.value.catalog = $event),
301
+ "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => filter.value.catalog = $event),
219
302
  disabled: (_a = unref(filterOptions)) == null ? void 0 : _a.mediaTypeStrict,
303
+ "popup-container": "#resource-filter-pannel",
220
304
  "allow-clear": "",
221
305
  placeholder: "\u7C7B\u578B",
222
- multiple: ""
306
+ multiple: "",
307
+ "max-tag-count": 1
223
308
  }, {
224
309
  default: withCtx(() => [
225
310
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(resourceCatalog), (item) => {
@@ -233,30 +318,23 @@ const _sfc_main = defineComponent({
233
318
  _: 1
234
319
  }, 8, ["modelValue", "disabled"])
235
320
  ]),
236
- createCommentVNode(" \u76EE\u5F55 "),
237
- createVNode(unref(TreeSelect), {
238
- modelValue: filter.value.directory_id,
239
- "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => filter.value.directory_id = $event),
240
- data: unref(tree),
241
- "load-more": unref(loadDirMore),
242
- placeholder: "\u8BF7\u9009\u62E9\u76EE\u5F55",
243
- style: { "width": "180px" },
244
- "allow-clear": ""
245
- }, null, 8, ["modelValue", "data", "load-more"]),
246
321
  createCommentVNode(" \u65F6\u95F4\u8303\u56F4 "),
247
- createVNode(unref(RangePicker), {
248
- modelValue: rangeTime.value,
249
- "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => rangeTime.value = $event),
250
- "allow-clear": "",
251
- style: { "width": "240px" }
252
- }, null, 8, ["modelValue"]),
322
+ createElementVNode("div", _hoisted_8, [
323
+ createVNode(unref(RangePicker), {
324
+ modelValue: rangeTime.value,
325
+ "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => rangeTime.value = $event),
326
+ "allow-clear": "",
327
+ "popup-container": "#resource-filter-pannel"
328
+ }, null, 8, ["modelValue"])
329
+ ]),
253
330
  createCommentVNode(" \u7D20\u6750\u4E0A\u4F20\u6765\u6E90 "),
254
- createElementVNode("div", _hoisted_6, [
331
+ createElementVNode("div", _hoisted_9, [
255
332
  createVNode(unref(Select), {
256
333
  modelValue: filter.value.source,
257
- "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => filter.value.source = $event),
334
+ "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => filter.value.source = $event),
258
335
  "allow-clear": "",
259
- placeholder: "\u6765\u6E90"
336
+ placeholder: "\u6765\u6E90",
337
+ "popup-container": "#resource-filter-pannel"
260
338
  }, {
261
339
  default: withCtx(() => [
262
340
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(resourceSource), (item) => {
@@ -271,14 +349,15 @@ const _sfc_main = defineComponent({
271
349
  }, 8, ["modelValue"])
272
350
  ]),
273
351
  createCommentVNode(" \u7D20\u6750\u4E0A\u4F20\u4EBA "),
274
- !_ctx.disableUploadBy ? (openBlock(), createElementBlock("div", _hoisted_7, [
352
+ !_ctx.disableUploadBy ? (openBlock(), createElementBlock("div", _hoisted_10, [
275
353
  createVNode(unref(Select), {
276
354
  modelValue: filter.value.upload_by,
277
- "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => filter.value.upload_by = $event),
355
+ "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => filter.value.upload_by = $event),
278
356
  "allow-clear": "",
279
357
  placeholder: "\u4E0A\u4F20\u4EBA",
280
358
  loading: unref(loading),
281
359
  "allow-search": "",
360
+ "popup-container": "#resource-filter-pannel",
282
361
  onSearch: unref(handleSearch),
283
362
  onDropdownReachBottom: unref(loadMore)
284
363
  }, {
@@ -293,40 +372,44 @@ const _sfc_main = defineComponent({
293
372
  ]),
294
373
  _: 1
295
374
  }, 8, ["modelValue", "loading", "onSearch", "onDropdownReachBottom"])
296
- ])) : createCommentVNode("v-if", true),
297
- !isEmpty.value ? (openBlock(), createBlock(unref(Button), {
298
- key: 1,
299
- type: "text",
300
- onClick: handleReset
301
- }, {
302
- default: withCtx(() => _cache[10] || (_cache[10] = [
303
- createTextVNode(" \u91CD\u7F6E ")
304
- ])),
305
- _: 1
306
- })) : createCommentVNode("v-if", true)
307
- ]),
308
- createElementVNode("div", _hoisted_8, [
375
+ ])) : createCommentVNode("v-if", true)
376
+ ], 512),
377
+ createElementVNode("div", _hoisted_11, [
378
+ createCommentVNode(" \u91CD\u7F6E\u6309\u94AE - Wrap in filter-item to be managed by the hook "),
379
+ withDirectives(createElementVNode("div", _hoisted_12, [
380
+ createVNode(unref(Button), {
381
+ type: "text",
382
+ onClick: handleReset
383
+ }, {
384
+ default: withCtx(() => _cache[13] || (_cache[13] = [
385
+ createTextVNode(" \u91CD\u7F6E ")
386
+ ])),
387
+ _: 1
388
+ })
389
+ ], 512), [
390
+ [vShow, !isEmpty.value]
391
+ ]),
309
392
  createVNode(unref(Button), {
310
393
  type: "primary",
311
- onClick: _cache[7] || (_cache[7] = ($event) => emits("upload"))
394
+ onClick: _cache[9] || (_cache[9] = ($event) => emits("upload"))
312
395
  }, {
313
396
  icon: withCtx(() => [
314
397
  createVNode(unref(IconUpload))
315
398
  ]),
316
399
  default: withCtx(() => [
317
- _cache[11] || (_cache[11] = createTextVNode(" \u4E0A\u4F20 "))
400
+ _cache[14] || (_cache[14] = createTextVNode(" \u4E0A\u4F20 "))
318
401
  ]),
319
402
  _: 1
320
403
  })
321
404
  ])
322
405
  ]),
323
- searchInput.value ? (openBlock(), createElementBlock("div", _hoisted_9, [
406
+ searchInput.value ? (openBlock(), createElementBlock("div", _hoisted_13, [
324
407
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(keywordsSelection), (item) => {
325
408
  return openBlock(), createElementBlock("div", {
326
409
  key: item.value,
327
410
  class: normalizeClass(["list-filter-tag", { active: filter.value.sf === item.value }]),
328
411
  onClick: ($event) => filter.value.sf = item.value
329
- }, toDisplayString(item.name), 11, _hoisted_10);
412
+ }, toDisplayString(item.name), 11, _hoisted_14);
330
413
  }), 128))
331
414
  ])) : createCommentVNode("v-if", true)
332
415
  ]);
@@ -1,9 +1,8 @@
1
- import { defineComponent, inject, watch, onMounted, openBlock, createBlock, unref, withCtx, renderSlot, createVNode, isRef, createElementVNode, createElementBlock, Fragment, renderList } from "vue";
1
+ import { defineComponent, inject, watch, ref, onMounted, openBlock, createBlock, unref, withCtx, renderSlot, createVNode, isRef, createElementVNode, createElementBlock, Fragment, renderList } from "vue";
2
2
  import { Pagination } from "@arco-design/web-vue";
3
3
  import _sfc_main$1 from "../ListWraper.js";
4
4
  import useAttachement from "../../../../hooks/useAttachement.js";
5
5
  import _sfc_main$2 from "./Filter.js";
6
- const _hoisted_1 = { class: "list-item-grid" };
7
6
  const _sfc_main = defineComponent({
8
7
  __name: "index",
9
8
  props: {
@@ -27,6 +26,18 @@ const _sfc_main = defineComponent({
27
26
  changeKey
28
27
  } = useAttachement({ key: props.activeKey, BASE_API });
29
28
  watch(() => props.activeKey, changeKey);
29
+ const listWrapper = ref(null);
30
+ const showPageSize = ref(true);
31
+ watch(
32
+ () => {
33
+ var _a;
34
+ return (_a = listWrapper.value) == null ? void 0 : _a.offsetWidth;
35
+ },
36
+ (val) => {
37
+ showPageSize.value = !(val && val < 480);
38
+ },
39
+ { immediate: true }
40
+ );
30
41
  onMounted(() => {
31
42
  loadData();
32
43
  });
@@ -51,22 +62,26 @@ const _sfc_main = defineComponent({
51
62
  total: unref(total),
52
63
  "page-size": unref(limit),
53
64
  "show-total": "",
54
- "show-page-size": "",
65
+ "show-page-size": showPageSize.value,
55
66
  "base-size": 3,
56
67
  "buffer-size": 1,
57
68
  onChange: _cache[2] || (_cache[2] = (e) => unref(changePage)((e - 1) * unref(limit))),
58
69
  onPageSizeChange: unref(changeSize)
59
- }, null, 8, ["current", "total", "page-size", "onPageSizeChange"])
70
+ }, null, 8, ["current", "total", "page-size", "show-page-size", "onPageSizeChange"])
60
71
  ]),
61
72
  default: withCtx(() => [
62
- createElementVNode("div", _hoisted_1, [
73
+ createElementVNode("div", {
74
+ ref_key: "listWrapper",
75
+ ref: listWrapper,
76
+ class: "list-item-grid"
77
+ }, [
63
78
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(list), (item) => {
64
79
  return renderSlot(_ctx.$slots, "item", {
65
80
  key: item.id,
66
81
  item
67
82
  });
68
83
  }), 128))
69
- ])
84
+ ], 512)
70
85
  ]),
71
86
  _: 3
72
87
  }, 8, ["loading", "is-empty"]);
@@ -0,0 +1,21 @@
1
+ import type { Ref } from 'vue';
2
+ declare type HideElementType = {
3
+ width: number;
4
+ el: HTMLDivElement;
5
+ };
6
+ export declare function useResponsiveFilter(filterItemsRef: Ref<HTMLElement | undefined>): {
7
+ moreBtnRef: Ref<HTMLElement | undefined, HTMLElement | undefined>;
8
+ popperPanelRef: Ref<HTMLElement | undefined, HTMLElement | undefined>;
9
+ hiddenElementList: Ref<{
10
+ width: number;
11
+ el: HTMLDivElement;
12
+ }[], HideElementType[] | {
13
+ width: number;
14
+ el: HTMLDivElement;
15
+ }[]>;
16
+ visible: Ref<boolean, boolean>;
17
+ show: () => void;
18
+ hide: () => void;
19
+ refreshLayout: () => Promise<void>;
20
+ };
21
+ export {};
@@ -0,0 +1,142 @@
1
+ import { ref, onMounted, nextTick, onUnmounted } from "vue";
2
+ import usePopper from "../../hooks/usePopper.js";
3
+ const getRect = (el) => {
4
+ if (!el || typeof el.getClientRects !== "function")
5
+ return { right: 0, width: 0 };
6
+ const rects = el.getClientRects();
7
+ if (rects.length === 0)
8
+ return { right: 0, width: 0 };
9
+ const rect = rects[0];
10
+ return {
11
+ right: rect.right,
12
+ width: rect.width
13
+ };
14
+ };
15
+ function useResponsiveFilter(filterItemsRef) {
16
+ const moreBtnRef = ref();
17
+ const popperPanelRef = ref();
18
+ const { initPopper, show, visible, hide } = usePopper(
19
+ popperPanelRef,
20
+ moreBtnRef
21
+ );
22
+ const windowWidth = ref(0);
23
+ const filterContainerRightBoundary = ref(0);
24
+ const hiddenElementList = ref([]);
25
+ const initWidths = () => {
26
+ var _a, _b;
27
+ windowWidth.value = ((_a = document.body) == null ? void 0 : _a.clientWidth) || 0;
28
+ const containerElement = (_b = filterItemsRef.value) == null ? void 0 : _b.parentElement;
29
+ if (containerElement) {
30
+ filterContainerRightBoundary.value = getRect(containerElement).right;
31
+ }
32
+ };
33
+ const initResizeListener = () => {
34
+ window.addEventListener("resize", refreshLayout);
35
+ };
36
+ const removeResizeListener = () => {
37
+ window.removeEventListener("resize", refreshLayout);
38
+ };
39
+ const hideElement = (el) => {
40
+ var _a, _b, _c;
41
+ const { width } = getRect(el);
42
+ if (width > 0 && ((_a = filterItemsRef.value) == null ? void 0 : _a.contains(el))) {
43
+ hiddenElementList.value.push({ width, el });
44
+ (_b = filterItemsRef.value) == null ? void 0 : _b.removeChild(el);
45
+ (_c = popperPanelRef.value) == null ? void 0 : _c.insertBefore(el, popperPanelRef.value.firstChild);
46
+ }
47
+ };
48
+ const showElement = () => {
49
+ var _a, _b;
50
+ if (!hiddenElementList.value.length || !filterItemsRef.value)
51
+ return;
52
+ const popEl = hiddenElementList.value.pop();
53
+ if (!popEl)
54
+ return;
55
+ const { el } = popEl;
56
+ (_a = popperPanelRef.value) == null ? void 0 : _a.removeChild(el);
57
+ (_b = filterItemsRef.value) == null ? void 0 : _b.appendChild(el);
58
+ };
59
+ const checkOverflow = () => {
60
+ if (!filterItemsRef.value)
61
+ return -1;
62
+ const containerRight = filterContainerRightBoundary.value;
63
+ const children = filterItemsRef.value.children;
64
+ let currentRightmostBoundary = getRect(filterItemsRef.value).right - getRect(filterItemsRef.value).width;
65
+ for (let i = children.length - 1; i >= 0; i--) {
66
+ const item = children[i];
67
+ if (!item || !item.classList || !item.classList.contains("filter-item"))
68
+ continue;
69
+ const itemRect = getRect(item);
70
+ if (itemRect.right > containerRight - 300) {
71
+ hideElement(item);
72
+ } else {
73
+ currentRightmostBoundary = Math.max(
74
+ currentRightmostBoundary,
75
+ itemRect.right
76
+ );
77
+ }
78
+ }
79
+ return currentRightmostBoundary;
80
+ };
81
+ const refreshLayout = async () => {
82
+ await nextTick();
83
+ initWidths();
84
+ if (!filterItemsRef.value || !popperPanelRef.value)
85
+ return;
86
+ const containerRight = filterContainerRightBoundary.value;
87
+ let lastVisibleItemRight = checkOverflow();
88
+ if (lastVisibleItemRight === -1 && filterItemsRef.value.children.length > 0) {
89
+ lastVisibleItemRight = getRect(filterItemsRef.value).left;
90
+ } else if (filterItemsRef.value.children.length === 0) {
91
+ lastVisibleItemRight = getRect(filterItemsRef.value).left;
92
+ }
93
+ await nextTick();
94
+ let availableSpace = containerRight - lastVisibleItemRight;
95
+ while (hiddenElementList.value.length > 0) {
96
+ const nextHiddenItem = hiddenElementList.value[hiddenElementList.value.length - 1];
97
+ const nextHiddenItemWidth = nextHiddenItem.width;
98
+ if (availableSpace > nextHiddenItemWidth + 10) {
99
+ showElement();
100
+ await nextTick();
101
+ const visibleElements = Array.from(
102
+ filterItemsRef.value.children
103
+ );
104
+ if (visibleElements.length > 0) {
105
+ lastVisibleItemRight = visibleElements.reduce((maxRight, el) => {
106
+ var _a;
107
+ if ((_a = el.classList) == null ? void 0 : _a.contains("filter-item")) {
108
+ return Math.max(maxRight, getRect(el).right);
109
+ }
110
+ return maxRight;
111
+ }, getRect(filterItemsRef.value).left);
112
+ } else {
113
+ lastVisibleItemRight = getRect(filterItemsRef.value).left;
114
+ }
115
+ availableSpace = containerRight - lastVisibleItemRight;
116
+ } else {
117
+ break;
118
+ }
119
+ }
120
+ };
121
+ onMounted(async () => {
122
+ initResizeListener();
123
+ initPopper("bottom-start", [0, 40]);
124
+ await nextTick();
125
+ initWidths();
126
+ await nextTick();
127
+ refreshLayout();
128
+ });
129
+ onUnmounted(() => {
130
+ removeResizeListener();
131
+ });
132
+ return {
133
+ moreBtnRef,
134
+ popperPanelRef,
135
+ hiddenElementList,
136
+ visible,
137
+ show,
138
+ hide,
139
+ refreshLayout
140
+ };
141
+ }
142
+ export { useResponsiveFilter };
@@ -7,7 +7,7 @@ function useCompoentLifycycle(props, emits, handler) {
7
7
  return {
8
8
  class: "resource-select-drawer",
9
9
  header: false,
10
- width: "1024px",
10
+ width: "85vw",
11
11
  footer: false,
12
12
  unmountOnClose: true
13
13
  };