utils_ezworks_validate-essential-components.js
/**
* @typedef ValidateEssentialComponentOptions
* @prototype {boolean} [stopOnFirstError=true]
* true 일 시 에러 발생 시 즉시 중단하고 메시지를 반환, false일 시 모든 에러를 종합 후 반환
* @prototype {boolean} [useAlert=true]
* true 일 시 오류에 대한 에러 메시지 반환
*/
import { traverseComponentTreeWithCallback } from "../ui/traverse-component-tree-with-callback";
import { isNull } from "../../adapters/ezworks/com-api/util";
import { nexaAlert } from "../../adapters/ezworks/nexa-alert";
/**
* @function validateEssentialComponents
* @param {nexacro.Component | nexacro.Component[]} rootComponent
* @param {ValidateEssentialComponentOptions} [options]
* @returns {boolean}
* 유효성 검사 성공 여부
* @memberof $f
* @example
* // div_search 컴포넌트의 자식 컴포넌트 중 cssclass가 essential인 컴포넌트의 value가 null일 경우 에러 메시지를 반환합니다.
* $f.validateEssentialComponents(this.div_search);
*
*/
export function validateEssentialComponents(rootComponent, options) {
const errorMessages = [];
const { stopOnFirstError = true, useAlert = true } = options || {};
if (!(rootComponent instanceof Array)) {
rootComponent = [rootComponent];
}
rootComponent.forEach((component) => {
traverseComponentTreeWithCallback(component, (comp, ctx) => {
if (!comp?.cssclass?.includes("essential")) {
return;
}
if (isNull(comp.value)) {
if (stopOnFirstError) {
errorMessages.push(findSilblingStatic(comp).text);
ctx.stopChildNodeTraversal();
}
}
});
});
if (errorMessages.length > 0 && useAlert) {
nexaAlert(`다음 항목은 필수 입력입니다.\n${errorMessages.join("\n")}`);
}
return errorMessages.length === 0;
}
/**
* 인수로 넘긴 컴포넌트와 동일한 명칭의 형제 Static 컴포넌트를 찾습니다.
*
* @param {nexacro.Component} comp
* 컴포넌트 객체
* @returns {nexacro.Component | undefined}
* 찾은 형제 컴포넌트
* @access private
*/
function findSilblingStatic(comp) {
const compId = comp.id;
const firstUnderbarIdx = compId.indexOf("_");
const staticName = `stt_${compId.substring(firstUnderbarIdx + 1)}`;
return comp.parent[staticName];
}