utils_dataset_dataset-row-tracer.js

import { nexaAlert } from "../../adapters/ezworks/nexa-alert";
/**
 * 넥사크로 데이터셋의 행의 정보를 기억하고 해당 행을 다시 찾는 객체입니다.
 *
 * @class
 * @param {nexacro.NormalDataset | nexacro.NormalDataset[]} dsArr
 * 행 위치를 저장할 대상
 * 데이터셋 또는 데이터셋 배열입니다. <br>ex) <br>$f.getRowTracer(this.ds_main);
 * $f.getRowTracer([this.ds_main]); $f.getRowTracer([this.ds_main,
 * this.ds_sub]);
 * @param {string[]} keys
 * PK에 해당하는 컬럼 명 / 전달할 데이터셋이 여러개 일 경우, keys 배열을 2차원 배열로
 * 작성해야 합니다. (데이터셋 개수와 내부 배열 개수는 일치해야 합니다.)
 * @param {boolean} autoEventLock
 * 행 기억 / 선택 시, 자동으로 이벤트를 잠그는 기능의 활성화 여부를 결정합니다.
 * (기본값 false)
 * @returns {DatasetRowTracer | boolean}
 * DatasetRowTracer 인스턴스
 * @deprecated
 */
export function DatasetRowTracer(dsArr, keys, autoEventLock) {
    this.name = "DatasetRowMemory Renewal 객체";
    this.dsArr = dsArr;
    this.dsSeq = 0;
    this.dsIdxParam = -1;
    let msg = "";

    // if (form.id != "form") {
    //     msg =
    //         typeof form === "string"
    //             ? `전달된 인자는 문자열입니다. :: ${form} `
    //             : `전달된 인스턴스 :: ${form}`;
    //     alert(
    //         `[DatasetRowTracer] argument type error\n해당 객체의 3번째 인자는 form을 전달해야 합니다.\n${msg}`,
    //     );
    //     return false;
    // }

    if (!(dsArr instanceof Array)) {
        this.dsArr = [dsArr];
    } else if (this.dsArr.some((ds) => Array.isArray(ds))) {
        // form.pop.alert(
        //     "[DatasetRowMemory Error]\n데이터셋 매개변수는 2차원 배열 이상 지원되지 않습니다.\n단일 데이터셋이나, 1차원 배열만 허용됩니다.",
        // );
        nexaAlert(
            "[DatasetRowMemory Error]\n데이터셋 매개변수는 2차원 배열 이상 지원되지 않습니다.\n단일 데이터셋이나, 1차원 배열만 허용됩니다.",
        );
        return false;
    }

    if (keys instanceof Array) {
        const string = 1,
            array = 2,
            err = 4;
        let type = 0;

        keys.forEach((v) => {
            if (v instanceof Array) {
                type |= array;
            } else if (typeof v === "string") {
                type |= string;
            } else {
                type |= err;
            }
        });
        if (type === string) {
            this.keys = [keys];
        } else if (type === array) {
            this.keys = keys;
        } else {
            throw Error(
                "keys 매개변수는 string, string의 1차원, 2차원 배열만 허용합니다.",
            );
        }
    } else {
        this.keys = [[keys]];
    }

    this._cols = [];
    this._autoEventLock = autoEventLock || false;
}

/**
 * 현재 인스턴스의 데이터셋의 행을 기억합니다.
 *
 * @param {number} dsIdxParam  데이터셋이 배열이지만, 특정 데이터셋만 행 정보를 저장하고자 할 때, 배열의 인덱스를
 *                             전달합니다.<br>※autoEventLock이
 *                             true일 경우, save() 호출 시, 매개변수를 전달하거나, 인스턴스 생성시 배열
 *                             길이만큼 select()를 호출 해야 이벤트가 정상적으로 켜집니다.
 */
DatasetRowTracer.prototype.save = function (dsIdxParam) {
    var row = this.dsArr.map((ds) => ds.rowposition);
    let tempObj = {};
    this.dsIdxParam = typeof dsIdxParam === "undefined" ? -1 : dsIdxParam;

    for (let i = 0; i < this.dsArr.length; i++) {
        this.keys[i].forEach((key) => {
            tempObj[key] = this.dsArr[i].getColumn(row[i], key);
        });
        this._cols.push(tempObj);
        tempObj = {};
        if (this._autoEventLock && this.dsIdxParam == -1) {
            this.dsArr[i].enableevent = false;
        }
    }

    if (this._autoEventLock && this.dsIdxParam != -1) {
        this.dsArr[this.dsIdxParam].enableevent = false;
    }
};

/**
 * 인스턴스가 저장하고 있는 행 인덱스를 스칼라 값 또는 배열로 반환합니다.
 *
 * @returns {number[]}
 */
DatasetRowTracer.prototype.find = function () {
    let result = [];
    for (let i = 0; i < this.dsArr.length; i++) {
        let expr = this.keys[i]
            .map((key) => key + "=='" + this._cols[i][key] + "'")
            .join("&&");
        let fRow = this.dsArr[i].findRowExpr(expr);

        if (result.length === i) {
            if (fRow !== -1) {
                result.push(fRow);
            }
        } else {
            break;
        }
    }
    return result;
};

/**
 * 인스턴스에 저장된 행을 찾아서 선택합니다.
 *
 * @returns {number[]}
 */
DatasetRowTracer.prototype.select = async function () {
    let findRow = this.find();
    let arrIdx = this.dsIdxParam == -1 ? this.dsSeq : this.dsIdxParam;

    //선택된 행이 0번일때, 조회 후 select되면 이벤트가 발생하지 않는 문제 수정
    this.dsArr[arrIdx].rowposition = -1;

    if (this._autoEventLock) {
        if (this.dsIdxParam != -1) {
            this.dsArr[this.dsIdxParam].enableevent = true;
        } else if (this.dsArr.length - 1 == this.dsSeq) {
            this.dsArr.forEach((v) => {
                v.enableevent = true;
            });
        }
    }
    this.dsArr[arrIdx].rowposition = findRow[arrIdx];
    this.dsSeq += 1;
    return findRow;
};

/**
 * 넥사크로 데이터셋의 행 정보를 기억하고 해당 행을 다시 찾는 인스턴스를 반환합니다.
 *
 * @deprecated `$f.initDatasetRowTracer`를 사용하세요.
 * @function getRowTracer
 * @param {nexacro.NormalDataset | nexacro.NormalDataset[]} dsArr
 * 행 위치를 저장할
 * 대상 데이터셋 또는 데이터셋 배열입니다. <br>ex) <br>$f.getRowTracer(this.ds_main);
 * $f.getRowTracer([this.ds_main]); $f.getRowTracer([this.ds_main,
 * this.ds_sub]);
 * @param {string[]} keys
 * PK에 해당하는 컬럼 명 / 전달할 데이터셋이 여러개 일 경우, keys 배열을 2차원
 * 배열로 작성해야 합니다. (데이터셋 개수와 내부 배열 개수는 일치해야 합니다.)
 * @param {boolean} autoEventLock
 * 행 기억 / 선택 시, 자동으로 이벤트를 잠그는 기능의 활성화 여부를
 * 결정합니다. (기본값 false)
 * @returns {DatasetRowTracer | boolean}
 * DatasetRowTracer 인스턴스
 * @memberof $f
 * @example
 * // DatasetRowTracer 인스턴스 생성 예제
 * let rowTracer = $f.getRowTracer(
 *     [this.ds_main, this.ds_sub],
 *     [
 *         ["YY", "SMR", "UNIV_CD"],
 *         ["YY", "SMR", "USER_ID"],
 *     ],
 *     true,
 * );
 * rowTracer.save(); //save에는 데이터셋 배열의 인덱스를 전달하여 특정 데이터셋의 행 정보만 저장할 수 있습니다.
 *
 * await this.fn_searchListM();
 * rowTracer.select(); //save()에 인자를 전달하지 않았다면, 데이터셋 배열 개수만큼 select()를 호출해야합니다.
 *
 * await this.fn_searchListD();
 * rowTracer.select(); //save()에 매개변수를 생략했을 경우, 전달된 데이터셋 배열 개수와 select() 호출 수가 같을 때 이벤트가  일괄적으로 켜집니다.
 *
 * // 인스턴스 생성 시 데이터셋이 배열이지만, 하나의 데이터셋 행만 찾아가야 한다면,
 * // 인스턴스 생성 시 코드(배열)를 수정할 필요 없이 save()시 배열의 인덱스를 매개변수로 전달하면 됩니다.
 * // ex) rowTracer.save(0); 해당 배열의 0번 -> this.ds_main만 행을 찾고, 이벤트를 관리합니다.
 *
 */
export function getRowTracer(dsArr, keys, autoEventLock) {
    return new DatasetRowTracer(dsArr, keys, autoEventLock);
}