メインコンテンツへ

表示ビュー

一言でいうと

Display は「あるソース(テーブル・データセット、または外部データ)をどの形式でどう描画するか」を1レコードとして保存したものです。旧 TableView を rename し、tableId 単一参照を DisplaySource(table直結 / dataset経由 / sourceless)に多態化した、data layer refactor の中心エンティティです。テーブル画面のタブも、ダッシュボードの widget も、同じ Display を参照します。

主要ドメイン概念

概念役割
Display描画設定本体。source + viewType + filters/sortBy/groupBy + display(viewType固有 JSONB config)
DisplaySourcesealed: 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 側にある(下記参照)
DisplayRevisionHTML_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-defaultreferences(このDisplayを使っているdashboard placement一覧)・exportexport-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(一覧)、useDisplayRecords
  • repositories/DisplayRepository.ts: backend /api/v1/displays のラッパー
  • types/display.ts: ViewType ごとの display config 型。バリデーションは 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 を逆引きする projection
  • dataset: DisplaySource.FromDataset 経由で複数テーブルの UNION ビューを source にできる

ViewType.requiresTableBinding() == falseViewType.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 の分岐を読み違えます。