ui-framework-jps
Version:
A simple UI framework for state management and UI components
120 lines • 6.21 kB
JavaScript
import { FieldType } from "../../../model/DataObjectTypeDefs";
import browserUtil from "../../../util/BrowserUtil";
import debug from 'debug';
import { UIFieldType } from "../../../CommonTypes";
const logger = debug('validation-event-handler');
export class ValidationEventHandler {
constructor(view, fieldConfig, listeners, subElements = null) {
this.view = view;
this.formId = view.getId();
this.fieldConfig = fieldConfig;
this.listeners = listeners;
this.subElements = subElements;
this.handleEvent = this.handleEvent.bind(this);
}
setValidationStatusAndMessage(fieldElement, isValid, value, message = undefined, resetOnFailure = false) {
logger(`Handling validation for field ${this.fieldConfig.field.id}: ${isValid} with message ${message}`);
logger(this.fieldConfig);
if (this.fieldConfig.validator && fieldElement) {
logger(`Handling validation for field ${this.fieldConfig.field.id}: ${isValid} with message ${message} - have validator and element`);
const field = this.fieldConfig.field;
let validationElementTarget = fieldElement; // we are providing user feedback on the field element, unless...
if (this.subElements) { // sub elements change the validation target
this.fieldConfig.validator.validator.setSubElements(this.subElements);
if (this.fieldConfig.subElement) { // should be targeting the parent element
let parentEl = fieldElement.parentElement;
if (parentEl) {
validationElementTarget = parentEl;
if (this.fieldConfig.subElement.container) { // another layer up required
parentEl = parentEl.parentElement;
if (parentEl) {
validationElementTarget = parentEl;
}
}
}
}
}
// let divId = `${this.view.getDataObjectDefinition().id}.field.${this.fieldConfig.field.id}.error`
let divId = `${this.formId}.field.${this.fieldConfig.field.id}.error`;
logger(`Handling validation for field ${this.fieldConfig.field.id}: ${isValid} with message ${message} - div is ${divId}`);
const errorMessageDiv = document.getElementById(divId);
const errorMessageEl = document.getElementById(`${divId}.message`);
// clear any previous message
errorMessageDiv === null || errorMessageDiv === void 0 ? void 0 : errorMessageDiv.setAttribute('style', 'display:none');
if (errorMessageEl)
errorMessageEl.innerHTML = '';
if (this.fieldConfig.validator.invalidClasses)
browserUtil.removeClasses(validationElementTarget, this.fieldConfig.validator.invalidClasses);
if (this.fieldConfig.validator.validClasses)
browserUtil.addClasses(validationElementTarget, this.fieldConfig.validator.validClasses);
if (!isValid) {
if (this.fieldConfig.validator.invalidClasses)
browserUtil.addClasses(validationElementTarget, this.fieldConfig.validator.invalidClasses);
if (this.fieldConfig.validator.validClasses)
browserUtil.removeClasses(validationElementTarget, this.fieldConfig.validator.validClasses);
if (!message) {
message = `${field.displayName} does not have a valid value.`;
}
// show the error message
errorMessageDiv === null || errorMessageDiv === void 0 ? void 0 : errorMessageDiv.setAttribute('style', 'display:block');
if (errorMessageEl)
errorMessageEl.innerHTML = message;
if (resetOnFailure) {
switch (field.type) {
case (FieldType.boolean): {
// @ts-ignore
fieldElement.checked = false;
break;
}
case (FieldType.integer): {
// @ts-ignore
fieldElement.value = '0';
break;
}
case (FieldType.float): {
// @ts-ignore
fieldElement.value = '0.0';
break;
}
default: {
// @ts-ignore
fieldElement.value = '';
break;
}
}
}
// @ts-ignore
this.listeners.forEach((listener) => listener.failedValidation(this.formId, field, value, message));
}
}
}
processValidation(fieldElement) {
if (this.fieldConfig.validator && fieldElement) {
const field = this.fieldConfig.field;
// @ts-ignore
let value = fieldElement.value;
// checkboxes store values differently
if (this.fieldConfig.elementType === UIFieldType.checkbox) { // @ts-ignore
value = '' + fieldElement.checked;
}
if (this.subElements) {
value = '';
this.subElements.forEach((subElement) => {
if (subElement.checked) {
value = subElement.value;
}
});
}
const validationResp = this.fieldConfig.validator.validator.isValidValue(field, value);
this.setValidationStatusAndMessage(fieldElement, validationResp.isValid, value, validationResp.message, validationResp.resetOnFailure);
}
}
handleEvent(event) {
event.preventDefault();
event.stopPropagation();
// @ts-ignore
const fieldElement = event.target;
this.processValidation(fieldElement);
}
}
//# sourceMappingURL=ValidationEventHandler.js.map