feat: folders as projects

Co-Authored-By: Classic298 <27028174+Classic298@users.noreply.github.com>
This commit is contained in:
Timothy Jaeryang Baek
2025-07-13 03:23:05 +04:00
co-authored by Classic298
parent 5abc03f4dd
commit 7607c53bd5
6 changed files with 238 additions and 69 deletions
@@ -1,24 +1,42 @@
<script lang="ts">
import { getContext } from 'svelte';
import { getContext, onMount } from 'svelte';
import { knowledge } from '$lib/stores';
import Selector from './Knowledge/Selector.svelte';
import FileItem from '$lib/components/common/FileItem.svelte';
import { getKnowledgeBases } from '$lib/apis/knowledge';
export let selectedItems = [];
const i18n = getContext('i18n');
let loaded = false;
onMount(async () => {
if (!$knowledge) {
knowledge.set(await getKnowledgeBases(localStorage.token));
}
loaded = true;
});
</script>
<div>
<div class="flex w-full justify-between mb-1">
<div class=" self-center text-sm font-semibold">{$i18n.t('Knowledge')}</div>
</div>
<slot name="label">
<div class="mb-2">
<div class="flex w-full justify-between mb-1">
<div class=" self-center text-sm font-semibold">
{$i18n.t('Knowledge')}
</div>
</div>
<div class=" text-xs dark:text-gray-500">
{$i18n.t('To attach knowledge base here, add them to the "Knowledge" workspace first.')}
</div>
<div class=" text-xs dark:text-gray-500">
{$i18n.t('To attach knowledge base here, add them to the "Knowledge" workspace first.')}
</div>
</div>
</slot>
<div class="flex flex-col">
{#if selectedItems?.length > 0}
<div class=" flex flex-wrap items-center gap-2 mt-2">
<div class=" flex flex-wrap items-center gap-2 mb-2.5">
{#each selectedItems as file, fileIdx}
<FileItem
{file}
@@ -38,27 +56,30 @@
</div>
{/if}
<div class="flex flex-wrap text-sm font-medium gap-1.5 mt-2">
<Selector
on:select={(e) => {
const item = e.detail;
{#if loaded}
<div class="flex flex-wrap text-sm font-medium gap-1.5">
<Selector
knowledgeItems={$knowledge || []}
on:select={(e) => {
const item = e.detail;
if (!selectedItems.find((k) => k.id === item.id)) {
selectedItems = [
...selectedItems,
{
...item
}
];
}
}}
>
<button
class=" px-3.5 py-1.5 font-medium hover:bg-black/5 dark:hover:bg-white/5 outline outline-1 outline-gray-100 dark:outline-gray-850 rounded-3xl"
type="button">{$i18n.t('Select Knowledge')}</button
if (!selectedItems.find((k) => k.id === item.id)) {
selectedItems = [
...selectedItems,
{
...item
}
];
}
}}
>
</Selector>
</div>
<button
class=" px-3.5 py-1.5 font-medium hover:bg-black/5 dark:hover:bg-white/5 outline outline-1 outline-gray-100 dark:outline-gray-850 rounded-3xl"
type="button">{$i18n.t('Select Knowledge')}</button
>
</Selector>
</div>
{/if}
<!-- {knowledge} -->
</div>
</div>
@@ -15,6 +15,8 @@
export let onClose: Function = () => {};
export let knowledgeItems = [];
let query = '';
let items = [];
@@ -51,7 +53,7 @@
};
});
let legacy_documents = $knowledge
let legacy_documents = knowledgeItems
.filter((item) => item?.meta?.document)
.map((item) => ({
...item,
@@ -86,16 +88,16 @@
]
: [];
let collections = $knowledge
let collections = knowledgeItems
.filter((item) => !item?.meta?.document)
.map((item) => ({
...item,
type: 'collection'
}));
let collection_files =
$knowledge.length > 0
knowledgeItems.length > 0
? [
...$knowledge
...knowledgeItems
.reduce((a, item) => {
return [
...new Set([
@@ -141,7 +143,7 @@
<div slot="content">
<DropdownMenu.Content
class="w-full max-w-96 rounded-xl px-1 py-1.5 border border-gray-300/30 dark:border-gray-700/50 z-50 bg-white dark:bg-gray-850 dark:text-white shadow-lg"
class="w-full max-w-96 rounded-xl px-1 py-1.5 border border-gray-300/30 dark:border-gray-700/50 z-[99999999] bg-white dark:bg-gray-850 dark:text-white shadow-lg"
sideOffset={8}
side="bottom"
align="start"
@@ -162,7 +164,7 @@
<div class="max-h-56 overflow-y-scroll">
{#if filteredItems.length === 0}
<div class="text-center text-sm text-gray-500 dark:text-gray-400">
<div class="text-center text-xs text-gray-500 dark:text-gray-400 py-4">
{$i18n.t('No knowledge found')}
</div>
{:else}