コンテンツにスキップ

データグリッドの列プリファレンス

列プリファレンスをハイパーメディア流に永続化します — ワイヤは 2 本、 すでに同梱されているもの以外の新規 JavaScript はゼロです:

  1. 列幅installDatagrid() は確定したリサイズを、 hc:datagridcolumnresize をディスパッチするinput[data-hc-datagrid-width="<col>"] へミラーします。小さな フォームがデバウンスされたイベントでオートセーブします。サーバーは ユーザーごとに永続化し、次回以降のロードで記憶した幅を描画し 返します — インライン幅 + data-resized として。幅はサーバーが 描画する事実です。
  2. 列順datagrid-columns のチューザーを installSortable() でアップグレード: チェックボックスのシリアライズは DOM 順に従い、 サーバーは送信された cols=順序を列順として尊重します。

バージョニングポリシーの 対象です。

NameStatus のリサイズグリップをドラッグ(またはフォーカス して矢印キー)してください。確定した幅が隠し入力に入り、デバウンス されたフォームが POST し、ステータス行が本物のサーバーなら永続化する 内容で応答します:

NameStatusOwner
Ingest pipelineActiveAda
Billing exportPendingAlan

Resize a column to save its width.

<!-- グリッド側: リサイズ可能なヘッダーは列名を持つ必要があります —
data-col のない data-resizable ヘッダーを installDatagrid() はスキップします。 -->
<th class="hc-datagrid__headcell" data-resizable data-col="name"
scope="col">Name</th>
<th class="hc-datagrid__headcell" data-resizable data-col="status"
scope="col">Status</th>
<form action="/prefs/columns" method="post"
data-hx-post="/prefs/columns"
data-hx-trigger="hc:datagridcolumnresize from:body delay:500ms"
data-hx-include="this"
data-hx-target="#prefs-status" data-hx-swap="innerHTML">
<input type="hidden" name="w-name" data-hc-datagrid-width="name">
<input type="hidden" name="w-status" data-hc-datagrid-width="status">
<div id="prefs-status" role="status" class="hc-sr-only"></div>
</form>

ミラーはイベントディスパッチのに行われるため、イベント起動の リクエストは常に新しい値をシリアライズします。ミラー先の入力は グリッドに最も近い <form> の中、なければドキュメント全体から 見つかります。

<fieldset class="hc-popover__body" id="cols-fields" data-hc-sortable>
<div class="hc-item">
<button type="button" class="hc-button" data-variant="ghost"
data-hc-sortable-handle aria-label="Reorder Name"></button>
<label class="hc-checkbox-label">
<input class="hc-checkbox" type="checkbox" name="cols" value="name" checked>
Name
</label>
</div>
<!-- …列ごとにソータブルな行を 1 つずつ… -->
</fieldset>

各行はソータブルなフィールドセットの直接の子で、ハンドルはラベルの に置き、決して中には入れません — <label> の中の インタラクティブコンテンツは不正な HTML で、ハンドルのクリックが チェックボックスをトグルしてしまいます。 ドラッグ(またはキーボードでグラブ)して並べ替えると、Apply は DOM 順 でチェックボックスをシリアライズし、アップグレードされた datagrid-columns 契約 がその順序で列を描画します。

POST /prefs/columns(w-<col> のペア):

ケースレスポンス (200)
いずれかの w-<col> ありrole="status" フラグメント(例: “Saved — Name 220px”)。ユーザーごとに永続化
無効な値サーバー側でクランプまたは無視、それでも 200 — 幅はプリファレンスであり、決してエラーではありません
no-JSネイティブ POST → 303 PRG

描画し返すことが契約のもう半分です: 次回以降のロードで、サーバーは 記憶した幅を列のヘッダーとセルに style="inline-size: <w>px; max-inline-size: <w>px" + data-resized として描画します — 印刷/エクスポートも他のセッションも画面と一致 します。

プログレッシブエンハンスメント

Section titled “プログレッシブエンハンスメント”

JavaScript なしではクライアントのリサイズ自体がありません — そして サーバーが描画した幅は引き続き適用されます。列順チューザーは本物の GET フォームのままで、ソータブルのアップグレードなしでも チェックボックスは集合を選べます。

  • 保存は role="status" リージョンで通知されます — 決して無言では ありません。
  • ソータブルのハンドルは本物のボタンで、installSortable() の キーボード文法(Space/Enter でグラブ、矢印で移動、Escape で キャンセル)を持ちます。
  • 列リサイズ自体もキーボードでアクセス可能(グリップはフォーカス可能な セパレーター)なので、プリファレンスのループ全体がそうです。
  • datagrid-columns — このレシピが順序でアップグレードするチューザー。
  • sortable — 並べ替え ビヘイビアとそのキーボード文法。
  • autosave — フォーム 全体のための同じデバウンス永続化のアイデア。
  • データグリッド — 列リサイズとミラー入力のフック。