|
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