From 2386f83e1b6e9c80f8bbf2021c200ceace970ed1 Mon Sep 17 00:00:00 2001 From: Erik Pasternak Date: Fri, 23 May 2025 20:25:15 -0700 Subject: [PATCH 1/2] Skip over hidden inputs when navigating from a field --- core/keyboard_nav/field_navigation_policy.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/keyboard_nav/field_navigation_policy.ts b/core/keyboard_nav/field_navigation_policy.ts index 02d31cc355f..96b416b122d 100644 --- a/core/keyboard_nav/field_navigation_policy.ts +++ b/core/keyboard_nav/field_navigation_policy.ts @@ -48,6 +48,9 @@ export class FieldNavigationPolicy implements INavigationPolicy> { let fieldIdx = input.fieldRow.indexOf(current) + 1; for (let i = curIdx; i < block.inputList.length; i++) { const newInput = block.inputList[i]; + if (!newInput.isVisible()) { + continue; + } const fieldRow = newInput.fieldRow; if (fieldIdx < fieldRow.length) return fieldRow[fieldIdx]; fieldIdx = 0; @@ -73,6 +76,9 @@ export class FieldNavigationPolicy implements INavigationPolicy> { let fieldIdx = parentInput.fieldRow.indexOf(current) - 1; for (let i = curIdx; i >= 0; i--) { const input = block.inputList[i]; + if (!input.isVisible()) { + continue; + } if (input.connection?.targetBlock() && input !== parentInput) { return input.connection.targetBlock() as BlockSvg; } From 59b2a0ba3222b1b9e9e0b9285093274b357859bb Mon Sep 17 00:00:00 2001 From: Erik Pasternak Date: Fri, 23 May 2025 20:42:35 -0700 Subject: [PATCH 2/2] Add tests and fix implementation --- core/keyboard_nav/field_navigation_policy.ts | 27 +++++++++----------- tests/mocha/navigation_test.js | 14 ++++++++++ 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/core/keyboard_nav/field_navigation_policy.ts b/core/keyboard_nav/field_navigation_policy.ts index 96b416b122d..a1fa357233e 100644 --- a/core/keyboard_nav/field_navigation_policy.ts +++ b/core/keyboard_nav/field_navigation_policy.ts @@ -48,15 +48,14 @@ export class FieldNavigationPolicy implements INavigationPolicy> { let fieldIdx = input.fieldRow.indexOf(current) + 1; for (let i = curIdx; i < block.inputList.length; i++) { const newInput = block.inputList[i]; - if (!newInput.isVisible()) { - continue; + if (newInput.isVisible()) { + const fieldRow = newInput.fieldRow; + if (fieldIdx < fieldRow.length) return fieldRow[fieldIdx]; + if (newInput.connection?.targetBlock()) { + return newInput.connection.targetBlock() as BlockSvg; + } } - const fieldRow = newInput.fieldRow; - if (fieldIdx < fieldRow.length) return fieldRow[fieldIdx]; fieldIdx = 0; - if (newInput.connection?.targetBlock()) { - return newInput.connection.targetBlock() as BlockSvg; - } } return null; } @@ -76,15 +75,13 @@ export class FieldNavigationPolicy implements INavigationPolicy> { let fieldIdx = parentInput.fieldRow.indexOf(current) - 1; for (let i = curIdx; i >= 0; i--) { const input = block.inputList[i]; - if (!input.isVisible()) { - continue; - } - if (input.connection?.targetBlock() && input !== parentInput) { - return input.connection.targetBlock() as BlockSvg; + if (input.isVisible()) { + if (input.connection?.targetBlock() && input !== parentInput) { + return input.connection.targetBlock() as BlockSvg; + } + const fieldRow = input.fieldRow; + if (fieldIdx > -1) return fieldRow[fieldIdx]; } - const fieldRow = input.fieldRow; - if (fieldIdx > -1) return fieldRow[fieldIdx]; - // Reset the fieldIdx to the length of the field row of the previous // input. if (i - 1 >= 0) { diff --git a/tests/mocha/navigation_test.js b/tests/mocha/navigation_test.js index 3f98d4ca57c..14a9c8f631a 100644 --- a/tests/mocha/navigation_test.js +++ b/tests/mocha/navigation_test.js @@ -534,6 +534,13 @@ suite('Navigation', function () { const nextNode = this.navigator.getNextSibling(this.blocks.buttonBlock); assert.equal(nextNode.id, this.blocks.buttonNext.id); }); + test('fromFieldSkipsHiddenInputs', function () { + this.blocks.buttonBlock.inputList[2].setVisible(false); + const fieldStart = this.blocks.buttonBlock.getField('BUTTON2'); + const fieldEnd = this.blocks.buttonBlock.getField('BUTTON3'); + const nextNode = this.navigator.getNextSibling(fieldStart); + assert.equal(nextNode.name, fieldEnd.name); + }); }); suite('Previous', function () { @@ -669,6 +676,13 @@ suite('Navigation', function () { ); assert.equal(prevNode.id, this.blocks.buttonBlock.id); }); + test('fromFieldSkipsHiddenInputs', function () { + this.blocks.buttonBlock.inputList[2].setVisible(false); + const fieldStart = this.blocks.buttonBlock.getField('BUTTON3'); + const fieldEnd = this.blocks.buttonBlock.getField('BUTTON2'); + const nextNode = this.navigator.getPreviousSibling(fieldStart); + assert.equal(nextNode.name, fieldEnd.name); + }); }); suite('In', function () {