diff --git a/core/keyboard_nav/field_navigation_policy.ts b/core/keyboard_nav/field_navigation_policy.ts index 02d31cc35..a1fa35723 100644 --- a/core/keyboard_nav/field_navigation_policy.ts +++ b/core/keyboard_nav/field_navigation_policy.ts @@ -48,12 +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]; - const fieldRow = newInput.fieldRow; - if (fieldIdx < fieldRow.length) return fieldRow[fieldIdx]; - fieldIdx = 0; - if (newInput.connection?.targetBlock()) { - return newInput.connection.targetBlock() as BlockSvg; + if (newInput.isVisible()) { + const fieldRow = newInput.fieldRow; + if (fieldIdx < fieldRow.length) return fieldRow[fieldIdx]; + if (newInput.connection?.targetBlock()) { + return newInput.connection.targetBlock() as BlockSvg; + } } + fieldIdx = 0; } return null; } @@ -73,12 +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.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 3f98d4ca5..14a9c8f63 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 () {