EzFoundation 클래스
- Source
Methods
(static) checkDuplicateRows(ds, cols, duplTextString) → {boolean}
데이터 셋의 중복을 검사합니다.
| Name | Type | Description |
|---|---|---|
ds | nexacro. | 대상 데이터셋 |
cols | string | 대상 컬럼 목록(,로 구분) |
duplTextString | string | | 메시지 텍스트 혹은 함수 |
- Type:
- boolean
// 기본 템플릿 사용 방식
$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으로 바인딩하여야 합니다.
| Name | Type | Attributes | Default | Description |
|---|---|---|---|---|
formObj | nexacro. | 넥사크로 폼 오브젝트 | ||
options | CheckScdulOptions | <optional> | {} | 일정 검사 옵션 |
일정 체크의 결과
- Type:
- Promise.<CheckSchdResultCode>
// 기본 처리
// 메뉴에 등록된 일정을 가지고 검사를 수행하며, 각 일정에 대하여 다음과 같이 동작합니다.
//
// 일정 범위 내:
// 메인 타이틀바의 모든 버튼을 활성화 합니다.
//
// 일정 범위 밖:
// 메인 타이틀바의 조회, 초기화 버튼을 제외한 버튼을 모두 비활성화 합니다.
$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진수 문자열을 일반 문자열로 변환
| Name | Type | Description |
|---|---|---|
hex | string | 변환할 16진수 문자열 (예: "48656c6c6f") |
- Source
디코딩된 문자열 (예: "Hello")
- Type:
- string
decodeHex("48656c6c6f"); // returns "Hello"(static) filterRowsByCondition(dataset, condition, optionsopt) → {nexacro.Dataset|null}
인수로 받은 데이터셋에서 조건을 검사하여 통과한 행만 남김
| Name | Type | Attributes | Description |
|---|---|---|---|
dataset | nexacro. | 대상 데이터셋 | |
condition | RemoveRowsByCondtionFunc | 검사 조건 | |
options | RemoveRowsByCondtionOptions | <optional> |
행 삭제 한 데이터셋
- Type:
- nexacro.
Dataset |null
$f.filterRowsByCondition(this.ds_main, (context) => {
return context.row % 2;
});(static) findAncestorComponent(comp, condition, options) → {nexacro.Component|null}
인수로 넘긴 컴포넌트의 조상 컴포넌트를 탐색하여 조건에 일치하는 컴포넌트를 찾아 반환합니다.
| Name | Type | Description |
|---|---|---|
comp | nexacro. | 탐색 시작 컴포넌트 |
condition | function | 조건 검사 함수 |
options | FindAncestorComponentOptions | 추가 옵션 |
찾은 컴포넌트
- Type:
- nexacro.
Component |null
$f.findAncestorComponent(this, (ptr) => ptr instanceof nexacro.Form);(static) forEachDataset(dataset, callback) → {void}
제공된 데이터셋의 각 행을 순회하며 행 데이터로 콜백 함수를 실행합니다.
| Name | Type | Description |
|---|---|---|
dataset | nexacro. | 넥사크로 데이터셋 |
callback | ForEachDatasetCallback | 각 행마다 실행할 함수입니다. 데이터셋, 현재 행 인덱스, 현재 행의 데이터가 담긴 객체를 받습니다. |
이 메서드는 값을 반환하지 않습니다.
- Type:
- void
// Dataset의 각 행을 순회하며 name 컬럼의 값을 콘솔에 출력
$f.forEachDataset(this.ds_user, ({ rowData }) => {
trace(rowData["NAME"]);
});(static) generateUUIDv4() → {string}
Math.random 기반의 UUID 생성용
UUID v4 형식의 36자리 문자열 (예: 110ec58a-a0f2-4ac4-8393-c866d813b8d1)
- Type:
- string
const uuid = generateUUIDv4();
console.log(uuid); // "110ec58a-a0f2-4ac4-8393-c866d813b8d1"(static) getDormCmb(form) → {DormCmb}
생활관 전용 콤보입니다. 학사콤보를 상속합니다.
| Name | Type | Description |
|---|---|---|
form | nexacro. | 현재 폼 (this) |
- Type:
- DormCmb
// 기본 사용법
$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)을 참고하세요
| Name | Type | Description |
|---|---|---|
form | nexacro. | 현재 폼 (this) |
- Type:
- HCmb
// 기본 사용법
$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)를 참조하세요.
| Name | Type | Attributes | Description | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
options | Object | <optional> |
Properties
|
연계 콤보 매니저 인스턴스
- Type:
- LinkedComboManager
// 기본 사용법
const comboManager = $f.getLinkedComboManager();(static) getRowTracer(dsArr, keys, autoEventLock) → {DatasetRowTracer|boolean}
넥사크로 데이터셋의 행 정보를 기억하고 해당 행을 다시 찾는 인스턴스를 반환합니다.
| Name | Type | Description |
|---|---|---|
dsArr | nexacro. | 행 위치를 저장할 대상 데이터셋 또는 데이터셋 배열입니다. |
keys | Array.<string> | PK에 해당하는 컬럼 명 / 전달할 데이터셋이 여러개 일 경우, keys 배열을 2차원 배열로 작성해야 합니다. (데이터셋 개수와 내부 배열 개수는 일치해야 합니다.) |
autoEventLock | boolean | 행 기억 / 선택 시, 자동으로 이벤트를 잠그는 기능의 활성화 여부를 결정합니다. (기본값 false) |
- Deprecated
- `$f.initDatasetRowTracer`를 사용하세요.
DatasetRowTracer 인스턴스
- Type:
- DatasetRowTracer |
boolean
// 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())으로 호출해도 행 추적 로직이 자동으로 적용됩니다. 조회 전 현재 행의 키 값을 기억하고, 조회 완료 후 동일한 행을 찾아 이동합니다. 부모 조회 중에는 자식 데이터셋의 이벤트를 차단하여 불필요한 연쇄 조회를 방지합니다.
| Name | Type | Description |
|---|---|---|
form | nexacro. | 현재 폼 (this) |
configs | Array.<RowTracerConfig> | 추적기 설정 목록 |
- Type:
- Array.<RowTracer>
// 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}
제공된 데이터셋의 각 행을 순회하며 콜백의 반환값들을 담은 새로운 배열을 생성합니다.
| Name | Type | Description |
|---|---|---|
dataset | nexacro. | 넥사크로 데이터셋 |
callback | function | 각 행마다 실행할 함수. (context) => any. |
콜백의 반환값으로 구성된 배열
- Type:
- Array
// 모든 사용자 ID를 배열로 추출
const userIds = $f.mapDatasetToArray(
this.ds_user,
({ rowData }) => rowData["ID"],
);(static) mkArg(args) → {string}
키, 값 오브젝트를 문자열 형식의 인수로 변환하는 함수
자동으로 매개변수의 값이 nullish 값일 경우 빈 문자열로 변경합니다.
| Name | Type | Attributes | Description |
|---|---|---|---|
args.$div | string | | <optional> | Div 객체 내부의 컴포넌트 대상으로 변환 - 인수를 변환 변환한다. 컴포넌트는 해당하는 값을 가져온다. |
args | Object | 파라미터 구성을 위한 객체 (값으로 nexacro.Dataset 객체가 올 경우, 객체의 키와 매칭되는 컬럼의 현재 행(rowposition) 값을 가져옴) |
- Source
문자열 형식의 인수
- Type:
- string
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}
주어진 값이 특정 조건에 따라 참인지 판단합니다.
| Name | Type | Description |
|---|---|---|
value | * | 평가할 값. 모든 타입이 가능합니다. |
- Source
- 다음 조건에서 true를 반환합니다: - Boolean true 값 - 숫자 0이 아닌 모든 숫자 - 문자열 "true" (대소문자 무관) 또는 "0"이 아닌 문자열 - 그 외의 경우 JavaScript의 truthiness 평가 결과를 반환
- Type:
- boolean
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를 찾습니다.
| Name | Type | Description |
|---|---|---|
options | prepareFileDeleteOptions |
성공 시 파일 삭제 실행 함수 반환
- Type:
- Promise.<function()>
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}
인수로 받은 데이터셋에서 조건을 검사하여 행을 삭제
| Name | Type | Attributes | Description |
|---|---|---|---|
dataset | nexacro. | 대상 데이터셋 | |
condition | RemoveRowsByCondtionFunc | 검사 조건 | |
options | RemoveRowsByCondtionOptions | <optional> |
행 삭제 한 데이터셋
- Type:
- nexacro.
Dataset |null
$f.removeRowsByCondition(this.ds_main, (context) => {
return context.row % 2;
});(static) replaceHaksaText(targetComp, optionsopt)
컴포넌트 내의 텍스트 중 "학년"을 "학기차"로, "대학"을 "대학원"으로 변경하는 함수입니다.
| Name | Type | Attributes | Default | Description | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
targetComp | nexacro. | 텍스트를 변경할 대상 Div 컴포넌트 | ||||||||||||
options | Object | <optional> | {} | 옵션 객체 Properties
|
// 기본 사용
$f.replaceHaksaText(this.div_main);
// 강제 변경
$f.replaceHaksaText(this.div_main, { force: true });(static) revalidateAllRow(validator, options) → {boolean}
EzValidator의 데이터셋 유효성 검사를 초기화합니다. 모든 행에 대해 oncolumnchanged 이벤트를 발생시켜 유효성 검사를 다시 수행합니다.
| Name | Type | Description |
|---|---|---|
validator | Object | EzValidator 인스턴스 |
options | RevalidateAllRowOptions |
초기화 성공 여부. validator가 없거나 dataset이 없으면 false를 반환합니다.
- Type:
- boolean
$f.revalidateAllRow(this.mainValidator);
// 수정된 행만 재검증
$f.revalidateAllRow(this.mainValidator, { onlyUpdateRow: true });(static) setupBetterInputGrid(grid)
인수로 지정한 그리드에 입력 편의 기능을 추가합니다.
- Enter: 다음 행으로 이동합니다.
- Space: 현재 셀이 콤보 혹은 캘린더일 경우 이를 엽니다.
- Left: 현재 셀의 변경사항을 데이터셋에 반영 후 쓰기 가능한 이전 셀로 포커스를 이동합니다.
- Right: 현재 셀의 변경사항을 데이터셋에 반영 후 쓰기 가능한 다음 셀로 포커스를 이동합니다.
| Name | Type | Description |
|---|---|---|
grid | nexacro. | 대상 그리드 |
$f.setupBetterInputGrid(this.grd_main);(static) setupGridMultiCellCopy(form, targetGrid) → {boolean}
인수로 넘긴 그리드를 멀티 셀 복사 가능하도록 변경합니다 다음 세 가지 프로퍼티를 덮어씁니다. selectchangetype,selectscrollmode, selecttype.
| Name | Type | Description |
|---|---|---|
form | nexacro. | 넥사크로 폼 |
targetGrid | nexacro. | 대상 그리드 |
성공 시 true 반환
- Type:
- boolean
$f.setupGridMultiCellCopy(this, this.grd_main);(static) sha256(message) → {string}
SHA256 해시를 하여 결과를 반환합니다.
| Name | Type | Description |
|---|---|---|
message | string | Sha256으로 해시할 문자열 |
- Source
해싱된 문자열
- Type:
- string
sha256("message");(static) traverseComponentTreeWithCallback(comp, callback)
인수로 받은 컴포넌트의 하위 컴포넌트를 순회하며 callback 함수 호출 stopChildNodeTraversal() 함수를 호출 하면 해당 컴포넌트 하위 영역 순환을 중단함.
| Name | Type | Description |
|---|---|---|
comp | nexacro. |
|
callback | TraverseComponentTreeCallback |
|
$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 파일로 생성
| Name | Type | Description |
|---|---|---|
form | nexacro. | 넥사크로 form. |
option | TxFileOption | 옵션 |
- Source
(static) validateEssentialComponents(rootComponent, optionsopt) → {boolean}
| Name | Type | Attributes | Description |
|---|---|---|---|
rootComponent | nexacro. | ||
options | ValidateEssentialComponentOptions | <optional> |
유효성 검사 성공 여부
- Type:
- boolean
// div_search 컴포넌트의 자식 컴포넌트 중 cssclass가 essential인 컴포넌트의 value가 null일 경우 에러 메시지를 반환합니다.
$f.validateEssentialComponents(this.div_search);