Skip to content

Commit 5fd6bdf

Browse files
committed
Replace old groups array with a writable to rerender Facets on update
1 parent 2908cc4 commit 5fd6bdf

File tree

1 file changed

+39
-32
lines changed

1 file changed

+39
-32
lines changed

src/lib/components/Facets/Facets.svelte

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,51 +1,26 @@
11
<script lang="ts">
22
import { createEventDispatcher } from 'svelte';
33
import { getModalStore, Modal, TreeView, TreeViewItem } from '@skeletonlabs/skeleton';
4+
import type { Writable } from 'svelte/store';
45
56
import ShowMore from './ShowMore.svelte';
67
import type { FacetGroup, SelectedFacetGroup } from '$models/Models';
78
89
export let groupSelection = false;
9-
export let groups: FacetGroup[];
10+
export let groups: Writable<FacetGroup[]>;
1011
export let showAll = false;
1112
export let open = false;
1213
13-
let displayedGroups = structuredClone(groups);
14-
15-
let selected: { [key: string]: SelectedFacetGroup } = groups.reduce((acc, g) => {
16-
const children = g.children.reduce((acc, c) => {
17-
acc[c.name] = {
18-
...c,
19-
selected: false
20-
};
21-
return acc;
22-
}, {});
23-
24-
acc[g.name] = {
25-
...g,
26-
children,
27-
selected: false
28-
};
29-
30-
return acc;
31-
}, {});
14+
let selected: { [key: string]: SelectedFacetGroup };
3215
let selectedItems: {
3316
[key: string]: {
3417
[key: string]: boolean;
3518
};
3619
} = {};
3720
let selectedGroups: { [key: string]: boolean } = {};
3821
39-
Object.keys(selected).forEach((groupName) => {
40-
selectedItems[groupName] = {};
41-
Object.keys(selected[groupName].children).forEach((itemName) => {
42-
selectedItems[groupName][itemName] = false;
43-
});
44-
selectedGroups[groupName] = false;
45-
});
46-
4722
const dispatch = createEventDispatcher();
48-
23+
4924
const modalStore = getModalStore();
5025
const showMore = (group: SelectedFacetGroup) => {
5126
modalStore.trigger({
@@ -64,7 +39,7 @@
6439
6540
const handleSave = (group: SelectedFacetGroup) => {
6641
Object.keys(group.children).forEach((key) => {
67-
selectedItems[group.name][key] = group.children[key].selected;
42+
selectedItems[group.name][key] = group.children[key].selected || false;
6843
});
6944
modalStore.close();
7045
};
@@ -100,7 +75,7 @@
10075
});
10176
}
10277
103-
dispatch('change', changed);
78+
changed.length && dispatch('change', changed);
10479
};
10580
10681
const sortOptions = () => {
@@ -134,6 +109,36 @@
134109
});
135110
};
136111
112+
groups.subscribe((data) => {
113+
selected = data.reduce((acc, g) => {
114+
const children = g.children.reduce((acc, c) => {
115+
acc[c.name] = {
116+
...c,
117+
selected: c.selected || false
118+
};
119+
return acc;
120+
}, {});
121+
122+
acc[g.name] = {
123+
...g,
124+
children,
125+
selected: g.selected || false
126+
};
127+
128+
return acc;
129+
}, {});
130+
131+
Object.keys(selected).forEach((groupName) => {
132+
selectedItems[groupName] = {};
133+
Object.keys(selected[groupName].children).forEach((itemName) => {
134+
selectedItems[groupName][itemName] =
135+
selected[groupName].children[itemName].selected || false;
136+
});
137+
selectedGroups[groupName] = selected[groupName].selected || false;
138+
});
139+
});
140+
141+
$: displayedGroups = structuredClone($groups);
137142
$: selectedItems, mapSelected('items'), sortOptions();
138143
$: selectedGroups, mapSelected('groups');
139144
</script>
@@ -148,7 +153,9 @@
148153
bind:checked={selectedGroups[group.name]}
149154
bind:group={selectedGroups}
150155
>
151-
<p class="font-semibold">{group.displayName}</p>
156+
<p class="font-semibold">
157+
{group.displayName}{group.count !== undefined ? ` (${group.count})` : ''}
158+
</p>
152159

153160
<svelte:fragment slot="children">
154161
<!-- If more than 5 choices, show the remaining in the Modal -->

0 commit comments

Comments
 (0)