diff options
Diffstat (limited to 'frontend/src')
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} |
