REFERENCE
SDK 範例
@asgard-js/core 與 @asgard-js/react 的用法與可以直接操作的範例。
TABLE / CHART 進階功能
table 與 chart 兩個模板除了基本渲染之外還各有一組進階能力:TABLE 可以在表格旁附上產生它的
SQL 並讓使用者把資料下載走,CHART 可以一次給多種圖表讓使用者自己切換。兩者都不需要任何
props,後端在模板裡填了欄位就會出現。
TABLE:SQL 分頁
table物件有兩個選用欄位:欄位 型別 說明 sqlstring產生這張表的查詢,在 SQL 分頁以帶語法高亮的程式碼區塊呈現 sqlExplanationstring查詢說明,以 Markdown 渲染在 SQL 下方 任一個有值就會在表格上方長出
Table/SQL兩個分頁;兩個都沒有時連分頁列都不會出現,就只是 一張普通的表格。兩個欄位各自獨立——只給sqlExplanation不給sql也是合法的,SQL 分頁就只有 說明文字。TABLE:下載
下載按鈕出現在標題列右側,條件是在 Table 分頁且有資料(切到 SQL 分頁時會消失)。點開是 兩個選項:
格式 產出 CSV 逗號分隔,值含 ,/"/換行時加引號並把"跳脫成""。檔案開頭加了 BOM,Excel 開中文才不會亂碼JSON Lines 一列一個 JSON 物件,以 columns的key為鍵檔名是
<標題>_<YYYY-MM-DD>.<副檔名>,標題裡非中英數的字元會被換成底線。下載的是全部資料,不是當前頁pagination只影響畫面上顯示幾列,下載一律匯出data的完整內容。整份檔案都在前端從當前資料 產生,不會回頭打後端。兩種格式匯出的都是套用
format之後的顯示值,不是原始值——CURRENCY欄位出來是"$135,000"而不是135000。要拿原始數值做後續運算的話,這不是合適的來源。下載完成後右下角會跳出提示條,可以直接開啟剛下載的檔案,5 秒後自動收起。
TABLE:欄位與格式
interface TableData {
rowType: "OBJECT" | "ARRAY";
columns: { header: string; key?: string; format?: "DATE" | "DATE_TIME" | "CURRENCY" }[];
pagination: { size: number } | null;
data: Record<string, unknown>[] | unknown[][];
sql?: string;
sqlExplanation?: string;
}rowType決定怎麼從一列取值,也決定表頭長什麼樣:OBJECT— 每列是物件,用column.key取值。表頭會顯示兩行:header在上、key在下。ARRAY— 每列是陣列,按欄位順序取值(key用不到)。表頭只有header一行。
format影響儲存格的呈現:DATE走toLocaleDateString()、DATE_TIME走toLocaleString()、CURRENCY格式化成新台幣(無小數)。沒給format就直接轉成字串;null/undefined一律顯示 成空字串。CHART:多種圖表切換
chartOptions是一個陣列,每個元素是一種畫法:欄位 型別 說明 chartOptions[].typestring識別字, defaultChart用它比對chartOptions[].titlestring下拉選單顯示的名稱 chartOptions[].specobjectVega 或 Vega-Lite spec defaultChartstring預設選中的 type下拉選單只在超過一個 option 時出現只給一個 option 時圖表照畫,但沒有可切換的東西,選單也就不會渲染。
另外
defaultChart對不到任何type時會退回第一個 option 的 spec,不會報錯——所以填錯字 只會安靜地畫出第一張圖。{
type: MessageTemplateType.CHART,
title: "各區銷售趨勢",
text: "同一份資料提供兩種圖表。",
defaultChart: "bar",
chartOptions: [
{ type: "bar", title: "長條圖", spec: barSpec },
{ type: "line", title: "折線圖", spec: lineSpec },
],
}CHART:渲染時 SDK 會動 spec
送進去的 spec 不是原封不動被畫出來的。SDK 會複製一份再改兩件事:
- 背景固定成白色。 這是刻意的——深色主題下 Vega 預設的軸標與圖例文字是深色的,透明背景會 讓它們幾乎看不見。
- 寬度跟著容器跑。 用
ResizeObserver量外框寬度寫進spec.width,並補上autosize: { type: "fit", resize: true, contains: "padding" }。所以 spec 裡自己寫的width會被覆蓋,height則保留。
Vega 內建的 actions 選單(存檔/看原始碼那顆)一律關閉。