メインコンテンツまでスキップ

Form

Form は、関連するフィールドをまとめて入力、検証、送信するためのコンポーネントです。申請、登録、設定、レコード編集、ワークフローの各ステップに適しています。Form はフィールドのセクション、レイアウト、検証状態、送信範囲を一元管理します。

1. Form の機能と設定項目​

Form の設定は 4 つのレベルに分かれます。

  1. Form:レイアウト、モード、データ読み込み、送信、下書き、公開状態を管理します。
  2. Form Section:業務上のテーマごとにフィールドを整理し、繰り返しコレクションとしても設定できます。
  3. Field:ラベル、Field Key、初期値、行の占有方法、条件、検証ルールを設定します。
  4. Button Set / Interaction:Reset、Validate、Submit、コンポーネント関数を組み合わせます。

1.1 プロパティと機能の一覧​

設定領域主なプロパティまたは機能用途
構造ID / Name、Form Sections、Fields、Button SetForm の境界、業務グループ、送信範囲を定義
レイアウトControls Per Row、Form column split、Layout、Label Alignment、Full rowフィールド数、ラベル幅、配置、全幅フィールドを調整
モードCreate、Edit、View、Warn about unsaved changes新規作成、編集、読み取り専用、未保存警告を管理
データアダプターLoad / Create / Update URL、Response Data Path、Record ID、Revisionレコードを読み込み、楽観ロック付き API に接続
送信Full values、Changed values only、Custom URL全値または変更された値だけを送信
検証Required、Length、Pattern、Number、Custom Validator、Remote validationローカル、リモート、サーバーのフィールドエラーを表示
条件Visible / Disabled / Required When、Dependencies、Clear When Hidden他のフィールド、Page Context、現在のモードに応じて動作
繰り返しグループCollection Key、Minimum / Maximum Items、Add / Delete連絡先や明細などのオブジェクト配列を編集
下書きBrowser / Remote storage、Draft Key、Autosave Delay、revision未完了の入力を保存、復元、破棄
操作と状態reset、validate、submit、saveDraft、restoreDraft、discardDraft、forms.*操作を構成し valid、dirty、submitting などを参照
フィールド生成Business Object、JSON Schema、OpenAPI既存モデルから編集可能なフィールド構造を生成

1.2 構造と送信範囲​

Form は状態と送信範囲の境界です。1 ページに複数の Form を置いても、それぞれは自身の Sections、Fields、Button Set だけを管理します。

  • Form Section は業務上のグループを表し、単なる余白ではありません。
  • Field Key は Form 状態と送信 JSON の安定した名前で、バックエンド DTO と合わせます。
  • Button Set は操作を配置し、実際に Reset、Validate、Submit のどれを実行するかは Interaction で設定します。
  • Submit Form は対象 Form に登録されたフィールドだけを収集し、別の Form、Page Context、Tree Current Record は自動では含めません。

検索 Form と編集 Form を同じページに置く場合は別々の ID を付け、各操作から対象を明示してください。

1.3 レイアウトとレスポンシブ動作​

Controls Per Row は 1 行の最大フィールド数と各フィールドのグリッド幅を決めます。Form column split はその領域を Label と Content に分割し、2 項目/行では合計 12、1 項目/行では合計 24 になります。

Layout は Horizontal、Vertical、Inline を選択できます。Label Alignment は Horizontal のラベル文字だけに作用します。Full row / Start on new row は長いフィールドを 1 行にしつつ、ラベルを通常フィールドと揃えます。狭い画面では読書順に積み重なるため、モバイル専用 Form は不要です。

1.4 モード、データ読み込み、送信​

モード動作一般的なエンドポイント
Create初期値から新規レコードを作成Create URL、通常 POST
Editレコードを読み込んで変更を送信Load URL + Update URL、通常 PUT / PATCH
View同じラベル/値レイアウトを読み取り専用で表示Load URL、編集操作なし

Data adapter は Response Data Path からレコードを取得し、Record ID Field と Revision Field で識別子と楽観ロックを保持します。読み込み後の値が Reset と Changed values only の基準です。単純な送信には Custom URL、読み込み、競合検出、下書き復元まで必要な場合は完全な Data adapter を使用します。

1.5 検証、フィールドエラー、条件​

Required、Length、Pattern、Number、Custom Validator は即時のローカル検証です。Remote validation はメール、ユーザー名、業務コードなどをバックエンドで確認し、トリガーと Debounce を設定できます。送信時にバックエンドが fieldErrors を返すと、Form は Field Key ごとにメッセージを表示します。

Visible When、Disabled When、Required When は state.*、context.*、record.*、form.* を参照します。Dependencies は再計算する Field Key を宣言し、Clear When Hidden は非表示になった古い値を削除します。画面上の非表示やクライアント検証は、サーバー側の権限や検証の代わりにはなりません。

1.6 繰り返しグループと下書き​

繰り返し Form Section では、内部 Fields が 1 行のテンプレートになります。Collection Key は送信 JSON のオブジェクト配列で、Minimum / Maximum Items が行数を制限し、Runtime が Add / Delete を提供します。エラーパスには配列インデックスが残るため、対象行を特定できます。

下書きは正式な業務レコードではなく未送信の Form 状態です。Browser storage は単一端末の短期入力、Remote service は Load / Save URL、Draft Key、revision を使う重要または複数端末の入力に適しています。revision 競合を黙って上書きしてはいけません。

1.7 操作と公開状態​

操作動作
reset読み込み済みの基準値または Create の初期値へ戻し、エラーを消去
validate現在の Form を検証し、失敗時は後続操作を停止
submit検証、payload 作成、送信、フィールドエラー処理を実行
saveDraft / restoreDraft / discardDraft下書きを保存、復元、破棄

式は forms.<formId>.valid、dirty、submitting、submitError、lastSubmit、mode を参照できます。これらは読み取り専用です。Step では Submit Form が成功した後だけ nextStep を実行できます。

1.8 フィールド生成とバックエンド連携​

Generate fields は Business Object、JSON Schema、OpenAPI Schema から Sections と Fields を作成します。生成後も通常のページメタデータとして編集できるため、ラベル、機密フィールド、選択肢、権限、レイアウト、API を確認してください。

データ読み込み、リモート検証、下書き、送信には X-Spark-Page-Environment と X-Spark-Page-Render-Mode が自動で付与されます。DESIGN_PREVIEW では安定したテストデータ、RUNTIME では実際の Use Case を返せますが、認証、テナント分離、権限は別途必須です。

1.9 設定の選び方​

目的推奨する開始設定参照する節
基本的な新規作成Create + Sections + ローカル検証 + Custom URL2~8
既存レコードの編集Edit + Load / Update URL + Record ID / Revision9、10、14
読み取り専用View + Load URL10
動的フィールドConditions + Dependencies11、12
連絡先や明細Repeatable Group13
長時間入力Draft + 未保存警告15
モデルから生成Generate fields16

1.10 Form で利用できるフィールド​

まずデータ形状からフィールドを選び、その後にレイアウト、検証、Interaction を設定します。現在のパレットでは以下の 22 種類を追加できます。旧 Select、MultiSelect、旧 MultiRowInput は既存ページ互換のためだけに非表示で保持され、新規ページの入口にはなりません。

分類フィールド適したデータ
基本入力Input、Address、Text Area1 行テキスト、住所、長文
選択とユーザーSelect、Radio Button、Checkbox、Switch、Cascade Select、Tree Select、Transfer、User Select、Department Select列挙値、階層、集合、ユーザー ID、部門 ID
日付と数値Date Picker、Time Picker、Calendar、Rate、Slider日付、時刻、評価、数値、範囲
エディターRich Text、Code Editor、JSON Editor書式付き本文、スクリプト、JSON
ファイルと構造化データUpload、Multi-Row Inputファイルメタデータ、オブジェクト配列

各ページで利用場面、主なプロパティ、送信値、条件、Interaction を説明します。外観だけでなくバックエンドのデータ契約に合わせて選択してください。

2. サンプル:従業員オンボーディング申請​

Spark Sample の Form ページには、2 つのセクション、2 列レイアウト、全幅の理由入力欄、Reset / Validate / Submit 操作があります。

Screen
└── Form: Employee Onboarding Form
├── Employee details
│ ├── Full name / Work email / Department
│ └── Employment type / Start date
├── Equipment and access
│ ├── Laptop budget / Administrator access
│ └── Request justification(全幅)
└── Reset / Validate / Submit request

3. Form とセクションを追加する​

  1. Screen、Panel、Grid Column、Tab、Step、Content のいずれかに Form を追加します。
  2. Form を選択し、Form Sections に 1 つ以上のセクションを追加します。
  3. セクションの Fields に Field、Select、RadioBox、DatePicker、Switch、TextArea などを追加します。
  4. Form の Button Set に操作ボタンを追加します。
  5. Form と各フィールドに安定した ID / Name を設定し、保存後に設計画面と実行画面を確認します。

セクションは「基本情報」「権限」「添付」「確認」のような業務上の意味で分けます。余白だけを作るための空セクションは避けてください。

4. レイアウト​

Controls Per Row は通常フィールドを 1 行に最大何個表示するかを決めます。PC の業務フォームは 2、長文や狭い領域は 1、短い検索条件だけなら 3 または 4 が目安です。狭い画面では読み順に 1 列へ積み重なります。

内部は 24 列グリッドですが、分割は各フィールド領域内で計算されます。2 項目/行の場合、1 項目は 12 列です。

Label 4 + Content 8 = 12

1 項目/行なら 6 + 18 など合計 24 にします。Form column split の目盛りをドラッグすると Label と Content が同時に変わります。

TextArea などに Start on new row / Full row を有効にすると、ラベルは現在の比率を維持して上の先頭ラベルと揃い、内容部分だけが残りの列をまたぎます。

Layout用途
Horizontalラベルと入力を横並びにする標準的な業務フォーム
Verticalラベルを上に置く。狭い領域や長いラベル向け
Inlineフィールドとボタンを 1 行に並べる短い検索バー向け

5. サンプルのフィールド​

フィールドコンポーネント主な設定
Full nameFieldRequired、Length 2–60
Work emailFieldRequired、メール Pattern
DepartmentSelect4 つの固定選択肢
Employment typeRadioBox3 つの選択肢
Start dateDatePickerYYYY-MM-DD
Laptop budgetNumber Field500–5000、接尾辞 USD
Administrator accessSwitchDefault Checked はオフ
Request justificationTextArea全幅、高さ 4–8、Length 20–500

Name / Field Key が送信 JSON のプロパティ名になります。同じ Form 内の編集フィールドには一意のキーを使用してください。

6. 検証​

Required は未入力、Length は文字数、Pattern はメールなどの形式、Number は数値範囲、Custom Validator は業務固有ルールに使います。エラー時は該当フィールドの近くにメッセージが表示され、送信は停止します。

画面側の検証は即時フィードバックのためです。ブラウザを経由しない要求もあるため、バックエンドにも同等の検証が必要です。

7. Reset、Validate、Submit​

Reset ボタンの onClick に Call Component Function を追加します。

Component: employee_onboarding_form
Function: reset

Reset は初期値に戻し、検証メッセージを消します。Validate では Validate Form を追加し、同じ Form を指定します。

Submit の設定:

Form: employee_onboarding_form
Submission Mode: Custom URL
URL: /spark/api/sample/form/requests
Method: POST

Spark は対象 Form を検証し、その Form に登録されたフィールドだけを JSON として送信します。他の Form、Page Context、Tree の Current Record は混在しません。

8. Java バックエンドとページコンテキスト​

@PostMapping
public ApiResult<FormRequestReceiptDTO> submit(
@RequestBody FormRequestSubmission request,
@RequestHeader(value = SparkPageRequestHeaders.ENVIRONMENT,
required = false) String environment,
@RequestHeader(value = SparkPageRequestHeaders.RENDER_MODE,
required = false) String renderMode) {
SparkPageRequestContext context =
SparkPageRequestHeaders.resolve(environment, renderMode);
return SparkApiResultHelper.success(
Locale.JAPANESE,
requestService.submit(request, context),
"SPARK-SAMPLE-FORM-0001");
}

DESIGN_PREVIEW では保存しない安定したプレビュー受領結果を返し、RUNTIME では実際の UseCase を実行できます。Spark は X-Spark-Page-Environment と X-Spark-Page-Render-Mode を自動付与します。Interaction ごとに重複設定しないでください。詳細はページリクエストコンテキストを参照してください。

9. 高度なサンプル:従業員プロフィール編集​

2 つ目のサンプルでは、レコード読み込み、メールのリモート検証、条件付き管理者アクセス理由、緊急連絡先の増減、下書き保存、変更項目だけの送信を扱います。

再現可能な定義は form-capabilities-page.json、バックエンドは FormCapabilityController と FormCapabilitySampleService にあります。

10. モードと公開状態​

Form capabilities で Create / Edit / View を選択します。Edit は Load URL から読み込み Update URL へ保存し、View は同じレイアウトで読み取り専用表示します。未保存変更の警告も有効にできます。

forms.employee_profile_form.valid
forms.employee_profile_form.dirty
forms.employee_profile_form.submitting
forms.employee_profile_form.submitError
forms.employee_profile_form.lastSubmit
forms.employee_profile_form.mode

Form 内では form.dirty、form.submitting も使用できます。これらは読み取り専用です。

11. 条件付きフィールド​

Visible When: state.adminAccess === true
Required When: state.adminAccess === true
Dependencies: adminAccess
Clear When Hidden: on

Visible / Disabled / Required は state.*、context.*、record.*、form.* の真偽式を使用します。Dependencies には依存する安定した Field Key をカンマ区切りで指定します。Clear When Hidden は非表示になった古い値を送信しないための設定です。

12. リモート検証とサーバーエラー​

Work email の Validators に Remote validation を追加します。

Validation URL: /spark/api/sample/form/validate-email
Method: POST
Debounce: 400
Valid Response Path: data.valid
Message Response Path: data.message
Trigger: blur

新しい入力は前のリクエストをキャンセルし、古い応答は無視されます。保存時の業務検証は Field Key ごとのエラーを返します。

{
"success": false,
"fieldErrors": {
"workEmail": ["このメールアドレスは使用済みです。"],
"adminAccessReason": ["管理者アクセスが必要な理由を入力してください。"]
}
}

Java では SparkFieldValidationException と Lattice Message を使用し、Web 境界で言語を解決します。

13. 繰り返しグループ​

Form Section の Repeatable Group を有効にします。

Collection Key: emergencyContacts
Minimum Items: 1
Maximum Items: 3
Add Button Text: Add contact

Section 内のフィールドが 1 行のテンプレートになり、Runtime は Add/Delete と配列の検証パスを管理します。View では編集操作を表示しません。

14. データアダプターと変更セット​

Load URL: /spark/api/sample/form/records/employee-1001
Create URL: /spark/api/sample/form/records
Update URL: /spark/api/sample/form/records/[[state.id]]
Response Data Path: data
Submission Payload: Changed values only
Record ID Field: id
Revision Field: revision

Edit は読み込み後に基準値を作り、recordId、revision、add/replace/remove の changes を送信します。Create は常に全値を送信します。古い revision の更新には HTTP 409 を返してください。

15. 下書き​

個人の一時入力には Browser storage、端末をまたぐ重要な処理には Remote service を使用します。Draft Key、Autosave Delay、Load URL、Save URL を設定します。saveDraft、restoreDraft、discardDraft をボタンから呼び出せます。リモート下書きは保存後に新しい revision を返す必要があります。

16. モデルまたは Schema から生成​

Form capabilities → Generate fields で Business Object、JSON Schema、OpenAPI を選び、Append または Replace を実行します。オブジェクト配列は Repeatable Group になります。生成物は通常の編集可能なページメタデータであり、Runtime がバックエンドの任意コンポーネント JSON やスクリプトを実行することはありません。

生成後にラベル、機密フィールド、選択肢、権限、URL、サーバー検証を確認してください。

17. トラブルシューティング​

  • ラベルが揃わない: 2 項目/行なら 4 + 8 のように合計 12 にします。
  • 条件付きフィールドが更新されない: Dependencies に制御元 Field Key を指定し、表示ラベルは使わないでください。
  • サーバーエラーが上部だけに出る: ルートの fieldErrors に正確な Field Key を返します。
  • 下書き競合が続く: 保存後に返された新しい revision を次の保存で送信します。
  • 設計プレビューで実データを作らない: DESIGN_PREVIEW ではプレビュー結果またはサンドボックスを使用します。