feat: Sort models by name in ascending/descending order

Co-Authored-By: silentoplayz <50341825+silentoplayz@users.noreply.github.com>
This commit is contained in:
Timothy Jaeryang Baek 2025-02-26 23:12:46 -08:00
parent ddb30589e3
commit da8c42ee49
2 changed files with 64 additions and 10 deletions

View File

@ -16,6 +16,8 @@
import Spinner from '$lib/components/common/Spinner.svelte'; import Spinner from '$lib/components/common/Spinner.svelte';
import Minus from '$lib/components/icons/Minus.svelte'; import Minus from '$lib/components/icons/Minus.svelte';
import Plus from '$lib/components/icons/Plus.svelte'; import Plus from '$lib/components/icons/Plus.svelte';
import ChevronUp from '$lib/components/icons/ChevronUp.svelte';
import ChevronDown from '$lib/components/icons/ChevronDown.svelte';
export let show = false; export let show = false;
export let initHandler = () => {}; export let initHandler = () => {};
@ -26,6 +28,9 @@
let defaultModelIds = []; let defaultModelIds = [];
let modelIds = []; let modelIds = [];
let sortKey = '';
let sortOrder = '';
let loading = false; let loading = false;
let showResetModal = false; let showResetModal = false;
@ -71,6 +76,9 @@
// Add remaining IDs not in MODEL_ORDER_LIST, sorted alphabetically // Add remaining IDs not in MODEL_ORDER_LIST, sorted alphabetically
...allModelIds.filter((id) => !orderedSet.has(id)).sort((a, b) => a.localeCompare(b)) ...allModelIds.filter((id) => !orderedSet.has(id)).sort((a, b) => a.localeCompare(b))
]; ];
sortKey = '';
sortOrder = '';
}; };
const submitHandler = async () => { const submitHandler = async () => {
loading = true; loading = true;
@ -145,9 +153,45 @@
> >
<div> <div>
<div class="flex flex-col w-full"> <div class="flex flex-col w-full">
<div class="mb-1 flex justify-between"> <button
class="mb-1 flex gap-2"
type="button"
on:click={() => {
sortKey = 'model';
if (sortOrder === 'asc') {
sortOrder = 'desc';
} else {
sortOrder = 'asc';
}
modelIds = modelIds
.filter((id) => id !== '')
.sort((a, b) => {
const nameA = $models.find((model) => model.id === a)?.name || a;
const nameB = $models.find((model) => model.id === b)?.name || b;
return sortOrder === 'desc'
? nameA.localeCompare(nameB)
: nameB.localeCompare(nameA);
});
}}
>
<div class="text-xs text-gray-500">{$i18n.t('Reorder Models')}</div> <div class="text-xs text-gray-500">{$i18n.t('Reorder Models')}</div>
</div>
{#if sortKey === 'model'}
<span class="font-normal self-center">
{#if sortOrder === 'asc'}
<ChevronUp className="size-3" />
{:else}
<ChevronDown className="size-3" />
{/if}
</span>
{:else}
<span class="invisible">
<ChevronUp className="size-3" />
</span>
{/if}
</button>
<ModelList bind:modelIds /> <ModelList bind:modelIds />
</div> </div>

View File

@ -21,14 +21,24 @@
modelIds = modelList; modelIds = modelList;
}; };
onMount(() => { $: if (modelIds) {
init();
}
const init = () => {
if (sortable) {
sortable.destroy();
}
if (modelListElement) {
sortable = Sortable.create(modelListElement, { sortable = Sortable.create(modelListElement, {
animation: 150, animation: 150,
onUpdate: async (event) => { onUpdate: async (event) => {
positionChangeHandler(); positionChangeHandler();
} }
}); });
}); }
};
</script> </script>
{#if modelIds.length > 0} {#if modelIds.length > 0}