@cmstops/pro-compo 0.3.100 → 3.0.0-stable.0

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 (47) hide show
  1. package/dist/index.css +45 -4
  2. package/dist/index.min.css +1 -1
  3. package/es/baseFilter/component.js +71 -14
  4. package/es/config.js +1 -1
  5. package/es/contentDetailList/component.js +24 -0
  6. package/es/contentDetailList/components/Content/index.js +2 -1
  7. package/es/contentDetailList/components/Doc/index.js +6 -0
  8. package/es/hooks/useAttachement.d.ts +26 -7
  9. package/es/hooks/useAttachement.js +42 -2
  10. package/es/hooks/usePopper.d.ts +1 -1
  11. package/es/hooks/usePopper.js +3 -3
  12. package/es/hooks/useUpload.d.ts +50 -2
  13. package/es/hooks/useUpload.js +43 -4
  14. package/es/index.css +45 -4
  15. package/es/selectResourceModal/__demo__/module/DivWrapper.d.ts +268 -0
  16. package/es/selectResourceModal/__demo__/module/basic.d.ts +299 -0
  17. package/es/selectResourceModal/components/List/ListLocal/index.js +8 -3
  18. package/es/selectResourceModal/components/List/ListNormal/Filter.js +206 -79
  19. package/es/selectResourceModal/components/List/ListNormal/index.js +23 -7
  20. package/es/selectResourceModal/hooks/useResponsiveFilter.d.ts +21 -0
  21. package/es/selectResourceModal/hooks/useResponsiveFilter.js +142 -0
  22. package/es/selectResourceModal/scripts/useCompoLf.js +1 -1
  23. package/es/selectResourceModal/style/index.css +45 -4
  24. package/es/selectResourceModal/style/index.less +14 -0
  25. package/es/selectResourceModal/style/list.less +40 -4
  26. package/es/selectThumb/component.js +57 -3
  27. package/es/utils/index.js +6 -6
  28. package/lib/baseFilter/component.js +69 -12
  29. package/lib/config.js +1 -1
  30. package/lib/contentDetailList/component.js +24 -0
  31. package/lib/contentDetailList/components/Content/index.js +2 -1
  32. package/lib/contentDetailList/components/Doc/index.js +6 -0
  33. package/lib/hooks/useAttachement.js +42 -0
  34. package/lib/hooks/usePopper.js +3 -3
  35. package/lib/hooks/useUpload.js +43 -3
  36. package/lib/index.css +45 -4
  37. package/lib/selectResourceModal/components/List/ListLocal/index.js +6 -1
  38. package/lib/selectResourceModal/components/List/ListNormal/Filter.js +203 -76
  39. package/lib/selectResourceModal/components/List/ListNormal/index.js +22 -6
  40. package/lib/selectResourceModal/hooks/useResponsiveFilter.js +144 -0
  41. package/lib/selectResourceModal/scripts/useCompoLf.js +1 -1
  42. package/lib/selectResourceModal/style/index.css +45 -4
  43. package/lib/selectResourceModal/style/index.less +14 -0
  44. package/lib/selectResourceModal/style/list.less +40 -4
  45. package/lib/selectThumb/component.js +56 -2
  46. package/lib/utils/index.js +6 -6
  47. package/package.json +1 -1
@@ -1,42 +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, 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
+ import { useDirectory } from "../../../../hooks/useAttachement.js";
5
6
  import { RESOURCE_SOURCE_OPTIONS, RESOURCE_CATALOG_OPTIONS } from "../../../../utils/typeMap.js";
6
7
  import { getAccountList } from "../../../scripts/selectionApis.js";
7
8
  import { keywordsSelection } from "../../../../utils/resource.js";
9
+ import { useResponsiveFilter } from "../../../hooks/useResponsiveFilter.js";
8
10
  const _hoisted_1 = { class: "list-filter-wrapper" };
9
11
  const _hoisted_2 = { class: "list-filter" };
10
- const _hoisted_3 = { class: "filter-list" };
11
- const _hoisted_4 = { style: { "width": "200px" } };
12
+ const _hoisted_3 = { class: "more-btn" };
13
+ const _hoisted_4 = { class: "right-prefix" };
12
14
  const _hoisted_5 = {
13
15
  class: "filter-item",
14
16
  style: { "width": "200px" }
15
17
  };
16
- const _hoisted_6 = { class: "filter-item" };
18
+ const _hoisted_6 = {
19
+ class: "filter-item",
20
+ style: { "width": "180px" }
21
+ };
17
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 = {
18
35
  key: 0,
19
36
  class: "filter-item"
20
37
  };
21
- const _hoisted_8 = { class: "filter-extra" };
22
- const _hoisted_9 = {
38
+ const _hoisted_11 = { class: "filter-extra" };
39
+ const _hoisted_12 = { class: "filter-item" };
40
+ const _hoisted_13 = {
23
41
  key: 0,
24
42
  class: "list-filter-tags"
25
43
  };
26
- const _hoisted_10 = ["onClick"];
44
+ const _hoisted_14 = ["onClick"];
27
45
  const _sfc_main = defineComponent({
28
46
  __name: "Filter",
29
47
  props: {
48
+ smallScreen: { type: Boolean },
30
49
  disableUploadBy: { type: Boolean }
31
50
  },
32
51
  emits: ["upload", "change"],
33
52
  setup(__props, { expose: __expose, emit: __emit }) {
53
+ var _a, _b, _c;
34
54
  const props = __props;
35
55
  const emits = __emit;
36
56
  const userInfo = inject("userInfo");
37
57
  const baseAPI = inject("baseAPI");
38
58
  const filterOptions = inject("filterOptions");
39
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);
40
69
  const { options, loading, load, loadMore, handleSearch } = useSelection({
41
70
  labelStr: "alias",
42
71
  valueStr: "id",
@@ -56,6 +85,9 @@ const _sfc_main = defineComponent({
56
85
  });
57
86
  const resourceSource = RESOURCE_SOURCE_OPTIONS;
58
87
  const resourceCatalog = RESOURCE_CATALOG_OPTIONS;
88
+ const { tree } = useDirectory({
89
+ BASE_API: baseAPI
90
+ });
59
91
  const originFilter = {
60
92
  catalog: [],
61
93
  source: "",
@@ -64,9 +96,20 @@ const _sfc_main = defineComponent({
64
96
  keyword: "",
65
97
  precise_keyword: "",
66
98
  upload_by: null,
67
- sf: ""
99
+ sf: "",
100
+ directory_id: void 0
68
101
  };
69
- 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
+ );
70
113
  const handleReset = () => {
71
114
  filter.value = JSON.parse(JSON.stringify(originFilter));
72
115
  };
@@ -111,82 +154,114 @@ const _sfc_main = defineComponent({
111
154
  filter.value.keyword = val;
112
155
  filter.value.precise_keyword = "";
113
156
  }
157
+ filter.value.sf = "";
114
158
  }
115
159
  });
116
- watch(
117
- () => searchType.value,
118
- () => {
119
- searchInput.value = filter.value.keyword || filter.value.precise_keyword;
120
- }
121
- );
122
160
  const isEmpty = computed(() => {
123
- 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
+ }
124
167
  return filter.value[key] === originFilter[key];
125
168
  });
126
169
  });
127
170
  watch(
128
171
  () => filter.value,
129
- () => {
130
- const result = { ...filter.value };
172
+ (val) => {
173
+ const result = { ...val };
131
174
  Object.keys(result).forEach((key) => {
132
175
  if (props.disableUploadBy && key === "upload_by")
133
176
  delete result[key];
134
- if (!result[key])
135
- delete result[key];
177
+ if (result[key] === "" || result[key] === null || result[key] === void 0) {
178
+ if (key !== "catalog") {
179
+ delete result[key];
180
+ }
181
+ }
136
182
  });
137
- if (!result.catalog)
138
- result.catalog = "image,video,audio";
139
- else
140
- result.catalog = result.catalog.join(",");
141
- emits("change", result);
142
- },
143
- { deep: true, immediate: true }
144
- );
145
- watch(
146
- () => filterOptions == null ? void 0 : filterOptions.value,
147
- () => {
148
- var _a;
149
- if ((_a = filterOptions == null ? void 0 : filterOptions.value) == null ? void 0 : _a.mediaType) {
150
- filter.value.catalog = filterOptions == null ? void 0 : filterOptions.value.mediaType.split(",");
151
- if (filterOptions == null ? void 0 : filterOptions.value.mediaTypeStrict) {
152
- 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;
153
188
  }
154
189
  }
190
+ emits("change", result);
155
191
  },
156
- { immediate: true, deep: true }
192
+ { deep: true, immediate: true }
157
193
  );
158
194
  onMounted(() => {
159
195
  load();
160
196
  });
161
197
  __expose({
162
- resetFilter: handleReset
198
+ filter,
199
+ handleReset
163
200
  });
164
201
  return (_ctx, _cache) => {
165
- var _a;
202
+ var _a2;
166
203
  return openBlock(), createElementBlock("div", _hoisted_1, [
204
+ createCommentVNode(" Use filterItemsRef's parentElement as the container for boundary checks "),
167
205
  createElementVNode("div", _hoisted_2, [
168
- 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
+ ]),
169
244
  createCommentVNode(" \u5173\u952E\u8BCD "),
170
- createElementVNode("div", _hoisted_4, [
245
+ createElementVNode("div", _hoisted_5, [
171
246
  createVNode(unref(Input), {
172
247
  modelValue: searchInput.value,
173
- "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => searchInput.value = $event),
248
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => searchInput.value = $event),
174
249
  "allow-clear": "",
175
250
  placeholder: "\u8BF7\u8F93\u5165\u5173\u952E\u8BCD"
176
251
  }, {
177
252
  prepend: withCtx(() => [
178
253
  createVNode(unref(Dropdown), {
179
- onSelect: _cache[0] || (_cache[0] = (e) => searchType.value = e)
254
+ onSelect: _cache[2] || (_cache[2] = (e) => searchType.value = e)
180
255
  }, {
181
256
  content: withCtx(() => [
182
257
  createVNode(unref(Doption), { value: 0 }, {
183
- default: withCtx(() => _cache[7] || (_cache[7] = [
258
+ default: withCtx(() => _cache[12] || (_cache[12] = [
184
259
  createTextVNode("\u7CBE\u51C6\u641C")
185
260
  ])),
186
261
  _: 1
187
262
  }),
188
263
  createVNode(unref(Doption), { value: 1 }, {
189
- default: withCtx(() => _cache[8] || (_cache[8] = [
264
+ default: withCtx(() => _cache[13] || (_cache[13] = [
190
265
  createTextVNode("\u6A21\u7CCA\u641C")
191
266
  ])),
192
267
  _: 1
@@ -206,15 +281,39 @@ const _sfc_main = defineComponent({
206
281
  _: 1
207
282
  }, 8, ["modelValue"])
208
283
  ]),
284
+ createCommentVNode(" \u76EE\u5F55 "),
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
+ ]),
209
306
  createCommentVNode(" \u7D20\u6750\u7C7B\u578B "),
210
- createElementVNode("div", _hoisted_5, [
307
+ createElementVNode("div", _hoisted_7, [
211
308
  createVNode(unref(Select), {
212
309
  modelValue: filter.value.catalog,
213
- "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => filter.value.catalog = $event),
214
- 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",
215
313
  "allow-clear": "",
216
314
  placeholder: "\u7C7B\u578B",
217
- multiple: ""
315
+ multiple: "",
316
+ "max-tag-count": 1
218
317
  }, {
219
318
  default: withCtx(() => [
220
319
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(resourceCatalog), (item) => {
@@ -229,19 +328,22 @@ const _sfc_main = defineComponent({
229
328
  }, 8, ["modelValue", "disabled"])
230
329
  ]),
231
330
  createCommentVNode(" \u65F6\u95F4\u8303\u56F4 "),
232
- createVNode(unref(RangePicker), {
233
- modelValue: rangeTime.value,
234
- "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => rangeTime.value = $event),
235
- "allow-clear": "",
236
- style: { "width": "240px" }
237
- }, 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
+ ]),
238
339
  createCommentVNode(" \u7D20\u6750\u4E0A\u4F20\u6765\u6E90 "),
239
- createElementVNode("div", _hoisted_6, [
340
+ createElementVNode("div", _hoisted_9, [
240
341
  createVNode(unref(Select), {
241
342
  modelValue: filter.value.source,
242
- "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => filter.value.source = $event),
343
+ "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => filter.value.source = $event),
243
344
  "allow-clear": "",
244
- placeholder: "\u6765\u6E90"
345
+ placeholder: "\u6765\u6E90",
346
+ "popup-container": "#resource-filter-pannel"
245
347
  }, {
246
348
  default: withCtx(() => [
247
349
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(resourceSource), (item) => {
@@ -256,14 +358,15 @@ const _sfc_main = defineComponent({
256
358
  }, 8, ["modelValue"])
257
359
  ]),
258
360
  createCommentVNode(" \u7D20\u6750\u4E0A\u4F20\u4EBA "),
259
- !_ctx.disableUploadBy ? (openBlock(), createElementBlock("div", _hoisted_7, [
361
+ !_ctx.disableUploadBy ? (openBlock(), createElementBlock("div", _hoisted_10, [
260
362
  createVNode(unref(Select), {
261
363
  modelValue: filter.value.upload_by,
262
- "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => filter.value.upload_by = $event),
364
+ "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => filter.value.upload_by = $event),
263
365
  "allow-clear": "",
264
366
  placeholder: "\u4E0A\u4F20\u4EBA",
265
367
  loading: unref(loading),
266
368
  "allow-search": "",
369
+ "popup-container": "#resource-filter-pannel",
267
370
  onSearch: unref(handleSearch),
268
371
  onDropdownReachBottom: unref(loadMore)
269
372
  }, {
@@ -278,40 +381,64 @@ const _sfc_main = defineComponent({
278
381
  ]),
279
382
  _: 1
280
383
  }, 8, ["modelValue", "loading", "onSearch", "onDropdownReachBottom"])
281
- ])) : createCommentVNode("v-if", true),
282
- !isEmpty.value ? (openBlock(), createBlock(unref(Button), {
283
- key: 1,
284
- type: "text",
285
- 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"))
286
415
  }, {
287
- default: withCtx(() => _cache[9] || (_cache[9] = [
288
- createTextVNode(" \u91CD\u7F6E ")
289
- ])),
416
+ icon: withCtx(() => [
417
+ createVNode(unref(IconUpload))
418
+ ]),
290
419
  _: 1
291
- })) : createCommentVNode("v-if", true)
292
- ]),
293
- createElementVNode("div", _hoisted_8, [
294
- createVNode(unref(Button), {
420
+ })) : (openBlock(), createBlock(unref(Button), {
421
+ key: 1,
295
422
  type: "primary",
296
- onClick: _cache[6] || (_cache[6] = ($event) => emits("upload"))
423
+ onClick: _cache[10] || (_cache[10] = ($event) => emits("upload"))
297
424
  }, {
298
425
  icon: withCtx(() => [
299
426
  createVNode(unref(IconUpload))
300
427
  ]),
301
428
  default: withCtx(() => [
302
- _cache[10] || (_cache[10] = createTextVNode(" \u4E0A\u4F20 "))
429
+ _cache[15] || (_cache[15] = createTextVNode(" \u4E0A\u4F20 "))
303
430
  ]),
304
431
  _: 1
305
- })
432
+ }))
306
433
  ])
307
434
  ]),
308
- searchInput.value ? (openBlock(), createElementBlock("div", _hoisted_9, [
435
+ searchInput.value ? (openBlock(), createElementBlock("div", _hoisted_13, [
309
436
  (openBlock(true), createElementBlock(Fragment, null, renderList(unref(keywordsSelection), (item) => {
310
437
  return openBlock(), createElementBlock("div", {
311
438
  key: item.value,
312
439
  class: normalizeClass(["list-filter-tag", { active: filter.value.sf === item.value }]),
313
440
  onClick: ($event) => filter.value.sf = item.value
314
- }, toDisplayString(item.name), 11, _hoisted_10);
441
+ }, toDisplayString(item.name), 11, _hoisted_14);
315
442
  }), 128))
316
443
  ])) : createCommentVNode("v-if", true)
317
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 };