ObjectOS
構築

ビュー

リスト、フォーム、カンバン、カレンダー、ガントなど — Console におけるすべてのオブジェクト画面の宣言方法。

ビュー

ビュー とは、ユーザーが Console でレコードを閲覧・編集する方法です。ビューは 宣言的メタデータであり、オブジェクトと同じライフサイクルを持ちます。一度宣言すれば、 パッケージとともに配布し、どこでもレンダリングできます。

2 種類あります。

  • リストビュー — 多数のレコードを可視化(グリッド、カンバン、カレンダーなど)
  • フォームビュー — 単一レコードの閲覧・編集(シンプル、タブ、 ウィザードなど)

スキーマソース: packages/spec/src/ui/view.zod.ts

最小限の宣言

すべてのオブジェクトは、ビューを宣言しなくても自動的にデフォルトのグリッドリスト とシンプルフォームを取得します。view を追加してオーバーライドまたは拡張できます。

import { defineObject, F, P } from '@objectstack/spec'

export default defineObject({
  name: 'support_ticket',
  fields: [ /* ... */ ],

  view: {
    list: { type: 'grid', columns: ['subject', 'status', 'priority', 'assignee'] },
    form: { sections: [ { label: 'Details', fields: ['subject','description','priority','status','assignee'] } ] }
  }
})

マルチビューオブジェクト(例えば同じデータに対するカンバン カレンダー)の場合は、 名前付きバリアントを使用します。

view: {
  listViews: {
    by_status:  { type: 'kanban',   kanban:   { groupByField: 'status' }, columns: ['subject','priority'] },
    schedule:   { type: 'calendar', calendar: { startDateField: 'due_at', titleField: 'subject' } },
    by_owner:   { type: 'grid', columns: ['subject','status','priority'], filterableFields: ['assignee'] }
  },
  formViews: {
    quick:    { type: 'modal',  sections: [ /* ... */ ] },
    full:     { type: 'tabbed', sections: [ /* ... */ ] }
  }
}

リストビューの種類

typeレンダリング必須の設定
gridデータテーブル(デフォルト)columns
kanban列を持つボードkanban: { groupByField }
galleryカードデッキgallery: { coverField, titleField }
calendar月 / 週 / 日calendar: { startDateField, titleField }
timeline時系列フィードtimeline: { startDateField, titleField }
ganttプロジェクトタイムライン + 依存関係gantt: { startDateField, endDateField, titleField }
map地理空間ピンmap: { locationField }
chart埋め込みチャートchart: { chartType, xAxisField, yAxisFields }

共通のリストオプション

{
  type: 'grid',
  columns: ['subject','status','priority','assignee','created_at'],

  filter: [ { field: 'archived', operator: 'equals', value: false } ],
  sort:   [ { field: 'created_at', order: 'desc' } ],
  pagination: { pageSize: 25 },
  searchableFields:   ['subject','description'],
  filterableFields:   ['status','priority','assignee'],

  navigation: { mode: 'drawer' },                       // 'page' | 'drawer' | 'modal' | 'split' | 'popover' | 'new_window' | 'none'
  selection:  { type: 'multiple' },                     // 'none' | 'single' | 'multiple'

  rowActions:  ['close_ticket','assign_to_me'],
  bulkActions: ['bulk_close','bulk_export'],

  conditionalFormatting: [
    { condition: P`record.priority == 'urgent'`, style: { background: '#fef2f2', fontWeight: 600 } }
  ],

  exportOptions: ['csv','xlsx'],
  emptyState:   { title: 'No tickets yet', message: 'Create one to get started', icon: 'inbox' }
}

filtersortObjectQL にコンパイルされます。 rowActionsbulkActionsactions を名前で参照します。

カンバン

{
  type: 'kanban',
  kanban: {
    groupByField:   'status',                // discrete field — usually a select
    summarizeField: 'amount',                // optional total per column
    columns: ['subject', 'priority', 'assignee']  // fields shown on each card
  }
}

ボードの列は groupByField の値から生成され、その順序と色は当該フィールドの select オプション定義から取得されます。

列間でのドラッグ&ドロップは、グループ化されたフィールドを設定する更新を発行します。 手動編集と同じ権限ルールが適用されます。

カレンダー

{
  type: 'calendar',
  calendar: {
    startDateField: 'start_at',
    endDateField:   'end_at',                // optional — single-point if omitted
    titleField:     'subject',
    colorField:     'priority'               // optional — colours events by value
  }
}

ガント

{
  type: 'gantt',
  gantt: {
    startDateField:    'start_at',
    endDateField:      'due_at',
    titleField:        'name',
    progressField:     'percent_complete',   // optional, drives the progress bar
    dependenciesField: 'depends_on'          // optional — multiselect lookup to same object
  }
}

チャート(インライン)

{
  type: 'chart',
  chart: {
    chartType: 'bar',                        // 'bar' | 'line' | 'pie' | 'area' | 'scatter'
    xAxisField:  'created_at',
    yAxisFields: ['amount'],
    aggregation: 'sum',
    groupByField: 'status'
  }
}

チャートビューは、単一オブジェクト上のインラインダッシュボード向けです。より高度な オブジェクト横断分析には、専用のレポート画面を使用してください。

フォームビューの種類

typeレイアウト
simple単一カラムまたはセクション(デフォルト)
tabbedタブ付きセクション
wizardステップバイステップのフロー
splitマスター・ディテールの 2 ペイン
drawerサイドパネルフォーム
modalダイアログフォーム
{
  type: 'tabbed',
  sections: [
    { label: 'Overview', fields: ['subject','status','priority','assignee'] },
    { label: 'Customer', fields: ['customer','contact','email','phone'] },
    { label: 'Resolution', fields: ['resolution_notes','resolved_at'] }
  ],
  submitBehavior: { kind: 'next-record' }   // 'thank-you' | 'redirect' | 'continue' | 'next-record'
}

公開フォーム

フォームは匿名アクセス可能にできます。

{
  type: 'simple',
  sections: [ { fields: ['name','email','message'] } ],
  sharing: {
    enabled: true,
    publicLink: 'contact-us',                // slug under /forms/
    allowAnonymous: true
  },
  submitBehavior: { kind: 'thank-you' }
}

これにより、GET /api/v1/forms/contact-usPOST /api/v1/forms/contact-us/submit が自動的に公開されます。これらは 認証を必要としない公開フォームルートです。REST API → Public forms を参照してください。

可視性、ARIA、テーマ

  • visibleOn: P\...`` — フォームの セクションフィールド に対して、 ユーザー / レコード / 環境に基づいて非表示にします(CEL 述語)
  • aria: { label, description, ... } — スクリーンリーダー向けの ARIA 属性 (リストビューとフォームビュー)
  • appearance: { showDescription, allowedVisualizations: [...] } — リスト ビューにおいて、エンドユーザーが切り替えられるリストタイプを制限します

チャットで構築する

通常、ビューのメタデータを手作業で書くことはありません。AI Builder に伝えましょう。

「support_ticket オブジェクトのカンバンビューを status でグループ化して追加し、 カードに subject と priority を表示してください。列を status に応じて 赤 / 黄 / 緑で色分けしてください。」

AI Builder はメタデータツールを呼び出し、差分をキューに入れます。承認すると、 ビューが Console に表示されます。AI Builder を参照してください。

関連項目

On this page