|
1 | 1 | <script lang="ts">
|
2 | 2 | import { createEventDispatcher } from 'svelte';
|
3 | 3 | import { getModalStore, Modal, TreeView, TreeViewItem } from '@skeletonlabs/skeleton';
|
| 4 | + import type { Writable } from 'svelte/store'; |
4 | 5 |
|
5 | 6 | import ShowMore from './ShowMore.svelte';
|
6 | 7 | import type { FacetGroup, SelectedFacetGroup } from '$models/Models';
|
7 | 8 |
|
8 | 9 | export let groupSelection = false;
|
9 |
| - export let groups: FacetGroup[]; |
| 10 | + export let groups: Writable<FacetGroup[]>; |
10 | 11 | export let showAll = false;
|
11 | 12 | export let open = false;
|
12 | 13 |
|
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 }; |
32 | 15 | let selectedItems: {
|
33 | 16 | [key: string]: {
|
34 | 17 | [key: string]: boolean;
|
35 | 18 | };
|
36 | 19 | } = {};
|
37 | 20 | let selectedGroups: { [key: string]: boolean } = {};
|
38 | 21 |
|
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 |
| -
|
47 | 22 | const dispatch = createEventDispatcher();
|
48 |
| - |
| 23 | +
|
49 | 24 | const modalStore = getModalStore();
|
50 | 25 | const showMore = (group: SelectedFacetGroup) => {
|
51 | 26 | modalStore.trigger({
|
|
64 | 39 |
|
65 | 40 | const handleSave = (group: SelectedFacetGroup) => {
|
66 | 41 | 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; |
68 | 43 | });
|
69 | 44 | modalStore.close();
|
70 | 45 | };
|
|
100 | 75 | });
|
101 | 76 | }
|
102 | 77 |
|
103 |
| - dispatch('change', changed); |
| 78 | + changed.length && dispatch('change', changed); |
104 | 79 | };
|
105 | 80 |
|
106 | 81 | const sortOptions = () => {
|
|
134 | 109 | });
|
135 | 110 | };
|
136 | 111 |
|
| 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); |
137 | 142 | $: selectedItems, mapSelected('items'), sortOptions();
|
138 | 143 | $: selectedGroups, mapSelected('groups');
|
139 | 144 | </script>
|
|
148 | 153 | bind:checked={selectedGroups[group.name]}
|
149 | 154 | bind:group={selectedGroups}
|
150 | 155 | >
|
151 |
| - <p class="font-semibold">{group.displayName}</p> |
| 156 | + <p class="font-semibold"> |
| 157 | + {group.displayName}{group.count !== undefined ? ` (${group.count})` : ''} |
| 158 | + </p> |
152 | 159 |
|
153 | 160 | <svelte:fragment slot="children">
|
154 | 161 | <!-- If more than 5 choices, show the remaining in the Modal -->
|
|
0 commit comments