Skip to content

Commit 1acd713

Browse files
authored
fix(multi-select): avoid cyclic dependency for Svelte 5 compatibility (#2034)
1 parent efddbbd commit 1acd713

File tree

1 file changed

+24
-22
lines changed

1 file changed

+24
-22
lines changed

src/MultiSelect/MultiSelect.svelte

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,6 @@
183183
184184
const dispatch = createEventDispatcher();
185185
186-
let initialSorted = false;
187186
let highlightedIndex = -1;
188187
let prevChecked = [];
189188
@@ -227,18 +226,8 @@
227226
highlightedIndex = index;
228227
}
229228
230-
function sort() {
231-
return [
232-
...(checked.length > 1 ? checked.sort(sortItem) : checked),
233-
...unchecked.sort(sortItem),
234-
];
235-
}
236-
237229
afterUpdate(() => {
238230
if (checked.length !== prevChecked.length) {
239-
if (selectionFeedback === "top") {
240-
sortedItems = sort();
241-
}
242231
prevChecked = checked;
243232
selectedIds = checked.map(({ id }) => id);
244233
dispatch("select", {
@@ -249,25 +238,38 @@
249238
}
250239
251240
if (!open) {
252-
if (!initialSorted || selectionFeedback !== "fixed") {
253-
sortedItems = sort();
254-
initialSorted = true;
255-
}
256-
257241
highlightedIndex = -1;
258242
value = "";
259243
}
260-
261-
items = sortedItems;
262244
});
263245
264246
$: menuId = `menu-${id}`;
265247
$: inline = type === "inline";
266248
$: 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+
})();
271273
$: checked = sortedItems.filter(({ checked }) => checked);
272274
$: unchecked = sortedItems.filter(({ checked }) => !checked);
273275
$: filteredItems = sortedItems.filter((item) => filterItem(item, value));

0 commit comments

Comments
 (0)