@verdnatura/vn-front-lib 0.0.9 → 0.0.11

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 (51) hide show
  1. package/dist/components-BrEjZWQj.js +3278 -0
  2. package/dist/components-Dty6kM2e.cjs +2 -0
  3. package/dist/components.cjs +1 -1
  4. package/dist/components.js +2 -2
  5. package/dist/composables-DUOUI4DI.js +3558 -0
  6. package/dist/composables-ZxHJjJGN.cjs +4 -0
  7. package/dist/composables.cjs +1 -1
  8. package/dist/composables.js +2 -2
  9. package/dist/filters.cjs +1 -0
  10. package/dist/filters.js +62 -0
  11. package/dist/rolldown-runtime-DF3sbh8G.cjs +1 -0
  12. package/dist/stores.cjs +1 -1
  13. package/dist/stores.js +144 -2
  14. package/dist/utils.cjs +1 -0
  15. package/dist/utils.js +131 -0
  16. package/dist/vn-front-lib.cjs +1 -1
  17. package/dist/vn-front-lib.css +1 -1
  18. package/dist/vn-front-lib.js +6 -7
  19. package/lib/components/dialogs/VnConfirm.vue +142 -0
  20. package/lib/components/feedback/VnSkeletonForm.vue +14 -0
  21. package/lib/components/feedback/VnSpinner.vue +63 -0
  22. package/lib/components/index.js +5 -0
  23. package/lib/components/models/VnFetch.vue +65 -0
  24. package/lib/components/models/VnForm.vue +492 -0
  25. package/lib/composables/index.js +7 -0
  26. package/lib/composables/tMobile.js +8 -0
  27. package/lib/composables/useArrayData.js +451 -0
  28. package/lib/composables/useForm.js +12 -0
  29. package/lib/composables/useNotify.js +24 -0
  30. package/lib/composables/useObjectComparison.js +67 -0
  31. package/lib/composables/useQueryResolver.js +306 -0
  32. package/lib/composables/useState.js +81 -0
  33. package/lib/filters/filterPanel.js +95 -0
  34. package/lib/filters/getDifferences.js +18 -0
  35. package/lib/filters/getUpdatedValues.js +6 -0
  36. package/lib/filters/index.js +5 -0
  37. package/lib/filters/isDialogOpened.js +3 -0
  38. package/lib/filters/onBeforeSave.js +9 -0
  39. package/lib/stores/index.js +2 -0
  40. package/lib/stores/useArrayDataStore.js +82 -0
  41. package/lib/stores/useStateStore.js +84 -0
  42. package/lib/utils/advancedFilters.js +125 -0
  43. package/lib/utils/index.js +2 -0
  44. package/lib/utils/trackAnalytics.js +18 -0
  45. package/package.json +9 -2
  46. package/dist/components-BLui5eyq.cjs +0 -1
  47. package/dist/components-Dl-Ieazh.js +0 -2466
  48. package/dist/useRequired-BqsSq8Mw.cjs +0 -1
  49. package/dist/useRequired-CTxBp3qy.js +0 -58
  50. package/dist/useValidationsStore-8JX1-oLO.cjs +0 -1
  51. package/dist/useValidationsStore-9Fxtj_pd.js +0 -12
@@ -0,0 +1,306 @@
1
+ import axios from 'axios';
2
+ import qs from 'qs';
3
+ import { getObjectByKeys, isSameValue } from 'lib/composables';
4
+ import { advancedFilters, defaultOperator, trackAnalyticEvent } from 'lib/utils';
5
+
6
+ const DEFAULT_OPERATOR = defaultOperator;
7
+
8
+ export async function requestData(params, canceller, store) {
9
+ const { isLocal, remoteParamsArray, customFilterFn, keyData, url } = store;
10
+
11
+ if (store?.dataAnalyticsFilter) {
12
+ const path = window.location.hash.slice(1).split('?')[0];
13
+ trackAnalyticEvent(store.dataAnalyticsFilter, path);
14
+ }
15
+
16
+ if (!isLocal) return fetchRemote(params);
17
+
18
+ let response;
19
+
20
+ const { remote: currentRemoteParams, local: currentLocalParams } =
21
+ getRemoteAndLocalParams(params, remoteParamsArray);
22
+
23
+ const { remote: appliedRemoteParams, local: appliedLocalParams } =
24
+ getRemoteAndLocalParams(store.appliedParams, remoteParamsArray);
25
+
26
+ const hasNewRemoteParams =
27
+ !store.appliedParams || !isSameValue(currentRemoteParams, appliedRemoteParams);
28
+
29
+ const hasNewLocalParams =
30
+ !store.appliedParams || !isSameValue(currentLocalParams, appliedLocalParams);
31
+
32
+ const localParamsToApply = hasNewLocalParams
33
+ ? currentLocalParams
34
+ : appliedLocalParams;
35
+
36
+ // prettier-ignore
37
+ if (((!hasNewRemoteParams && !hasNewLocalParams) || (!store?.rawResponse || hasNewRemoteParams)) && url)
38
+ response = await fetchRemote(currentRemoteParams);
39
+
40
+ response = fetchLocalData(
41
+ store.rawResponse,
42
+ localParamsToApply,
43
+ customFilterFn,
44
+ keyData,
45
+ store,
46
+ );
47
+ store.appliedParams = JSON.parse(JSON.stringify(params));
48
+
49
+ return response;
50
+
51
+ async function fetchRemote(remoteParams) {
52
+ const requestParams = {
53
+ ...remoteParams,
54
+ filter: JSON.stringify(remoteParams.filter),
55
+ };
56
+
57
+ const query = await axios.get(store.url, {
58
+ signal: canceller.signal,
59
+ params: requestParams,
60
+ paramsSerializer: (params) => qs.stringify(params, { skipNulls: false }),
61
+ });
62
+ store.appliedParams = JSON.parse(JSON.stringify(params));
63
+ store.rawResponse = structuredClone(query.data);
64
+ return query;
65
+ }
66
+ }
67
+
68
+ export function getRemoteAndLocalParams(params, remoteParamsArray = []) {
69
+ const isPlainObject = (value) =>
70
+ value && typeof value === 'object' && !Array.isArray(value);
71
+
72
+ const source = isPlainObject(params) ? params : {};
73
+ const remoteKeys = Array.isArray(remoteParamsArray)
74
+ ? remoteParamsArray.filter((key) => typeof key === 'string')
75
+ : [];
76
+ const remoteKeySet = new Set(remoteKeys);
77
+
78
+ const remote = getObjectByKeys(source, remoteKeys);
79
+ const local = Object.fromEntries(
80
+ Object.entries(source).filter(
81
+ ([key]) => key !== 'filter' && !remoteKeySet.has(key),
82
+ ),
83
+ );
84
+
85
+ const sourceFilter = isPlainObject(source.filter) ? source.filter : null;
86
+ if (!sourceFilter) return { remote, local };
87
+
88
+ const localFilter = {};
89
+ const remoteFilter = {};
90
+
91
+ if (isPlainObject(sourceFilter.where)) {
92
+ const remoteWhere = getObjectByKeys(sourceFilter.where, remoteKeys);
93
+ const localWhere = Object.fromEntries(
94
+ Object.entries(sourceFilter.where).filter(([key]) => !remoteKeySet.has(key)),
95
+ );
96
+
97
+ if (Object.keys(localWhere).length) localFilter.where = localWhere;
98
+ if (Object.keys(remoteWhere).length) remoteFilter.where = remoteWhere;
99
+ }
100
+
101
+ if (Array.isArray(sourceFilter.order)) {
102
+ const matchesRemoteOrder = (orderClause) => {
103
+ if (typeof orderClause !== 'string') return false;
104
+
105
+ const normalizedClause = orderClause.toLowerCase();
106
+ return remoteKeys.some((remoteKey) => {
107
+ const normalizedKey = remoteKey.toLowerCase();
108
+ return (
109
+ normalizedClause === normalizedKey ||
110
+ normalizedClause.startsWith(`${normalizedKey} `) ||
111
+ normalizedClause.includes(`.${normalizedKey} `)
112
+ );
113
+ });
114
+ };
115
+
116
+ const remoteOrder = sourceFilter.order.filter(matchesRemoteOrder);
117
+ const localOrder = sourceFilter.order.filter(
118
+ (orderClause) => !matchesRemoteOrder(orderClause),
119
+ );
120
+
121
+ if (localOrder.length) localFilter.order = localOrder;
122
+ if (remoteOrder.length) remoteFilter.order = remoteOrder;
123
+ }
124
+
125
+ Object.assign(
126
+ remoteFilter,
127
+ Object.fromEntries(
128
+ Object.entries(sourceFilter).filter(
129
+ ([filterKey]) => filterKey !== 'where' && filterKey !== 'order',
130
+ ),
131
+ ),
132
+ );
133
+
134
+ if (Object.keys(localFilter).length) local.filter = localFilter;
135
+ if (Object.keys(remoteFilter).length) remote.filter = remoteFilter;
136
+
137
+ return { remote, local };
138
+ }
139
+
140
+ export function fetchLocalData(data, params, customFn, keyData, store) {
141
+ const { isStackableParams, nonStackableParams, stackedParams } = store;
142
+ let dataToFilter = keyData ? data[keyData] : (data ?? store.data);
143
+
144
+ const currentParams = JSON.parse(JSON.stringify(params));
145
+ const filter = currentParams?.filter;
146
+ const order = filter?.order;
147
+ const where = filter?.where;
148
+ const otherParams = JSON.parse(JSON.stringify(currentParams));
149
+ delete otherParams.filter;
150
+
151
+ const hasWhere = Object.keys(where ?? {}).length;
152
+ const hasOtherParams = Object.keys(otherParams ?? {}).length;
153
+ const hasStackedParams = isStackableParams && stackedParams.length;
154
+
155
+ if (hasWhere || hasOtherParams || hasStackedParams) {
156
+ const filters = [];
157
+ if (where) setFilters(where, filters);
158
+ if (otherParams) setFilters(otherParams, filters);
159
+ if (isStackableParams) setStackedFilters(store, filters);
160
+
161
+ function setStackedFilters(store, filters) {
162
+ filters.push(
163
+ ...store.stackedParams.filter(
164
+ (p) =>
165
+ !filters.find(
166
+ (f) =>
167
+ f.column === p.column &&
168
+ f.operator === p.operator &&
169
+ !Array.isArray(p.value) &&
170
+ isSameValue(f.value, p.value),
171
+ ),
172
+ ),
173
+ );
174
+ if (isStackableParams)
175
+ store.stackedParams = filters.filter(
176
+ (f) => !nonStackableParams?.includes(f.column),
177
+ );
178
+ }
179
+
180
+ function setFilters(params, filters) {
181
+ for (const key in params) {
182
+ const complexOp =
183
+ params[key] &&
184
+ typeof params[key] === 'object' &&
185
+ !Array.isArray(params[key]);
186
+
187
+ const rawOperator = complexOp
188
+ ? Object.keys(params[key])[0]
189
+ : DEFAULT_OPERATOR;
190
+ const value = complexOp ? params[key][rawOperator] : params[key];
191
+
192
+ filters.push({ column: key, operator: rawOperator, value });
193
+ }
194
+ }
195
+
196
+ function filterFn(row, filters) {
197
+ let match;
198
+ for (const filter of filters) {
199
+ try {
200
+ const opFn = advancedFilters?.[filter.operator]?.localEval;
201
+ match = opFn ? opFn(row[filter.column], filter.value) : false;
202
+ } catch (error) {
203
+ console.error('fetchLocalData filter comparison error', {
204
+ row,
205
+ filter,
206
+ filters,
207
+ error,
208
+ });
209
+ return false;
210
+ }
211
+ if (!match) break;
212
+ }
213
+ return match;
214
+ }
215
+
216
+ const matcher = customFn
217
+ ? (row) => customFn(row, filters, filterFn)
218
+ : (row) => filterFn(row, filters);
219
+
220
+ dataToFilter = dataToFilter.filter(matcher);
221
+ }
222
+
223
+ if (order) {
224
+ const sortParams = parseOrder(order);
225
+ dataToFilter = multiSort(dataToFilter, sortParams);
226
+ }
227
+
228
+ let response;
229
+
230
+ if (keyData) response = { ...data, [keyData]: dataToFilter };
231
+ else response = { data: dataToFilter };
232
+
233
+ return response;
234
+ }
235
+
236
+ function parseOrder(order) {
237
+ if (typeof order === 'string') order = order.split(',');
238
+
239
+ return order.map((str) => {
240
+ const [key, direction = 'asc'] = str.trim().split(/\s+/);
241
+
242
+ return {
243
+ key,
244
+ order: direction.toLowerCase() === 'desc' ? 'desc' : 'asc',
245
+ };
246
+ });
247
+ }
248
+
249
+ function normalizeValue(val) {
250
+ if (val == null) return null;
251
+
252
+ if (val instanceof Date) return val.getTime();
253
+
254
+ if (typeof val === 'boolean') return val ? 1 : 0;
255
+
256
+ if (typeof val === 'number') return val;
257
+
258
+ if (typeof val === 'string') {
259
+ const num = Number(val);
260
+ if (!isNaN(num) && val.trim() !== '') return num;
261
+
262
+ if (isLikelyDateString(val)) {
263
+ const date = new Date(val);
264
+ if (!isNaN(date.getTime())) return date.getTime();
265
+ }
266
+
267
+ return val.toLowerCase();
268
+ }
269
+
270
+ return val;
271
+ }
272
+
273
+ function isLikelyDateString(val) {
274
+ return /^(\d{4}-\d{2}-\d{2})([T ][\d:.+-]+(?:Z)?)?$/.test(val.trim());
275
+ }
276
+
277
+ function compareValues(a, b, order) {
278
+ const dir = order === 'asc' ? 1 : -1;
279
+
280
+ const valA = normalizeValue(a);
281
+ const valB = normalizeValue(b);
282
+
283
+ if (valA == null && valB == null) return 0;
284
+ if (valA == null) return 1;
285
+ if (valB == null) return -1;
286
+
287
+ if (typeof valA === 'string' && typeof valB === 'string') {
288
+ const res = valA.localeCompare(valB);
289
+ return dir * res;
290
+ }
291
+
292
+ if (valA > valB) return dir;
293
+ if (valA < valB) return -dir;
294
+
295
+ return 0;
296
+ }
297
+
298
+ function multiSort(array, sortParams) {
299
+ return [...array].sort((a, b) => {
300
+ for (const { key, order } of sortParams) {
301
+ const res = compareValues(a[key], b[key], order);
302
+ if (res !== 0) return res;
303
+ }
304
+ return 0;
305
+ });
306
+ }
@@ -0,0 +1,81 @@
1
+ import { ref, computed } from 'vue';
2
+
3
+ const state = ref({});
4
+
5
+ const user = ref({
6
+ id: 0,
7
+ name: '',
8
+ nickname: '',
9
+ lang: '',
10
+ darkMode: null,
11
+ companyFk: null,
12
+ warehouseFk: null,
13
+ centralWeekPlacement: null,
14
+ yearScope: null,
15
+ });
16
+ if (sessionStorage.getItem('user'))
17
+ user.value = JSON.parse(sessionStorage.getItem('user'));
18
+
19
+ const roles = ref([]);
20
+ const acls = ref([]);
21
+ const drawer = ref(true);
22
+ const headerMounted = ref(false);
23
+
24
+ export function useState() {
25
+ function getUser() {
26
+ return computed(() => {
27
+ return user.value;
28
+ });
29
+ }
30
+
31
+ function setUser(data) {
32
+ const currentUser = { ...JSON.parse(sessionStorage.getItem('user')), ...data };
33
+ sessionStorage.setItem('user', JSON.stringify(currentUser));
34
+ user.value = currentUser;
35
+ return currentUser;
36
+ }
37
+
38
+ function getRoles() {
39
+ return computed(() => {
40
+ return roles.value;
41
+ });
42
+ }
43
+
44
+ function setRoles(data) {
45
+ roles.value = data;
46
+ }
47
+
48
+ function getAcls() {
49
+ return computed(() => acls.value);
50
+ }
51
+
52
+ function setAcls(data) {
53
+ acls.value = data;
54
+ }
55
+
56
+ function set(name, data) {
57
+ state.value[name] = ref(data);
58
+ }
59
+
60
+ function get(name) {
61
+ return state.value[name];
62
+ }
63
+
64
+ function unset(name) {
65
+ delete state.value[name];
66
+ }
67
+
68
+ return {
69
+ getUser,
70
+ setUser,
71
+ getRoles,
72
+ setRoles,
73
+ getAcls,
74
+ setAcls,
75
+ set,
76
+ get,
77
+ unset,
78
+ drawer,
79
+ headerMounted,
80
+ };
81
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Passes a loopback fields filter to an object.
3
+ *
4
+ * @param {Object} fields The fields object or array
5
+ * @return {Object} The fields as object
6
+ */
7
+ function fieldsToObject(fields) {
8
+ const fieldsObj = {};
9
+
10
+ if (Array.isArray(fields)) {
11
+ for (const field of fields) fieldsObj[field] = true;
12
+ } else if (typeof fields == 'object') {
13
+ for (const field in fields) {
14
+ if (fields[field]) fieldsObj[field] = true;
15
+ }
16
+ }
17
+
18
+ return fieldsObj;
19
+ }
20
+
21
+ /**
22
+ * Merges two loopback fields filters.
23
+ *
24
+ * @param {Object|Array} src The source fields
25
+ * @param {Object|Array} dst The destination fields
26
+ * @return {Array} The merged fields as an array
27
+ */
28
+ function mergeFields(src, dst) {
29
+ const fields = {};
30
+ Object.assign(fields, fieldsToObject(src), fieldsToObject(dst));
31
+ return Object.keys(fields);
32
+ }
33
+
34
+ /**
35
+ * Merges two loopback where filters.
36
+ *
37
+ * @param {Object|Array} src The source where
38
+ * @param {Object|Array} dst The destination where
39
+ * @return {Array} The merged wheres
40
+ */
41
+ function mergeWhere(src, dst) {
42
+ const and = [];
43
+ if (src) and.push(src);
44
+ if (dst) and.push(dst);
45
+ return simplifyOperation(and, 'and');
46
+ }
47
+
48
+ /**
49
+ * Merges two loopback filters returning the merged filter.
50
+ *
51
+ * @param {Object} src The source filter
52
+ * @param {Object} dst The destination filter
53
+ * @return {Object} The result filter
54
+ */
55
+ function mergeFilters(src, dst) {
56
+ const res = { ...dst };
57
+
58
+ if (!src) return res;
59
+
60
+ if (src.fields) res.fields = mergeFields(src.fields, res.fields);
61
+ if (src.where) res.where = mergeWhere(res.where, src.where);
62
+ if (src.include) res.include = src.include;
63
+ if (src.order) res.order = src.order;
64
+ if (src.limit) res.limit = src.limit;
65
+ if (src.offset) res.offset = src.offset;
66
+ if (src.skip) res.skip = src.skip;
67
+
68
+ return res;
69
+ }
70
+
71
+ function simplifyOperation(operation, operator) {
72
+ switch (operation.length) {
73
+ case 0:
74
+ return undefined;
75
+ case 1:
76
+ return operation[0];
77
+ default:
78
+ return { [operator]: operation };
79
+ }
80
+ }
81
+
82
+ function buildFilter(params, builderFunc) {
83
+ const and = [];
84
+
85
+ for (const param in params) {
86
+ const value = params[param];
87
+ if (value === undefined) continue;
88
+
89
+ const expr = builderFunc(param, value);
90
+ if (expr) and.push(expr);
91
+ }
92
+ return simplifyOperation(and, 'and');
93
+ }
94
+
95
+ export { fieldsToObject, mergeFields, mergeWhere, mergeFilters, buildFilter };
@@ -0,0 +1,18 @@
1
+ export function getDifferences(formData = {}, initialData = {}) {
2
+ const diff = {};
3
+ const initial = { ...initialData };
4
+ const form = { ...formData };
5
+ delete initial.$index;
6
+ delete form.$index;
7
+
8
+ for (const key in form) {
9
+ if (!Object.prototype.hasOwnProperty.call(initial, key)) diff[key] = form[key];
10
+ else if (JSON.stringify(form[key]) !== JSON.stringify(initial[key]))
11
+ diff[key] = form[key];
12
+ }
13
+
14
+ for (const key in initial)
15
+ if (!Object.prototype.hasOwnProperty.call(form, key)) diff[key] = initial[key];
16
+
17
+ return diff;
18
+ }
@@ -0,0 +1,6 @@
1
+ export function getUpdatedValues(keys, formData) {
2
+ return keys.reduce((acc, key) => {
3
+ acc[key] = formData[key];
4
+ return acc;
5
+ }, {});
6
+ }
@@ -0,0 +1,5 @@
1
+ export * from './filterPanel';
2
+ export * from './getDifferences';
3
+ export * from './getUpdatedValues';
4
+ export * from './isDialogOpened';
5
+ export * from './onBeforeSave';
@@ -0,0 +1,3 @@
1
+ export function isDialogOpened(query = '[role="dialog"]') {
2
+ return document.querySelectorAll(query).length > 0;
3
+ }
@@ -0,0 +1,9 @@
1
+ import { getDifferences } from 'lib/filters';
2
+ import { getUpdatedValues } from 'lib/filters';
3
+
4
+ export function onBeforeSave(formData, originalData) {
5
+ return getUpdatedValues(
6
+ Object.keys(getDifferences(formData, originalData)),
7
+ formData,
8
+ );
9
+ }
@@ -1 +1,3 @@
1
+ export * from './useArrayDataStore';
2
+ export * from './useStateStore';
1
3
  export * from './useValidationsStore';
@@ -0,0 +1,82 @@
1
+ import { ref } from 'vue';
2
+ import { defineStore } from 'pinia';
3
+
4
+ export const useArrayDataStore = defineStore('arrayDataStore', () => {
5
+ const state = ref({});
6
+ const defaultOpts = {
7
+ filter: {},
8
+ userFilter: {},
9
+ userParams: {},
10
+ appliedParams: null,
11
+ rawResponse: null,
12
+ url: '',
13
+ limit: 20,
14
+ skip: 0,
15
+ order: '',
16
+ isLoading: false,
17
+ userParamsChanged: false,
18
+ exprBuilder: null,
19
+ dynamicExprBuilder: {},
20
+ dynamicWhereBuilder: {},
21
+ searchUrl: 'params',
22
+ navigate: null,
23
+ page: 1,
24
+ mapKey: 'id',
25
+ oneRecord: false,
26
+ hasChanges: false,
27
+ isLocal: false,
28
+ customFilterFn: null,
29
+ remoteParamsArray: [],
30
+ keyData: null,
31
+ isStackableParams: false,
32
+ nonStackableParams: [],
33
+ stackedParams: [],
34
+ dataAnalyticsFilter: false,
35
+ ignoreUrlParams: [],
36
+ };
37
+
38
+ function get(key) {
39
+ return state.value[key];
40
+ }
41
+
42
+ function set(key) {
43
+ state.value[key] = getDefaultState(key);
44
+ }
45
+
46
+ function clear(key) {
47
+ state.value[key]?.channel?.close();
48
+ delete state.value[key];
49
+ }
50
+
51
+ function reset(key, opts = []) {
52
+ if (!opts.length) state.value[key] = getDefaultState();
53
+ else
54
+ opts.forEach((opt) => {
55
+ if (opt.includes('.')) {
56
+ const [parent, child] = opt.split('.');
57
+ state.value[key][parent][child] = defaultOpts[child];
58
+ } else if (Object.hasOwn(state.value[key], opt))
59
+ state.value[key][opt] = defaultOpts[opt];
60
+ });
61
+ }
62
+
63
+ function getDefaultState(key) {
64
+ return Object.assign(JSON.parse(JSON.stringify(defaultOpts)), {
65
+ data: ref(),
66
+ map: ref(new Map()),
67
+ channel: new BroadcastChannel(`channel-data-${key}`),
68
+ });
69
+ }
70
+
71
+ function resetPagination(key) {
72
+ reset(key, ['skip', 'filter.skip', 'page']);
73
+ }
74
+
75
+ return {
76
+ get,
77
+ set,
78
+ clear,
79
+ reset,
80
+ resetPagination,
81
+ };
82
+ });
@@ -0,0 +1,84 @@
1
+ import { ref } from 'vue';
2
+ import { defineStore } from 'pinia';
3
+
4
+ export const useStateStore = defineStore('stateStore', () => {
5
+ const isMounted = ref(false);
6
+ const leftDrawer = ref(false);
7
+ const rightDrawer = ref(false);
8
+ const rightAdvancedDrawer = ref(false);
9
+ const subToolbar = ref(false);
10
+ const cardDescriptor = ref(null);
11
+ const descriptors = ref({});
12
+
13
+ function cardDescriptorChangeValue(descriptor) {
14
+ cardDescriptor.value = descriptor;
15
+ }
16
+ function toggleLeftDrawer() {
17
+ leftDrawer.value = !leftDrawer.value;
18
+ }
19
+
20
+ function toggleRightDrawer() {
21
+ rightDrawer.value = !rightDrawer.value;
22
+ }
23
+
24
+ function toggleRightAdvancedDrawer() {
25
+ rightAdvancedDrawer.value = !rightAdvancedDrawer.value;
26
+ }
27
+
28
+ function rightDrawerChangeValue(value) {
29
+ rightDrawer.value = value;
30
+ }
31
+
32
+ function rightAdvancedDrawerChangeValue(value) {
33
+ rightAdvancedDrawer.value = value;
34
+ }
35
+
36
+ function toggleSubToolbar() {
37
+ subToolbar.value = !subToolbar.value;
38
+ }
39
+
40
+ function setMounted() {
41
+ isMounted.value = true;
42
+ }
43
+
44
+ function isHeaderMounted() {
45
+ return isMounted.value;
46
+ }
47
+
48
+ function isLeftDrawerShown() {
49
+ return leftDrawer.value;
50
+ }
51
+
52
+ function isRightDrawerShown() {
53
+ return rightDrawer.value;
54
+ }
55
+
56
+ function isSubToolbarShown() {
57
+ return subToolbar.value;
58
+ }
59
+
60
+ function setDescriptors(value) {
61
+ descriptors.value = value;
62
+ }
63
+
64
+ return {
65
+ cardDescriptor,
66
+ cardDescriptorChangeValue,
67
+ leftDrawer,
68
+ rightDrawer,
69
+ rightAdvancedDrawer,
70
+ setMounted,
71
+ isHeaderMounted,
72
+ toggleLeftDrawer,
73
+ toggleRightDrawer,
74
+ toggleRightAdvancedDrawer,
75
+ isLeftDrawerShown,
76
+ isRightDrawerShown,
77
+ isSubToolbarShown,
78
+ toggleSubToolbar,
79
+ rightDrawerChangeValue,
80
+ rightAdvancedDrawerChangeValue,
81
+ descriptors,
82
+ setDescriptors,
83
+ };
84
+ });