summaryrefslogtreecommitdiff
path: root/frontend
diff options
context:
space:
mode:
Diffstat (limited to 'frontend')
-rw-r--r--frontend/src/lib/components/ui/collapsible/collapsible-content.svelte7
-rw-r--r--frontend/src/lib/components/ui/collapsible/collapsible-trigger.svelte7
-rw-r--r--frontend/src/lib/components/ui/collapsible/collapsible.svelte11
-rw-r--r--frontend/src/lib/components/ui/collapsible/index.ts13
-rw-r--r--frontend/src/lib/types.ts1
-rw-r--r--frontend/src/pages/ProjectBacktestTab.svelte18
-rw-r--r--frontend/src/pages/ProjectResultsTab.svelte19
7 files changed, 76 insertions, 0 deletions
diff --git a/frontend/src/lib/components/ui/collapsible/collapsible-content.svelte b/frontend/src/lib/components/ui/collapsible/collapsible-content.svelte
new file mode 100644
index 0000000..bdabb55
--- /dev/null
+++ b/frontend/src/lib/components/ui/collapsible/collapsible-content.svelte
@@ -0,0 +1,7 @@
+<script lang="ts">
+ import { Collapsible as CollapsiblePrimitive } from "bits-ui";
+
+ let { ref = $bindable(null), ...restProps }: CollapsiblePrimitive.ContentProps = $props();
+</script>
+
+<CollapsiblePrimitive.Content bind:ref data-slot="collapsible-content" {...restProps} />
diff --git a/frontend/src/lib/components/ui/collapsible/collapsible-trigger.svelte b/frontend/src/lib/components/ui/collapsible/collapsible-trigger.svelte
new file mode 100644
index 0000000..ece7ad6
--- /dev/null
+++ b/frontend/src/lib/components/ui/collapsible/collapsible-trigger.svelte
@@ -0,0 +1,7 @@
+<script lang="ts">
+ import { Collapsible as CollapsiblePrimitive } from "bits-ui";
+
+ let { ref = $bindable(null), ...restProps }: CollapsiblePrimitive.TriggerProps = $props();
+</script>
+
+<CollapsiblePrimitive.Trigger bind:ref data-slot="collapsible-trigger" {...restProps} />
diff --git a/frontend/src/lib/components/ui/collapsible/collapsible.svelte b/frontend/src/lib/components/ui/collapsible/collapsible.svelte
new file mode 100644
index 0000000..39cdd4e
--- /dev/null
+++ b/frontend/src/lib/components/ui/collapsible/collapsible.svelte
@@ -0,0 +1,11 @@
+<script lang="ts">
+ import { Collapsible as CollapsiblePrimitive } from "bits-ui";
+
+ let {
+ ref = $bindable(null),
+ open = $bindable(false),
+ ...restProps
+ }: CollapsiblePrimitive.RootProps = $props();
+</script>
+
+<CollapsiblePrimitive.Root bind:ref bind:open data-slot="collapsible" {...restProps} />
diff --git a/frontend/src/lib/components/ui/collapsible/index.ts b/frontend/src/lib/components/ui/collapsible/index.ts
new file mode 100644
index 0000000..c0db268
--- /dev/null
+++ b/frontend/src/lib/components/ui/collapsible/index.ts
@@ -0,0 +1,13 @@
+import Content from "./collapsible-content.svelte";
+import Trigger from "./collapsible-trigger.svelte";
+import Root from "./collapsible.svelte";
+
+export {
+ Root,
+ Content,
+ Trigger,
+ //
+ Root as Collapsible,
+ Content as CollapsibleContent,
+ Trigger as CollapsibleTrigger,
+};
diff --git a/frontend/src/lib/types.ts b/frontend/src/lib/types.ts
index db065e4..5444f2a 100644
--- a/frontend/src/lib/types.ts
+++ b/frontend/src/lib/types.ts
@@ -171,6 +171,7 @@ export interface BacktestResult {
logs: string[];
engine: { name: string; version: string };
warnings: string[];
+ assumptions?: Record<string, string | number>;
elapsed_ms?: number | null;
peak_rss_kb?: number | null;
data_manifest_hash?: string;
diff --git a/frontend/src/pages/ProjectBacktestTab.svelte b/frontend/src/pages/ProjectBacktestTab.svelte
index 7d5b172..dcde8d2 100644
--- a/frontend/src/pages/ProjectBacktestTab.svelte
+++ b/frontend/src/pages/ProjectBacktestTab.svelte
@@ -17,6 +17,7 @@ import type { Run, Dataset } from '../lib/types';
import { Alert } from '$lib/components/ui/alert';
import { Badge } from '$lib/components/ui/badge';
import * as Card from '$lib/components/ui/card';
+ import * as Collapsible from '$lib/components/ui/collapsible';
import * as Textarea from '$lib/components/ui/textarea';
import * as Table from '$lib/components/ui/table';
import * as Select from '$lib/components/ui/select';
@@ -362,6 +363,23 @@ import * as Textarea from '$lib/components/ui/textarea';
</ul>
</Alert>
{/if}
+ {#if latest.result?.assumptions && Object.keys(latest.result.assumptions).length}
+ <Collapsible.Root>
+ <Collapsible.Trigger
+ class="flex w-full items-center justify-between p-4 text-sm font-medium hover:bg-muted/50"
+ data-testid="assumptions-toggle">技术口径</Collapsible.Trigger>
+ <Collapsible.Content class="px-4 pb-4">
+ <dl class="text-xs" data-testid="assumptions-list">
+ {#each Object.entries(latest.result.assumptions) as [k, v] (k)}
+ <div class="flex gap-4 py-1">
+ <dt class="text-muted-foreground shrink-0">{k}</dt>
+ <dd>{v}</dd>
+ </div>
+ {/each}
+ </dl>
+ </Collapsible.Content>
+ </Collapsible.Root>
+ {/if}
{#if latest.status === 'succeeded' && latest.result}
<Button variant="outline" href={`#/projects/${projectId}/results?run=${latest.id}`} class="w-fit">查看完整结果与图表</Button>
{/if}
diff --git a/frontend/src/pages/ProjectResultsTab.svelte b/frontend/src/pages/ProjectResultsTab.svelte
index 860fab2..2afb7c1 100644
--- a/frontend/src/pages/ProjectResultsTab.svelte
+++ b/frontend/src/pages/ProjectResultsTab.svelte
@@ -18,6 +18,7 @@
import { Alert } from '$lib/components/ui/alert';
import { Badge } from '$lib/components/ui/badge';
import * as Card from '$lib/components/ui/card';
+ import * as Collapsible from '$lib/components/ui/collapsible';
import * as Table from '$lib/components/ui/table';
import * as Select from '$lib/components/ui/select';
import * as Tabs from '$lib/components/ui/tabs';
@@ -197,6 +198,24 @@ import type { Run, BacktestResult } from '../lib/types';
</Alert>
{/if}
+ {#if result.assumptions && Object.keys(result.assumptions).length}
+ <Collapsible.Root>
+ <Collapsible.Trigger
+ class="flex w-full items-center justify-between p-4 text-sm font-medium hover:bg-muted/50"
+ data-testid="assumptions-toggle">技术口径</Collapsible.Trigger>
+ <Collapsible.Content class="px-4 pb-4">
+ <dl class="text-xs" data-testid="assumptions-list">
+ {#each Object.entries(result.assumptions) as [k, v] (k)}
+ <div class="flex gap-4 py-1">
+ <dt class="text-muted-foreground shrink-0">{k}</dt>
+ <dd>{v}</dd>
+ </div>
+ {/each}
+ </dl>
+ </Collapsible.Content>
+ </Collapsible.Root>
+ {/if}
+
<Card.Root size="sm" class="p-4 flex flex-col gap-4">
{#if result.metrics}
{@const mrow = result.metrics}