EditableProperty

値をその場で編集し、確定と取り消しの操作をそろえます。

担当者
メモ
打ち合わせの要点

値か鉛筆のアイコンを押して編集を始め、⌘+Enter(WindowsなどではCtrl+Enter)か「確定」で編集を終えます。Escapeか「取消」で元の値に戻します。一行でも複数行でも同じで、Enterだけでは確定しません。

項目を並べる
件名
担当者
公開日
管理番号(8文字まで)
複数行:空のメモと長い文
引き継ぎのメモ
会場の案内
空のままでは確定できない値
連絡先
編集できない値
作成者
長い値
共有リンク
フォームで送る値と取り消し
会場
右から左に読む場合
المسؤول

使いどころ

  • 担当者・件名・メモのように、属性の一つだけを画面を移らずに書き換えさせる時に使います。
  • 複数の値をまとめて入力して送る時は Field で組んだフォーム、読むだけの属性は ValueList を使います。

使い方

id・label・name を渡し、value に今の値を渡します。項目名は小さな太字、表示の値は下線も枠もない文字です。値のすぐ後ろに灰色の鉛筆を置き、値と鉛筆を囲む領域にホバーすると、押すと書き換えられることを示す黄色のハイライト(#ffffcc)の面を出します。鉛筆はホバーすると赤になります。値が空の時は emptyLabel を灰色で出します。

鉛筆を押しても、値そのものを押しても書き始めます(文字を選んでいる時は書き始めません)。一行の値は全体を選び、そのまま打てば置き換わります。multiline の値は末尾から書き足せ、表示でも改行をそのまま出します。書いている間はBasecamp 2のTo-doのその場での編集と同じく、枠も面も付けずに文字の下へ灰色(#ccc)の1pxの点線を引き、フォーカスした欄は点線を青い2pxの線にします。表示と編集で文字の大きさ・一行目の高さ・書き始めは変わりません。

確定(小さい主操作)と取消(文字だけの操作)は、一行・複数行とも欄の下に並べます。確定は Control + Enter・⌘ + Enter、取消は Escape でもでき、Enterだけでは確定しません。確定すると新しい値を表示へ移し、鉛筆の位置に緑のチェックの完了のマークを1.6秒出します(アニメーションはしません)。確定・取消の後はフォーカスを鉛筆に戻します。

required・maxLength は欄の標準の検証として働き、確定の時に検証して、通らなければ書いたまま検証メッセージを出します。フォームの送信で検証に通らなかった時も、書いている状態に切り替えます。

保存は editable:commit で受け取り、保存しない時は editable:beforecommit を取り消します。確定した値は欄に残るので、form に結び付けてフォームの値として送ることもできます。フォームのリセットでは最初の値に戻して表示に戻ります。保存・保存失敗の通知・値の検証ルールは利用側が持ちます。

EditableController を editable、EditablePropertyController を editable-property として登録します。JavaScriptなしでは、確定・取消を隠した通常の入力欄として表示し、フォームで値を送れます。

キーボード

EditablePropertyのキーボード操作
キー動作
Enter / Space(鉛筆)書き始めます。
Control + Enter / ⌘ + Enter書いている値を確定します。
Escape書いている値を捨て、書き始める前の値に戻します。
Enter一行の欄では何もしません。複数行の欄では改行します。

アクセシビリティ

  • 欄は aria-labelledby で label を名前にします。鉛筆の読み上げ名は「〇〇を編集」で、aria-controls で欄を指し、aria-expanded で書いているかを示します。
  • 確定のボタンには aria-keyshortcuts="Control+Enter Meta+Enter" を付けます。
  • 値そのものはフォーカスを受けません。キーボードでは鉛筆から書き始めます。
  • 日本語入力の変換中のEnter・Escapeは、確定・取消に使いません。

イベント

EditablePropertyが発火するイベント
イベント内容
editable:beforeedit鉛筆か値そのものを押して書き始める前に発火します。取り消せます。detailは { value, previousValue, reason } で、reason は pointer・keyboard です。
editable:edit書き始めた後に発火します。detailは editable:beforeedit と同じです。
editable:beforecommit確定の前に、検証を通った時だけ発火します。取り消せます(書いている状態のまま残ります)。detailの value は新しい値、previousValue は書き始める前の値です。
editable:commit確定した後に発火します。detailは editable:beforecommit と同じで、ここで保存します。
editable:beforecancel取消の前に発火します。取り消せます。detailの value は戻す値、previousValue は書いていた値です。
editable:cancel取り消して元の値に戻した後に発火します。detailは editable:beforecancel と同じです。

API

EditableProperty

値の位置で文字列を編集する。保存処理は利用側がeditable:commitで受け取る。一行・複数行とも、確定はControl+Enter / Meta+Enter、取消はEscapeにそろえる。

EditablePropertyのprops
名前型既定値説明
id必須stringコンポーネント内の要素のidの元。${id}-label・${id}-input・${id}-editorを作るので、画面の中で一意にする。
label必須string項目名。値の上に出し、欄の名前(aria-labelledby)と鉛筆ボタンの読み上げ名「〇〇を編集」にも使う。
name必須string欄のname。フォームで送る時の名前になる。
valuestring""最初の値。確定した値は欄に残り、フォームで送れる。
emptyLabelstring"未登録"値が空の時に表示の位置へ出す灰色の文字。
requiredboolean空のままでは確定できなくする。確定の時に欄の標準の検証を行う。
disabledboolean編集できなくする。鉛筆ボタンを押せず、値を押しても編集を始めない。欄も無効になるので、フォームでは送られない。
formstring欄を結び付けるformのid。コンポーネントがformの外にある時に使う。
maxLengthnumber入力できる文字数の上限。欄のmaxlengthに入れる。
multilinebooleanfalse複数行の値。複数行の欄で入力し、改行はそのまま表示する。

登録するcontroller:editable(EditableController)、editable-property(EditablePropertyController)

読み込むCSS:layers.css、reset.css、tokens.css、base.css、layout.css、components/button.css、components/field.css、components/icon.css、components/editable-property.css

コード

HTML
Hono JSX