Skip to content
This repository has been archived by the owner on Jun 12, 2024. It is now read-only.

OC-22077 Query widget appearing when clicking add repeat group button in form #738

Merged
merged 2 commits into from
Jan 29, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions public/js/src/module/form.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// Extend the Enketo Core Form class, and expose it for local testing.
import { Form, FormModel } from 'enketo-core';
import events from 'enketo-core/src/js/event';
import { scrollIntoViewIfNeeded } from 'enketo-core/src/js/dom-utils';
import $ from 'jquery';
import config from 'enketo/config';
import gui from './gui';
import settings from './settings';
Expand Down Expand Up @@ -419,5 +421,50 @@ Form.prototype.updateValidityInUi = function (control, result) {
}
};

Form.prototype.goToTarget = function (target, options = {}) {
if (target) {
if (this.pages.active && !options.isPageFlip) {
// Flip to page
this.pages.flipToPageContaining($(target));
}
// check if the target has a form control
if (target.closest('.calculation, .setvalue, .setgeopoint')) {
// It is up to the apps to decide what to do with this event.
target.dispatchEvent(events.GoToInvisible());
}
// check if the nearest question or group is irrelevant after page flip
if (target.closest('.or-branch.disabled')) {
// It is up to the apps to decide what to do with this event.
target.dispatchEvent(events.GoToIrrelevant());
}

// Focus on the first non .ignore form control which is not currently readonly.
// If the element is hidden (e.g. because it's been replaced by a widget),
// the focus event will not fire, so we also trigger an applyfocus event that widgets can listen for.
let selector;
if (target.closest('.question')) {
selector =
'input:not(.ignore):not([readonly]), textarea:not(.ignore):not([readonly]), select:not(.ignore):not([readonly])';
} else {
// For repeat DOM, prevent focus on DN dome when all element is readonly or ignore(#733)
selector =
'.question:not(.or-appearance-dn) input:not(.ignore):not([readonly]), .question:not(.or-appearance-dn) textarea:not(.ignore):not([readonly]), .question:not(.or-appearance-dn) select:not(.ignore):not([readonly])';
}

const input = target.querySelector(selector);

if (input != null) {
input.focus();
input.dispatchEvent(events.ApplyFocus());
}

// Scroll to element if needed. This will generally be a noop unless no
// focusable control was found (e.g. readonly question in pages mode).
scrollIntoViewIfNeeded(target);
}

return !!target;
};

/* eslint import/prefer-default-export: "off" */
export { Form };
Loading