enketo-core
Version:
Extensible Enketo form engine
65 lines (56 loc) • 2.26 kB
JavaScript
import Widget from '../../js/widget';
import events from '../../js/event';
/**
* Clone text input fields value into new print-only element.
* This is an unusual way to implement a feature, because it is not an actual widget,
* but this is the easiest way to do it.
*/
class TextPrintWidget extends Widget {
/**
* @type {string}
*/
static get selector() {
// The [data-for] exclusion prevents "comment" widgets from being included.
// It is not quite correct to do this but atm the "for" attribute in XForms is only used for comment widgets.
return '.question:not(.or-appearance-autocomplete):not(.or-appearance-url) > input[type=text]:not(.ignore):not([data-for]), .question:not(.or-appearance-autocomplete):not(.or-appearance-url) > textarea:not(.ignore):not([data-for])';
}
_init() {
this.question.addEventListener(
events.Printify().type,
this._addWidget.bind(this)
);
this.question.addEventListener(
events.DePrintify().type,
this._removeWidget.bind(this)
);
}
_addWidget() {
if (!this.widget) {
const className = 'print-input-text';
const printElement = document.createElement('div');
printElement.classList.add(className, 'widget');
this.element.after(printElement);
this.element.classList.add('print-hide');
// If previous element is a fake input in date widget, hide it as well
const previousElement = this.element.previousElementSibling;
if (
previousElement !== null &&
previousElement.classList.contains('date')
) {
previousElement.classList.add('print-hide');
}
this.widget = this.element.parentElement.querySelector(
`.${className}`
);
this.widget.innerHTML = this.element.value.replace(/\n/g, '<br>');
}
}
_removeWidget() {
if (this.widget) {
this.element.classList.remove('print-hide');
this.element.parentElement.removeChild(this.widget);
this.widget = null;
}
}
}
export default TextPrintWidget;