ワダチを作る #8:編集画面を「1フォーム・1保存」にまとめて、ステップ2を終えた
前回(#7)で、画面の見た目を整えました。今回は、編集画面の作り直しと、ステップ2の区切りです。
迷う編集画面だった
習慣の編集画面は、アイコンを付けられるようになったあたりから、こうなっていました。
- 名前・アイコン・時間帯・頻度・タイマー:上のフォームの「保存する」
- 内容の選択肢(朝活の「個人開発」など):別のフォームで、別の保存ボタン
- 内容のアイコン:内容ごとに、その場で保存
画面を触っていて、「いま押した保存は、どこまで効くのか」が、分かりません。内容のアイコンを選んだのに、保存を押し忘れて、反映されていなかった、ということも起きました。習慣自体のアイコンと、内容のアイコンで、付け方が違うのも、迷うところです。

統合前:保存ボタンが、場所ごとに別々
決めたこと:全部を1つの「保存する」にする
案を出して、選んでもらいました。
- 内容の選択肢も、全部、上のフォームに入れる
- 保存ボタンは、1つだけ。押すと、画面にあるものが全部、反映される
- 内容のアイコンも、習慣のアイコンと同じ付け方にする(ファイルを選ぶ。外すチェックも同じ)
- 内容を「隠す」、新しい内容を「足す」も、同じフォームの中

統合後:保存するボタンは1つ。画面にあるものが全部、反映される
作りの工夫
全部検査してから、1回で反映する
1つのフォームに、たくさんの項目が入ると、一部だけ反映されて、残りは失敗、という状態が、いちばん困ります。そこで、サーバーは、次の順にしました。
- 送られた項目を、全部、先に検査する(名前・頻度・タイマー・各アイコンの種類と大きさ・内容の名前)
- 1つでもだめなら、何も反映せず、欄ごとの案内を返す
- すべて通ったら、
db.batchの1回で、まとめて反映する
D1 の batch は、途中で失敗すると、全体を取り消してくれます。「保存した」か「何も変わっていない」の、どちらかになります。
欄の名前を決めて、ユニットテストにした
内容は何個あるか分からないので、欄の名前に、内容の id を入れました。
optionIcon-<id>:その内容に付けるアイコンremoveOptionIcon-<id>:その内容のアイコンを外すhideOption-<id>:その内容を隠すnewOptionName-<n>/newOptionIcon-<n>:新しく足す内容(最大10行)
この名前の組み立てと読み取りを habit-edit.ts に切り出し、ユニットテストで固めました。画面とサーバーが、同じ名前を使うので、片方だけ変えて壊す、ということを防げます。
他人の習慣・他の習慣の内容は、404
フォームに、他人の習慣の内容の id を、混ぜて送っても、反映されません。サーバーは、送られた内容が、この習慣の内容かを確かめ、違えば404にします(あることを見せない)。
送る量の上限
画像を、たくさん同時に送るので、フォーム全体の大きさの上限が要ります。50KB × (1 + 内容数 + 足す行10) + 32KB としました。
375px で、はみ出した
フォームを1つにまとめたら、スマホの幅(375px)で、ファイル選択が横にはみ出しました。原因は、fieldset の既定の最小幅です。min-w-0 を付けて、直りました。こういうはみ出しは、E2E で幅を計っているので、すぐ分かります。
本番リリース
ここまでを、2回に分けて、本番に出しました。
- 見た目の整え(ヘッダー・バナー・日付の帯・基本色)
- 編集画面の統合
どちらも、テーブルの変更はありません。本番のデプロイを確かめて、Issue を閉じました。
ステップ2を終えて、次の段階を決め直した
ここまでで、習慣の登録と、毎日の「やった」の記録が、できるようになりました。ひとまず、毎日、実際に使えます。そこで、ステップ2(基本の機能)は、ここまでにして、次の段階を、決め直しました。
| ステップ | 中身 |
|---|---|
| 1 | 土台づくり(終) |
| 2 | 基本の機能(終) |
| 3 | 過去の実績(継続性)を表示する(直近の日数・週○回の達成・通算・再開のひとこと など) |
| 4 | マルチユーザー対応(ログイン・招待・退会・エクスポート など。ハコヅミの土台を移す) |
| 5 | その他の機能強化(背景・動画、内容ごとのタイマー など) |
ステップ2に残っていた2件(iPad の PWA で、ロック画面から一時停止・再生すると、環境音が鳴らない問題、など)は、ステップ5に移しました。
いまのワダチは、自分だけが使う前提(Cloudflare Access の後ろ)です。公開は、ステップ4のログインを入れてから。その前に、ステップ3で、「積み上がった」ことを見せる画面を作ります。連続日数を主役にしない、という原則を、実際の画面で、どう形にするか。次回から、そこに入ります。
おわりに
- 保存ボタンの効く範囲は、画面の見た目と、そろえる。1つのフォームなら、保存も1つ
- 検査は全部先に、反映は1回で。「一部だけ保存された」を、作らない
- 欄の名前のような、画面とサーバーが共有する決まりは、切り出して、テストで固める
文章としては長くなりましたが、ステップ2で、「使える」ところまで来ました。次回は、ステップ3(過去の実績)です。