@leaflink/stash 49.2.0 → 49.3.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.
@@ -1,19 +1,19 @@
1
- import { ref as x, computed as S, defineComponent as W, useSlots as j, inject as M, provide as O, watch as J, openBlock as f, createBlock as v, normalizeClass as z, unref as r, withCtx as u, mergeProps as P, createCommentVNode as p, createElementBlock as Q, createElementVNode as _, renderSlot as V, createVNode as I, createTextVNode as k, toDisplayString as g } from "vue";
2
- import U from "./useMediaQuery.js";
3
- import { SCREEN_SIZES as Z } from "./constants.js";
1
+ import { ref as B, computed as C, defineComponent as j, useSlots as O, inject as J, provide as z, watch as Q, openBlock as p, createBlock as m, normalizeClass as U, unref as t, withCtx as u, mergeProps as $, createCommentVNode as f, createElementBlock as Z, createElementVNode as A, renderSlot as G, createVNode as I, createTextVNode as k, toDisplayString as w } from "vue";
2
+ import q from "./useMediaQuery.js";
3
+ import { SCREEN_SIZES as H } from "./constants.js";
4
4
  import { t as d } from "./locale.js";
5
- import { _ as q } from "./Box.vue_vue_type_script_setup_true_lang-69e5176b.js";
6
- import C from "./Button.js";
7
- import T from "lodash-es/cloneDeep";
8
- import $ from "./Icon.js";
5
+ import { _ as K } from "./Box.vue_vue_type_script_setup_true_lang-69e5176b.js";
6
+ import _ from "./Button.js";
7
+ import L from "lodash-es/cloneDeep";
8
+ import P from "./Icon.js";
9
9
  import "./Paginate.vue_used_vue_type_style_index_0_lang.module-18343da7.js";
10
- import { D as G } from "./DataView.vue_used_vue_type_style_index_0_lang.module-5c180dba.js";
11
- import H from "./FilterChip.js";
12
- import { _ as K } from "./Label.vue_vue_type_script_setup_true_lang-4b02087f.js";
13
- import X from "./Modal.js";
14
- import Y from "./SearchBar.js";
15
- import { D as ee } from "./DataViewFilters.keys-c80ffabe.js";
16
- import { i as L } from "./isDefined-2ce6cde4.js";
10
+ import { D as R } from "./DataView.vue_used_vue_type_style_index_0_lang.module-5c180dba.js";
11
+ import X from "./FilterChip.js";
12
+ import { _ as Y } from "./Label.vue_vue_type_script_setup_true_lang-4b02087f.js";
13
+ import ee from "./Modal.js";
14
+ import te from "./SearchBar.js";
15
+ import { D as le } from "./DataViewFilters.keys-c80ffabe.js";
16
+ import { i as W } from "./isDefined-2ce6cde4.js";
17
17
  import "lodash-es/get";
18
18
  import "./Button.vue_used_vue_type_style_index_0_lang.module-4dabc2a9.js";
19
19
  import "./_plugin-vue_export-helper-dad06003.js";
@@ -27,63 +27,63 @@ import "./Input.js";
27
27
  import "lodash-es/isNil";
28
28
  import "./utils/i18n.js";
29
29
  import "./Field.vue_vue_type_script_setup_true_lang-e1e4ff03.js";
30
- function Te({
31
- schema: s,
32
- dataViewRef: D
30
+ function Le({
31
+ schema: a,
32
+ dataViewRef: V
33
33
  }) {
34
- const e = x({}), o = x({});
35
- for (const t in s)
36
- e.value[t] = s[t].defaultValue, o.value[t] = s[t].defaultValue;
37
- const m = D;
34
+ const e = B({}), o = B({});
35
+ for (const l in a)
36
+ e.value[l] = a[l].defaultValue, o.value[l] = a[l].defaultValue;
37
+ const y = V;
38
38
  function h() {
39
- e.value = T(o.value), m.value.updateCurrentFilters(e.value, { shouldEmit: !0 });
39
+ e.value = L(o.value), y.value.updateCurrentFilters(e.value, { shouldEmit: !0 });
40
40
  }
41
- function B() {
42
- for (const t in s)
43
- e.value[t] = s[t].defaultValue, o.value[t] = s[t].defaultValue;
44
- m.value.updateCurrentFilters(e.value, { shouldEmit: !0 });
41
+ function N() {
42
+ for (const l in a)
43
+ e.value[l] = a[l].defaultValue, o.value[l] = a[l].defaultValue;
44
+ y.value.updateCurrentFilters(e.value, { shouldEmit: !0 });
45
45
  }
46
- function y(t) {
47
- for (const i in s)
48
- s[i].group === t && (e.value[i] = s[i].defaultValue, o.value[i] = s[i].defaultValue);
49
- m.value.updateCurrentFilters(e.value, { shouldEmit: !0 });
46
+ function b(l) {
47
+ for (const i in a)
48
+ a[i].group === l && (e.value[i] = a[i].defaultValue, o.value[i] = a[i].defaultValue);
49
+ y.value.updateCurrentFilters(e.value, { shouldEmit: !0 });
50
50
  }
51
- function A() {
52
- o.value = T(e.value);
51
+ function D() {
52
+ o.value = L(e.value);
53
53
  }
54
- const E = S(() => {
54
+ const g = C(() => {
55
55
  var i;
56
- const t = {};
57
- for (const a in s) {
58
- const n = s[a], w = e.value[a];
59
- (((i = n.isActive) == null ? void 0 : i.call(n, w)) || L(w)) && n.group && (t[n.group] = (t[n.group] ?? 0) + 1);
56
+ const l = {};
57
+ for (const c in a) {
58
+ const n = a[c], s = e.value[c];
59
+ (((i = n.isActive) == null ? void 0 : i.call(n, s)) || W(s)) && n.group && (l[n.group] = (l[n.group] ?? 0) + 1);
60
60
  }
61
- return t;
62
- }), N = S(() => {
61
+ return l;
62
+ }), S = C(() => {
63
63
  var i;
64
- let t = 0;
65
- for (const a in s) {
66
- const n = s[a], w = e.value[a];
67
- (((i = n.isActive) == null ? void 0 : i.call(n, w)) || L(w)) && (t += 1);
64
+ let l = 0;
65
+ for (const c in a) {
66
+ const n = a[c], s = e.value[c];
67
+ (((i = n.isActive) == null ? void 0 : i.call(n, s)) || W(s)) && (l += 1);
68
68
  }
69
- return t;
69
+ return l;
70
70
  });
71
71
  return {
72
72
  applyFilters: h,
73
- resetAllFilters: B,
73
+ resetAllFilters: N,
74
74
  // @ts-expect-error "could be instantiated with a different subtype": TODO: figure out how to resolve the types
75
- resetFilterGroup: y,
76
- undoWorkingFilters: A,
77
- activeFiltersCounts: E,
78
- totalActiveFiltersCount: N,
75
+ resetFilterGroup: b,
76
+ undoWorkingFilters: D,
77
+ activeFiltersCounts: g,
78
+ totalActiveFiltersCount: S,
79
79
  appliedFilters: e,
80
80
  workingFilters: o
81
81
  };
82
82
  }
83
- const te = {
83
+ const re = {
84
84
  key: 1,
85
85
  class: "tw-col-span-12 tw-row-start-2 md:tw-col-start-7 md:tw-row-start-1 lg:tw-col-span-8 lg:tw-col-start-5"
86
- }, le = { class: "tw-hidden md:tw-block" }, re = { class: "tw-flex tw-gap-4" }, se = { class: "tw-inline-flex tw-items-center tw-gap-3" }, ae = { class: "tw-flex tw-flex-col-reverse tw-gap-gutter lg:tw-flex-row lg:tw-justify-end" }, $e = /* @__PURE__ */ W({
86
+ }, ae = { class: "tw-hidden md:tw-block" }, se = { class: "tw-flex tw-gap-4" }, ie = { class: "tw-inline-flex tw-items-center tw-gap-3" }, oe = { class: "tw-flex tw-justify-end tw-gap-gutter" }, Pe = /* @__PURE__ */ j({
87
87
  __name: "DataViewFilters",
88
88
  props: {
89
89
  filtersLabelText: { default: d("ll.filterBy") },
@@ -94,182 +94,192 @@ const te = {
94
94
  showDrawerPreviousButton: { type: Boolean, default: !1 },
95
95
  useFiltersInstance: { default: void 0 },
96
96
  onApply: { type: Function, default: void 0 },
97
- activeGroup: { default: "" }
97
+ activeGroup: { default: void 0 }
98
98
  },
99
99
  emits: ["open-drawer", "dismiss", "previous", "reset-group", "reset-all"],
100
- setup(s, { emit: D }) {
101
- const e = s, o = D, m = j(), h = U(`(min-width: ${Z.lg})`), {
102
- density: B,
103
- isLoading: y,
104
- isWithinModule: A,
105
- currentSearch: E,
106
- updateCurrentSearch: N
107
- } = M(G.key, G.defaults);
108
- O(ee.key, {
100
+ setup(a, { emit: V }) {
101
+ const e = a, o = V, y = O(), h = q(`(min-width: ${H.lg})`), N = C(() => e.drawerStyle === "nested" && !e.activeGroup), b = C(() => e.drawerStyle === "nested" && e.activeGroup), {
102
+ density: D,
103
+ isLoading: g,
104
+ isWithinModule: S,
105
+ currentSearch: l,
106
+ updateCurrentSearch: i
107
+ } = J(R.key, R.defaults);
108
+ z(le.key, {
109
109
  useFiltersInstance: e.useFiltersInstance,
110
110
  drawerStyle: e.drawerStyle
111
111
  });
112
- const t = S(() => {
113
- var l;
114
- return ((l = e.useFiltersInstance) == null ? void 0 : l.totalActiveFiltersCount.value) ?? 0;
115
- }), i = S(
112
+ const c = C(() => {
113
+ var r;
114
+ return ((r = e.useFiltersInstance) == null ? void 0 : r.totalActiveFiltersCount.value) ?? 0;
115
+ }), n = C(
116
116
  () => {
117
- var l;
118
- return ((l = e.useFiltersInstance) == null ? void 0 : l.activeFiltersCounts.value[e.activeGroup]) ?? 0;
117
+ var r;
118
+ return Number(e.activeGroup && ((r = e.useFiltersInstance) == null ? void 0 : r.activeFiltersCounts.value[e.activeGroup])) || 0;
119
119
  }
120
- ), a = x(!1);
121
- async function n() {
122
- var c, F;
123
- const { preventDismiss: l } = await ((c = e.onApply) == null ? void 0 : c.call(e)) || ((F = e.useFiltersInstance) == null ? void 0 : F.applyFilters()) || {};
124
- l || (a.value = !1);
120
+ ), s = B(!1);
121
+ async function E() {
122
+ var v, F;
123
+ const { preventDismiss: r } = await ((v = e.onApply) == null ? void 0 : v.call(e)) || ((F = e.useFiltersInstance) == null ? void 0 : F.applyFilters()) || {};
124
+ r || (s.value = !1);
125
125
  }
126
- function w() {
127
- var l;
128
- (l = e.useFiltersInstance) == null || l.resetFilterGroup(e.activeGroup), o("reset-group"), a.value = !1;
126
+ function M() {
127
+ var r;
128
+ e.activeGroup && ((r = e.useFiltersInstance) == null || r.resetFilterGroup(e.activeGroup), o("reset-group"), s.value = !1);
129
129
  }
130
- function b() {
131
- var l;
132
- (l = e.useFiltersInstance) == null || l.resetAllFilters(), o("reset-all"), a.value = !1;
130
+ function x() {
131
+ var r;
132
+ (r = e.useFiltersInstance) == null || r.resetAllFilters(), o("reset-all"), s.value = !1;
133
133
  }
134
- function R() {
135
- var l;
136
- (l = e.useFiltersInstance) == null || l.undoWorkingFilters(), a.value = !1, o("dismiss");
134
+ function T() {
135
+ var r;
136
+ (r = e.useFiltersInstance) == null || r.undoWorkingFilters(), s.value = !1, o("dismiss");
137
137
  }
138
- return J(a, () => {
139
- a.value && o("open-drawer");
140
- }), (l, c) => (f(), v(q, {
141
- class: z(["stash-data-view-filters tw-grid tw-grid-cols-12 tw-gap-6 tw-p-3", { "lg:tw-p-6": r(B) === "comfortable", "tw-mb-3": !r(A) }]),
142
- radius: r(A) ? "none" : "rounded",
138
+ return Q(s, () => {
139
+ s.value && o("open-drawer");
140
+ }), (r, v) => (p(), m(K, {
141
+ class: U(["stash-data-view-filters tw-grid tw-grid-cols-12 tw-gap-6 tw-p-3", { "lg:tw-p-6": t(D) === "comfortable", "tw-mb-3": !t(S) }]),
142
+ radius: t(S) ? "none" : "rounded",
143
143
  "data-test": "stash-data-view-filters",
144
144
  "disable-padding": ""
145
145
  }, {
146
146
  default: u(() => [
147
- e.showSearch ? (f(), v(Y, P({
147
+ e.showSearch ? (p(), m(te, $({
148
148
  key: 0,
149
149
  class: "tw-col-span-12 md:tw-col-span-6 lg:tw-col-span-4",
150
150
  "data-test": "stash-data-view-filters|search-bar",
151
- "is-loading": r(y),
152
- label: r(d)("ll.search"),
153
- "model-value": r(E)
151
+ "is-loading": t(g),
152
+ label: t(d)("ll.search"),
153
+ "model-value": t(l)
154
154
  }, e.searchBarProps, {
155
- onSearch: c[0] || (c[0] = (F) => r(N)(F, { shouldEmit: !0 }))
156
- }), null, 16, ["is-loading", "label", "model-value"])) : p("", !0),
157
- m.default ? (f(), Q("div", te, [
158
- _("div", le, [
159
- V(l.$slots, "filters-label", {}, () => [
160
- I(K, null, {
155
+ onSearch: v[0] || (v[0] = (F) => t(i)(F, { shouldEmit: !0 }))
156
+ }), null, 16, ["is-loading", "label", "model-value"])) : f("", !0),
157
+ y.default ? (p(), Z("div", re, [
158
+ A("div", ae, [
159
+ G(r.$slots, "filters-label", {}, () => [
160
+ I(Y, null, {
161
161
  default: u(() => [
162
- k(g(e.filtersLabelText), 1)
162
+ k(w(e.filtersLabelText), 1)
163
163
  ]),
164
164
  _: 1
165
165
  })
166
166
  ])
167
167
  ]),
168
- _("div", re, [
169
- I(H, {
168
+ A("div", se, [
169
+ I(X, {
170
170
  secondary: "",
171
171
  class: "!tw-flex tw-w-full tw-justify-center tw-gap-4 md:!tw-inline-flex md:tw-w-auto",
172
172
  "data-test": "stash-data-view-filters|drawer-toggle-button",
173
- "filter-count": t.value,
174
- onClick: c[1] || (c[1] = (F) => a.value = !0)
173
+ "filter-count": c.value,
174
+ onClick: v[1] || (v[1] = (F) => s.value = !0)
175
175
  }, {
176
176
  default: u(() => [
177
- _("span", se, [
178
- I($, {
177
+ A("span", ie, [
178
+ I(P, {
179
179
  name: "filter-line",
180
180
  class: "tw-text-ice-700"
181
181
  }),
182
- _("span", null, g(r(d)("ll.filters")), 1)
182
+ A("span", null, w(t(d)("ll.filters")), 1)
183
183
  ])
184
184
  ]),
185
185
  _: 1
186
186
  }, 8, ["filter-count"]),
187
- r(h) ? V(l.$slots, "default", { key: 0 }) : p("", !0),
188
- t.value > 0 && r(h) ? (f(), v(C, {
187
+ t(h) ? G(r.$slots, "default", { key: 0 }) : f("", !0),
188
+ c.value > 0 && t(h) ? (p(), m(_, {
189
189
  key: 1,
190
190
  inline: "",
191
- onClick: b
191
+ onClick: x
192
192
  }, {
193
193
  default: u(() => [
194
- k(g(r(d)("ll.resetAll")), 1)
194
+ k(w(t(d)("ll.resetAll")), 1)
195
195
  ]),
196
196
  _: 1
197
- })) : p("", !0)
197
+ })) : f("", !0)
198
198
  ])
199
- ])) : p("", !0),
200
- m.drawer ? (f(), v(X, P({
199
+ ])) : f("", !0),
200
+ y.drawer ? (p(), m(ee, $({
201
201
  key: 2,
202
202
  "data-test": "stash-data-view-filters|drawer",
203
203
  "disable-body-padding": "",
204
204
  position: "right",
205
- "is-open": a.value,
206
- title: r(d)("ll.allFilters")
207
- }, e.drawerProps, { onDismiss: R }), {
205
+ "is-open": s.value,
206
+ title: t(d)("ll.allFilters")
207
+ }, e.drawerProps, { onDismiss: T }), {
208
208
  headerAction: u(() => [
209
- e.showDrawerPreviousButton ? (f(), v(C, {
209
+ b.value ? (p(), m(_, {
210
210
  key: 0,
211
211
  icon: "",
212
212
  class: "tw-text-ice-100",
213
213
  "data-test": "stash-data-view-filters|drawer-previous-button",
214
- "aria-label": r(d)("ll.previous"),
215
- title: r(d)("ll.previous"),
216
- onClick: c[2] || (c[2] = (F) => o("previous"))
214
+ "aria-label": t(d)("ll.previous"),
215
+ title: t(d)("ll.previous"),
216
+ onClick: v[2] || (v[2] = (F) => o("previous"))
217
217
  }, {
218
218
  default: u(() => [
219
- I($, { name: "chevron-left" })
219
+ I(P, { name: "chevron-left" })
220
220
  ]),
221
221
  _: 1
222
- }, 8, ["aria-label", "title"])) : p("", !0)
222
+ }, 8, ["aria-label", "title"])) : f("", !0)
223
223
  ]),
224
224
  footer: u(() => [
225
- _("div", ae, [
226
- !e.showDrawerPreviousButton && t.value > 0 ? (f(), v(C, {
225
+ A("div", oe, [
226
+ c.value === 0 ? (p(), m(_, {
227
227
  key: 0,
228
228
  secondary: "",
229
- disabled: r(y),
230
- onClick: b
229
+ onClick: T
231
230
  }, {
232
231
  default: u(() => [
233
- k(g(r(d)("ll.resetAll")), 1)
232
+ k(w(t(d)("ll.cancel")), 1)
234
233
  ]),
235
234
  _: 1
236
- }, 8, ["disabled"])) : p("", !0),
237
- (e.showDrawerPreviousButton || e.drawerStyle === "cascade") && i.value > 0 ? (f(), v(C, {
235
+ })) : f("", !0),
236
+ (N.value || e.drawerStyle === "cascade") && c.value > 0 ? (p(), m(_, {
238
237
  key: 1,
239
238
  secondary: "",
240
- disabled: r(y),
241
- onClick: w
239
+ disabled: t(g),
240
+ onClick: x
242
241
  }, {
243
242
  default: u(() => [
244
- k(g(r(d)("ll.reset")), 1)
243
+ k(w(t(d)("ll.resetAll")), 1)
245
244
  ]),
246
245
  _: 1
247
- }, 8, ["disabled"])) : p("", !0),
248
- e.showDrawerPreviousButton || e.drawerStyle === "cascade" ? (f(), v(C, {
246
+ }, 8, ["disabled"])) : f("", !0),
247
+ b.value && n.value > 0 ? (p(), m(_, {
249
248
  key: 2,
250
- disabled: r(y),
251
- onClick: n
249
+ secondary: "",
250
+ disabled: t(g),
251
+ onClick: M
252
+ }, {
253
+ default: u(() => [
254
+ k(w(t(d)("ll.reset")), 1)
255
+ ]),
256
+ _: 1
257
+ }, 8, ["disabled"])) : f("", !0),
258
+ b.value || e.drawerStyle === "cascade" ? (p(), m(_, {
259
+ key: 3,
260
+ disabled: t(g),
261
+ onClick: E
252
262
  }, {
253
263
  default: u(() => [
254
- k(g(r(d)("ll.apply")), 1)
264
+ k(w(t(d)("ll.apply")), 1)
255
265
  ]),
256
266
  _: 1
257
- }, 8, ["disabled"])) : p("", !0)
267
+ }, 8, ["disabled"])) : f("", !0)
258
268
  ])
259
269
  ]),
260
270
  default: u(() => [
261
- V(l.$slots, "drawer")
271
+ G(r.$slots, "drawer")
262
272
  ]),
263
273
  _: 3
264
- }, 16, ["is-open", "title"])) : p("", !0)
274
+ }, 16, ["is-open", "title"])) : f("", !0)
265
275
  ]),
266
276
  _: 3
267
277
  }, 8, ["class", "radius"]));
268
278
  }
269
279
  });
270
280
  export {
271
- ee as DATA_VIEW_FILTERS_UTILS_INJECTION,
272
- $e as default,
273
- Te as useFilters
281
+ le as DATA_VIEW_FILTERS_UTILS_INJECTION,
282
+ Pe as default,
283
+ Le as useFilters
274
284
  };
275
285
  //# sourceMappingURL=DataViewFilters.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataViewFilters.js","sources":["../src/components/DataViewFilters/useFilters.ts","../src/components/DataViewFilters/DataViewFilters.vue"],"sourcesContent":["import cloneDeep from 'lodash-es/cloneDeep';\nimport { computed, ComputedRef, Ref, ref } from 'vue';\n\nimport isDefined from '../../composables/useValidation/utils/isDefined';\nimport DataView from '../DataView/DataView.vue';\n\ntype DataViewInstance = InstanceType<typeof DataView>;\n\n/**\n * Contains metadata and configuration for the filters.\n * @see https://www.typescriptlang.org/docs/handbook/2/mapped-types.html\n */\nexport type UseFiltersSchema<Values extends object, Groups extends string> = {\n [Property in keyof Values]: {\n defaultValue?: Values[Property];\n group?: Groups;\n isActive?: (value: Values[Property]) => boolean;\n };\n};\n\nexport interface UseFiltersArgs<Values extends object, Groups extends string> {\n schema: UseFiltersSchema<Values, Groups>;\n /** A ref for an instance of DataView */\n dataViewRef: Ref<unknown>; // Note: using `Ref<InstanceType<typeof DataView>>` here causes type errors when providing a value for this argument\n}\n\nexport interface UseFiltersReturnType<Values = object, Groups extends string = string> {\n applyFilters: () => void;\n resetAllFilters: () => void;\n resetFilterGroup: (group: string) => void; // Note: group is intentionally not typed as `Groups` since there is no way to pass in a Groups type to UseFiltersReturnType within DataViewFilters.vue\n undoWorkingFilters: () => void;\n activeFiltersCounts: ComputedRef<Record<Groups, number>>;\n totalActiveFiltersCount: ComputedRef<number>;\n appliedFilters: Ref<Values>;\n workingFilters: Ref<Values>;\n}\n\n/**\n * Provides utility functions for working with `DataViewFilters`.\n */\nexport function useFilters<Values extends object, Groups extends string>({\n schema,\n dataViewRef,\n}: UseFiltersArgs<Values, Groups>): UseFiltersReturnType<Values, Groups> {\n const appliedFilters = ref({}) as Ref<Values>;\n const workingFilters = ref({}) as Ref<Values>;\n\n for (const filterName in schema) {\n // @ts-expect-error \"could be instantiated with an arbitrary type\"; TODO: figure out how to resolve the types\n appliedFilters.value[filterName] = schema[filterName].defaultValue;\n // @ts-expect-error \"could be instantiated with an arbitrary type\"; TODO: figure out how to resolve the types\n workingFilters.value[filterName] = schema[filterName].defaultValue;\n }\n\n const dvRef = dataViewRef as Ref<DataViewInstance>;\n\n /**\n * For when an \"Apply\" button is clicked. It does the following:\n * 1) applies the working filter state\n * 2) sets the current page to 1\n * 3) emits the \"update\" event from DataView\n */\n function applyFilters() {\n appliedFilters.value = cloneDeep(workingFilters.value);\n dvRef.value.updateCurrentFilters(appliedFilters.value, { shouldEmit: true });\n }\n\n /**\n * For when a \"Reset all\" button is clicked. It does the following:\n * 1) applies the defaultValue filter values to all filters\n * 2) sets the current page to 1\n * 3) emits the \"update\" event from DataView\n */\n function resetAllFilters() {\n for (const filterName in schema) {\n // @ts-expect-error \"could be instantiated with an arbitrary type\"; TODO: figure out how to resolve the types\n appliedFilters.value[filterName] = schema[filterName].defaultValue;\n // @ts-expect-error \"could be instantiated with an arbitrary type\"; TODO: figure out how to resolve the types\n workingFilters.value[filterName] = schema[filterName].defaultValue;\n }\n\n dvRef.value.updateCurrentFilters(appliedFilters.value, { shouldEmit: true });\n }\n\n /**\n * For when a \"Reset\" button is clicked. It does the following:\n * 1) applies the defaultValue filter values to the given filter group\n * 2) sets the current page to 1\n * 3) emits the \"update\" event from DataView\n */\n function resetFilterGroup(group: Groups) {\n for (const filterName in schema) {\n if (schema[filterName].group === group) {\n // @ts-expect-error \"could be instantiated with an arbitrary type\"; TODO: figure out how to resolve the types\n appliedFilters.value[filterName] = schema[filterName].defaultValue;\n // @ts-expect-error \"could be instantiated with an arbitrary type\"; TODO: figure out how to resolve the types\n workingFilters.value[filterName] = schema[filterName].defaultValue;\n }\n }\n\n dvRef.value.updateCurrentFilters(appliedFilters.value, { shouldEmit: true });\n }\n\n /**\n * Resets the `workingFilters` to match the `appliedFilters`. This can be used when the FilterDrawer or a FilterDropdown is dismissed without clicking \"Reset\" or \"Apply\".\n */\n function undoWorkingFilters() {\n workingFilters.value = cloneDeep(appliedFilters.value);\n }\n\n const activeFiltersCounts = computed(() => {\n const counts = {} as Record<Groups, number>;\n\n for (const filterName in schema) {\n const config = schema[filterName];\n const value = appliedFilters.value[filterName];\n const isActive = config.isActive?.(value) || isDefined(value);\n\n if (isActive && config.group) {\n counts[config.group] = (counts[config.group] ?? 0) + 1;\n }\n }\n\n return counts;\n });\n\n const totalActiveFiltersCount = computed(() => {\n let count = 0;\n\n for (const filterName in schema) {\n const config = schema[filterName];\n const value = appliedFilters.value[filterName];\n const isActive = config.isActive?.(value) || isDefined(value);\n\n if (isActive) {\n count += 1;\n }\n }\n\n return count;\n });\n\n return {\n applyFilters,\n resetAllFilters,\n // @ts-expect-error \"could be instantiated with a different subtype\": TODO: figure out how to resolve the types\n resetFilterGroup,\n undoWorkingFilters,\n activeFiltersCounts,\n totalActiveFiltersCount,\n appliedFilters,\n workingFilters,\n };\n}\n\nexport default useFilters;\n","<script lang=\"ts\">\n export * from './DataViewFilters.keys';\n export * from './DataViewFilters.types';\n export * from './useFilters';\n</script>\n\n<script setup lang=\"ts\">\n import { computed, inject, provide, ref, watch } from 'vue';\n\n import useMediaQuery from '../../composables/useMediaQuery/useMediaQuery';\n import { SCREEN_SIZES } from '../../constants';\n import { t } from '../../locale';\n import Box from '../Box/Box.vue';\n import Button from '../Button/Button.vue';\n import { DATA_VIEW_INJECTION } from '../DataView/DataView.vue';\n import FilterChip from '../FilterChip/FilterChip.vue';\n import Icon from '../Icon/Icon.vue';\n import Label from '../Label/Label.vue';\n import Modal, { type ModalProps } from '../Modal/Modal.vue';\n import SearchBar, { SearchBarProps } from '../SearchBar/SearchBar.vue';\n import { DATA_VIEW_FILTERS_UTILS_INJECTION } from './DataViewFilters.keys';\n import type { DrawerStyle, OnApplyFilters } from './DataViewFilters.types';\n import type { UseFiltersReturnType } from './useFilters';\n\n export interface DataViewFiltersProps {\n filtersLabelText?: string;\n /**\n * Props to pass to the `SearchBar` component.\n */\n searchBarProps?: SearchBarProps;\n showSearch?: boolean;\n /** 'cascade' displays all fields within every filter group; 'nested' displays only the group names and requires clicking a group to view its fields */\n drawerStyle?: DrawerStyle;\n drawerProps?: ModalProps;\n showDrawerPreviousButton?: boolean;\n /**\n * Required when using filters. This prop should contain the return value of the `useFilters()` composable.\n */\n useFiltersInstance?: UseFiltersReturnType;\n onApply?: OnApplyFilters;\n /** The name of the active filter group. The active filter group is determined by which instance of FilterDropdown or FilterDrawerItem is open. */\n activeGroup?: string;\n }\n\n export interface DataViewFiltersSlots {\n default?: void;\n drawer?: void;\n 'filters-label'?: void;\n }\n\n const props = withDefaults(defineProps<DataViewFiltersProps>(), {\n filtersLabelText: t('ll.filterBy'),\n isLoading: false,\n drawerStyle: 'nested',\n drawerProps: undefined,\n searchBarProps: undefined,\n showDrawerPreviousButton: false,\n showSearch: true,\n useFiltersInstance: undefined,\n onApply: undefined,\n activeGroup: '',\n });\n\n const emit = defineEmits<{\n /** When the drawer is opened */\n (e: 'open-drawer'): void;\n /** When the drawer is dismissed */\n (e: 'dismiss'): void;\n /** When the \"Previous\" button in the header is clicked */\n (e: 'previous'): void;\n /** When the \"Reset\" button is clicked while viewing a filter group */\n (e: 'reset-group'): void;\n /** When one of the \"Reset All\" buttons is clicked */\n (e: 'reset-all'): void;\n }>();\n\n const slots = defineSlots<DataViewFiltersSlots>();\n\n const isDesktop = useMediaQuery(`(min-width: ${SCREEN_SIZES.lg})`);\n\n const {\n density,\n isLoading: isDataViewLoading,\n isWithinModule,\n currentSearch,\n updateCurrentSearch,\n } = inject(DATA_VIEW_INJECTION.key, DATA_VIEW_INJECTION.defaults);\n\n provide(DATA_VIEW_FILTERS_UTILS_INJECTION.key, {\n useFiltersInstance: props.useFiltersInstance,\n drawerStyle: props.drawerStyle,\n });\n\n const totalActiveFiltersCount = computed(() => props.useFiltersInstance?.totalActiveFiltersCount.value ?? 0);\n const activeGroupActiveFiltersCount = computed(\n () => props.useFiltersInstance?.activeFiltersCounts.value[props.activeGroup] ?? 0,\n );\n const isDrawerOpen = ref(false);\n\n async function handleApplyClick() {\n const { preventDismiss } = (await props.onApply?.()) || props.useFiltersInstance?.applyFilters() || {};\n\n if (!preventDismiss) {\n isDrawerOpen.value = false;\n }\n }\n\n function handleResetGroupClick() {\n props.useFiltersInstance?.resetFilterGroup(props.activeGroup);\n emit('reset-group');\n isDrawerOpen.value = false;\n }\n\n function handleResetAllClick() {\n props.useFiltersInstance?.resetAllFilters();\n emit('reset-all');\n isDrawerOpen.value = false;\n }\n\n function onDismiss() {\n props.useFiltersInstance?.undoWorkingFilters();\n isDrawerOpen.value = false;\n emit('dismiss');\n }\n\n watch(isDrawerOpen, () => {\n if (isDrawerOpen.value) {\n emit('open-drawer');\n }\n });\n</script>\n\n<template>\n <Box\n class=\"stash-data-view-filters tw-grid tw-grid-cols-12 tw-gap-6 tw-p-3\"\n :class=\"{ 'lg:tw-p-6': density === 'comfortable', 'tw-mb-3': !isWithinModule }\"\n :radius=\"isWithinModule ? 'none' : 'rounded'\"\n data-test=\"stash-data-view-filters\"\n disable-padding\n >\n <SearchBar\n v-if=\"props.showSearch\"\n class=\"tw-col-span-12 md:tw-col-span-6 lg:tw-col-span-4\"\n data-test=\"stash-data-view-filters|search-bar\"\n :is-loading=\"isDataViewLoading\"\n :label=\"t('ll.search')\"\n :model-value=\"currentSearch\"\n v-bind=\"props.searchBarProps\"\n @search=\"(searchTerm) => updateCurrentSearch(searchTerm, { shouldEmit: true })\"\n />\n <div\n v-if=\"slots.default\"\n class=\"tw-col-span-12 tw-row-start-2 md:tw-col-start-7 md:tw-row-start-1 lg:tw-col-span-8 lg:tw-col-start-5\"\n >\n <div class=\"tw-hidden md:tw-block\">\n <slot name=\"filters-label\">\n <Label>{{ props.filtersLabelText }}</Label>\n </slot>\n </div>\n <div class=\"tw-flex tw-gap-4\">\n <FilterChip\n secondary\n class=\"!tw-flex tw-w-full tw-justify-center tw-gap-4 md:!tw-inline-flex md:tw-w-auto\"\n data-test=\"stash-data-view-filters|drawer-toggle-button\"\n :filter-count=\"totalActiveFiltersCount\"\n @click=\"isDrawerOpen = true\"\n >\n <span class=\"tw-inline-flex tw-items-center tw-gap-3\">\n <Icon name=\"filter-line\" class=\"tw-text-ice-700\" />\n <span>{{ t('ll.filters') }}</span>\n </span>\n </FilterChip>\n <slot v-if=\"isDesktop\"></slot>\n <Button v-if=\"totalActiveFiltersCount > 0 && isDesktop\" inline @click=\"handleResetAllClick\">\n {{ t('ll.resetAll') }}\n </Button>\n </div>\n </div>\n <Modal\n v-if=\"slots.drawer\"\n data-test=\"stash-data-view-filters|drawer\"\n disable-body-padding\n position=\"right\"\n :is-open=\"isDrawerOpen\"\n :title=\"t('ll.allFilters')\"\n v-bind=\"props.drawerProps\"\n @dismiss=\"onDismiss\"\n >\n <template #headerAction>\n <Button\n v-if=\"props.showDrawerPreviousButton\"\n icon\n class=\"tw-text-ice-100\"\n data-test=\"stash-data-view-filters|drawer-previous-button\"\n :aria-label=\"t('ll.previous')\"\n :title=\"t('ll.previous')\"\n @click=\"emit('previous')\"\n >\n <Icon name=\"chevron-left\" />\n </Button>\n </template>\n\n <slot name=\"drawer\"></slot>\n\n <template #footer>\n <div class=\"tw-flex tw-flex-col-reverse tw-gap-gutter lg:tw-flex-row lg:tw-justify-end\">\n <Button\n v-if=\"!props.showDrawerPreviousButton && totalActiveFiltersCount > 0\"\n secondary\n :disabled=\"isDataViewLoading\"\n @click=\"handleResetAllClick\"\n >\n {{ t('ll.resetAll') }}\n </Button>\n <Button\n v-if=\"\n (props.showDrawerPreviousButton || props.drawerStyle === 'cascade') && activeGroupActiveFiltersCount > 0\n \"\n secondary\n :disabled=\"isDataViewLoading\"\n @click=\"handleResetGroupClick\"\n >\n {{ t('ll.reset') }}\n </Button>\n <Button\n v-if=\"props.showDrawerPreviousButton || props.drawerStyle === 'cascade'\"\n :disabled=\"isDataViewLoading\"\n @click=\"handleApplyClick\"\n >\n {{ t('ll.apply') }}\n </Button>\n </div>\n </template>\n </Modal>\n </Box>\n</template>\n"],"names":["useFilters","schema","dataViewRef","appliedFilters","ref","workingFilters","filterName","dvRef","applyFilters","cloneDeep","resetAllFilters","resetFilterGroup","group","undoWorkingFilters","activeFiltersCounts","computed","counts","config","value","_a","isDefined","totalActiveFiltersCount","count","props","__props","emit","__emit","slots","_useSlots","isDesktop","useMediaQuery","SCREEN_SIZES","density","isDataViewLoading","isWithinModule","currentSearch","updateCurrentSearch","inject","DATA_VIEW_INJECTION","provide","DATA_VIEW_FILTERS_UTILS_INJECTION","activeGroupActiveFiltersCount","isDrawerOpen","handleApplyClick","preventDismiss","_b","handleResetGroupClick","handleResetAllClick","onDismiss","watch"],"mappings":"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"}
1
+ {"version":3,"file":"DataViewFilters.js","sources":["../src/components/DataViewFilters/useFilters.ts","../src/components/DataViewFilters/DataViewFilters.vue"],"sourcesContent":["import cloneDeep from 'lodash-es/cloneDeep';\nimport { computed, ComputedRef, Ref, ref } from 'vue';\n\nimport isDefined from '../../composables/useValidation/utils/isDefined';\nimport DataView from '../DataView/DataView.vue';\n\ntype DataViewInstance = InstanceType<typeof DataView>;\n\n/**\n * Contains metadata and configuration for the filters.\n * @see https://www.typescriptlang.org/docs/handbook/2/mapped-types.html\n */\nexport type UseFiltersSchema<Values extends object, Groups extends string> = {\n [Property in keyof Values]: {\n defaultValue?: Values[Property];\n group?: Groups;\n isActive?: (value: Values[Property]) => boolean;\n };\n};\n\nexport interface UseFiltersArgs<Values extends object, Groups extends string> {\n schema: UseFiltersSchema<Values, Groups>;\n /** A ref for an instance of DataView */\n dataViewRef: Ref<unknown>; // Note: using `Ref<InstanceType<typeof DataView>>` here causes type errors when providing a value for this argument\n}\n\nexport interface UseFiltersReturnType<Values = object, Groups extends string = string> {\n applyFilters: () => void;\n resetAllFilters: () => void;\n resetFilterGroup: (group: string) => void; // Note: group is intentionally not typed as `Groups` since there is no way to pass in a Groups type to UseFiltersReturnType within DataViewFilters.vue\n undoWorkingFilters: () => void;\n activeFiltersCounts: ComputedRef<Record<Groups, number>>;\n totalActiveFiltersCount: ComputedRef<number>;\n appliedFilters: Ref<Values>;\n workingFilters: Ref<Values>;\n}\n\n/**\n * Provides utility functions for working with `DataViewFilters`.\n */\nexport function useFilters<Values extends object, Groups extends string>({\n schema,\n dataViewRef,\n}: UseFiltersArgs<Values, Groups>): UseFiltersReturnType<Values, Groups> {\n const appliedFilters = ref({}) as Ref<Values>;\n const workingFilters = ref({}) as Ref<Values>;\n\n for (const filterName in schema) {\n // @ts-expect-error \"could be instantiated with an arbitrary type\"; TODO: figure out how to resolve the types\n appliedFilters.value[filterName] = schema[filterName].defaultValue;\n // @ts-expect-error \"could be instantiated with an arbitrary type\"; TODO: figure out how to resolve the types\n workingFilters.value[filterName] = schema[filterName].defaultValue;\n }\n\n const dvRef = dataViewRef as Ref<DataViewInstance>;\n\n /**\n * For when an \"Apply\" button is clicked. It does the following:\n * 1) applies the working filter state\n * 2) sets the current page to 1\n * 3) emits the \"update\" event from DataView\n */\n function applyFilters() {\n appliedFilters.value = cloneDeep(workingFilters.value);\n dvRef.value.updateCurrentFilters(appliedFilters.value, { shouldEmit: true });\n }\n\n /**\n * For when a \"Reset all\" button is clicked. It does the following:\n * 1) applies the defaultValue filter values to all filters\n * 2) sets the current page to 1\n * 3) emits the \"update\" event from DataView\n */\n function resetAllFilters() {\n for (const filterName in schema) {\n // @ts-expect-error \"could be instantiated with an arbitrary type\"; TODO: figure out how to resolve the types\n appliedFilters.value[filterName] = schema[filterName].defaultValue;\n // @ts-expect-error \"could be instantiated with an arbitrary type\"; TODO: figure out how to resolve the types\n workingFilters.value[filterName] = schema[filterName].defaultValue;\n }\n\n dvRef.value.updateCurrentFilters(appliedFilters.value, { shouldEmit: true });\n }\n\n /**\n * For when a \"Reset\" button is clicked. It does the following:\n * 1) applies the defaultValue filter values to the given filter group\n * 2) sets the current page to 1\n * 3) emits the \"update\" event from DataView\n */\n function resetFilterGroup(group: Groups) {\n for (const filterName in schema) {\n if (schema[filterName].group === group) {\n // @ts-expect-error \"could be instantiated with an arbitrary type\"; TODO: figure out how to resolve the types\n appliedFilters.value[filterName] = schema[filterName].defaultValue;\n // @ts-expect-error \"could be instantiated with an arbitrary type\"; TODO: figure out how to resolve the types\n workingFilters.value[filterName] = schema[filterName].defaultValue;\n }\n }\n\n dvRef.value.updateCurrentFilters(appliedFilters.value, { shouldEmit: true });\n }\n\n /**\n * Resets the `workingFilters` to match the `appliedFilters`. This can be used when the FilterDrawer or a FilterDropdown is dismissed without clicking \"Reset\" or \"Apply\".\n */\n function undoWorkingFilters() {\n workingFilters.value = cloneDeep(appliedFilters.value);\n }\n\n const activeFiltersCounts = computed(() => {\n const counts = {} as Record<Groups, number>;\n\n for (const filterName in schema) {\n const config = schema[filterName];\n const value = appliedFilters.value[filterName];\n const isActive = config.isActive?.(value) || isDefined(value);\n\n if (isActive && config.group) {\n counts[config.group] = (counts[config.group] ?? 0) + 1;\n }\n }\n\n return counts;\n });\n\n const totalActiveFiltersCount = computed(() => {\n let count = 0;\n\n for (const filterName in schema) {\n const config = schema[filterName];\n const value = appliedFilters.value[filterName];\n const isActive = config.isActive?.(value) || isDefined(value);\n\n if (isActive) {\n count += 1;\n }\n }\n\n return count;\n });\n\n return {\n applyFilters,\n resetAllFilters,\n // @ts-expect-error \"could be instantiated with a different subtype\": TODO: figure out how to resolve the types\n resetFilterGroup,\n undoWorkingFilters,\n activeFiltersCounts,\n totalActiveFiltersCount,\n appliedFilters,\n workingFilters,\n };\n}\n\nexport default useFilters;\n","<script lang=\"ts\">\n export * from './DataViewFilters.keys';\n export * from './DataViewFilters.types';\n export * from './useFilters';\n</script>\n\n<script setup lang=\"ts\">\n import { computed, inject, provide, ref, watch } from 'vue';\n\n import useMediaQuery from '../../composables/useMediaQuery/useMediaQuery';\n import { SCREEN_SIZES } from '../../constants';\n import { t } from '../../locale';\n import Box from '../Box/Box.vue';\n import Button from '../Button/Button.vue';\n import { DATA_VIEW_INJECTION } from '../DataView/DataView.vue';\n import FilterChip from '../FilterChip/FilterChip.vue';\n import Icon from '../Icon/Icon.vue';\n import Label from '../Label/Label.vue';\n import Modal, { type ModalProps } from '../Modal/Modal.vue';\n import SearchBar, { SearchBarProps } from '../SearchBar/SearchBar.vue';\n import { DATA_VIEW_FILTERS_UTILS_INJECTION } from './DataViewFilters.keys';\n import type { DrawerStyle, OnApplyFilters } from './DataViewFilters.types';\n import type { UseFiltersReturnType } from './useFilters';\n\n export interface DataViewFiltersProps {\n filtersLabelText?: string;\n /**\n * Props to pass to the `SearchBar` component.\n */\n searchBarProps?: SearchBarProps;\n showSearch?: boolean;\n /** 'cascade' displays all fields within every filter group; 'nested' displays only the group names and requires clicking a group to view its fields */\n drawerStyle?: DrawerStyle;\n drawerProps?: ModalProps;\n /**\n * @deprecated The `activeGroup` prop is a sufficient replacement for this prop. A falsy `activeGroup` will hide the button and a truthy `activeGroup` will show it (when the `drawerStyle` is 'nested').\n *\n * **Note:** This prop has no effect when using a \"cascade\" `drawerStyle`.\n */\n showDrawerPreviousButton?: boolean;\n /**\n * Required when using filters. This prop should contain the return value of the `useFilters()` composable.\n */\n useFiltersInstance?: UseFiltersReturnType;\n onApply?: OnApplyFilters;\n /**\n * The name of the active filter group. The active filter group is determined by which instance of FilterDropdown or FilterDrawerItem is open.\n *\n * **Note:** This prop is required when using a \"nested\" `drawerStyle`, but has no effect when using a \"cascade\" `drawerStyle`.\n */\n activeGroup?: string;\n }\n\n export interface DataViewFiltersSlots {\n default?: void;\n drawer?: void;\n 'filters-label'?: void;\n }\n\n const props = withDefaults(defineProps<DataViewFiltersProps>(), {\n filtersLabelText: t('ll.filterBy'),\n isLoading: false,\n drawerStyle: 'nested',\n drawerProps: undefined,\n searchBarProps: undefined,\n showDrawerPreviousButton: false,\n showSearch: true,\n useFiltersInstance: undefined,\n onApply: undefined,\n activeGroup: undefined,\n });\n\n const emit = defineEmits<{\n /** When the drawer is opened */\n (e: 'open-drawer'): void;\n /** When the drawer is dismissed */\n (e: 'dismiss'): void;\n /** When the \"Previous\" button in the header is clicked */\n (e: 'previous'): void;\n /** When the \"Reset\" button is clicked while viewing a filter group */\n (e: 'reset-group'): void;\n /** When one of the \"Reset All\" buttons is clicked */\n (e: 'reset-all'): void;\n }>();\n\n const slots = defineSlots<DataViewFiltersSlots>();\n\n const isDesktop = useMediaQuery(`(min-width: ${SCREEN_SIZES.lg})`);\n const isViewingGroupsMenu = computed(() => props.drawerStyle === 'nested' && !props.activeGroup);\n const isViewingSingleGroup = computed(() => props.drawerStyle === 'nested' && props.activeGroup);\n\n const {\n density,\n isLoading: isDataViewLoading,\n isWithinModule,\n currentSearch,\n updateCurrentSearch,\n } = inject(DATA_VIEW_INJECTION.key, DATA_VIEW_INJECTION.defaults);\n\n provide(DATA_VIEW_FILTERS_UTILS_INJECTION.key, {\n useFiltersInstance: props.useFiltersInstance,\n drawerStyle: props.drawerStyle,\n });\n\n const totalActiveFiltersCount = computed(() => props.useFiltersInstance?.totalActiveFiltersCount.value ?? 0);\n /** The number of active filters in the currently active group. This is only used when the drawerStyle is 'nested'. */\n const activeGroupActiveFiltersCount = computed(\n () => Number(props.activeGroup && props.useFiltersInstance?.activeFiltersCounts.value[props.activeGroup]) || 0,\n );\n const isDrawerOpen = ref(false);\n\n async function handleApplyClick() {\n const { preventDismiss } = (await props.onApply?.()) || props.useFiltersInstance?.applyFilters() || {};\n\n if (!preventDismiss) {\n isDrawerOpen.value = false;\n }\n }\n\n function handleResetGroupClick() {\n if (!props.activeGroup) {\n return;\n }\n\n props.useFiltersInstance?.resetFilterGroup(props.activeGroup);\n emit('reset-group');\n isDrawerOpen.value = false;\n }\n\n function handleResetAllClick() {\n props.useFiltersInstance?.resetAllFilters();\n emit('reset-all');\n isDrawerOpen.value = false;\n }\n\n function onDismiss() {\n props.useFiltersInstance?.undoWorkingFilters();\n isDrawerOpen.value = false;\n emit('dismiss');\n }\n\n watch(isDrawerOpen, () => {\n if (isDrawerOpen.value) {\n emit('open-drawer');\n }\n });\n</script>\n\n<template>\n <Box\n class=\"stash-data-view-filters tw-grid tw-grid-cols-12 tw-gap-6 tw-p-3\"\n :class=\"{ 'lg:tw-p-6': density === 'comfortable', 'tw-mb-3': !isWithinModule }\"\n :radius=\"isWithinModule ? 'none' : 'rounded'\"\n data-test=\"stash-data-view-filters\"\n disable-padding\n >\n <SearchBar\n v-if=\"props.showSearch\"\n class=\"tw-col-span-12 md:tw-col-span-6 lg:tw-col-span-4\"\n data-test=\"stash-data-view-filters|search-bar\"\n :is-loading=\"isDataViewLoading\"\n :label=\"t('ll.search')\"\n :model-value=\"currentSearch\"\n v-bind=\"props.searchBarProps\"\n @search=\"(searchTerm) => updateCurrentSearch(searchTerm, { shouldEmit: true })\"\n />\n <div\n v-if=\"slots.default\"\n class=\"tw-col-span-12 tw-row-start-2 md:tw-col-start-7 md:tw-row-start-1 lg:tw-col-span-8 lg:tw-col-start-5\"\n >\n <div class=\"tw-hidden md:tw-block\">\n <slot name=\"filters-label\">\n <Label>{{ props.filtersLabelText }}</Label>\n </slot>\n </div>\n <div class=\"tw-flex tw-gap-4\">\n <FilterChip\n secondary\n class=\"!tw-flex tw-w-full tw-justify-center tw-gap-4 md:!tw-inline-flex md:tw-w-auto\"\n data-test=\"stash-data-view-filters|drawer-toggle-button\"\n :filter-count=\"totalActiveFiltersCount\"\n @click=\"isDrawerOpen = true\"\n >\n <span class=\"tw-inline-flex tw-items-center tw-gap-3\">\n <Icon name=\"filter-line\" class=\"tw-text-ice-700\" />\n <span>{{ t('ll.filters') }}</span>\n </span>\n </FilterChip>\n <slot v-if=\"isDesktop\"></slot>\n <Button v-if=\"totalActiveFiltersCount > 0 && isDesktop\" inline @click=\"handleResetAllClick\">\n {{ t('ll.resetAll') }}\n </Button>\n </div>\n </div>\n <Modal\n v-if=\"slots.drawer\"\n data-test=\"stash-data-view-filters|drawer\"\n disable-body-padding\n position=\"right\"\n :is-open=\"isDrawerOpen\"\n :title=\"t('ll.allFilters')\"\n v-bind=\"props.drawerProps\"\n @dismiss=\"onDismiss\"\n >\n <template #headerAction>\n <Button\n v-if=\"isViewingSingleGroup\"\n icon\n class=\"tw-text-ice-100\"\n data-test=\"stash-data-view-filters|drawer-previous-button\"\n :aria-label=\"t('ll.previous')\"\n :title=\"t('ll.previous')\"\n @click=\"emit('previous')\"\n >\n <Icon name=\"chevron-left\" />\n </Button>\n </template>\n\n <slot name=\"drawer\"></slot>\n\n <template #footer>\n <div class=\"tw-flex tw-justify-end tw-gap-gutter\">\n <Button v-if=\"totalActiveFiltersCount === 0\" secondary @click=\"onDismiss\">\n {{ t('ll.cancel') }}\n </Button>\n <Button\n v-if=\"(isViewingGroupsMenu || props.drawerStyle === 'cascade') && totalActiveFiltersCount > 0\"\n secondary\n :disabled=\"isDataViewLoading\"\n @click=\"handleResetAllClick\"\n >\n {{ t('ll.resetAll') }}\n </Button>\n <Button\n v-if=\"isViewingSingleGroup && activeGroupActiveFiltersCount > 0\"\n secondary\n :disabled=\"isDataViewLoading\"\n @click=\"handleResetGroupClick\"\n >\n {{ t('ll.reset') }}\n </Button>\n <Button\n v-if=\"isViewingSingleGroup || props.drawerStyle === 'cascade'\"\n :disabled=\"isDataViewLoading\"\n @click=\"handleApplyClick\"\n >\n {{ t('ll.apply') }}\n </Button>\n </div>\n </template>\n </Modal>\n </Box>\n</template>\n"],"names":["useFilters","schema","dataViewRef","appliedFilters","ref","workingFilters","filterName","dvRef","applyFilters","cloneDeep","resetAllFilters","resetFilterGroup","group","undoWorkingFilters","activeFiltersCounts","computed","counts","config","value","_a","isDefined","totalActiveFiltersCount","count","props","__props","emit","__emit","slots","_useSlots","isDesktop","useMediaQuery","SCREEN_SIZES","isViewingGroupsMenu","isViewingSingleGroup","density","isDataViewLoading","isWithinModule","currentSearch","updateCurrentSearch","inject","DATA_VIEW_INJECTION","provide","DATA_VIEW_FILTERS_UTILS_INJECTION","activeGroupActiveFiltersCount","isDrawerOpen","handleApplyClick","preventDismiss","_b","handleResetGroupClick","handleResetAllClick","onDismiss","watch"],"mappings":"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"}
@@ -47,13 +47,22 @@ export declare interface DataViewFiltersProps {
47
47
  /** 'cascade' displays all fields within every filter group; 'nested' displays only the group names and requires clicking a group to view its fields */
48
48
  drawerStyle?: DrawerStyle;
49
49
  drawerProps?: ModalProps;
50
+ /**
51
+ * @deprecated The `activeGroup` prop is a sufficient replacement for this prop. A falsy `activeGroup` will hide the button and a truthy `activeGroup` will show it (when the `drawerStyle` is 'nested').
52
+ *
53
+ * **Note:** This prop has no effect when using a "cascade" `drawerStyle`.
54
+ */
50
55
  showDrawerPreviousButton?: boolean;
51
56
  /**
52
57
  * Required when using filters. This prop should contain the return value of the `useFilters()` composable.
53
58
  */
54
59
  useFiltersInstance?: UseFiltersReturnType;
55
60
  onApply?: OnApplyFilters;
56
- /** The name of the active filter group. The active filter group is determined by which instance of FilterDropdown or FilterDrawerItem is open. */
61
+ /**
62
+ * The name of the active filter group. The active filter group is determined by which instance of FilterDropdown or FilterDrawerItem is open.
63
+ *
64
+ * **Note:** This prop is required when using a "nested" `drawerStyle`, but has no effect when using a "cascade" `drawerStyle`.
65
+ */
57
66
  activeGroup?: string;
58
67
  }
59
68
 
@@ -78,7 +87,7 @@ declare const _default: __VLS_WithTemplateSlots<DefineComponent<ExtractPropTypes
78
87
  showSearch: boolean;
79
88
  useFiltersInstance: undefined;
80
89
  onApply: undefined;
81
- activeGroup: string;
90
+ activeGroup: undefined;
82
91
  }>>, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {
83
92
  "open-drawer": () => void;
84
93
  dismiss: () => void;
@@ -95,7 +104,7 @@ declare const _default: __VLS_WithTemplateSlots<DefineComponent<ExtractPropTypes
95
104
  showSearch: boolean;
96
105
  useFiltersInstance: undefined;
97
106
  onApply: undefined;
98
- activeGroup: string;
107
+ activeGroup: undefined;
99
108
  }>>> & Readonly<{
100
109
  onDismiss?: (() => any) | undefined;
101
110
  "onOpen-drawer"?: (() => any) | undefined;
@@ -1,6 +1,7 @@
1
- import { defineComponent as r, ref as u, computed as c, openBlock as s, createElementBlock as i, createTextVNode as p, toDisplayString as f, createBlock as h, withCtx as m, createVNode as d, normalizeClass as g, createCommentVNode as x } from "vue";
2
- import C from "./Button.js";
3
- import b from "./Icon.js";
1
+ import { defineComponent as n, ref as r, computed as u, openBlock as a, createElementBlock as c, createTextVNode as i, toDisplayString as m, createBlock as f, withCtx as p, createVNode as h, normalizeClass as d, createCommentVNode as g } from "vue";
2
+ import x from "./Button.js";
3
+ import C from "./Icon.js";
4
+ import b from "./utils/obfuscateText.js";
4
5
  import "./Button.vue_used_vue_type_style_index_0_lang.module-4dabc2a9.js";
5
6
  import "./_plugin-vue_export-helper-dad06003.js";
6
7
  import "lodash-es/uniqueId";
@@ -9,49 +10,47 @@ import "./Icon.vue_used_vue_type_style_index_0_lang.module-eb359559.js";
9
10
  const k = {
10
11
  class: "stash-obfuscate-text",
11
12
  "data-test": "stash-obfuscate-text"
12
- }, A = /* @__PURE__ */ r({
13
+ }, D = /* @__PURE__ */ n({
13
14
  name: "ll-obfuscate-text",
14
15
  __name: "ObfuscateText",
15
16
  props: {
16
17
  text: {},
18
+ obfuscateAll: { type: Boolean, default: !1 },
19
+ showToggle: { type: Boolean, default: !1 },
20
+ lengthToKeep: { default: 0 },
17
21
  maskChar: { default: "•" },
18
22
  maskCharCount: { default: 10 },
19
- lengthToKeep: { default: 0 },
20
- position: { default: "start" },
21
- obfuscateAll: { type: Boolean, default: !1 },
22
- showToggle: { type: Boolean, default: !1 }
23
+ position: { default: "start" }
23
24
  },
24
- setup(l) {
25
- const e = u(!1), t = l, n = c(() => {
26
- if (t.showToggle && e.value)
27
- return t.text;
28
- if (t.obfuscateAll || !t.lengthToKeep)
29
- return t.maskChar.repeat(t.maskCharCount);
30
- let o;
31
- return t.position === "end" ? (o = t.text.substring(0, t.lengthToKeep), o + t.maskChar.repeat(t.maskCharCount)) : (o = t.text.substring(t.text.length - t.lengthToKeep), t.maskChar.repeat(t.maskCharCount) + o);
32
- });
33
- return (o, a) => (s(), i("span", k, [
34
- p(f(n.value) + " ", 1),
35
- o.showToggle ? (s(), h(C, {
25
+ setup(s) {
26
+ const e = r(!1), t = s, l = u(() => t.showToggle && e.value ? t.text : t.obfuscateAll ? t.maskChar.repeat(t.maskCharCount) : b(t.text, {
27
+ maskChar: t.maskChar,
28
+ maskCharCount: t.maskCharCount,
29
+ lengthToKeep: t.lengthToKeep,
30
+ position: t.position
31
+ }));
32
+ return (w, o) => (a(), c("span", k, [
33
+ i(m(l.value) + " ", 1),
34
+ t.showToggle ? (a(), f(x, {
36
35
  key: 0,
37
36
  class: "tw-ml-1 tw-h-auto tw-w-auto tw-p-0",
38
37
  icon: "",
39
38
  type: "button",
40
- onClick: a[0] || (a[0] = (w) => e.value = !e.value)
39
+ onClick: o[0] || (o[0] = (T) => e.value = !e.value)
41
40
  }, {
42
- default: m(() => [
43
- d(b, {
41
+ default: p(() => [
42
+ h(C, {
44
43
  name: e.value ? "hide" : "show",
45
- class: g(["tw-cursor-pointer", e.value ? "stash-obfuscate-text__hide-toggle-icon" : "stash-obfuscate-text__show-toggle-icon"]),
44
+ class: d(["tw-cursor-pointer", e.value ? "stash-obfuscate-text__hide-toggle-icon" : "stash-obfuscate-text__show-toggle-icon"]),
46
45
  "data-test": e.value ? "stash-obfuscate-text|hide-toggle-icon" : "stash-obfuscate-text|show-toggle-icon"
47
46
  }, null, 8, ["name", "class", "data-test"])
48
47
  ]),
49
48
  _: 1
50
- })) : x("", !0)
49
+ })) : g("", !0)
51
50
  ]));
52
51
  }
53
52
  });
54
53
  export {
55
- A as default
54
+ D as default
56
55
  };
57
56
  //# sourceMappingURL=ObfuscateText.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ObfuscateText.js","sources":["../src/components/ObfuscateText/ObfuscateText.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, ref } from 'vue';\n\n import Button from '../Button/Button.vue';\n import Icon from '../Icon/Icon.vue';\n\n defineOptions({ name: 'll-obfuscate-text' });\n\n export interface ObfuscateTextProps {\n /**\n * The full text\n */\n text: string;\n\n /**\n * Character to obfuscate text with\n */\n maskChar?: string;\n\n /**\n * The number of masked characters to display\n */\n maskCharCount?: number;\n\n /**\n * Num of characters to keep revealed.\n * Default will obfuscate entire string\n * with length of maskCharCount.\n */\n lengthToKeep?: number;\n\n /**\n * Position to start obfuscating text\n */\n position?: 'start' | 'end';\n\n /**\n * Whether to obfuscate all characters.\n * @deprecated omit the lengthToKeep prop to achieve the same result\n */\n obfuscateAll?: boolean;\n\n /**\n * Displays a button for toggling text visibility\n */\n showToggle?: boolean;\n }\n\n const isFullTextVisible = ref(false);\n\n const props = withDefaults(defineProps<ObfuscateTextProps>(), {\n maskChar: '•',\n maskCharCount: 10,\n lengthToKeep: 0,\n position: 'start',\n obfuscateAll: false,\n showToggle: false,\n });\n\n const obfuscatedText = computed(() => {\n if (props.showToggle && isFullTextVisible.value) {\n return props.text;\n }\n\n if (props.obfuscateAll || !props.lengthToKeep) {\n return props.maskChar.repeat(props.maskCharCount);\n }\n\n let charsToKeep;\n\n if (props.position === 'end') {\n charsToKeep = props.text.substring(0, props.lengthToKeep);\n\n return charsToKeep + props.maskChar.repeat(props.maskCharCount);\n } else {\n charsToKeep = props.text.substring(props.text.length - props.lengthToKeep);\n\n return props.maskChar.repeat(props.maskCharCount) + charsToKeep;\n }\n });\n</script>\n\n<template>\n <span class=\"stash-obfuscate-text\" data-test=\"stash-obfuscate-text\">\n {{ obfuscatedText }}\n <Button\n v-if=\"showToggle\"\n class=\"tw-ml-1 tw-h-auto tw-w-auto tw-p-0\"\n icon\n type=\"button\"\n @click=\"isFullTextVisible = !isFullTextVisible\"\n >\n <Icon\n :name=\"isFullTextVisible ? 'hide' : 'show'\"\n class=\"tw-cursor-pointer\"\n :class=\"isFullTextVisible ? 'stash-obfuscate-text__hide-toggle-icon' : 'stash-obfuscate-text__show-toggle-icon'\"\n :data-test=\"\n isFullTextVisible ? 'stash-obfuscate-text|hide-toggle-icon' : 'stash-obfuscate-text|show-toggle-icon'\n \"\n />\n </Button>\n </span>\n</template>\n"],"names":["isFullTextVisible","ref","props","__props","obfuscatedText","computed","charsToKeep"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAgDQ,UAAAA,IAAoBC,EAAI,EAAK,GAE7BC,IAAQC,GASRC,IAAiBC,EAAS,MAAM;AAChC,UAAAH,EAAM,cAAcF,EAAkB;AACxC,eAAOE,EAAM;AAGf,UAAIA,EAAM,gBAAgB,CAACA,EAAM;AAC/B,eAAOA,EAAM,SAAS,OAAOA,EAAM,aAAa;AAG9C,UAAAI;AAEA,aAAAJ,EAAM,aAAa,SACrBI,IAAcJ,EAAM,KAAK,UAAU,GAAGA,EAAM,YAAY,GAEjDI,IAAcJ,EAAM,SAAS,OAAOA,EAAM,aAAa,MAE9DI,IAAcJ,EAAM,KAAK,UAAUA,EAAM,KAAK,SAASA,EAAM,YAAY,GAElEA,EAAM,SAAS,OAAOA,EAAM,aAAa,IAAII;AAAA,IACtD,CACD;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"ObfuscateText.js","sources":["../src/components/ObfuscateText/ObfuscateText.vue"],"sourcesContent":["<script setup lang=\"ts\">\n import { computed, ref } from 'vue';\n\n import Button from '../Button/Button.vue';\n import Icon from '../Icon/Icon.vue';\n\n defineOptions({ name: 'll-obfuscate-text' });\n\n import obfuscateText, { ObfuscateTextOptions } from '../../utils/obfuscateText';\n\n export interface ObfuscateTextProps extends ObfuscateTextOptions {\n /**\n * The full text\n */\n text: string;\n\n /**\n * Whether to obfuscate all characters.\n * @deprecated omit the lengthToKeep prop to achieve the same result\n */\n obfuscateAll?: boolean;\n\n /**\n * Displays a button for toggling text visibility\n */\n showToggle?: boolean;\n }\n\n const isFullTextVisible = ref(false);\n\n const props = withDefaults(defineProps<ObfuscateTextProps>(), {\n maskChar: '•',\n maskCharCount: 10,\n lengthToKeep: 0,\n position: 'start',\n obfuscateAll: false,\n showToggle: false,\n });\n\n const obfuscatedText = computed(() => {\n if (props.showToggle && isFullTextVisible.value) {\n return props.text;\n }\n\n if (props.obfuscateAll) {\n return props.maskChar.repeat(props.maskCharCount);\n }\n\n return obfuscateText(props.text, {\n maskChar: props.maskChar,\n maskCharCount: props.maskCharCount,\n lengthToKeep: props.lengthToKeep,\n position: props.position,\n });\n });\n</script>\n\n<template>\n <span class=\"stash-obfuscate-text\" data-test=\"stash-obfuscate-text\">\n {{ obfuscatedText }}\n <Button\n v-if=\"props.showToggle\"\n class=\"tw-ml-1 tw-h-auto tw-w-auto tw-p-0\"\n icon\n type=\"button\"\n @click=\"isFullTextVisible = !isFullTextVisible\"\n >\n <Icon\n :name=\"isFullTextVisible ? 'hide' : 'show'\"\n class=\"tw-cursor-pointer\"\n :class=\"isFullTextVisible ? 'stash-obfuscate-text__hide-toggle-icon' : 'stash-obfuscate-text__show-toggle-icon'\"\n :data-test=\"\n isFullTextVisible ? 'stash-obfuscate-text|hide-toggle-icon' : 'stash-obfuscate-text|show-toggle-icon'\n \"\n />\n </Button>\n </span>\n</template>\n"],"names":["isFullTextVisible","ref","props","__props","obfuscatedText","computed","obfuscateText"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AA4BQ,UAAAA,IAAoBC,EAAI,EAAK,GAE7BC,IAAQC,GASRC,IAAiBC,EAAS,MAC1BH,EAAM,cAAcF,EAAkB,QACjCE,EAAM,OAGXA,EAAM,eACDA,EAAM,SAAS,OAAOA,EAAM,aAAa,IAG3CI,EAAcJ,EAAM,MAAM;AAAA,MAC/B,UAAUA,EAAM;AAAA,MAChB,eAAeA,EAAM;AAAA,MACrB,cAAcA,EAAM;AAAA,MACpB,UAAUA,EAAM;AAAA,IAAA,CACjB,CACF;;;;;;;;;;;;;;;;;;;;;;"}
@@ -50,11 +50,13 @@ declare const _default: DefineComponent<ExtractPropTypes<__VLS_WithDefaults<__VL
50
50
  }, {}, {}, {}, string, ComponentProvideOptions, true, {}, any>;
51
51
  export default _default;
52
52
 
53
- export declare interface ObfuscateTextProps {
53
+ declare interface ObfuscateTextOptions {
54
54
  /**
55
- * The full text
55
+ * Num of characters to keep revealed.
56
+ * Default will obfuscate entire string
57
+ * with length of maskCharCount.
56
58
  */
57
- text: string;
59
+ lengthToKeep?: number;
58
60
  /**
59
61
  * Character to obfuscate text with
60
62
  */
@@ -63,16 +65,17 @@ export declare interface ObfuscateTextProps {
63
65
  * The number of masked characters to display
64
66
  */
65
67
  maskCharCount?: number;
66
- /**
67
- * Num of characters to keep revealed.
68
- * Default will obfuscate entire string
69
- * with length of maskCharCount.
70
- */
71
- lengthToKeep?: number;
72
68
  /**
73
69
  * Position to start obfuscating text
74
70
  */
75
71
  position?: 'start' | 'end';
72
+ }
73
+
74
+ export declare interface ObfuscateTextProps extends ObfuscateTextOptions {
75
+ /**
76
+ * The full text
77
+ */
78
+ text: string;
76
79
  /**
77
80
  * Whether to obfuscate all characters.
78
81
  * @deprecated omit the lengthToKeep prop to achieve the same result
@@ -0,0 +1,25 @@
1
+ declare function obfuscateText(text: any, { maskChar, maskCharCount, lengthToKeep, position }?: ObfuscateTextOptions): string;
2
+ export default obfuscateText;
3
+
4
+ export declare interface ObfuscateTextOptions {
5
+ /**
6
+ * Num of characters to keep revealed.
7
+ * Default will obfuscate entire string
8
+ * with length of maskCharCount.
9
+ */
10
+ lengthToKeep?: number;
11
+ /**
12
+ * Character to obfuscate text with
13
+ */
14
+ maskChar?: string;
15
+ /**
16
+ * The number of masked characters to display
17
+ */
18
+ maskCharCount?: number;
19
+ /**
20
+ * Position to start obfuscating text
21
+ */
22
+ position?: 'start' | 'end';
23
+ }
24
+
25
+ export { }
@@ -0,0 +1,10 @@
1
+ function b(u, { maskChar: e = "•", maskCharCount: f = 10, lengthToKeep: i = 0, position: n = "start" } = {}) {
2
+ if (!i)
3
+ return e == null ? void 0 : e.repeat(f);
4
+ let t;
5
+ return n === "end" ? (t = u.substring(0, i), t + (e == null ? void 0 : e.repeat(f))) : (t = u.substring(u.length - i), (e == null ? void 0 : e.repeat(f)) + t);
6
+ }
7
+ export {
8
+ b as default
9
+ };
10
+ //# sourceMappingURL=obfuscateText.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obfuscateText.js","sources":["../../src/utils/obfuscateText.ts"],"sourcesContent":["export interface ObfuscateTextOptions {\n /**\n * Num of characters to keep revealed.\n * Default will obfuscate entire string\n * with length of maskCharCount.\n */\n lengthToKeep?: number;\n /**\n * Character to obfuscate text with\n */\n maskChar?: string;\n /**\n * The number of masked characters to display\n */\n maskCharCount?: number;\n /**\n * Position to start obfuscating text\n */\n position?: 'start' | 'end';\n}\n\nexport default function obfuscateText(\n text,\n { maskChar = '•', maskCharCount = 10, lengthToKeep = 0, position = 'start' }: ObfuscateTextOptions = {},\n): string {\n if (!lengthToKeep) {\n return maskChar?.repeat(maskCharCount);\n }\n\n let charsToKeep;\n\n if (position === 'end') {\n charsToKeep = text.substring(0, lengthToKeep);\n\n return charsToKeep + maskChar?.repeat(maskCharCount);\n } else {\n charsToKeep = text.substring(text.length - lengthToKeep);\n\n return maskChar?.repeat(maskCharCount) + charsToKeep;\n }\n}\n"],"names":["obfuscateText","text","maskChar","maskCharCount","lengthToKeep","position","charsToKeep"],"mappings":"AAqBA,SAAwBA,EACtBC,GACA,EAAE,UAAAC,IAAW,KAAK,eAAAC,IAAgB,IAAI,cAAAC,IAAe,GAAG,UAAAC,IAAW,QAAQ,IAA0B,CAAA,GAC7F;AACR,MAAI,CAACD;AACI,WAAAF,KAAA,gBAAAA,EAAU,OAAOC;AAGtB,MAAAG;AAEJ,SAAID,MAAa,SACDC,IAAAL,EAAK,UAAU,GAAGG,CAAY,GAErCE,KAAcJ,KAAA,gBAAAA,EAAU,OAAOC,QAEtCG,IAAcL,EAAK,UAAUA,EAAK,SAASG,CAAY,IAEhDF,KAAA,gBAAAA,EAAU,OAAOC,MAAiBG;AAE7C;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leaflink/stash",
3
- "version": "49.2.0",
3
+ "version": "49.3.1",
4
4
  "description": "LeafLink's design system.",
5
5
  "homepage": "https://stash.leaflink.com",
6
6
  "main": "./dist/index.ts",