From 5c0ba37eda80d39e6ceca59bb1d5f4942f858995 Mon Sep 17 00:00:00 2001 From: "Somhairle H. Marisol" Date: Thu, 17 Sep 2026 14:32:37 +0800 Subject: chore: establish Strategy Lab source baseline (development, not release) --- frontend/src/components/Chart.svelte | 67 +++++ frontend/src/components/CodeEditor.svelte | 104 ++++++++ frontend/src/components/DatasetCard.svelte | 157 +++++++++++ frontend/src/components/DatasetWizard.svelte | 374 +++++++++++++++++++++++++++ frontend/src/components/DiffView.svelte | 71 +++++ frontend/src/components/Layout.svelte | 241 +++++++++++++++++ frontend/src/components/Loading.svelte | 24 ++ frontend/src/components/Modal.svelte | 63 +++++ frontend/src/components/Page.svelte | 37 +++ frontend/src/components/Status.svelte | 66 +++++ 10 files changed, 1204 insertions(+) create mode 100644 frontend/src/components/Chart.svelte create mode 100644 frontend/src/components/CodeEditor.svelte create mode 100644 frontend/src/components/DatasetCard.svelte create mode 100644 frontend/src/components/DatasetWizard.svelte create mode 100644 frontend/src/components/DiffView.svelte create mode 100644 frontend/src/components/Layout.svelte create mode 100644 frontend/src/components/Loading.svelte create mode 100644 frontend/src/components/Modal.svelte create mode 100644 frontend/src/components/Page.svelte create mode 100644 frontend/src/components/Status.svelte (limited to 'frontend/src/components') diff --git a/frontend/src/components/Chart.svelte b/frontend/src/components/Chart.svelte new file mode 100644 index 0000000..ca8f4f8 --- /dev/null +++ b/frontend/src/components/Chart.svelte @@ -0,0 +1,67 @@ + + +
+ + diff --git a/frontend/src/components/CodeEditor.svelte b/frontend/src/components/CodeEditor.svelte new file mode 100644 index 0000000..544a6a4 --- /dev/null +++ b/frontend/src/components/CodeEditor.svelte @@ -0,0 +1,104 @@ + + +
+ {#if label}{label}{/if} +
+
+ + diff --git a/frontend/src/components/DatasetCard.svelte b/frontend/src/components/DatasetCard.svelte new file mode 100644 index 0000000..7b38874 --- /dev/null +++ b/frontend/src/components/DatasetCard.svelte @@ -0,0 +1,157 @@ + + +
+ {#if ds} +
+
+ {ds.name ?? '未命名数据集'} + {#if ds.manifest_hash}manifest {ds.manifest_hash.slice(0, 10)}…{/if} + {#if ds.cache_hit}缓存命中 · 复用现有物化对象{/if} +
+ + {datasetStatusLabel[ds.status]} + +
+ + + + + + + +
请求标的{(ds.request.instruments ?? []).map(instrumentLabel).join(';')}
范围{ds.request.start_date} ~ {ds.request.end_date} · {ds.request.frequency} · {adjustmentLabel[ds.request.adjustment] ?? ds.request.adjustment}
字段{(ds.request.fields ?? []).join(', ')}
创建时间{fmtDate(ds.created_at)}
+ {#if ds.status === 'failed'} + + {/if} + {#if ds.status !== 'ready'} +

{ds.status === 'pending' || ds.status === 'running' ? '获取中,完成后可预览覆盖情况' : ''}

+ {/if} + {#if ds.status === 'ready'} +
+ +
+ {#if showPreview} +
+ + {#if preview} + {@const cov = summarizeCoverage(preview.coverage ?? [])} + {#if cov.warnings.length > 0} + + {:else if cov.common.start} + + {/if} + + + {#each preview.columns as c (c)}{/each} + + + {#each preview.rows as row, i (i)} + {#each preview.columns as c (c)}{/each} + {/each} + +
{c}
{row[c]}
+ {#if preview.truncated} +

预览仅展示部分行

+ {/if} + {/if} +
+ {/if} + {/if} + {:else} + + {/if} +
+ + diff --git a/frontend/src/components/DatasetWizard.svelte b/frontend/src/components/DatasetWizard.svelte new file mode 100644 index 0000000..1e61d92 --- /dev/null +++ b/frontend/src/components/DatasetWizard.svelte @@ -0,0 +1,374 @@ + + +
+

新建数据集

+ + + + {#if caps} +
+

1) 选择标的 最多 {maxSymbols} 个 · 日频 POC

+
+ { + if (ev.key === 'Enter') doSearch(); + }} + aria-label="标的搜索" + /> + +
+ + {#if searchErr && !searchBusy} + + {/if} + {#if searchItems.length > 0} + + + + + + {#each searchItems as inst (inst.market + '.' + inst.symbol + inst.asset_type + '.' + (inst.source ?? 'unknown'))} + + + + + + + + {/each} + +
代码类型名称来源
{inst.market}.{inst.symbol}{assetTypeLabel[inst.asset_type] ?? inst.asset_type}{inst.name ?? '—'}{itemSourceLabel(inst.source, searchSource)} + +
+ {/if} + +
+ 手动录入标的(目录未收录时) +
+

仅接受确切标识,不会推断市场或类型。请与供应商页面核对后再录入。

+
+ + + + +
+
+ +
+
+
+
+ +
+

2) 已选标的 {selected.length}/{maxSymbols}

+ {#if selected.length === 0} +

尚未选择标的。指数仅可作研究中枢,不可直接交易。

+ {:else} +
    + {#each selected as s, i (s.market + '.' + s.symbol + s.asset_type)} +
  • + {s.market}.{s.symbol} + {#if s.name}{s.name}{/if} + {assetTypeLabel[s.asset_type] ?? s.asset_type} + +
  • + {/each} +
+ {/if} +
+ +
+ + + +
+ +
+ + +
+ +
+ 附加原始字段(可选) +

OHLCV 必需字段由引擎要求固定获取;附加字段保持原始口径,未请求的字段不会返回。

+
    + {#each rawFieldChoices as f (f.code)} +
  • + +
  • + {/each} +
+ {#if caps.fields.some((f) => !f.raw)} +

必需字段:{caps.fields.filter((f) => !f.raw).map((f) => f.label).join(' / ')}

+ {/if} +
+ + {#if formErr.length > 0} + + {/if} + {#if submitErr} + + {/if} +

数据请求会进入队列异步获取。配置仅保存你填写的请求,不预填演示数据。

+
+ +
+ {/if} + + +
+ + diff --git a/frontend/src/components/DiffView.svelte b/frontend/src/components/DiffView.svelte new file mode 100644 index 0000000..cf0c1be --- /dev/null +++ b/frontend/src/components/DiffView.svelte @@ -0,0 +1,71 @@ + + +
+
+ 新增({afterLabel}) + 删除({beforeLabel}) +
+ +
+ {#each lines as l, i (i)} + {#if l.t === 'a'} + +{l.text} + {:else if l.t === 'd'} + −{l.text} + {:else} + {l.text} + {/if} + {/each} +
+
+ + diff --git a/frontend/src/components/Layout.svelte b/frontend/src/components/Layout.svelte new file mode 100644 index 0000000..78cee45 --- /dev/null +++ b/frontend/src/components/Layout.svelte @@ -0,0 +1,241 @@ + + +
+ + +
+ {@render children?.()} +
+
+ + diff --git a/frontend/src/components/Loading.svelte b/frontend/src/components/Loading.svelte new file mode 100644 index 0000000..6de2ea2 --- /dev/null +++ b/frontend/src/components/Loading.svelte @@ -0,0 +1,24 @@ +
+ +

加载中…

+
+ + diff --git a/frontend/src/components/Modal.svelte b/frontend/src/components/Modal.svelte new file mode 100644 index 0000000..c9f334c --- /dev/null +++ b/frontend/src/components/Modal.svelte @@ -0,0 +1,63 @@ + + + + + diff --git a/frontend/src/components/Page.svelte b/frontend/src/components/Page.svelte new file mode 100644 index 0000000..a9549bb --- /dev/null +++ b/frontend/src/components/Page.svelte @@ -0,0 +1,37 @@ + + +
+
+

{title}

+ {#if subtitle}

{subtitle}

{/if} +
+ {#if actions}{@render actions?.()}{/if} +
+
+ {@render children?.()} +
+ + diff --git a/frontend/src/components/Status.svelte b/frontend/src/components/Status.svelte new file mode 100644 index 0000000..019c224 --- /dev/null +++ b/frontend/src/components/Status.svelte @@ -0,0 +1,66 @@ + + +{#if busy} +
+ + {busyText} +
+{:else if error} + +{:else if empty !== null && empty !== undefined && empty !== false} +
+

{empty}

+ {#if emptyHint}

{emptyHint}

{/if} +
+{/if} +{#if warnings && warnings.length > 0} +
+ {#each warnings as w, i (i)} + + {/each} +
+{/if} + + -- cgit v1.2.3