表示ビュー
一言でいうと
Display は「あるソース(テーブル・データセット、または外部データ)をどの形式でどう描画するか」を1レコードとして保存したものです。旧 TableView を rename し、tableId 単一参照を DisplaySource(table直結 / dataset経由 / sourceless)に多態化した、data layer refactor の中心エンティティです。テーブル画面のタブも、ダッシュボードの widget も、同じ Display を参照します。
主要ドメイン概念
| 概念 | 役割 |
|---|---|
Display | 描画設定本体。source + viewType + filters/sortBy/groupBy + display(viewType固有 JSONB config) |
DisplaySource | sealed: FromTable(table直結) / FromDataset(dataset経由) / Sourceless(外部データを renderer が自前取得) |
ViewType | 表示形式の enum(16種: LIST/BOARD/CALENDAR/TIMELINE/GALLERY/SUMMARY/STAT/CHART/ALERT/TREE_TABLE/MEMBER_SCHEDULE/HTML_CUSTOM/FORM/GOOGLE_CALENDAR/TEAM_CALENDAR/INTERACTIVE_HTML/MAIL/LINE_CORRESPONDENCE)。定義は core/table 側にある(下記参照) |
DisplayRevision | HTML_CUSTOM viewType 専用の保存履歴(直近N件の FIFO ログ) |
DisplayReference | この Display を参照している dashboard placement の projection(「どの screen で使われているか」を UI に見せるため) |
Backend 構造
core/display/ は3層構造。ViewType 自体は core/table 側の domain/model/ViewType.kt に定義され、display はそれを参照するだけです(表示形式の定義は table が SSoT)。
api/controller/DisplayController.kt: CRUD(POST/GET/PATCH/DELETE /api/v1/displays)に加えてset-default・references(このDisplayを使っているdashboard placement一覧)・export・export-to-node(HTML_CUSTOM の事前レンダリング結果 / AI生成結果をドキュメントツリーへ export)domain/service/DisplayService.kt: 作成・更新・DisplaySourceの妥当性検証(ViewType.requiresTableBinding()/isSourceless()との整合チェック)domain/service/DisplayRevisionService.kt: HTML_CUSTOM の保存履歴。record と prune を単一トランザクションで実行し「常に直近N件」を保証するdomain/model/DisplaySource.kt: DB ではdisplays.source_kind(TABLE/DATASET/SOURCELESS) +displays.source_idの2カラムに分解される
Frontend 構造
app/modules/display/ は4分類のうち components を持たない薄いモジュールです(実際のビュー描画コンポーネントは screen 側の renderer 群が持つ)。
composables/:useDisplay(単一Displayのget+CRUD)、useDisplayList(一覧)、useDisplayRecordsrepositories/DisplayRepository.ts: backend/api/v1/displaysのラッパーtypes/display.ts:ViewTypeごとのdisplayconfig 型。バリデーションはshared/view-type-display-schema.jsonから生成された zod スキーマ(下記)を使う
他モジュールとの辺
table(backend):ViewType定義とdisplayMetadata()(viewType固有 config のフィールド仕様)の SSoT。shared/view-type-display-schema.jsonはこのdisplayMetadata()から生成されるscreen(frontend, backend対応なし): dashboard widget はDisplayを参照して描画する。widget の renderer 群(ListViewRenderer/BoardViewRenderer/CalendarViewRenderer/ChartViewRenderer等)はscreenモジュール側にあり、view-type-display-schema.jsonから生成されたvalidateDisplayを共通で使う。DisplayReferenceはこの placement を逆引きする projectiondataset:DisplaySource.FromDataset経由で複数テーブルの UNION ビューを source にできる
ViewType.requiresTableBinding() == false と ViewType.isSourceless() == true を同一視しないこと。HTML_CUSTOM は前者が false(AI生成HTML widget は schema-on-render で、内部の custom element が各自 table を参照するため「主たる binding」を必要としない)だが、後者は false(実際の table/dataset source を workspace の anchor として持つ)です。Sourceless で作成できるのは GOOGLE_CALENDAR/TEAM_CALENDAR/INTERACTIVE_HTML の3つだけで、HTML_CUSTOM はここに含まれません。判定を混同すると DisplayService.validateSourceCompatibility の分岐を読み違えます。