行から詳細へ
業務の一覧で最もよく使われ、どのアプリでも作り直される操作です。 **このレコードを開き、作業し、戻り、次を開く。**作り直されたものの 多くは同じ 3 つを失います — 中クリック、Back ボタン、そして一覧での 居場所です。
別名: マスター詳細、ドリルダウン。
同一性の列からレコードを開き、Previous / Next で辿ってください。 並びは結果セットで、前後はサーバーが一覧クエリを再実行して解決するので、 3 行目と 4 行目の間のページ境界をクライアントに意識させずに越えます。
次に数行チェックして Open selected を押してください。形は同じ、並びが
違います。歩行の途中で消えたレコードは、Next を生かしたままの
墓標ステップとして描画されます — このデモのスナップショットトークンは
id をそのまま並べているので、レコードリンクの URL の seq= トークンに
存在しない id(例: 4999)を差し込めば再現できます。トークンを読めなく
なるまで壊すと、スナップショットは fail closed します: 一覧へ戻る
リンク付きの 410 アラートで、黙って全件歩行に広がることはありません。
リンクは本物のリンク、同一性の列に
Section titled “リンクは本物のリンク、同一性の列に”<tr class="hc-datagrid__row" id="row-4903" data-row-no="137"> <td class="hc-datagrid__cell"> <input class="hc-checkbox" type="checkbox" name="ids" value="4903" aria-label="Select order SO-4903"> </td> <th class="hc-datagrid__cell" scope="row"> <a href="/orders/4903" data-hc-row-link>SO-4903</a> </th> <!-- …データのセル… --></tr>同一性の列が持ちます。行がであるものであって、後ろに付け足した 動詞ではありません。ただのアンカーであるだけで、中クリック、⌘ クリック、 アドレスのコピー、Back、キーボード、JS 無しの経路が手に入ります。 クリックハンドラはそれらを下手に作り直すことになります。
installRowLink() が足すのは、アンカー自身にはできない 1 つだけ —
行のどこでも Enter で開く。矢印キーで辿り着いたグリッド利用者が
期待する挙動です。編集が該当する場所では編集が勝ち(グリッドが
エディタを開く前にイベントをキャンセルします)、Enter を自分で扱う
コントロールはそのまま、修飾キー付きは「別のこと」の意思表示です。
戻りこそ、みんなが落とす部分
Section titled “戻りこそ、みんなが落とす部分”一覧 URL は既に条件・ソート・列・ページを持っています。Back が復元
できないのはどの行にいたかだけなので、詳細の一覧に戻るはその
URL + #row-<id> です。
/orders?f-ship=@week-start..&sort=-ship,order&page=4#row-4903installDatagrid()
がアクティブセルをそこに着地させ、グリッド自身のスクロールポートを
スクロールします。キーボード利用者も目と同じ場所に到着します。
| 状態 | 復元方法 |
|---|---|
| 条件・ソート・列・ページ | 一覧 URL |
| どの行か | #row-<id> |
| 選択のチェック | 選択から始まった旅のときだけ |
| スクロール位置 | あえて復元しない — 行へのフォーカスの方が正確。1 行挿入されれば同じピクセル位置は別の行を指す |
| 編集途中の入力 | 復元しない — 未保存の変更が離脱前に警告 |
詳細側はその URL を知る必要があります。アプリが正準の一覧を知っているか、
リンクが ?from=<URL エンコード> で運ぶかです。運ぶ場合はサーバー側で
検証してから(同一オリジン・既知のルート)リンクに出してください。
未検証の from はオープンリダイレクトです。
「同じ」より「新しい」
Section titled “「同じ」より「新しい」”| ケース | 戻り方 |
|---|---|
| 何も変更していない | Back。ブラウザ自身の履歴が最も安く正しい復元 |
| 保存した | 一覧 URL + #row-<id> へ 303 |
このリダイレクトは形式ではありません。スナップショット復元は ユーザー自身の編集より前のデータを見せます。確実に気付かれる唯一の 古い値であり、ページャの件数も道連れです。
のぞき見かページか:URL は 1 つ、描画は 2 つ
Section titled “のぞき見かページか:URL は 1 つ、描画は 2 つ”<a href="/orders/4903" data-hc-row-link data-hx-get="/orders/4903?peek=1" data-hx-target="#record-dialog" data-hx-swap="innerHTML">SO-4903</a>href は正準のままなので、JavaScript が落ちても「死んだ行」ではなく
フルページになります。オーバーレイは
remote-dialog
レシピで、中にフルページへのリンクを含みます — 閉じ込めるのぞき見は
無い方がましです。
ページか、のぞき見か、ドッキングペインか
Section titled “ページか、のぞき見か、ドッキングペインか”「詳細をどこに出すか」の答えはモーダルではありません。選択肢は 3 つで、 既定はページです。URL を持つのはページだけだからです。
| 形 | どんなとき | 理由 |
|---|---|---|
| ページ(既定) | 項目が多い、子グリッドがある、独自のアクションがある。ユーザーがそのレコードの中にいる | 共有・ブックマーク・別タブ・JS 無しで到達できる唯一の描画 |
| ドッキングペイン(分割) | レコードと一覧を何度も見比べる仕事(トリアージ、突合) | 両方が生きたまま。オーバーレイで隠れるものが無い |
| のぞき見(モーダル) | 見て戻るだけ(1 項目の確認、承認して閉じる)。短いレコード | 一覧の居場所を保てる。スクロールが要る/タブや子グリッドが生えた時点で、それはページになりたがっている |
業務ソフトウェアでモーダルは 3 つの中で最も少数派で、それは偶然では ありません。Gmail はレコードを開くと画面を置き換えます。SAP Fiori は 一覧とレコードを列に分割します。Salesforce も ServiceNow もレコードには ページを与えます。これらの製品でモーダルが担うのは短く完結した作業 (1 件作る、確認する、1 項目直す)であって、「レコードそのもの」では ありません。レコードは仕事が起きる場所で、仕事には広さと URL と自前の エラー面が要るからです。
避けるべき失敗は具体的です。**URL を持たないモーダル。**レコードを見て いるのにアドレスバーが一覧のままなら、Back は開いていないものを閉じ、 同僚に送るリンクは違う画面を指し、再読込で居場所が消えます。URL を push し、URL から自分を復元できるモーダルは正当な描画です。そうでない モーダルは、詳細画面の服を着た行き止まりです。
のぞき見を正直に保つ規則が 2 つあり、破れば両方とも不具合です。
- 行の
hrefはページであり、のぞき見はdata-hx-getでその上に 重ねます。ダイアログ経由でしか辿り着けないレコードはリンクできません。 同僚から最も多く求められるのがそれです。 - **のぞき見の中にページへのリンクを置く。**閉じ込めるのぞき見は、 無い方がましです。
連続して辿る
Section titled “連続して辿る”1 件開くのは仕事の半分です。業務は待ち行列です。詳細は前へ/次へを 持ち、その並びはユーザーが見ていたものです。
| 並び | ワイヤ |
|---|---|
| 結果セット(既定) | ?seq=list&i=<序数> — サーバーが一覧クエリを再実行して前後を解決するので、「次へ」はページ境界をクライアントに意識させずに越えます |
| 選択 | 「選択した12件を開く」が ids チェックボックスを送信 → POST /orders/selections → トークン付きで 303 |
トークンが指すのは順序付きスナップショットで、画面もそう述べます
(12 件中 3 件目 — 14:32 時点の選択)。消えたレコードは墓標の
ステップであって壁ではありません(最初の欠落で止まると、データが
動いているときにこそ信用できなくなります)。トークンの失効は
fail closed(410 +一覧への導線)で、黙って全件歩行に広がる
ことはありません。
連続移動をどこに置くか — 下部ではない理由
Section titled “連続移動をどこに置くか — 下部ではない理由”前へ/次へはレコードのヘッダーに置きます。同一性の表示と「一覧に 戻る」の隣です。下にある内容のページングではありません。
- 「次へ行く」判断は、たいてい最後まで読む前に下されます。ちらっと 見て、判断して、次へ。スクロールしないと届かないコントロールは、 2 秒の判断を毎回スクロール込みにします。
- 詳細の本文はスクロールするので、下部のコントロールは流れて消える (待ち行列が長いときにこそ役に立たない)か、固定の帯をもう 1 本 用意することになります。滅多に到達しない位置のために払うクロームです。
- 保存後の
303はユーザーを先頭に着地させます。次の移動は、いま いる場所にあるべきです。
長い詳細では、下部に副次的な複製として置いても構いません。どちらも 同じリンクなので同期する状態はなく、主役はヘッダー側のままです。
**そのヘッダーの中の並びにも意味があります。**しかもこれは、メール クライアントが既に全員に教えている並びです。
← 一覧に戻る …レコードの同一性… 1 / 15,129 ‹ ›- 出口は先頭。人が「ここから出たい」ときに見るのはそこだからです。
- 移動(位置の表示 → 前へ/次へ)は末尾。ポインタが既にいる側で、 かつ「次へ進む」が頻度の高い行為だからです。
一覧の移動用の帯と同じ規則です。いまどこにいるかとどこへ行くかは 末尾、出口は先頭。
詳細の中のグリッドは自分でページングする
Section titled “詳細の中のグリッドは自分でページングする”詳細画面は自分のグリッドを持ちます(明細・出荷・履歴)。それぞれが 自分の直下でページングし、ページ全体のフッターには置きません。 3 つのグリッドがある画面のページ全体のページャは、どのグリッドを めくるのかを言えません。一覧テンプレート の規則(移動は、それが動かすデータの下に)は、そのデータについての 話であって、ページについての話ではありません。
残りの高さを取るのは
hc-fill
を持つグリッドだけで、他は自分の上限・自分のページャ・自分の空状態を
保ちます。
つまり詳細画面の下部が持つのはその画面のアクション(保存・取消)で あって、移動ではありません。
- データグリッド — 行の序数、フラグメントナビゲーション、アクティブセル
- 一括操作 — 選択の出どころ
- リモートダイアログ — のぞき見の描画
- データグリッドページ — これが起きる画面