Skip to content

Commit c331084

Browse files
committed
fix: only clear page row ids when setting allPageRowsSelected to false
1 parent 67255fa commit c331084

File tree

2 files changed

+253
-6
lines changed

2 files changed

+253
-6
lines changed

src/lib/plugins/addSelectedRows.test.ts

Lines changed: 248 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { Sample } from 'src/routes/_createSamples';
44
import { derived, get, readable } from 'svelte/store';
55
import { addSelectedRows } from './addSelectedRows';
66
import { addSubRows } from './addSubRows';
7+
import { addPagination } from './addPagination';
78

89
const data = readable<Sample[]>([
910
{
@@ -117,7 +118,7 @@ test('basic row selection', () => {
117118
expect(row0Props.select.selected).toBe(true);
118119
});
119120

120-
test('linked parent and child selection', () => {
121+
test('linked data sub rows selection', () => {
121122
const table = createTable(data, {
122123
sub: addSubRows({
123124
children: 'children',
@@ -186,3 +187,249 @@ test('linked parent and child selection', () => {
186187
expect(row0Props.select.allSubRowsSelected).toBe(true);
187188
expect(row0Props.select.someSubRowsSelected).toBe(true);
188189
});
190+
191+
test('reading rows selected store', () => {
192+
const table = createTable(data, {
193+
sub: addSubRows({
194+
children: 'children',
195+
}),
196+
select: addSelectedRows(),
197+
});
198+
const columns = table.createColumns([
199+
table.display({
200+
id: 'selected',
201+
header: (_, { pluginStates }) => {
202+
const { allRowsSelected, someRowsSelected } = pluginStates.select;
203+
return derived([allRowsSelected, someRowsSelected], ([$all, $some]) => {
204+
return `all: ${$all}, some: ${$some}`;
205+
});
206+
},
207+
cell: ({ row }, { pluginStates }) => {
208+
const { isSelected, isSomeSubRowsSelected, isAllSubRowsSelected } =
209+
pluginStates.select.getRowState(row);
210+
return derived(
211+
[isSelected, isSomeSubRowsSelected, isAllSubRowsSelected],
212+
([$selected, $someSubRowsSelected, $allSubRowsSelected]) => {
213+
return `selected: ${$selected}, some subrows: ${$someSubRowsSelected}, all subrows: ${$allSubRowsSelected}`;
214+
}
215+
);
216+
},
217+
}),
218+
table.column({
219+
header: 'First Name',
220+
accessor: 'firstName',
221+
}),
222+
]);
223+
const vm = table.createViewModel(columns);
224+
const { selectedDataIds, allRowsSelected, someRowsSelected } = vm.pluginStates.select;
225+
226+
// Populate `tableState.rows` by subscribing to `vm.rows` and running all row
227+
// derivation functions.
228+
get(vm.rows);
229+
selectedDataIds.add('0');
230+
231+
expect(get(someRowsSelected)).toBe(true);
232+
expect(get(allRowsSelected)).toBe(false);
233+
234+
get(vm.rows);
235+
selectedDataIds.addAll(['0>0', '0>0>0', '0>1', '1', '1>0', '1>1', '2', '2>0', '2>1', '3', '4']);
236+
237+
expect(get(someRowsSelected)).toBe(true);
238+
expect(get(allRowsSelected)).toBe(true);
239+
240+
get(vm.rows);
241+
selectedDataIds.remove('0');
242+
243+
expect(get(someRowsSelected)).toBe(true);
244+
expect(get(allRowsSelected)).toBe(false);
245+
246+
get(vm.rows);
247+
selectedDataIds.clear();
248+
249+
expect(get(someRowsSelected)).toBe(false);
250+
expect(get(allRowsSelected)).toBe(false);
251+
});
252+
253+
test('updating all rows selected store', () => {
254+
const table = createTable(data, {
255+
sub: addSubRows({
256+
children: 'children',
257+
}),
258+
select: addSelectedRows(),
259+
});
260+
const columns = table.createColumns([
261+
table.display({
262+
id: 'selected',
263+
header: (_, { pluginStates }) => {
264+
const { allRowsSelected, someRowsSelected } = pluginStates.select;
265+
return derived([allRowsSelected, someRowsSelected], ([$all, $some]) => {
266+
return `all: ${$all}, some: ${$some}`;
267+
});
268+
},
269+
cell: ({ row }, { pluginStates }) => {
270+
const { isSelected, isSomeSubRowsSelected, isAllSubRowsSelected } =
271+
pluginStates.select.getRowState(row);
272+
return derived(
273+
[isSelected, isSomeSubRowsSelected, isAllSubRowsSelected],
274+
([$selected, $someSubRowsSelected, $allSubRowsSelected]) => {
275+
return `selected: ${$selected}, some subrows: ${$someSubRowsSelected}, all subrows: ${$allSubRowsSelected}`;
276+
}
277+
);
278+
},
279+
}),
280+
table.column({
281+
header: 'First Name',
282+
accessor: 'firstName',
283+
}),
284+
]);
285+
const vm = table.createViewModel(columns);
286+
const { selectedDataIds, allRowsSelected } = vm.pluginStates.select;
287+
288+
get(vm.rows);
289+
allRowsSelected.set(true);
290+
291+
expect(get(selectedDataIds)).toEqual({
292+
'0': true,
293+
'1': true,
294+
'2': true,
295+
'3': true,
296+
'4': true,
297+
});
298+
299+
get(vm.rows);
300+
allRowsSelected.set(false);
301+
302+
expect(get(selectedDataIds)).toEqual({});
303+
});
304+
305+
test('reading page rows selected store', () => {
306+
const table = createTable(data, {
307+
page: addPagination({
308+
initialPageSize: 2,
309+
}),
310+
sub: addSubRows({
311+
children: 'children',
312+
}),
313+
select: addSelectedRows(),
314+
});
315+
const columns = table.createColumns([
316+
table.display({
317+
id: 'selected',
318+
header: (_, { pluginStates }) => {
319+
const { allRowsSelected, someRowsSelected } = pluginStates.select;
320+
return derived([allRowsSelected, someRowsSelected], ([$all, $some]) => {
321+
return `all: ${$all}, some: ${$some}`;
322+
});
323+
},
324+
cell: ({ row }, { pluginStates }) => {
325+
const { isSelected, isSomeSubRowsSelected, isAllSubRowsSelected } =
326+
pluginStates.select.getRowState(row);
327+
return derived(
328+
[isSelected, isSomeSubRowsSelected, isAllSubRowsSelected],
329+
([$selected, $someSubRowsSelected, $allSubRowsSelected]) => {
330+
return `selected: ${$selected}, some subrows: ${$someSubRowsSelected}, all subrows: ${$allSubRowsSelected}`;
331+
}
332+
);
333+
},
334+
}),
335+
table.column({
336+
header: 'First Name',
337+
accessor: 'firstName',
338+
}),
339+
]);
340+
const vm = table.createViewModel(columns);
341+
const { selectedDataIds, allPageRowsSelected, somePageRowsSelected } = vm.pluginStates.select;
342+
343+
// Populate `tableState.pageRows` by subscribing to `vm.pageRows` and running
344+
// all row derivation functions.
345+
get(vm.pageRows);
346+
selectedDataIds.add('4');
347+
348+
console.log(get(vm.pageRows));
349+
350+
expect(get(somePageRowsSelected)).toBe(false);
351+
expect(get(allPageRowsSelected)).toBe(false);
352+
353+
get(vm.pageRows);
354+
selectedDataIds.add('0');
355+
356+
expect(get(somePageRowsSelected)).toBe(true);
357+
expect(get(allPageRowsSelected)).toBe(false);
358+
359+
get(vm.pageRows);
360+
selectedDataIds.addAll(['1']);
361+
362+
expect(get(somePageRowsSelected)).toBe(true);
363+
expect(get(allPageRowsSelected)).toBe(true);
364+
365+
get(vm.pageRows);
366+
selectedDataIds.remove('0');
367+
368+
expect(get(somePageRowsSelected)).toBe(true);
369+
expect(get(allPageRowsSelected)).toBe(false);
370+
371+
get(vm.pageRows);
372+
selectedDataIds.clear();
373+
374+
expect(get(somePageRowsSelected)).toBe(false);
375+
expect(get(allPageRowsSelected)).toBe(false);
376+
});
377+
378+
test('updating all page rows selected store', () => {
379+
const table = createTable(data, {
380+
page: addPagination({
381+
initialPageSize: 2,
382+
}),
383+
sub: addSubRows({
384+
children: 'children',
385+
}),
386+
select: addSelectedRows(),
387+
});
388+
const columns = table.createColumns([
389+
table.display({
390+
id: 'selected',
391+
header: (_, { pluginStates }) => {
392+
const { allRowsSelected, someRowsSelected } = pluginStates.select;
393+
return derived([allRowsSelected, someRowsSelected], ([$all, $some]) => {
394+
return `all: ${$all}, some: ${$some}`;
395+
});
396+
},
397+
cell: ({ row }, { pluginStates }) => {
398+
const { isSelected, isSomeSubRowsSelected, isAllSubRowsSelected } =
399+
pluginStates.select.getRowState(row);
400+
return derived(
401+
[isSelected, isSomeSubRowsSelected, isAllSubRowsSelected],
402+
([$selected, $someSubRowsSelected, $allSubRowsSelected]) => {
403+
return `selected: ${$selected}, some subrows: ${$someSubRowsSelected}, all subrows: ${$allSubRowsSelected}`;
404+
}
405+
);
406+
},
407+
}),
408+
table.column({
409+
header: 'First Name',
410+
accessor: 'firstName',
411+
}),
412+
]);
413+
const vm = table.createViewModel(columns);
414+
const { selectedDataIds, allPageRowsSelected } = vm.pluginStates.select;
415+
416+
get(vm.pageRows);
417+
allPageRowsSelected.set(true);
418+
419+
expect(get(selectedDataIds)).toEqual({
420+
'0': true,
421+
'1': true,
422+
});
423+
424+
get(vm.pageRows);
425+
allPageRowsSelected.set(false);
426+
427+
expect(get(selectedDataIds)).toEqual({});
428+
429+
selectedDataIds.add('4');
430+
431+
get(vm.pageRows);
432+
allPageRowsSelected.set(false);
433+
434+
expect(get(selectedDataIds)).toEqual({ 4: true });
435+
});

src/lib/plugins/addSelectedRows.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -215,14 +215,14 @@ export const addSelectedRows =
215215
}
216216
);
217217
const setAllPageRowsSelected = ($allPageRowsSelected: boolean) => {
218+
const $pageRows = get(tableState.pageRows);
219+
const pageDataIds = $pageRows
220+
.map((row) => (row.isData() ? row.dataId : null))
221+
.filter(nonNull);
218222
if ($allPageRowsSelected) {
219-
const $pageRows = get(tableState.pageRows);
220-
const pageDataIds = $pageRows
221-
.map((row) => (row.isData() ? row.dataId : null))
222-
.filter(nonNull);
223223
selectedDataIds.addAll(pageDataIds);
224224
} else {
225-
selectedDataIds.clear();
225+
selectedDataIds.removeAll(pageDataIds);
226226
}
227227
};
228228
const allPageRowsSelected: Writable<boolean> = {

0 commit comments

Comments
 (0)