@webitel/ui-datalist 26.8.1 → 26.8.3
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/package.json
CHANGED
|
@@ -169,6 +169,63 @@ describe('tableHeadersStoreBody', () => {
|
|
|
169
169
|
|
|
170
170
|
expect(router.currentRoute.value.query.sort).toBe('+name');
|
|
171
171
|
});
|
|
172
|
+
it('keeps every column that renders from a persisted field', async () => {
|
|
173
|
+
await router.push({
|
|
174
|
+
name: 'cases',
|
|
175
|
+
query: {
|
|
176
|
+
[fieldsQueryKey]: 'protocol,app',
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
/* `icon` and `protocol` render from one API field */
|
|
181
|
+
const store = tableHeadersStoreBody({
|
|
182
|
+
rawHeaders: [
|
|
183
|
+
{
|
|
184
|
+
value: 'icon',
|
|
185
|
+
field: 'protocol',
|
|
186
|
+
show: true,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
value: 'protocol',
|
|
190
|
+
field: 'protocol',
|
|
191
|
+
show: true,
|
|
192
|
+
sort: null,
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
value: 'app',
|
|
196
|
+
field: 'app',
|
|
197
|
+
show: true,
|
|
198
|
+
sort: null,
|
|
199
|
+
},
|
|
200
|
+
] as DatalistTableHeader[],
|
|
201
|
+
id,
|
|
202
|
+
});
|
|
203
|
+
await runWithRouter(() => store.setupPersistence());
|
|
204
|
+
|
|
205
|
+
expect(store.shownHeaders.value.map(({ value }) => value)).toEqual([
|
|
206
|
+
'icon',
|
|
207
|
+
'protocol',
|
|
208
|
+
'app',
|
|
209
|
+
]);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
it('ignores an empty persisted field instead of adding a placeholder column', async () => {
|
|
213
|
+
/* a header persisted before it got a `field` is stored as an empty string */
|
|
214
|
+
await router.push({
|
|
215
|
+
name: 'cases',
|
|
216
|
+
query: {
|
|
217
|
+
[fieldsQueryKey]: ',name,subject',
|
|
218
|
+
},
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
const store = await setUpStore();
|
|
222
|
+
|
|
223
|
+
expect(store.shownHeaders.value.map(({ field }) => field)).toEqual([
|
|
224
|
+
'name',
|
|
225
|
+
'subject',
|
|
226
|
+
]);
|
|
227
|
+
expect(store.headers.value.some(({ field }) => !field)).toBe(false);
|
|
228
|
+
});
|
|
172
229
|
});
|
|
173
230
|
|
|
174
231
|
describe('access', () => {
|
|
@@ -130,8 +130,11 @@ export const tableHeadersStoreBody = ({
|
|
|
130
130
|
};
|
|
131
131
|
|
|
132
132
|
const updateFields = (persistedFields: string[]) => {
|
|
133
|
-
/* persisted state predates the gate, and unknown fields are revived below
|
|
134
|
-
|
|
133
|
+
/* persisted state predates the gate, and unknown fields are revived below;
|
|
134
|
+
an empty field is a leftover of a header persisted before it got a `field` */
|
|
135
|
+
const fields = persistedFields.filter(
|
|
136
|
+
(field) => field && !deniedFields.has(field),
|
|
137
|
+
);
|
|
135
138
|
|
|
136
139
|
const fieldsSet = new Set(fields);
|
|
137
140
|
const mainFieldNames = new Set(headers.value.map((header) => header.field));
|
|
@@ -153,28 +156,26 @@ export const tableHeadersStoreBody = ({
|
|
|
153
156
|
}) as DatalistTableHeader,
|
|
154
157
|
);
|
|
155
158
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
159
|
+
/* several headers may render from one field (e.g. icon + text), keep them all */
|
|
160
|
+
const headersByField = new Map<string, DatalistTableHeader[]>();
|
|
161
|
+
for (const header of [
|
|
162
|
+
...mainHeaders,
|
|
163
|
+
...customHeaders,
|
|
164
|
+
]) {
|
|
165
|
+
const list = headersByField.get(header.field) ?? [];
|
|
166
|
+
list.push(header);
|
|
167
|
+
headersByField.set(header.field, list);
|
|
168
|
+
}
|
|
165
169
|
|
|
166
170
|
const headersInPersistedOrder = fields.flatMap((field) => {
|
|
167
|
-
const
|
|
168
|
-
if (!header) return [];
|
|
171
|
+
const list = headersByField.get(field) ?? [];
|
|
169
172
|
headersByField.delete(field);
|
|
170
|
-
return
|
|
171
|
-
header,
|
|
172
|
-
];
|
|
173
|
+
return list;
|
|
173
174
|
});
|
|
174
175
|
|
|
175
176
|
const hiddenHeaders = [
|
|
176
177
|
...headersByField.values(),
|
|
177
|
-
];
|
|
178
|
+
].flat();
|
|
178
179
|
|
|
179
180
|
updateShownHeaders([
|
|
180
181
|
...headersInPersistedOrder,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import deepEqual from 'deep-equal';
|
|
2
2
|
import set from 'lodash/set';
|
|
3
|
-
import { type Ref, ref, toRaw, watch } from 'vue';
|
|
3
|
+
import { nextTick, type Ref, ref, toRaw, watch } from 'vue';
|
|
4
4
|
|
|
5
5
|
import {
|
|
6
6
|
createDatalistStore,
|
|
@@ -247,6 +247,53 @@ export const tableStoreBody = <Entity extends Identifiable>(
|
|
|
247
247
|
}
|
|
248
248
|
};
|
|
249
249
|
|
|
250
|
+
let loadingAfterFiltersChange = false;
|
|
251
|
+
|
|
252
|
+
watch(
|
|
253
|
+
[
|
|
254
|
+
() => filtersManager.value.getAllValues(),
|
|
255
|
+
sort,
|
|
256
|
+
fields,
|
|
257
|
+
size,
|
|
258
|
+
],
|
|
259
|
+
async () => {
|
|
260
|
+
if (!isStoreSetUp.value) {
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
/*
|
|
265
|
+
* @author @Lera24
|
|
266
|
+
* https://webitel.atlassian.net/browse/WTEL-7597?focusedCommentId=697115
|
|
267
|
+
* */
|
|
268
|
+
if (isReorderingColumn.value) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
loadingAfterFiltersChange = true;
|
|
272
|
+
updatePage(1);
|
|
273
|
+
await loadDataList();
|
|
274
|
+
loadingAfterFiltersChange = false;
|
|
275
|
+
},
|
|
276
|
+
/* filtersManager requires deep watching for its values */
|
|
277
|
+
{
|
|
278
|
+
deep: true,
|
|
279
|
+
},
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
watch(
|
|
283
|
+
[
|
|
284
|
+
page,
|
|
285
|
+
],
|
|
286
|
+
() => {
|
|
287
|
+
if (!isStoreSetUp.value) {
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
if (!loadingAfterFiltersChange && !isAppendDataList) {
|
|
292
|
+
return loadDataList();
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
);
|
|
296
|
+
|
|
250
297
|
const setupStore = async () => {
|
|
251
298
|
if (isStoreSetUp.value) {
|
|
252
299
|
return;
|
|
@@ -260,44 +307,13 @@ export const tableStoreBody = <Entity extends Identifiable>(
|
|
|
260
307
|
]);
|
|
261
308
|
}
|
|
262
309
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
size,
|
|
271
|
-
],
|
|
272
|
-
async () => {
|
|
273
|
-
/*
|
|
274
|
-
* @author @Lera24
|
|
275
|
-
* https://webitel.atlassian.net/browse/WTEL-7597?focusedCommentId=697115
|
|
276
|
-
* */
|
|
277
|
-
if (isReorderingColumn.value) {
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
loadingAfterFiltersChange = true;
|
|
281
|
-
updatePage(1);
|
|
282
|
-
await loadDataList();
|
|
283
|
-
loadingAfterFiltersChange = false;
|
|
284
|
-
},
|
|
285
|
-
/* filtersManager requires deep watching for its values */
|
|
286
|
-
{
|
|
287
|
-
deep: true,
|
|
288
|
-
},
|
|
289
|
-
);
|
|
290
|
-
|
|
291
|
-
watch(
|
|
292
|
-
[
|
|
293
|
-
page,
|
|
294
|
-
],
|
|
295
|
-
() => {
|
|
296
|
-
if (!loadingAfterFiltersChange && !isAppendDataList) {
|
|
297
|
-
return loadDataList();
|
|
298
|
-
}
|
|
299
|
-
},
|
|
300
|
-
);
|
|
310
|
+
/*
|
|
311
|
+
* lets any reactive updates the restore above just made (e.g. to
|
|
312
|
+
* sort/fields/filters) finish flushing through the watchers above
|
|
313
|
+
* while `isStoreSetUp` is still false, before they start reacting to
|
|
314
|
+
* real changes
|
|
315
|
+
*/
|
|
316
|
+
await nextTick();
|
|
301
317
|
|
|
302
318
|
isStoreSetUp.value = true;
|
|
303
319
|
};
|