@cmstops/pro-compo 3.9.1-stable.0 → 3.9.1-stable.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 (38) hide show
  1. package/dist/index.css +45 -4
  2. package/dist/index.min.css +1 -1
  3. package/es/config.js +1 -1
  4. package/es/contentDetailList/component.js +24 -0
  5. package/es/contentDetailList/components/Content/index.js +2 -1
  6. package/es/contentDetailList/components/Doc/index.js +6 -0
  7. package/es/hooks/usePopper.d.ts +1 -1
  8. package/es/hooks/usePopper.js +3 -3
  9. package/es/hooks/useUpload.d.ts +50 -2
  10. package/es/hooks/useUpload.js +43 -4
  11. package/es/index.css +45 -4
  12. package/es/selectResourceModal/__demo__/module/DivWrapper.d.ts +268 -0
  13. package/es/selectResourceModal/__demo__/module/basic.d.ts +299 -0
  14. package/es/selectResourceModal/components/List/ListLocal/index.js +8 -3
  15. package/es/selectResourceModal/components/List/ListNormal/Filter.js +198 -90
  16. package/es/selectResourceModal/components/List/ListNormal/index.js +23 -7
  17. package/es/selectResourceModal/hooks/useResponsiveFilter.d.ts +21 -0
  18. package/es/selectResourceModal/hooks/useResponsiveFilter.js +142 -0
  19. package/es/selectResourceModal/style/index.css +45 -4
  20. package/es/selectResourceModal/style/index.less +14 -0
  21. package/es/selectResourceModal/style/list.less +40 -4
  22. package/es/utils/index.js +6 -6
  23. package/lib/config.js +1 -1
  24. package/lib/contentDetailList/component.js +24 -0
  25. package/lib/contentDetailList/components/Content/index.js +2 -1
  26. package/lib/contentDetailList/components/Doc/index.js +6 -0
  27. package/lib/hooks/usePopper.js +3 -3
  28. package/lib/hooks/useUpload.js +43 -3
  29. package/lib/index.css +45 -4
  30. package/lib/selectResourceModal/components/List/ListLocal/index.js +6 -1
  31. package/lib/selectResourceModal/components/List/ListNormal/Filter.js +195 -87
  32. package/lib/selectResourceModal/components/List/ListNormal/index.js +22 -6
  33. package/lib/selectResourceModal/hooks/useResponsiveFilter.js +144 -0
  34. package/lib/selectResourceModal/style/index.css +45 -4
  35. package/lib/selectResourceModal/style/index.less +14 -0
  36. package/lib/selectResourceModal/style/list.less +40 -4
  37. package/lib/utils/index.js +6 -6
  38. package/package.json +1 -1
@@ -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,34 @@ 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
+ "filter-tree-node": (searchValue, nodeData) => {
299
+ console.log(nodeData);
300
+ if (!nodeData.alias)
301
+ return false;
302
+ return nodeData.alias.toLowerCase().indexOf(searchValue.toLowerCase()) > -1;
303
+ }
304
+ }, null, 8, ["modelValue", "data", "filter-tree-node"])
305
+ ]),
227
306
  createCommentVNode(" \u7D20\u6750\u7C7B\u578B "),
228
- createElementVNode("div", _hoisted_5, [
307
+ createElementVNode("div", _hoisted_7, [
229
308
  createVNode(unref(Select), {
230
309
  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,
310
+ "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => filter.value.catalog = $event),
311
+ disabled: (_a2 = unref(filterOptions)) == null ? void 0 : _a2.mediaTypeStrict,
312
+ "popup-container": "#resource-filter-pannel",
233
313
  "allow-clear": "",
234
314
  placeholder: "\u7C7B\u578B",
235
315
  multiple: "",
@@ -248,19 +328,22 @@ const _sfc_main = defineComponent({
248
328
  }, 8, ["modelValue", "disabled"])
249
329
  ]),
250
330
  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"]),
331
+ createElementVNode("div", _hoisted_8, [
332
+ createVNode(unref(RangePicker), {
333
+ modelValue: rangeTime.value,
334
+ "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => rangeTime.value = $event),
335
+ "allow-clear": "",
336
+ "popup-container": "#resource-filter-pannel"
337
+ }, null, 8, ["modelValue"])
338
+ ]),
257
339
  createCommentVNode(" \u7D20\u6750\u4E0A\u4F20\u6765\u6E90 "),
258
- createElementVNode("div", _hoisted_6, [
340
+ createElementVNode("div", _hoisted_9, [
259
341
  createVNode(unref(Select), {
260
342
  modelValue: filter.value.source,
261
- "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => filter.value.source = $event),
343
+ "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => filter.value.source = $event),
262
344
  "allow-clear": "",
263
- placeholder: "\u6765\u6E90"
345
+ placeholder: "\u6765\u6E90",
346
+ "popup-container": "#resource-filter-pannel"
264
347
  }, {
265
348
  default: withCtx(() => [
266
349
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(resourceSource), (item) => {
@@ -275,14 +358,15 @@ const _sfc_main = defineComponent({
275
358
  }, 8, ["modelValue"])
276
359
  ]),
277
360
  createCommentVNode(" \u7D20\u6750\u4E0A\u4F20\u4EBA "),
278
- !_ctx.disableUploadBy ? (openBlock(), createElementBlock("div", _hoisted_7, [
361
+ !_ctx.disableUploadBy ? (openBlock(), createElementBlock("div", _hoisted_10, [
279
362
  createVNode(unref(Select), {
280
363
  modelValue: filter.value.upload_by,
281
- "onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => filter.value.upload_by = $event),
364
+ "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => filter.value.upload_by = $event),
282
365
  "allow-clear": "",
283
366
  placeholder: "\u4E0A\u4F20\u4EBA",
284
367
  loading: unref(loading),
285
368
  "allow-search": "",
369
+ "popup-container": "#resource-filter-pannel",
286
370
  onSearch: unref(handleSearch),
287
371
  onDropdownReachBottom: unref(loadMore)
288
372
  }, {
@@ -297,40 +381,64 @@ const _sfc_main = defineComponent({
297
381
  ]),
298
382
  _: 1
299
383
  }, 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
384
+ ])) : createCommentVNode("v-if", true)
385
+ ], 512),
386
+ createElementVNode("div", _hoisted_11, [
387
+ createCommentVNode(" \u91CD\u7F6E\u6309\u94AE - Wrap in filter-item to be managed by the hook "),
388
+ withDirectives(createElementVNode("div", _hoisted_12, [
389
+ _ctx.smallScreen ? (openBlock(), createBlock(unref(Button), {
390
+ key: 0,
391
+ type: "text",
392
+ onClick: handleReset
393
+ }, {
394
+ icon: withCtx(() => [
395
+ createVNode(unref(IconRefresh))
396
+ ]),
397
+ _: 1
398
+ })) : (openBlock(), createBlock(unref(Button), {
399
+ key: 1,
400
+ type: "text",
401
+ onClick: handleReset
402
+ }, {
403
+ default: withCtx(() => _cache[14] || (_cache[14] = [
404
+ createTextVNode(" \u91CD\u7F6E ")
405
+ ])),
406
+ _: 1
407
+ }))
408
+ ], 512), [
409
+ [vShow, !isEmpty.value]
410
+ ]),
411
+ _ctx.smallScreen ? (openBlock(), createBlock(unref(Button), {
412
+ key: 0,
413
+ type: "primary",
414
+ onClick: _cache[9] || (_cache[9] = ($event) => emits("upload"))
305
415
  }, {
306
- default: withCtx(() => _cache[10] || (_cache[10] = [
307
- createTextVNode(" \u91CD\u7F6E ")
308
- ])),
416
+ icon: withCtx(() => [
417
+ createVNode(unref(IconUpload))
418
+ ]),
309
419
  _: 1
310
- })) : createCommentVNode("v-if", true)
311
- ]),
312
- createElementVNode("div", _hoisted_8, [
313
- createVNode(unref(Button), {
420
+ })) : (openBlock(), createBlock(unref(Button), {
421
+ key: 1,
314
422
  type: "primary",
315
- onClick: _cache[7] || (_cache[7] = ($event) => emits("upload"))
423
+ onClick: _cache[10] || (_cache[10] = ($event) => emits("upload"))
316
424
  }, {
317
425
  icon: withCtx(() => [
318
426
  createVNode(unref(IconUpload))
319
427
  ]),
320
428
  default: withCtx(() => [
321
- _cache[11] || (_cache[11] = createTextVNode(" \u4E0A\u4F20 "))
429
+ _cache[15] || (_cache[15] = createTextVNode(" \u4E0A\u4F20 "))
322
430
  ]),
323
431
  _: 1
324
- })
432
+ }))
325
433
  ])
326
434
  ]),
327
- searchInput.value ? (openBlock(), createElementBlock("div", _hoisted_9, [
435
+ searchInput.value ? (openBlock(), createElementBlock("div", _hoisted_13, [
328
436
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(keywordsSelection), (item) => {
329
437
  return openBlock(), createElementBlock("div", {
330
438
  key: item.value,
331
439
  class: normalizeClass(["list-filter-tag", { active: filter.value.sf === item.value }]),
332
440
  onClick: ($event) => filter.value.sf = item.value
333
- }, toDisplayString(item.name), 11, _hoisted_10);
441
+ }, toDisplayString(item.name), 11, _hoisted_14);
334
442
  }), 128))
335
443
  ])) : createCommentVNode("v-if", true)
336
444
  ]);
@@ -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 };