Angular Hierarchical Grid キーボード ナビゲーション
IgxHierarchicalGrid のキーボード ナビゲーションは、さまざまなキーボード操作をユーザーに提供します。これにより IgxHierarchicalGrid のアクセシビリティが向上し、内部の要素 (セル、行、列ヘッダー、ツールバー、フッターなど) をナビゲートできるようになります。この機能はデフォルトで有効になっています。デフォルトの動作を簡単にオーバーライドするオプションがあります。
IgxHierarchicalGrid のタブが削減され、ナビゲーションが W3C のアクセシビリティ標準に準拠し、使いやすくなりました。
現在、IgxHierarchicalGrid には以下のタブ位置が導入されています。
- GroupBy または ツールバーの領域 (有効な場合)
- IgxHierarchicalGrid ヘッダー
- IgxHierarchicalGrid 本体
- 列集計 (有効な場合)
- IgxHierarchicalGrid ページネーター (有効な場合)
Note
この動作変更のため、Tab と Shift + Tab キーでセル間を移動することは IgxHierarchicalGrid でサポートされなくなりました。 Tabキーを押すと、グループ化 / ツール バー -> ヘッダー -> 本体 -> 集計 -> フッター / ページネーター の順序にタブ位置を移動します。
Note
テンプレートによってフォーカス可能な要素を IgxHierarchicalGrid の本体に公開すると、ブラウザのデフォルトの動作が防止されていないため、予期されない結果が発生する可能性があります。 したがって、それを適切に防止/変更するのは開発者の責任です。
ヘッダー ナビゲーション
IgxHierarchicalGrid ヘッダーのキーボード ナビゲーションが完全にサポートされるようになりました。列ヘッダーは矢印キーで簡単にトラバースできます。さらに、フィルタリング、ソート、グループ化などの列操作をトリガーするキーの組み合わせがいくつかあります。 IgxHierarchicalGrid ヘッダー コンテナーがフォーカスされている場合、以下のキー組み合わせを使用できます。
キーの組み合わせ
- 上矢印 - ヘッダーで 1 つ上のセルへ移動 (ループなし); 複数行レイアウトまたは複数列ヘッダーが定義されている場合のみ使用できます。
- 下矢印 - ヘッダーの 1 つ下のセルに移動 (ラッピングなし); 複数行レイアウトまたは複数列ヘッダーが定義されている場合のみ使用できます。
- 左矢印 - 1 つ左のセルへ移動 (ループなし)
- 右矢印 - 1 つ右のセルへ移動 (行間のラッピングなし)
- Ctrl + 左矢印 - 行の左端のセルへ移動; 複数行レイアウトまたは複数列ヘッダーが有効な場合、同じレベルの左端のセルへ移動
- Home - 行の左端のセルへ移動; 複数行レイアウトまたは複数列ヘッダーが有効な場合、同じレベルの左端のセルへ移動
- Ctrl + 右矢印 - 行の右端のセルへ移動; 複数行レイアウトまたは複数列ヘッダーが有効な場合、同じレベルの右端のセルへ移動
- End - 行の右端のセルへ移動; 複数行レイアウトまたは複数列ヘッダーが有効な場合、同じレベルの右端のセルへ移動
- Alt + L - 詳細フィルタリングが有効な場合、詳細フィルタリング ダイアログを開きます。
- Ctrl + Shift + L - 列がフィルター可能な場合、Excel スタイル フィルターまたはデフォルト (行) フィルターを開きます。
- Ctrl + Arrow Up - アクティブな列ヘッダーを昇順にソートします。列が昇順で既にソートされている場合、ソート状態を削除します。
- Ctrl + Arrow Down - アクティブな列ヘッダーを降順にソートします。列が降順で既にソートされている場合、ソート状態を削除します。
- Space - 列を選択します。列がすでに選択されている場合、選択を解除します。
本体ナビゲーション
IgxHierarchicalGrid 本体がフォーカスされている場合、以下のキー組み合わせを使用できます。
キーの組み合わせ
- 上矢印 - 1 つ上のセルへ移動 、必要に応じてグリッド階層の 1 つ上のレベルへ移動 (ラッピングなし)
- 下矢印 - 1 つ下のセルへ移動 、必要に応じてグリッド階層の 1 つ下のレベルへ移動 (ラッピングなし)
- 左矢印 - 1 つ左のセルへ移動 (行間のラッピングなし)
- 右矢印 - 1 つ右のセルへ移動 (行間のラッピングなし)
- Ctrl + 左矢印 - 行の左端のセルへ移動
- Ctrl + 右矢印 - 行の右端のセルへ移動
- Ctrl + 上矢印 - 列の最初のセルへ移動
- Ctrl + 下矢印 - 列の最後のセルへ移動
- Home - 行の左端のセルへ移動
- End - 行の右端のセルへ移動
- Ctrl + Home - グリッドの最も左上のデータ セルへ移動
- Ctrl + End - グリッドの最も右下のデータ セルへ移動
- Page Up - 1 ページ (ビューポート) 上へスクロール
- Page Down - 1 ページ (ビューポート) 下へスクロール
- Enter 編集モードに入る
- F2 編集モードに入る
- Esc 編集モードを終了する
- Tab - 編集モードのセルがある場合のみ使用できます。行の次の編集可能なセルにフォーカスを移動します。行の最後のセルに達した場合、フォーカスを次の行の最初の編集可能なセルに移動します。行編集が有効な場合、フォーカスを編集可能な一番右のセルから CANCEL および DONE ボタンへ移動し、DONE ボタンから行の一番左の編集可能なセルへ移動します。
- Shift + Tab - 編集モードのセルがある場合のみ使用できます。行の一つ前の編集可能なセルにフォーカスを移動します。行の最初のセルに達した場合、フォーカスを前の行の最後の編集可能なセルに移動します。行編集が有効な場合、フォーカスを編集可能な一番右のセルから CANCEL および DONE ボタンへ移動し、DONE ボタンから行の一番右の編集可能なセルへ移動します。
- Space - 行の選択が有効な場合、行を選択します。
- Alt + 左矢印 または Alt + 上矢印 - 行アイランドを縮小します。
- Alt + 右矢印 または Alt + 下矢印 - 行アイランドを展開します。
以下のデモサンプルで上記のすべての操作を実行できます。ナビゲーション可能なグリッド要素をフォーカスすると、利用可能な操作のリストが表示されます。
デモ
カスタム キーボード ナビゲーション
特定のキーまたはキーの組み合わせのデフォルトの動作をオーバーライドすることができるは、キーボード ナビゲーション機能の利点の 1 つです。たとえば、Enter キーまたは Tab キーを押して次のセルまたは下のセルへ移動します。この以外のナビゲーションシナリオでも、キーボード ナビゲーションの API で簡単に実現できます。
API | 説明 | 引数 |
---|---|---|
gridKeydown |
上記のキー押下やキー押下の組み合わせのいずれかが実行されたときに発生されるイベント。キャンセルできます。その他のキーの押下/組み合わせには、デフォルトの onkeydown イベントを使用します。 |
IGridKeydownEventArgs |
activeNodeChange |
アクティブ ノードが変更されたときに発生するイベント。これを使用して、アクティブ フォーカス位置 (ヘッダー、tbody など)、列インデックス、行インデックス、またはネストされたレベルを決定できます。 | IActiveNodeChangeEventArgs |
navigateTo |
提供された rowindex と visibleColumnIndex に基づいてグリッド内の位置に移動します。{ targetType: GridKeydownTargetType, target: Object } タイプのパラメーターを受け入れるコールバック関数を通してターゲット要素上でカスタム ロジックを実行することもできます。使用方法: grid.navigateTo(10, 3, (args) => { args.target.nativeElement.focus(); }); |
rowindex : number, visibleColumnIndex : number, callback : ({ targetType: GridKeydownTargetType, target: Object } ) => {} |
getNextCell |
rowIndex と visibileColumnIndex で次のセルを定義する ICellPosition オブジェクトを返します。コールバック関数は、getNextCell メソッドの 3 番目のパラメーターとして渡すことができます。コールバック関数は、パラメーターとして IgxColumnComponent を受け取り、指定された条件が満たされた場合に boolean 値を返します: const nextEditableCell = grid.getNextCell(0, 4, (col) => col.editable); |
currentRowIndex : number, currentVisibleColumnIndex : number, callback : (IgxColumnComponent ) => boolean |
getPreviousCell |
rowIndex と visibileColumnIndex で前のセルを定義する ICellPosition オブジェクトを返します。コールバック関数は、getPreviousCell メソッドの 3 番目のパラメーターとして渡すことができます。コールバック関数は、パラメーターとして IgxColumnComponent を受け取り、指定された条件が満たされた場合に boolean 値を返します: const prevEditableCell = grid.getPreviousCell(0, 4, (col) => col.editable); |
currentRowIndex : number, currentVisibleColumnIndex : number, callback : (IgxColumnComponent ) => boolean |
Note
getNextCell
および getPreviousCell
は現在のレベルで使用し、上位または下位レベルのセルにアクセスできません。
API を使用して、ユーザー入力の検証やカスタム ナビゲーションなどの一般的なシナリオを実現する方法を示します。最初に、gridKeydown
イベントのイベント ハンドラーを登録する必要があります。
<igx-hierarchical-grid #grid1 [data]="data" (gridKeydown)="customKeydown($event, grid1)">
<igx-row-island [key]="'Albums'" (gridCreated)="childGridCreated($event)">
</igx-row-island>
</igx-hierarchical-grid>
igxHierarchicalGrid子グリッドにカスタムキーボードナビゲーションを追加するには、各子グリッドを gridKeydown
イベントにサブスクライブする必要があります。そのため、上記の例でgridCreated
イベントのイベント ハンドラーを登録しました。
public childGridCreated(event: IGridCreatedEventArgs) {
const grid = event.grid;
event.grid.gridKeydown.subscribe((args) => {
this.customKeydown(args, grid);
});
}
public customKeydown(args: IGridKeydownEventArgs) {
const target: IgxGridCell = args.target as IgxGridCell;
const evt: KeyboardEvent = args.event as KeyboardEvent;
const type = args.targetType;
if (type === 'dataCell' && target.editMode && evt.key.toLowerCase() === 'tab') {
// 1. USER INPUT VALIDATON ON TAB
}
if (type === 'dataCell' && evt.key.toLowerCase() === 'enter') {
// 2. CUSTOM NAVIGATION ON ENTER KEY PRESS
}
}
IGridKeydownEventArgs 値に基づいて、独自のロジックを提供する 2つ のケースを識別しました (上記を参照)。API のメソッドを使用して、目的の処理を実行しましょう。ユーザーが編集モードでセル上で Tab キーを押している場合、入力の検証を実行します。ユーザーがセル上で Enter キーを押すと、次の行のセルへフォーカスを移動します。
// 1. USER INPUT VALIDATON ON TAB
if (target.column.dataType === 'number' && target.editValue < 0) {
// alert the user that the input is invalid
return;
}
// 2. CUSTOM NAVIGATION ON ENTER KEY PRESS
const nexRowIndex = target.row.expanded ? target.rowIndex + 2 : target.rowIndex + 1;
grid.navigateTo(nexRowIndex, target.visibleColumnIndex,
(obj) => { obj.target.nativeElement.focus(); });
注: 実装の詳細は、サンプルコードを参照してください。
実装したカスタム シナリオを試すには以下のデモを使用してください。
Grammy Nominations
列のセルをダブルクリックするか F2 キーを押し、値を-2
に変更して Tab キーを押します。プロンプト メッセージが表示されます。- セルを選択して Enter キー を数回押します。キーを押すたびに、同じ列の下にある次の行のセルへフォーカスを移動します。
デモ
既知の制限
制限 | 説明 |
---|---|
スクロール可能な親コンテナーを使用してグリッド内を移動します。 | グリッドがスクロール可能な親コンテナー内に配置され、ユーザーが表示されていないグリッドのセルへ移動した場合、親コンテナーはスクロールされません。 |