Skip to content

Commit b31aaab

Browse files
committed
fix: addSelectedRows some subrows selected state
1 parent 6295245 commit b31aaab

File tree

2 files changed

+189
-1
lines changed

2 files changed

+189
-1
lines changed
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
/* eslint-disable @typescript-eslint/no-non-null-assertion */
2+
import { createTable } from '../createTable';
3+
import type { Sample } from 'src/routes/_createSamples';
4+
import { derived, get, readable } from 'svelte/store';
5+
import { addSelectedRows } from './addSelectedRows';
6+
import { addSubRows } from './addSubRows';
7+
8+
const data = readable<Sample[]>([
9+
{
10+
firstName: 'Adam',
11+
lastName: 'Lee',
12+
age: 30,
13+
progress: 30,
14+
status: 'single',
15+
visits: 5,
16+
children: [
17+
{
18+
firstName: 'Allie',
19+
lastName: 'Lee',
20+
age: 30,
21+
progress: 30,
22+
status: 'single',
23+
visits: 5,
24+
children: [
25+
{
26+
firstName: 'Aria',
27+
lastName: 'Lee',
28+
age: 30,
29+
progress: 30,
30+
status: 'single',
31+
visits: 5,
32+
},
33+
],
34+
},
35+
{ firstName: 'Amy', lastName: 'Lee', age: 30, progress: 30, status: 'single', visits: 5 },
36+
],
37+
},
38+
{
39+
firstName: 'Bryan',
40+
lastName: 'Lee',
41+
age: 30,
42+
progress: 30,
43+
status: 'single',
44+
visits: 5,
45+
children: [
46+
{ firstName: 'Ben', lastName: 'Lee', age: 30, progress: 30, status: 'single', visits: 5 },
47+
{ firstName: 'Beth', lastName: 'Lee', age: 30, progress: 30, status: 'single', visits: 5 },
48+
],
49+
},
50+
{
51+
firstName: 'Charlie',
52+
lastName: 'Puth',
53+
age: 30,
54+
progress: 30,
55+
status: 'single',
56+
visits: 5,
57+
children: [
58+
{ firstName: 'Cory', lastName: 'Puth', age: 30, progress: 30, status: 'single', visits: 5 },
59+
{
60+
firstName: 'Carmen',
61+
lastName: 'Puth',
62+
age: 30,
63+
progress: 30,
64+
status: 'single',
65+
visits: 5,
66+
},
67+
],
68+
},
69+
{ firstName: 'Danny', lastName: 'Lee', age: 40, progress: 40, status: 'single', visits: 5 },
70+
{ firstName: 'Elliot', lastName: 'Page', age: 40, progress: 40, status: 'single', visits: 5 },
71+
]);
72+
73+
test('basic row selection', () => {
74+
const table = createTable(data, {
75+
sub: addSubRows({
76+
children: 'children',
77+
}),
78+
select: addSelectedRows(),
79+
});
80+
const columns = table.createColumns([
81+
table.display({
82+
id: 'selected',
83+
header: (_, { pluginStates }) => {
84+
const { allRowsSelected, someRowsSelected } = pluginStates.select;
85+
return derived([allRowsSelected, someRowsSelected], ([$all, $some]) => {
86+
return `all: ${$all}, some: ${$some}`;
87+
});
88+
},
89+
cell: ({ row }, { pluginStates }) => {
90+
const { isSelected, isSomeSubRowsSelected, isAllSubRowsSelected } =
91+
pluginStates.select.getRowState(row);
92+
return derived(
93+
[isSelected, isSomeSubRowsSelected, isAllSubRowsSelected],
94+
([$selected, $someSubRowsSelected, $allSubRowsSelected]) => {
95+
return `selected: ${$selected}, some subrows: ${$someSubRowsSelected}, all subrows: ${$allSubRowsSelected}`;
96+
}
97+
);
98+
},
99+
}),
100+
table.column({
101+
header: 'First Name',
102+
accessor: 'firstName',
103+
}),
104+
]);
105+
const vm = table.createViewModel(columns);
106+
const rows = get(vm.rows);
107+
const row0 = rows[0].isData() ? rows[0] : undefined;
108+
expect(row0).not.toBeUndefined();
109+
110+
let row0Props = get(row0!.props());
111+
expect(row0Props.select.selected).toBe(false);
112+
113+
const { selectedDataIds } = vm.pluginStates.select;
114+
selectedDataIds.add('0');
115+
116+
row0Props = get(row0!.props());
117+
expect(row0Props.select.selected).toBe(true);
118+
});
119+
120+
test('linked parent and child selection', () => {
121+
const table = createTable(data, {
122+
sub: addSubRows({
123+
children: 'children',
124+
}),
125+
select: addSelectedRows({
126+
linkDataSubRows: true,
127+
}),
128+
});
129+
const columns = table.createColumns([
130+
table.display({
131+
id: 'selected',
132+
header: (_, { pluginStates }) => {
133+
const { allRowsSelected, someRowsSelected } = pluginStates.select;
134+
return derived([allRowsSelected, someRowsSelected], ([$all, $some]) => {
135+
return `all: ${$all}, some: ${$some}`;
136+
});
137+
},
138+
cell: ({ row }, { pluginStates }) => {
139+
const { isSelected, isSomeSubRowsSelected, isAllSubRowsSelected } =
140+
pluginStates.select.getRowState(row);
141+
return derived(
142+
[isSelected, isSomeSubRowsSelected, isAllSubRowsSelected],
143+
([$selected, $someSubRowsSelected, $allSubRowsSelected]) => {
144+
return `selected: ${$selected}, some subrows: ${$someSubRowsSelected}, all subrows: ${$allSubRowsSelected}`;
145+
}
146+
);
147+
},
148+
}),
149+
table.column({
150+
header: 'First Name',
151+
accessor: 'firstName',
152+
}),
153+
]);
154+
const vm = table.createViewModel(columns);
155+
const rows = get(vm.rows);
156+
const row0 = rows[0].isData() ? rows[0] : undefined;
157+
expect(row0).not.toBeUndefined();
158+
159+
let row0Props = get(row0!.props());
160+
expect(row0Props.select.selected).toBe(false);
161+
expect(row0Props.select.allSubRowsSelected).toBe(false);
162+
expect(row0Props.select.someSubRowsSelected).toBe(false);
163+
164+
const { selectedDataIds } = vm.pluginStates.select;
165+
selectedDataIds.add('0');
166+
167+
row0Props = get(row0!.props());
168+
expect(row0Props.select.selected).toBe(true);
169+
170+
row0Props = get(row0!.props());
171+
expect(row0Props.select.selected).toBe(true);
172+
expect(row0Props.select.allSubRowsSelected).toBe(false);
173+
expect(row0Props.select.someSubRowsSelected).toBe(false);
174+
175+
selectedDataIds.add('0>0>0');
176+
177+
row0Props = get(row0!.props());
178+
expect(row0Props.select.selected).toBe(true);
179+
expect(row0Props.select.allSubRowsSelected).toBe(false);
180+
expect(row0Props.select.someSubRowsSelected).toBe(true);
181+
182+
selectedDataIds.add('0>1');
183+
184+
row0Props = get(row0!.props());
185+
expect(row0Props.select.selected).toBe(true);
186+
expect(row0Props.select.allSubRowsSelected).toBe(true);
187+
expect(row0Props.select.someSubRowsSelected).toBe(true);
188+
});

src/lib/plugins/addSelectedRows.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ const isSomeSubRowsSelectedForRow = <Item>(
6565
return false;
6666
}
6767
return row.subRows.some((subRow) =>
68-
isAllSubRowsSelectedForRow(subRow, $selectedDataIds, linkDataSubRows)
68+
isSomeSubRowsSelectedForRow(subRow, $selectedDataIds, linkDataSubRows)
6969
);
7070
};
7171

0 commit comments

Comments
 (0)