ワダチを作る #8:編集画面を「1フォーム・1保存」にまとめて、ステップ2を終えた

前回(#7)で、画面の見た目を整えました。今回は、編集画面の作り直しと、ステップ2の区切りです。

迷う編集画面だった

習慣の編集画面は、アイコンを付けられるようになったあたりから、こうなっていました。

  • 名前・アイコン・時間帯・頻度・タイマー:上のフォームの「保存する」
  • 内容の選択肢(朝活の「個人開発」など):別のフォームで、別の保存ボタン
  • 内容のアイコン:内容ごとに、その場で保存

画面を触っていて、「いま押した保存は、どこまで効くのか」が、分かりません。内容のアイコンを選んだのに、保存を押し忘れて、反映されていなかった、ということも起きました。習慣自体のアイコンと、内容のアイコンで、付け方が違うのも、迷うところです。

統合前の編集画面。上に名前・アイコン・頻度などのフォームと「保存する」、その下に内容の選択肢の一覧と、別の保存ボタンがある

統合前:保存ボタンが、場所ごとに別々

決めたこと:全部を1つの「保存する」にする

案を出して、選んでもらいました。

  • 内容の選択肢も、全部、上のフォームに入れる
  • 保存ボタンは、1つだけ。押すと、画面にあるものが全部、反映される
  • 内容のアイコンも、習慣のアイコンと同じ付け方にする(ファイルを選ぶ。外すチェックも同じ)
  • 内容を「隠す」、新しい内容を「足す」も、同じフォームの中
統合後の編集画面。名前から内容の選択肢まで1つのフォームに入り、一番下に「保存する」のボタンが1つだけある

統合後:保存するボタンは1つ。画面にあるものが全部、反映される

作りの工夫

全部検査してから、1回で反映する

1つのフォームに、たくさんの項目が入ると、一部だけ反映されて、残りは失敗、という状態が、いちばん困ります。そこで、サーバーは、次の順にしました。

  1. 送られた項目を、全部、先に検査する(名前・頻度・タイマー・各アイコンの種類と大きさ・内容の名前)
  2. 1つでもだめなら、何も反映せず、欄ごとの案内を返す
  3. すべて通ったら、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(過去の実績)です。

← トップページに戻る