UNPKG

enketo-core

Version:

Extensible Enketo form engine

57 lines (52 loc) 2.06 kB
import Widget from '../../js/widget'; import { os } from '../../js/sniffer'; import { elementDataStore as data } from '../../js/dom-utils'; /** * The whole purpose of this widget is to workaround iOS browser bugs. See bug descriptions inline below. * * @augments Widget */ class DatepickerNativeIos extends Widget { /** * @type {string} */ static get selector() { return ' .question input[type="date"], .question input[type="datetime-local"], .question input[type="time"]'; } /** * @param {Element} element - the element to instantiate the widget on * @return {boolean} to instantiate or not to instantiate, that is the question */ static condition(element) { // Do not instantiate if DatepickerExtended was instantiated on element or if non-iOS browser is used. return ( !data.has(element, 'DatepickerExtended') && !data.has(element, 'DatetimepickerExtended') && !data.has(element, 'TimepickerExtended') && os.ios ); } _init() { /* * Bug 1. * * This bug deals with readonly date, time, and datetime-local inputs on iOS browsers (e.g. Safari and Chrome). * See https://github.com/OpenClinica/enketo-express-oc/issues/219. * Once this bug is fixed in iOS, this code can be removed. * * Unfortunately, I don't think we can detect the presence of the bug itself to avoid * using the workaround automatically (after Apple fixes it). * * This is a very ugly solution, but the bug is fairly obscure, and the workaround is hopefully * just temporary. */ // console.log( 'Adding iOS readonly date/time/datetime picker workaround.' ); this.element.addEventListener('focus', () => { // prepare for future where readonly state is dynamic if (this.element.readOnly) { this.element.blur(); } }); } } export default DatepickerNativeIos;