forked from bai/curriculum-project-hub
cbe569d7e6
Run `prettier --write .` across all source files. Changes are purely formatting: trailing commas, line wrapping at 120 chars, import reordering, and CSS whitespace. No logic changes. Verified with `prettier --check .` and `svelte-check` (0 errors, 0 warnings).
50 lines
1.4 KiB
Svelte
50 lines
1.4 KiB
Svelte
<script lang="ts">
|
|
import type { ExplorerFolder } from '$lib/api';
|
|
import { fmtDate } from '$lib/format';
|
|
import Icon from './Icon.svelte';
|
|
import FolderNode from './FolderNode.svelte';
|
|
|
|
let {
|
|
folders,
|
|
projects,
|
|
parentId,
|
|
slug,
|
|
}: {
|
|
folders: ExplorerFolder[];
|
|
projects: {
|
|
id: string;
|
|
name: string;
|
|
folderId: string | null;
|
|
createdAt: string;
|
|
binding: { chatId: string } | null;
|
|
}[];
|
|
parentId: string | null;
|
|
slug: string;
|
|
} = $props();
|
|
|
|
let childFolders = $derived(folders.filter((f) => f.parentId === parentId));
|
|
let childProjects = $derived(projects.filter((p) => p.folderId === parentId));
|
|
</script>
|
|
|
|
<div class="space-y-0.5">
|
|
{#each childProjects as p (p.id)}
|
|
<a
|
|
href={`/admin/org/${slug}/projects/${p.id}`}
|
|
class="flex items-center gap-2.5 px-3 py-2.5 text-sm transition hover:bg-surface-100"
|
|
>
|
|
<span class="flex h-7 w-7 items-center justify-center border border-primary-200 bg-primary-50 text-primary-700">
|
|
<Icon name="file" class="h-4 w-4" />
|
|
</span>
|
|
<span class="min-w-0 flex-1 truncate font-medium text-surface-900">{p.name}</span>
|
|
{#if p.binding}
|
|
<span class="saas-badge-success">已绑定</span>
|
|
{/if}
|
|
<span class="hidden text-xs text-surface-600 sm:inline">{fmtDate(p.createdAt)}</span>
|
|
</a>
|
|
{/each}
|
|
|
|
{#each childFolders as f (f.id)}
|
|
<FolderNode folder={f} {folders} {projects} {slug} />
|
|
{/each}
|
|
</div>
|