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