mirror of
https://github.com/open-webui/open-webui.git
synced 2025-12-15 05:45:19 +00:00
68 lines
1.7 KiB
Svelte
68 lines
1.7 KiB
Svelte
<script lang="ts">
|
|
import Sortable from 'sortablejs';
|
|
|
|
import { createEventDispatcher, getContext, onMount } from 'svelte';
|
|
const i18n = getContext('i18n');
|
|
|
|
import { models } from '$lib/stores';
|
|
import Tooltip from '$lib/components/common/Tooltip.svelte';
|
|
import EllipsisVertical from '$lib/components/icons/EllipsisVertical.svelte';
|
|
|
|
export let modelIds = [];
|
|
|
|
let sortable = null;
|
|
let modelListElement = null;
|
|
|
|
const positionChangeHandler = () => {
|
|
const modelList = Array.from(modelListElement.children).map((child) =>
|
|
child.id.replace('model-item-', '')
|
|
);
|
|
|
|
modelIds = modelList;
|
|
};
|
|
|
|
$: if (modelIds) {
|
|
init();
|
|
}
|
|
|
|
const init = () => {
|
|
if (sortable) {
|
|
sortable.destroy();
|
|
}
|
|
|
|
if (modelListElement) {
|
|
sortable = Sortable.create(modelListElement, {
|
|
animation: 150,
|
|
onUpdate: async (event) => {
|
|
positionChangeHandler();
|
|
}
|
|
});
|
|
}
|
|
};
|
|
</script>
|
|
|
|
{#if modelIds.length > 0}
|
|
<div class="flex flex-col -translate-x-1" bind:this={modelListElement}>
|
|
{#each modelIds as modelId, modelIdx (modelId)}
|
|
<div class=" flex gap-2 w-full justify-between items-center" id="model-item-{modelId}">
|
|
<Tooltip content={modelId} placement="top-start">
|
|
<div class="flex items-center gap-1">
|
|
<EllipsisVertical className="size-4 cursor-move" />
|
|
|
|
<div class=" text-sm flex-1 py-1 rounded-lg">
|
|
{#if $models.find((model) => model.id === modelId)}
|
|
{$models.find((model) => model.id === modelId).name}
|
|
{:else}
|
|
{modelId}
|
|
{/if}
|
|
</div>
|
|
</div>
|
|
</Tooltip>
|
|
</div>
|
|
{/each}
|
|
</div>
|
|
{:else}
|
|
<div class="text-gray-500 text-xs text-center py-2">
|
|
{$i18n.t('No models found')}
|
|
</div>
|
|
{/if}
|