|
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