@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.
- package/dist/components-BrEjZWQj.js +3278 -0
- package/dist/components-Dty6kM2e.cjs +2 -0
- package/dist/components.cjs +1 -1
- package/dist/components.js +2 -2
- package/dist/composables-DUOUI4DI.js +3558 -0
- package/dist/composables-ZxHJjJGN.cjs +4 -0
- package/dist/composables.cjs +1 -1
- package/dist/composables.js +2 -2
- package/dist/filters.cjs +1 -0
- package/dist/filters.js +62 -0
- package/dist/rolldown-runtime-DF3sbh8G.cjs +1 -0
- package/dist/stores.cjs +1 -1
- package/dist/stores.js +144 -2
- package/dist/utils.cjs +1 -0
- package/dist/utils.js +131 -0
- package/dist/vn-front-lib.cjs +1 -1
- package/dist/vn-front-lib.css +1 -1
- package/dist/vn-front-lib.js +6 -7
- package/lib/components/dialogs/VnConfirm.vue +142 -0
- package/lib/components/feedback/VnSkeletonForm.vue +14 -0
- package/lib/components/feedback/VnSpinner.vue +63 -0
- package/lib/components/index.js +5 -0
- package/lib/components/models/VnFetch.vue +65 -0
- package/lib/components/models/VnForm.vue +492 -0
- package/lib/composables/index.js +7 -0
- package/lib/composables/tMobile.js +8 -0
- package/lib/composables/useArrayData.js +451 -0
- package/lib/composables/useForm.js +12 -0
- package/lib/composables/useNotify.js +24 -0
- package/lib/composables/useObjectComparison.js +67 -0
- package/lib/composables/useQueryResolver.js +306 -0
- package/lib/composables/useState.js +81 -0
- package/lib/filters/filterPanel.js +95 -0
- package/lib/filters/getDifferences.js +18 -0
- package/lib/filters/getUpdatedValues.js +6 -0
- package/lib/filters/index.js +5 -0
- package/lib/filters/isDialogOpened.js +3 -0
- package/lib/filters/onBeforeSave.js +9 -0
- package/lib/stores/index.js +2 -0
- package/lib/stores/useArrayDataStore.js +82 -0
- package/lib/stores/useStateStore.js +84 -0
- package/lib/utils/advancedFilters.js +125 -0
- package/lib/utils/index.js +2 -0
- package/lib/utils/trackAnalytics.js +18 -0
- package/package.json +9 -2
- package/dist/components-BLui5eyq.cjs +0 -1
- package/dist/components-Dl-Ieazh.js +0 -2466
- package/dist/useRequired-BqsSq8Mw.cjs +0 -1
- package/dist/useRequired-CTxBp3qy.js +0 -58
- package/dist/useValidationsStore-8JX1-oLO.cjs +0 -1
- 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
|
+
}
|
package/lib/stores/index.js
CHANGED
|
@@ -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
|
+
});
|