$f

EzFoundation 클래스

Methods

(static) checkDuplicateRows(ds, cols, duplTextString) → {boolean}

데이터 셋의 중복을 검사합니다.

Parameters:
NameTypeDescription
dsnexacro.Dataset

대상 데이터셋

colsstring

대상 컬럼 목록(,로 구분)

duplTextStringstring | CheckDuplicateRowsMessageFormatFunc

메시지 텍스트 혹은 함수

Returns:
Type: 
boolean
Example
// 기본 템플릿 사용 방식
$f.checkDuplicateRows(this.ds_main, "PK1,PK2", "메시지 텍스트");

// 커스텀 템플릿 방식
$f.checkDuplicateRows(
    this.ds_main,
    "PK1,PK2",
    (row1, row2) => `Lines ${row1} and ${row2} are duplicated.`,
);

(static) checkScdul(formObj, optionsopt) → {Promise.<CheckSchdResultCode>}

일정을 검사하여 관련한 처리를 수행합니다.

이 함수는 this를 form으로 간주합니다. 다른 스코프에서 실행 시 call을 통해서 this를 form으로 바인딩하여야 합니다.

Parameters:
NameTypeAttributesDefaultDescription
formObjnexacro.Form

넥사크로 폼 오브젝트

optionsCheckScdulOptions<optional>
{}

일정 검사 옵션

Returns:

일정 체크의 결과

Type: 
Promise.<CheckSchdResultCode>
Example
// 기본 처리
// 메뉴에 등록된 일정을 가지고 검사를 수행하며, 각 일정에 대하여 다음과 같이 동작합니다.
//
// 일정 범위 내:
// 메인 타이틀바의 모든 버튼을 활성화 합니다.
//
// 일정 범위 밖:
// 메인 타이틀바의 조회, 초기화 버튼을 제외한 버튼을 모두 비활성화 합니다.
$f.fn_checkScdul(this);

// 모든 인수
$f.checkScdul(this, {
    scdulCd: "ABC1234", // 일정 코드 (기본 값: 메뉴의 일정 코드)
    sno: this.div_search.form.sch_sno.value, // 학번
    enableDefaultAction: true, // 기본 컴포넌트 활성/비활성, 화면 종료 등의 액션을 사용합니다. false시 아무런 작업도 하지 않습니다.
    targetComponent: [
        this.getMainTitle().getButton("SEARCH"), // 대상 컴포넌트를 지정하면 set_enable 함수로 동작합니다.
        (b) => formObj.getMainTitle().set_useSaveButton(b), // 일정 여부를 인수로 갖는 함수입니다. 일정 여부에 따라 다른 옵션을 지정하는데 사용합니다.
    ], // 대상 컴포넌트 및 함수
    targetComponentOverride: false, // true로 설정 시 targetComponent를 기본 대상 컴포넌트로 덮어쓰며, false로 설정 시 병합합니다.
    isCloseOutOfScdul: false, // true로 설정 시 일정 검사 후 화면을 닫습니다.
});

// 리턴값 활용 예제
// 1. 일정 범위 내인 경우만 처리
const result = await $f.checkScdul(this);
if (result.scdulYn) {
    // 일정 범위 내 처리
    this.saveData();
}

// 2. 시작/종료 일시 활용
const result = await $f.checkScdul(this);
if (result.scdulYn) {
    this.div_info.form.sta_period.set_text(
        `${result.beginDtm} ~ ${result.endDtm}`,
    );
}

// 3. 메시지 직접 처리
const result = await $f.checkScdul(this, {
    enableDefaultAction: false,
});
if (!result.scdulYn) {
    await this.pop.warn(result.scdulMsg);
}

(static) decodeHex(hex) → {string}

16진수 문자열을 일반 문자열로 변환

Parameters:
NameTypeDescription
hexstring

변환할 16진수 문자열 (예: "48656c6c6f")

Returns:

디코딩된 문자열 (예: "Hello")

Type: 
string
Example
decodeHex("48656c6c6f"); // returns "Hello"

(static) filterRowsByCondition(dataset, condition, optionsopt) → {nexacro.Dataset|null}

인수로 받은 데이터셋에서 조건을 검사하여 통과한 행만 남김

Parameters:
NameTypeAttributesDescription
datasetnexacro.Dataset

대상 데이터셋

conditionRemoveRowsByCondtionFunc

검사 조건

optionsRemoveRowsByCondtionOptions<optional>
Returns:

행 삭제 한 데이터셋

Type: 
nexacro.Dataset | null
Example
$f.filterRowsByCondition(this.ds_main, (context) => {
    return context.row % 2;
});

(static) findAncestorComponent(comp, condition, options) → {nexacro.Component|null}

인수로 넘긴 컴포넌트의 조상 컴포넌트를 탐색하여 조건에 일치하는 컴포넌트를 찾아 반환합니다.

Parameters:
NameTypeDescription
compnexacro.Component

탐색 시작 컴포넌트

conditionfunction

조건 검사 함수

optionsFindAncestorComponentOptions

추가 옵션

Returns:

찾은 컴포넌트

Type: 
nexacro.Component | null
Example
$f.findAncestorComponent(this, (ptr) => ptr instanceof nexacro.Form);

(static) forEachDataset(dataset, callback) → {void}

제공된 데이터셋의 각 행을 순회하며 행 데이터로 콜백 함수를 실행합니다.

Parameters:
NameTypeDescription
datasetnexacro.NormalDataset

넥사크로 데이터셋

callbackForEachDatasetCallback

각 행마다 실행할 함수입니다. 데이터셋, 현재 행 인덱스, 현재 행의 데이터가 담긴 객체를 받습니다.

Returns:

이 메서드는 값을 반환하지 않습니다.

Type: 
void
Example
// Dataset의 각 행을 순회하며 name 컬럼의 값을 콘솔에 출력
$f.forEachDataset(this.ds_user, ({ rowData }) => {
    trace(rowData["NAME"]);
});

(static) generateUUIDv4() → {string}

Math.random 기반의 UUID 생성용

Returns:

UUID v4 형식의 36자리 문자열 (예: 110ec58a-a0f2-4ac4-8393-c866d813b8d1)

Type: 
string
Example
const uuid = generateUUIDv4();
console.log(uuid); // "110ec58a-a0f2-4ac4-8393-c866d813b8d1"

(static) getDormCmb(form) → {DormCmb}

생활관 전용 콤보입니다. 학사콤보를 상속합니다.

Parameters:
NameTypeDescription
formnexacro.Form

현재 폼 (this)

Returns:
Type: 
DormCmb
Example
// 기본 사용법
$f.getDormCmb(this).init({
    div: [this.div_search],
    grid: [this.grd_main],
});

// 특정 조직 필터링
$f.getDormCmb(this).init({
    div: this.div_search,
    orgFilter: (ctx) => ctx.rowData["UNIV_CD"] === "03130000",
});

// 콤보 모드 설정
$f.getDormCmb(this).init({
    div: this.div_search,
    orgMode: {
        // 조직 콤보 모드
        fclt: "a", // 대학/대학원: '전체' 표시
        univ: "s", // 대학: '선택' 표시
        dpmj: "n", // 학과: 빈값 없음
        majr: "n", // 전공: 빈값 없음
        detMajr: "n", // 세부전공: 빈값 없음
    },
    smrMode: "a", // 학기 콤보: '전체' 표시
});

// 문자열로 모든 모드 일괄 설정
$f.getDormCmb(this).init({
    div: this.div_search,
    orgMode: "a", // 모든 조직 콤보에 '전체' 표시
    smrMode: "a", // 학기 콤보: '전체' 표시
});

// 그리드 콤보 모드 설정
$f.getDormCmb(this).init({
    grid: this.grd_main,
    orgGridMode: {
        // 그리드 조직 콤보 모드
        fclt: "s", // 대학/대학원: '선택' 표시
        univ: "s", // 대학: '선택' 표시
        dpmj: "n", // 학과: 빈값 없음
    },
    smrGridMode: "s", // 그리드 학기 콤보: '선택' 표시
});

// 바인딩 컴포넌트 대상 변경
$f.getDormCmb(this).init({
    div: this.div_search,
    targtCompNm: {
        // 컴포넌트 명 재정의
        yyCompNm: /^spn_aplyYy$/,
        smrCompNm: /^cmb_aplySmr$/,
        fcltCompNm: /^cmb_fcltDvcd$/,
        univCompNm: /^cmb_testUnivCd$/,
        dpmjCompNm: /^cmb_hakgwaCd$/,
        majrCompNm: /^cmb_majrCd$/,
        detMajrCompNm: /^cmb_detMajrCd$/,

        // 그리드 컬럼 명 재정의
        smrColNm: ["SMR", "GRDU_SMR"],
        fcltGridColNm: "FCLT_DVCD",
        univColNm: "CUSTOM_1",
        dpmjColNm: "CUSTOM_2",
        majrColNm: "CUSTOM_3",
        detMajrColNm: "detMajrColNm",
    },
});

(static) getHCmb(form) → {HCmb}

학사 콤보 객체를 리턴합니다. 상세한 사용법은 학사 콤보(HCmb#init)를 참조하세요.

인수는 학사 콤보 옵션(hCmbOption)을 참고하세요

Parameters:
NameTypeDescription
formnexacro.Form

현재 폼 (this)

Returns:
Type: 
HCmb
Example
// 기본 사용법
$f.getHCmb(this).init({
    div: [this.div_search],
    grid: [this.grd_main],
});

// 특정 조직 필터링
$f.getHCmb(this).init({
    div: this.div_search,
    orgFilter: (ctx) => ctx.rowData["UNIV_CD"] === "03130000",
});

// 콤보 모드 설정
$f.getHCmb(this).init({
    div: this.div_search,
    orgMode: {
        // 조직 콤보 모드
        fclt: "a", // 대학/대학원: '전체' 표시
        univ: "s", // 대학: '선택' 표시
        dpmj: "n", // 학과: 빈값 없음
        majr: "n", // 전공: 빈값 없음
        detMajr: "n", // 세부전공: 빈값 없음
    },
    smrMode: "a", // 학기 콤보: '전체' 표시
});

// 문자열로 모든 모드 일괄 설정
$f.getHCmb(this).init({
    div: this.div_search,
    orgMode: "a", // 모든 조직 콤보에 '전체' 표시
    smrMode: "a", // 학기 콤보: '전체' 표시
});

// 그리드 콤보 모드 설정
$f.getHCmb(this).init({
    grid: this.grd_main,
    orgGridMode: {
        // 그리드 조직 콤보 모드
        fclt: "s", // 대학/대학원: '선택' 표시
        univ: "s", // 대학: '선택' 표시
        dpmj: "n", // 학과: 빈값 없음
    },
    smrGridMode: "s", // 그리드 학기 콤보: '선택' 표시
});

// 바인딩 컴포넌트 대상 변경
$f.getHCmb(this).init({
    div: this.div_search,
    targtCompNm: {
        // 컴포넌트 명 재정의
        yyCompNm: /^spn_aplyYy$/,
        smrCompNm: /^cmb_aplySmr$/,
        fcltCompNm: /^cmb_fcltDvcd$/,
        univCompNm: /^cmb_testUnivCd$/,
        dpmjCompNm: /^cmb_hakgwaCd$/,
        majrCompNm: /^cmb_majrCd$/,
        detMajrCompNm: /^cmb_detMajrCd$/,

        // 그리드 컬럼 명 재정의
        smrColNm: ["SMR", "GRDU_SMR"],
        fcltGridColNm: "FCLT_DVCD",
        univColNm: "CUSTOM_1",
        dpmjColNm: "CUSTOM_2",
        majrColNm: "CUSTOM_3",
        detMajrColNm: "detMajrColNm",
    },
});

// 관리학과 기준으로 데이터 조회
$f.getHCmb(this).init({
    div: this.div_search,
    useMngtDpmj: true, // 관리학과 기준으로 조직 데이터 조회
});

(static) getLinkedComboManager(optionsopt) → {LinkedComboManager}

연계 콤보 매니저 객체를 리턴합니다. 상세한 사용법은 연계 콤보 매니저(LinkedComboManager)를 참조하세요.

Parameters:
NameTypeAttributesDescription
optionsObject<optional>
  • 매니저 설정 옵션
Properties
NameTypeAttributesDescription
filterBuilderfunction<optional>
  • 사용자 정의 필터 문자열 생성 함수
Returns:

연계 콤보 매니저 인스턴스

Type: 
LinkedComboManager
Example
// 기본 사용법
const comboManager = $f.getLinkedComboManager();

(static) getRowTracer(dsArr, keys, autoEventLock) → {DatasetRowTracer|boolean}

넥사크로 데이터셋의 행 정보를 기억하고 해당 행을 다시 찾는 인스턴스를 반환합니다.

Parameters:
NameTypeDescription
dsArrnexacro.NormalDataset | Array.<nexacro.NormalDataset>

행 위치를 저장할 대상 데이터셋 또는 데이터셋 배열입니다.
ex)
$f.getRowTracer(this.ds_main); $f.getRowTracer([this.ds_main]); $f.getRowTracer([this.ds_main, this.ds_sub]);

keysArray.<string>

PK에 해당하는 컬럼 명 / 전달할 데이터셋이 여러개 일 경우, keys 배열을 2차원 배열로 작성해야 합니다. (데이터셋 개수와 내부 배열 개수는 일치해야 합니다.)

autoEventLockboolean

행 기억 / 선택 시, 자동으로 이벤트를 잠그는 기능의 활성화 여부를 결정합니다. (기본값 false)

Deprecated
  • `$f.initDatasetRowTracer`를 사용하세요.
Returns:

DatasetRowTracer 인스턴스

Type: 
DatasetRowTracer | boolean
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만 행을 찾고, 이벤트를 관리합니다.

(static) initRowTracer(form, configs) → {Array.<RowTracer>}

폼에 등록된 조회 함수를 행 추적 래퍼로 교체합니다.

초기화 후에는 기존 방식(this.fn_searchMain())으로 호출해도 행 추적 로직이 자동으로 적용됩니다. 조회 전 현재 행의 키 값을 기억하고, 조회 완료 후 동일한 행을 찾아 이동합니다. 부모 조회 중에는 자식 데이터셋의 이벤트를 차단하여 불필요한 연쇄 조회를 방지합니다.

Parameters:
NameTypeDescription
formnexacro.Form

현재 폼 (this)

configsArray.<RowTracerConfig>

추적기 설정 목록

Returns:
Type: 
Array.<RowTracer>
Example
// onload에서 1회 초기화 — 이후 fn_searchMain 호출 시 행 추적이 자동 적용됨
$f.initRowTracer(this, [
    {
        searchFn: "fn_searchMain",
        grid: this.grd_main,
        keys: ["SEQ", "SNO, NAME"],
        children: [
            {
                searchFn: "fn_searchSub",
                grid: this.grd_sub,
                keys: ["SEQ"],
            },
        ],
    },
]);

// 기존 호출 방식 그대로 사용
this.fn_searchMain();

(static) mapDatasetToArray(dataset, callback) → {Array}

제공된 데이터셋의 각 행을 순회하며 콜백의 반환값들을 담은 새로운 배열을 생성합니다.

Parameters:
NameTypeDescription
datasetnexacro.NormalDataset

넥사크로 데이터셋

callbackfunction

각 행마다 실행할 함수. (context) => any.

Returns:

콜백의 반환값으로 구성된 배열

Type: 
Array
Example
// 모든 사용자 ID를 배열로 추출
const userIds = $f.mapDatasetToArray(
    this.ds_user,
    ({ rowData }) => rowData["ID"],
);

(static) mkArg(args) → {string}

키, 값 오브젝트를 문자열 형식의 인수로 변환하는 함수

자동으로 매개변수의 값이 nullish 값일 경우 빈 문자열로 변경합니다.

Parameters:
NameTypeAttributesDescription
args.$divstring | Array.<string><optional>

Div 객체 내부의 컴포넌트 대상으로 변환 - 인수를 변환 변환한다. 컴포넌트는 해당하는 값을 가져온다.

argsObject

파라미터 구성을 위한 객체 (값으로 nexacro.Dataset 객체가 올 경우, 객체의 키와 매칭되는 컬럼의 현재 행(rowposition) 값을 가져옴)

Returns:

문자열 형식의 인수

Type: 
string
Example
const args = $f.mkArg({
    $div: this.div_search,
    LITERAL_STRING: "TEST",
    COMPONENT: this.div_search.form.cmb_combo,
    COLUMN_NAME: this.ds_list, // nexacro.Dataset (현재 rowposition에서 'COLUMN_NAME' 컬럼의 값을 가져옴)
});

(static) parseBool(value) → {boolean}

주어진 값이 특정 조건에 따라 참인지 판단합니다.

Parameters:
NameTypeDescription
value*

평가할 값. 모든 타입이 가능합니다.

Returns:
  • 다음 조건에서 true를 반환합니다: - Boolean true 값 - 숫자 0이 아닌 모든 숫자 - 문자열 "true" (대소문자 무관) 또는 "0"이 아닌 문자열 - 그 외의 경우 JavaScript의 truthiness 평가 결과를 반환
Type: 
boolean
Example
parseBool(true); // returns true
parseBool(false); // returns false

parseBool("true"); // returns true
parseBool("TRUE"); // returns true
parseBool("false"); // returns false

parseBool(1); // returns true
parseBool("1"); // returns true
parseBool(0); // returns false
parseBool("0"); // returns false

(static) prepareFileDelete(options) → {Promise.<function()>}

삭제할 데이터셋의 대상 파일 UUID를 찾습니다.

Parameters:
NameTypeDescription
optionsprepareFileDeleteOptions
Throws:
Error
Returns:

성공 시 파일 삭제 실행 함수 반환

Type: 
Promise.<function()>
Example
this.fn_cansave = function (obj, e) {
    this.delFuncPromise = $f.prepareFileDelete({
        dataset: this.ds_main,
        target: "CSB_ANNO_MATER",
        fileKeyFn: (c) => [c("YY"), c("SEQ"), "1"],
    });
    return $mpt.confirmSave(this.ds_main, this.validatorMain);
};

this.fn_save = async function () {
    try {
        await (
            await this.delFuncPromise
        )();
        await this.fn_saveMain();
    } catch (e) {
        this.pop.alert("저장 중 오류가 발생하였습니다.");
        return;
    }

    this.fn_search();
    return $mpt.alertSaved();
};

(static) removeRowsByCondition(dataset, condition, optionsopt) → {nexacro.Dataset|null}

인수로 받은 데이터셋에서 조건을 검사하여 행을 삭제

Parameters:
NameTypeAttributesDescription
datasetnexacro.Dataset

대상 데이터셋

conditionRemoveRowsByCondtionFunc

검사 조건

optionsRemoveRowsByCondtionOptions<optional>
Returns:

행 삭제 한 데이터셋

Type: 
nexacro.Dataset | null
Example
$f.removeRowsByCondition(this.ds_main, (context) => {
    return context.row % 2;
});

(static) replaceHaksaText(targetComp, optionsopt)

컴포넌트 내의 텍스트 중 "학년"을 "학기차"로, "대학"을 "대학원"으로 변경하는 함수입니다.

Parameters:
NameTypeAttributesDefaultDescription
targetCompnexacro.Div

텍스트를 변경할 대상 Div 컴포넌트

optionsObject<optional>
{}

옵션 객체

Properties
NameTypeAttributesDefaultDescription
forceboolean<optional>
false

true인 경우 업무코드와 관계없이 강제로 텍스트를 변경합니다

Example
// 기본 사용
$f.replaceHaksaText(this.div_main);

// 강제 변경
$f.replaceHaksaText(this.div_main, { force: true });

(static) revalidateAllRow(validator, options) → {boolean}

EzValidator의 데이터셋 유효성 검사를 초기화합니다. 모든 행에 대해 oncolumnchanged 이벤트를 발생시켜 유효성 검사를 다시 수행합니다.

Parameters:
NameTypeDescription
validatorObject

EzValidator 인스턴스

optionsRevalidateAllRowOptions
Returns:

초기화 성공 여부. validator가 없거나 dataset이 없으면 false를 반환합니다.

Type: 
boolean
Example
$f.revalidateAllRow(this.mainValidator);

// 수정된 행만 재검증
$f.revalidateAllRow(this.mainValidator, { onlyUpdateRow: true });

(static) setupBetterInputGrid(grid)

인수로 지정한 그리드에 입력 편의 기능을 추가합니다.

  • Enter: 다음 행으로 이동합니다.
  • Space: 현재 셀이 콤보 혹은 캘린더일 경우 이를 엽니다.
  • Left: 현재 셀의 변경사항을 데이터셋에 반영 후 쓰기 가능한 이전 셀로 포커스를 이동합니다.
  • Right: 현재 셀의 변경사항을 데이터셋에 반영 후 쓰기 가능한 다음 셀로 포커스를 이동합니다.
Parameters:
NameTypeDescription
gridnexacro.Grid

대상 그리드

Example
$f.setupBetterInputGrid(this.grd_main);

(static) setupGridMultiCellCopy(form, targetGrid) → {boolean}

인수로 넘긴 그리드를 멀티 셀 복사 가능하도록 변경합니다 다음 세 가지 프로퍼티를 덮어씁니다. selectchangetype,selectscrollmode, selecttype.

Parameters:
NameTypeDescription
formnexacro.Form

넥사크로 폼

targetGridnexacro.Grid

대상 그리드

Returns:

성공 시 true 반환

Type: 
boolean
Example
$f.setupGridMultiCellCopy(this, this.grd_main);

(static) sha256(message) → {string}

SHA256 해시를 하여 결과를 반환합니다.

Parameters:
NameTypeDescription
messagestring

Sha256으로 해시할 문자열

Returns:

해싱된 문자열

Type: 
string
Example
sha256("message");

(static) traverseComponentTreeWithCallback(comp, callback)

인수로 받은 컴포넌트의 하위 컴포넌트를 순회하며 callback 함수 호출 stopChildNodeTraversal() 함수를 호출 하면 해당 컴포넌트 하위 영역 순환을 중단함.

Parameters:
NameTypeDescription
compnexacro.Component
  • root 컴포넌트
callbackTraverseComponentTreeCallback
  • 실행할 콜백함수
Example
$f.traverseComponentTreeWithCallback(this.div_search, (comp, ctx) => {
    // 모든 컴포넌트의 readonly 속성을 true로 설정
    comp.readonly = true;

    // div_exclude라는 이름을 가진 컴포넌트를 만나면
    if (comp.name === "div_exclude") {
        // 해당 컴포넌트의 하위 컴포넌트 순회를 중단
        ctx.stopChildNodeTraversal();
    }
});

(static) txFile(form, option)

조회된 내용을 인코딩 euc-kr 파일로 생성

Parameters:
NameTypeDescription
formnexacro.Form

넥사크로 form.

optionTxFileOption

옵션

(static) validateEssentialComponents(rootComponent, optionsopt) → {boolean}

Parameters:
NameTypeAttributesDescription
rootComponentnexacro.Component | Array.<nexacro.Component>
optionsValidateEssentialComponentOptions<optional>
Returns:

유효성 검사 성공 여부

Type: 
boolean
Example
// div_search 컴포넌트의 자식 컴포넌트 중 cssclass가 essential인 컴포넌트의 value가 null일 경우 에러 메시지를 반환합니다.
$f.validateEssentialComponents(this.div_search);