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

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