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];
}