diff --git a/src/lib/components/workspace/Knowledge.svelte b/src/lib/components/workspace/Knowledge.svelte index d8bc8edfba..fcf15b7de3 100644 --- a/src/lib/components/workspace/Knowledge.svelte +++ b/src/lib/components/workspace/Knowledge.svelte @@ -6,10 +6,10 @@ dayjs.extend(relativeTime); import { toast } from 'svelte-sonner'; - import { onMount, getContext } from 'svelte'; + import { onMount, getContext, tick } from 'svelte'; const i18n = getContext('i18n'); - import { WEBUI_NAME, knowledge } from '$lib/stores'; + import { WEBUI_NAME, knowledge, user } from '$lib/stores'; import { getKnowledgeBases, deleteKnowledgeById, @@ -17,6 +17,7 @@ } from '$lib/apis/knowledge'; import { goto } from '$app/navigation'; + import { capitalizeFirstLetter } from '$lib/utils'; import DeleteConfirmDialog from '../common/ConfirmDialog.svelte'; import ItemMenu from './Knowledge/ItemMenu.svelte'; @@ -24,9 +25,9 @@ import Search from '../icons/Search.svelte'; import Plus from '../icons/Plus.svelte'; import Spinner from '../common/Spinner.svelte'; - import { capitalizeFirstLetter } from '$lib/utils'; import Tooltip from '../common/Tooltip.svelte'; import XMark from '../icons/XMark.svelte'; + import ViewSelector from './common/ViewSelector.svelte'; let loaded = false; @@ -34,14 +35,25 @@ let selectedItem = null; let showDeleteConfirm = false; + let tagsContainerElement: HTMLDivElement; + let viewOption = ''; + let fuse = null; let knowledgeBases = []; + + let items = []; let filteredItems = []; - $: if (knowledgeBases.length > 0) { - // Added a check for non-empty array, good practice - fuse = new Fuse(knowledgeBases, { + const setFuse = async () => { + items = knowledgeBases.filter( + (item) => + viewOption === '' || + (viewOption === 'created' && item.user_id === $user?.id) || + (viewOption === 'shared' && item.user_id !== $user?.id) + ); + + fuse = new Fuse(items, { keys: [ 'name', 'description', @@ -50,16 +62,24 @@ ], threshold: 0.3 }); + + await tick(); + setFilteredItems(); + }; + + $: if (knowledgeBases.length > 0 && viewOption !== undefined) { + // Added a check for non-empty array, good practice + setFuse(); } else { fuse = null; // Reset fuse if knowledgeBases is empty } - $: if (fuse) { - filteredItems = query - ? fuse.search(query).map((e) => { - return e.item; - }) - : knowledgeBases; + const setFilteredItems = () => { + filteredItems = query ? fuse.search(query).map((result) => result.item) : items; + }; + + $: if (query !== undefined && fuse) { + setFilteredItems(); } const deleteHandler = async (item) => { @@ -75,6 +95,7 @@ }; onMount(async () => { + viewOption = localStorage?.workspaceViewOption || ''; knowledgeBases = await getKnowledgeBaseList(localStorage.token); loaded = true; }); @@ -94,18 +115,31 @@ }} /> -