跳至主要内容

TABLE / CHART 進階功能

tablechart 兩個模板除了基本渲染之外還各有一組進階能力:TABLE 可以在表格旁附上產生它的 SQL 並讓使用者把資料下載走,CHART 可以一次給多種圖表讓使用者自己切換。兩者都不需要任何 props,後端在模板裡填了欄位就會出現。

選擇範例

表格上方有 Table / SQL 兩個分頁,Table 分頁的標題列右側有下載按鈕(CSV / JSON Lines)。

本範例用 botProviderEndpoint: "skip" 搭配 initMessages 餵入固定資料,不需連線。下載是在前端由當前資料產生的,所以是真的可以下載。
聊天機器人載入中…

TABLE:SQL 分頁

table 物件有兩個選用欄位:

欄位型別說明
sqlstring產生這張表的查詢,在 SQL 分頁以帶語法高亮的程式碼區塊呈現
sqlExplanationstring查詢說明,以 Markdown 渲染在 SQL 下方

任一個有值就會在表格上方長出 Table / SQL 兩個分頁;兩個都沒有時連分頁列都不會出現,就只是 一張普通的表格。兩個欄位各自獨立——只給 sqlExplanation 不給 sql 也是合法的,SQL 分頁就只有 說明文字。

TABLE:下載

下載按鈕出現在標題列右側,條件是在 Table 分頁有資料(切到 SQL 分頁時會消失)。點開是 兩個選項:

格式產出
CSV逗號分隔,值含 ,"/換行時加引號並把 " 跳脫成 ""。檔案開頭加了 BOM,Excel 開中文才不會亂碼
JSON Lines一列一個 JSON 物件,以 columnskey 為鍵

檔名是 <標題>_<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 影響儲存格的呈現:DATEtoLocaleDateString()DATE_TIMEtoLocaleString()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 會複製一份再改兩件事:

  1. 背景固定成白色。 這是刻意的——深色主題下 Vega 預設的軸標與圖例文字是深色的,透明背景會 讓它們幾乎看不見。
  2. 寬度跟著容器跑。ResizeObserver 量外框寬度寫進 spec.width,並補上 autosize: { type: "fit", resize: true, contains: "padding" }。所以 spec 裡自己寫的 width 會被覆蓋,height 則保留。

Vega 內建的 actions 選單(存檔/看原始碼那顆)一律關閉。

也看看

  • 訊息模板 — 全部模板類型總覽
  • 主題 — 調整聊天介面配色(圖表背景不受影響,見上)