@cmstops/pro-compo 3.9.1-rc.4 → 3.9.1-rc.5

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.
@@ -1,43 +1,71 @@
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, TreeSelect, Select, Option, 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, IconRefresh, 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
- style: { "width": "170px" }
16
+ style: { "width": "200px" }
17
+ };
18
+ const _hoisted_6 = {
19
+ class: "filter-item",
20
+ style: { "width": "180px" }
16
21
  };
17
- const _hoisted_6 = { class: "filter-item" };
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: {
48
+ smallScreen: { type: Boolean },
31
49
  disableUploadBy: { type: Boolean }
32
50
  },
33
51
  emits: ["upload", "change"],
34
52
  setup(__props, { expose: __expose, emit: __emit }) {
53
+ var _a, _b, _c;
35
54
  const props = __props;
36
55
  const emits = __emit;
37
56
  const userInfo = inject("userInfo");
38
57
  const baseAPI = inject("baseAPI");
39
58
  const filterOptions = inject("filterOptions");
40
59
  const domainId = computed(() => userInfo == null ? void 0 : userInfo.value.domain_id);
60
+ const filterItemsRef = ref();
61
+ const {
62
+ moreBtnRef,
63
+ popperPanelRef,
64
+ hiddenElementList,
65
+ visible,
66
+ show,
67
+ hide
68
+ } = useResponsiveFilter(filterItemsRef);
41
69
  const { options, loading, load, loadMore, handleSearch } = useSelection({
42
70
  labelStr: "alias",
43
71
  valueStr: "id",
@@ -71,7 +99,17 @@ const _sfc_main = defineComponent({
71
99
  sf: "",
72
100
  directory_id: void 0
73
101
  };
74
- const filter = ref(JSON.parse(JSON.stringify(originFilter)));
102
+ if ((_a = filterOptions == null ? void 0 : filterOptions.value) == null ? void 0 : _a.mediaTypeStrict) {
103
+ originFilter.catalog = filterOptions.value.mediaType.split(",");
104
+ }
105
+ const filter = ref(
106
+ JSON.parse(
107
+ JSON.stringify({
108
+ ...originFilter,
109
+ catalog: ((_c = (_b = filterOptions == null ? void 0 : filterOptions.value) == null ? void 0 : _b.mediaType) == null ? void 0 : _c.split(",")) || []
110
+ })
111
+ )
112
+ );
75
113
  const handleReset = () => {
76
114
  filter.value = JSON.parse(JSON.stringify(originFilter));
77
115
  };
@@ -116,82 +154,114 @@ const _sfc_main = defineComponent({
116
154
  filter.value.keyword = val;
117
155
  filter.value.precise_keyword = "";
118
156
  }
157
+ filter.value.sf = "";
119
158
  }
120
159
  });
121
- watch(
122
- () => searchType.value,
123
- () => {
124
- searchInput.value = filter.value.keyword || filter.value.precise_keyword;
125
- }
126
- );
127
160
  const isEmpty = computed(() => {
128
- return Object.keys(filter.value).every((key) => {
161
+ return Object.keys(originFilter).every((key) => {
162
+ if (key === "catalog") {
163
+ const currentCatalog = filter.value[key] || [];
164
+ const originCatalog = originFilter[key] || [];
165
+ return currentCatalog.length === originCatalog.length && currentCatalog.every((v) => originCatalog.includes(v));
166
+ }
129
167
  return filter.value[key] === originFilter[key];
130
168
  });
131
169
  });
132
170
  watch(
133
171
  () => filter.value,
134
- () => {
135
- const result = { ...filter.value };
172
+ (val) => {
173
+ const result = { ...val };
136
174
  Object.keys(result).forEach((key) => {
137
175
  if (props.disableUploadBy && key === "upload_by")
138
176
  delete result[key];
139
- if (!result[key])
140
- delete result[key];
177
+ if (result[key] === "" || result[key] === null || result[key] === void 0) {
178
+ if (key !== "catalog") {
179
+ delete result[key];
180
+ }
181
+ }
141
182
  });
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(",");
183
+ if (result.catalog && Array.isArray(result.catalog)) {
184
+ if (result.catalog.length > 0) {
185
+ result.catalog = result.catalog.join(",");
186
+ } else {
187
+ delete result.catalog;
158
188
  }
159
189
  }
190
+ emits("change", result);
160
191
  },
161
- { immediate: true, deep: true }
192
+ { deep: true, immediate: true }
162
193
  );
163
194
  onMounted(() => {
164
195
  load();
165
196
  });
166
197
  __expose({
167
- resetFilter: handleReset
198
+ filter,
199
+ handleReset
168
200
  });
169
201
  return (_ctx, _cache) => {
170
- var _a;
202
+ var _a2;
171
203
  return openBlock(), createElementBlock("div", _hoisted_1, [
204
+ createCommentVNode(" Use filterItemsRef's parentElement as the container for boundary checks "),
172
205
  createElementVNode("div", _hoisted_2, [
173
- createElementVNode("div", _hoisted_3, [
206
+ createCommentVNode(" Filter Items Container "),
207
+ createElementVNode("div", {
208
+ id: "resource-filter-pannel",
209
+ ref_key: "filterItemsRef",
210
+ ref: filterItemsRef,
211
+ class: "filter-list"
212
+ }, [
213
+ createCommentVNode(" More Filters Button and Popper Panel "),
214
+ createElementVNode("div", _hoisted_3, [
215
+ createElementVNode("div", {
216
+ ref_key: "moreBtnRef",
217
+ ref: moreBtnRef
218
+ }, [
219
+ withDirectives(createVNode(unref(Button), {
220
+ style: { marginRight: "10px" },
221
+ onClick: _cache[0] || (_cache[0] = withModifiers(() => unref(visible) ? unref(hide)() : unref(show)(), ["stop"]))
222
+ }, {
223
+ default: withCtx(() => [
224
+ createElementVNode("span", _hoisted_4, [
225
+ _cache[11] || (_cache[11] = createTextVNode(" \u66F4\u591A ")),
226
+ createVNode(unref(IconCaretDown))
227
+ ])
228
+ ]),
229
+ _: 1
230
+ }, 512), [
231
+ [vShow, unref(hiddenElementList).length]
232
+ ])
233
+ ], 512),
234
+ withDirectives(createElementVNode("div", {
235
+ ref_key: "popperPanelRef",
236
+ ref: popperPanelRef,
237
+ class: "filter-pannel",
238
+ onClick: _cache[1] || (_cache[1] = withModifiers(() => {
239
+ }, ["stop"]))
240
+ }, null, 512), [
241
+ [vShow, unref(visible)]
242
+ ])
243
+ ]),
174
244
  createCommentVNode(" \u5173\u952E\u8BCD "),
175
- createElementVNode("div", _hoisted_4, [
245
+ createElementVNode("div", _hoisted_5, [
176
246
  createVNode(unref(Input), {
177
247
  modelValue: searchInput.value,
178
- "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => searchInput.value = $event),
248
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => searchInput.value = $event),
179
249
  "allow-clear": "",
180
250
  placeholder: "\u8BF7\u8F93\u5165\u5173\u952E\u8BCD"
181
251
  }, {
182
252
  prepend: withCtx(() => [
183
253
  createVNode(unref(Dropdown), {
184
- onSelect: _cache[0] || (_cache[0] = (e) => searchType.value = e)
254
+ onSelect: _cache[2] || (_cache[2] = (e) => searchType.value = e)
185
255
  }, {
186
256
  content: withCtx(() => [
187
257
  createVNode(unref(Doption), { value: 0 }, {
188
- default: withCtx(() => _cache[8] || (_cache[8] = [
258
+ default: withCtx(() => _cache[12] || (_cache[12] = [
189
259
  createTextVNode("\u7CBE\u51C6\u641C")
190
260
  ])),
191
261
  _: 1
192
262
  }),
193
263
  createVNode(unref(Doption), { value: 1 }, {
194
- default: withCtx(() => _cache[9] || (_cache[9] = [
264
+ default: withCtx(() => _cache[13] || (_cache[13] = [
195
265
  createTextVNode("\u6A21\u7CCA\u641C")
196
266
  ])),
197
267
  _: 1
@@ -212,24 +282,28 @@ const _sfc_main = defineComponent({
212
282
  }, 8, ["modelValue"])
213
283
  ]),
214
284
  createCommentVNode(" \u76EE\u5F55 "),
215
- createVNode(unref(TreeSelect), {
216
- modelValue: filter.value.directory_id,
217
- "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => filter.value.directory_id = $event),
218
- data: unref(tree),
219
- placeholder: "\u8BF7\u9009\u62E9\u76EE\u5F55",
220
- style: { "width": "120px" },
221
- "field-names": {
222
- title: "alias",
223
- key: "id"
224
- },
225
- "allow-clear": ""
226
- }, null, 8, ["modelValue", "data"]),
285
+ createElementVNode("div", _hoisted_6, [
286
+ createVNode(unref(TreeSelect), {
287
+ modelValue: filter.value.directory_id,
288
+ "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => filter.value.directory_id = $event),
289
+ data: unref(tree),
290
+ "popup-container": "#resource-filter-pannel",
291
+ placeholder: "\u8BF7\u9009\u62E9\u76EE\u5F55",
292
+ "field-names": {
293
+ title: "alias",
294
+ key: "id"
295
+ },
296
+ "allow-clear": "",
297
+ "allow-search": ""
298
+ }, null, 8, ["modelValue", "data"])
299
+ ]),
227
300
  createCommentVNode(" \u7D20\u6750\u7C7B\u578B "),
228
- createElementVNode("div", _hoisted_5, [
301
+ createElementVNode("div", _hoisted_7, [
229
302
  createVNode(unref(Select), {
230
303
  modelValue: filter.value.catalog,
231
- "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => filter.value.catalog = $event),
232
- disabled: (_a = unref(filterOptions)) == null ? void 0 : _a.mediaTypeStrict,
304
+ "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => filter.value.catalog = $event),
305
+ disabled: (_a2 = unref(filterOptions)) == null ? void 0 : _a2.mediaTypeStrict,
306
+ "popup-container": "#resource-filter-pannel",
233
307
  "allow-clear": "",
234
308
  placeholder: "\u7C7B\u578B",
235
309
  multiple: "",
@@ -248,19 +322,22 @@ const _sfc_main = defineComponent({
248
322
  }, 8, ["modelValue", "disabled"])
249
323
  ]),
250
324
  createCommentVNode(" \u65F6\u95F4\u8303\u56F4 "),
251
- createVNode(unref(RangePicker), {
252
- modelValue: rangeTime.value,
253
- "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => rangeTime.value = $event),
254
- "allow-clear": "",
255
- style: { "width": "240px" }
256
- }, null, 8, ["modelValue"]),
325
+ createElementVNode("div", _hoisted_8, [
326
+ createVNode(unref(RangePicker), {
327
+ modelValue: rangeTime.value,
328
+ "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => rangeTime.value = $event),
329
+ "allow-clear": "",
330
+ "popup-container": "#resource-filter-pannel"
331
+ }, null, 8, ["modelValue"])
332
+ ]),
257
333
  createCommentVNode(" \u7D20\u6750\u4E0A\u4F20\u6765\u6E90 "),
258
- createElementVNode("div", _hoisted_6, [
334
+ createElementVNode("div", _hoisted_9, [
259
335
  createVNode(unref(Select), {
260
336
  modelValue: filter.value.source,
261
- "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => filter.value.source = $event),
337
+ "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => filter.value.source = $event),
262
338
  "allow-clear": "",
263
- placeholder: "\u6765\u6E90"
339
+ placeholder: "\u6765\u6E90",
340
+ "popup-container": "#resource-filter-pannel"
264
341
  }, {
265
342
  default: withCtx(() => [
266
343
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(resourceSource), (item) => {
@@ -275,14 +352,15 @@ const _sfc_main = defineComponent({
275
352
  }, 8, ["modelValue"])
276
353
  ]),
277
354
  createCommentVNode(" \u7D20\u6750\u4E0A\u4F20\u4EBA "),
278
- !_ctx.disableUploadBy ? (openBlock(), createElementBlock("div", _hoisted_7, [
355
+ !_ctx.disableUploadBy ? (openBlock(), createElementBlock("div", _hoisted_10, [
279
356
  createVNode(unref(Select), {
280
357
  modelValue: filter.value.upload_by,
281
- "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => filter.value.upload_by = $event),
358
+ "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => filter.value.upload_by = $event),
282
359
  "allow-clear": "",
283
360
  placeholder: "\u4E0A\u4F20\u4EBA",
284
361
  loading: unref(loading),
285
362
  "allow-search": "",
363
+ "popup-container": "#resource-filter-pannel",
286
364
  onSearch: unref(handleSearch),
287
365
  onDropdownReachBottom: unref(loadMore)
288
366
  }, {
@@ -297,40 +375,64 @@ const _sfc_main = defineComponent({
297
375
  ]),
298
376
  _: 1
299
377
  }, 8, ["modelValue", "loading", "onSearch", "onDropdownReachBottom"])
300
- ])) : createCommentVNode("v-if", true),
301
- !isEmpty.value ? (openBlock(), createBlock(unref(Button), {
302
- key: 1,
303
- type: "text",
304
- onClick: handleReset
378
+ ])) : createCommentVNode("v-if", true)
379
+ ], 512),
380
+ createElementVNode("div", _hoisted_11, [
381
+ createCommentVNode(" \u91CD\u7F6E\u6309\u94AE - Wrap in filter-item to be managed by the hook "),
382
+ withDirectives(createElementVNode("div", _hoisted_12, [
383
+ _ctx.smallScreen ? (openBlock(), createBlock(unref(Button), {
384
+ key: 0,
385
+ type: "text",
386
+ onClick: handleReset
387
+ }, {
388
+ icon: withCtx(() => [
389
+ createVNode(unref(IconRefresh))
390
+ ]),
391
+ _: 1
392
+ })) : (openBlock(), createBlock(unref(Button), {
393
+ key: 1,
394
+ type: "text",
395
+ onClick: handleReset
396
+ }, {
397
+ default: withCtx(() => _cache[14] || (_cache[14] = [
398
+ createTextVNode(" \u91CD\u7F6E ")
399
+ ])),
400
+ _: 1
401
+ }))
402
+ ], 512), [
403
+ [vShow, !isEmpty.value]
404
+ ]),
405
+ _ctx.smallScreen ? (openBlock(), createBlock(unref(Button), {
406
+ key: 0,
407
+ type: "primary",
408
+ onClick: _cache[9] || (_cache[9] = ($event) => emits("upload"))
305
409
  }, {
306
- default: withCtx(() => _cache[10] || (_cache[10] = [
307
- createTextVNode(" \u91CD\u7F6E ")
308
- ])),
410
+ icon: withCtx(() => [
411
+ createVNode(unref(IconUpload))
412
+ ]),
309
413
  _: 1
310
- })) : createCommentVNode("v-if", true)
311
- ]),
312
- createElementVNode("div", _hoisted_8, [
313
- createVNode(unref(Button), {
414
+ })) : (openBlock(), createBlock(unref(Button), {
415
+ key: 1,
314
416
  type: "primary",
315
- onClick: _cache[7] || (_cache[7] = ($event) => emits("upload"))
417
+ onClick: _cache[10] || (_cache[10] = ($event) => emits("upload"))
316
418
  }, {
317
419
  icon: withCtx(() => [
318
420
  createVNode(unref(IconUpload))
319
421
  ]),
320
422
  default: withCtx(() => [
321
- _cache[11] || (_cache[11] = createTextVNode(" \u4E0A\u4F20 "))
423
+ _cache[15] || (_cache[15] = createTextVNode(" \u4E0A\u4F20 "))
322
424
  ]),
323
425
  _: 1
324
- })
426
+ }))
325
427
  ])
326
428
  ]),
327
- searchInput.value ? (openBlock(), createElementBlock("div", _hoisted_9, [
429
+ searchInput.value ? (openBlock(), createElementBlock("div", _hoisted_13, [
328
430
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(keywordsSelection), (item) => {
329
431
  return openBlock(), createElementBlock("div", {
330
432
  key: item.value,
331
433
  class: normalizeClass(["list-filter-tag", { active: filter.value.sf === item.value }]),
332
434
  onClick: ($event) => filter.value.sf = item.value
333
- }, toDisplayString(item.name), 11, _hoisted_10);
435
+ }, toDisplayString(item.name), 11, _hoisted_14);
334
436
  }), 128))
335
437
  ])) : createCommentVNode("v-if", true)
336
438
  ]);
@@ -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 smallScreen = ref(false);
31
+ watch(
32
+ () => {
33
+ var _a;
34
+ return (_a = listWrapper.value) == null ? void 0 : _a.offsetWidth;
35
+ },
36
+ (val) => {
37
+ smallScreen.value = !!(val && val < 600);
38
+ },
39
+ { immediate: true }
40
+ );
30
41
  onMounted(() => {
31
42
  loadData();
32
43
  });
@@ -40,9 +51,10 @@ const _sfc_main = defineComponent({
40
51
  ]),
41
52
  header: withCtx(() => [
42
53
  createVNode(_sfc_main$2, {
54
+ smallScreen: smallScreen.value,
43
55
  onChange: unref(changeFilter),
44
56
  onUpload: _cache[0] || (_cache[0] = ($event) => emits("change-tab", "local"))
45
- }, null, 8, ["onChange"])
57
+ }, null, 8, ["smallScreen", "onChange"])
46
58
  ]),
47
59
  footer: withCtx(() => [
48
60
  createVNode(unref(Pagination), {
@@ -51,22 +63,26 @@ const _sfc_main = defineComponent({
51
63
  total: unref(total),
52
64
  "page-size": unref(limit),
53
65
  "show-total": "",
54
- "show-page-size": "",
66
+ "show-page-size": !smallScreen.value,
55
67
  "base-size": 3,
56
68
  "buffer-size": 1,
57
69
  onChange: _cache[2] || (_cache[2] = (e) => unref(changePage)((e - 1) * unref(limit))),
58
70
  onPageSizeChange: unref(changeSize)
59
- }, null, 8, ["current", "total", "page-size", "onPageSizeChange"])
71
+ }, null, 8, ["current", "total", "page-size", "show-page-size", "onPageSizeChange"])
60
72
  ]),
61
73
  default: withCtx(() => [
62
- createElementVNode("div", _hoisted_1, [
74
+ createElementVNode("div", {
75
+ ref_key: "listWrapper",
76
+ ref: listWrapper,
77
+ class: "list-item-grid"
78
+ }, [
63
79
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(list), (item) => {
64
80
  return renderSlot(_ctx.$slots, "item", {
65
81
  key: item.id,
66
82
  item
67
83
  });
68
84
  }), 128))
69
- ])
85
+ ], 512)
70
86
  ]),
71
87
  _: 3
72
88
  }, 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 - 400) {
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 };