@webitel/ui-datalist 26.8.1 → 26.8.2

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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webitel/ui-datalist",
3
- "version": "26.8.1",
3
+ "version": "26.8.2",
4
4
  "description": "Toolkit for building data lists in webitel ui system",
5
5
  "scripts": {
6
6
  "build:types": "vue-tsc -b tsconfig.build.json",
@@ -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
- const fields = persistedFields.filter((field) => !deniedFields.has(field));
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
- const headersByField = new Map(
157
- [
158
- ...mainHeaders,
159
- ...customHeaders,
160
- ].map((header) => [
161
- header.field,
162
- header,
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 header = headersByField.get(field);
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,