フレームワーク不要。HTML属性だけで実現する、宣言的な動的フォーム

複雑な業務フォームを
data属性安全な式で整理する

FormFx は、チェックや選択に応じてフォームが動的に変わる場面を、 Alpine.jsやjQueryの「ifだらけ」から救うための軽量ライブラリです。
eval不使用でCSP環境にも対応し、安全かつ宣言的にフォームを整理します。

Vanilla / TypeScript eval禁止(安全な評価) ESM / UMD / types
attributes-first
data-fx-*
<input id="hasInjury" type="checkbox">

<section data-fx-show="#hasInjury == true"
         data-fx-required="#hasInjury == true">
  <input name="injury_detail">
</section>

<script type="module">
  import { FormFx } from "formfx";
  new FormFx(document.querySelector("form")).mount();
</script>
Repeater
最大N件の入力欄追加
Rules
JSONで集中管理も可能

宣言的

フォーム作者はJSを書かずに data-fx-* で制御できます。

安全な式評価

eval禁止。パーサ+評価器で条件式を安全に処理します。

大規模運用

JSONルール、デバッグ表示、履歴/監査など(拡張)を見据えた設計。


show/hide
条件で表示/非表示
required
条件で必須切替
enable/disable
入力可否の制御
repeater
最大N件の追加

Install

npm または CDN で導入できます。

npm
npm install formfx
CDN (UMD)
<script src="https://unpkg.com/formfx@1.0.2/dist/index.global.js"></script>

Quick Start

CDN等でライブラリを読み込み、対象のフォームに対して new FormFx(el).mount() を呼び出すだけで利用できます。

<!-- 1. ライブラリの読み込み -->
<script src="https://unpkg.com/formfx/dist/index.global.js"></script>

<!-- 2. HTML属性でルールを記述 -->
<form id="sample-form">
  <input id="check" type="checkbox"> 承諾する
  <div data-fx-show="#check == true">
    <input name="msg" data-fx-required="#check == true">
  </div>
</form>

<!-- 3. 初期化 -->
<script>
  new FormFx(document.querySelector("#sample-form")).mount();
</script>

Attributes

属性 説明
data-fx-show 式が true のとき表示。false のとき非表示。 #hasInjury == true
data-fx-required 式が true のとき required を付与。 #severity == 'high'
data-fx-disabled 式が true のとき disabled を付与。 #mode == 'readonly'
data-fx-clear-on-hide 非表示になったとき値をクリア(オプション)。 true
非表示時に required が残るとHTML5バリデーションで送信できないことがあります。 disableOnHide: true を推奨します。

Repeater

最大N件の入力欄を追加できます(例:関連患者、関与スタッフ、要因など)。

<div data-fx-repeater data-fx-name="patients" data-fx-max="3">
  <button type="button" data-fx-add>追加</button>
  <div data-fx-list></div>

  <template data-fx-template>
    <div data-fx-item>
      <input data-fx-field name="id" placeholder="患者ID">
      <input data-fx-field name="note" placeholder="備考">
      <button type="button" data-fx-remove>削除</button>
    </div>
  </template>
</div>

nameの採番戦略(例:patients[0].id)は設定で変更可能にする設計が推奨です。

JSON Rules

大規模フォームではルールを一箇所で集中管理できます(高度な使い方)。

const fx = new FormFx(form, {
  rules: [
    {
      id: "injury-rule",
      if: "#hasInjury == true",
      then: [
        { show: "#injuryBlock" },
        { require: "#injuryDetail" }
      ],
      else: [
        { hide: "#injuryBlock" }
      ]
    }
  ]
});
fx.mount();

Expressions

例:チェックボックス、セレクト、文字列比較など。

#hasInjury == true
#severity == 'high' && #needCall == true
(#type == 'drug' || #type == 'device')
※ v1.1以降で empty()len() などの関数拡張の実装も予定しています。

Demo

FormFx Active

実際に動作するデモです。チェックボックスや選択肢に応じて表示が切り替わります。

※ 傷害ありの場合、入力が必須になります。

API

Constructor
new FormFx(formElement, options)
Lifecycle
fx.mount()
fx.destroy()
Options (例)
{
  disableOnHide: true,  // 非表示時に配下をdisabledにして送信/検証から外す
  clearOnHide: false,   // 非表示時に値をクリア
  // rules: [...],       // JSON rules(高度)
  // debug: true         // デバッグ(高度)
}

FAQ

非表示になった入力が required のままだと、HTML5バリデーションで送信できないことがあります。 disableOnHide: true は、非表示の入力を送信・検証対象から外すための安全策です。

Alpine.js は手軽ですが、分岐が増えるとロジックが散らばりがちです。 FormFx は「条件式と効果」を宣言的にまとめ、保守しやすい形に寄せます。

既存のHTMLを壊したくない、導入コストを抑えたい、業務系で制約がある、といったケースを想定しています。 FormFx はフレームワーク不要です。

Roadmap

  • v1.x: ルール表現拡張 / A11y / Repeater強化 / 運用機能
  • v2.x: 状態モデル、拡張可能な式仕様、運用・監査の高度化