|
183 | 183 |
|
184 | 184 | const dispatch = createEventDispatcher(); |
185 | 185 |
|
186 | | - let initialSorted = false; |
187 | 186 | let highlightedIndex = -1; |
188 | 187 | let prevChecked = []; |
189 | 188 |
|
|
227 | 226 | highlightedIndex = index; |
228 | 227 | } |
229 | 228 |
|
230 | | - function sort() { |
231 | | - return [ |
232 | | - ...(checked.length > 1 ? checked.sort(sortItem) : checked), |
233 | | - ...unchecked.sort(sortItem), |
234 | | - ]; |
235 | | - } |
236 | | -
|
237 | 229 | afterUpdate(() => { |
238 | 230 | if (checked.length !== prevChecked.length) { |
239 | | - if (selectionFeedback === "top") { |
240 | | - sortedItems = sort(); |
241 | | - } |
242 | 231 | prevChecked = checked; |
243 | 232 | selectedIds = checked.map(({ id }) => id); |
244 | 233 | dispatch("select", { |
|
249 | 238 | } |
250 | 239 |
|
251 | 240 | if (!open) { |
252 | | - if (!initialSorted || selectionFeedback !== "fixed") { |
253 | | - sortedItems = sort(); |
254 | | - initialSorted = true; |
255 | | - } |
256 | | -
|
257 | 241 | highlightedIndex = -1; |
258 | 242 | value = ""; |
259 | 243 | } |
260 | | -
|
261 | | - items = sortedItems; |
262 | 244 | }); |
263 | 245 |
|
264 | 246 | $: menuId = `menu-${id}`; |
265 | 247 | $: inline = type === "inline"; |
266 | 248 | $: ariaLabel = $$props["aria-label"] || "Choose an item"; |
267 | | - $: sortedItems = items.map((item) => ({ |
268 | | - ...item, |
269 | | - checked: selectedIds.includes(item.id), |
270 | | - })); |
| 249 | + $: sortedItems = (() => { |
| 250 | + if (selectionFeedback === "top" && selectedIds.length > 0) { |
| 251 | + const checkedItems = items |
| 252 | + .filter((item) => selectedIds.includes(item.id)) |
| 253 | + .map((item) => ({ ...item, checked: true })); |
| 254 | + const uncheckedItems = items |
| 255 | + .filter((item) => !selectedIds.includes(item.id)) |
| 256 | + .map((item) => ({ ...item, checked: false })); |
| 257 | +
|
| 258 | + return [ |
| 259 | + ...(checkedItems.length > 1 |
| 260 | + ? checkedItems.sort(sortItem) |
| 261 | + : checkedItems), |
| 262 | + ...uncheckedItems.sort(sortItem), |
| 263 | + ]; |
| 264 | + } |
| 265 | +
|
| 266 | + return items |
| 267 | + .map((item) => ({ |
| 268 | + ...item, |
| 269 | + checked: selectedIds.includes(item.id), |
| 270 | + })) |
| 271 | + .sort(sortItem); |
| 272 | + })(); |
271 | 273 | $: checked = sortedItems.filter(({ checked }) => checked); |
272 | 274 | $: unchecked = sortedItems.filter(({ checked }) => !checked); |
273 | 275 | $: filteredItems = sortedItems.filter((item) => filterItem(item, value)); |
|
0 commit comments