Files
frontend/apps/as/src/pages/code-management/lib/configs/acntg-config.ts
T

100 lines
3.3 KiB
TypeScript

import {
ACNTG_SE_SAVE_MODE,
type AcntgSeMngResponseDto,
type AcntgSeMngSaveRequestDto,
} from "@/entities/acntg";
import type { AcntgSeDraft, AcntgSeGridState } from "../../model/acntg/acntg-se-grid-types";
import type { AcntgSeRow } from "../../model/acntg/acntg-se-row-types";
import { buildAcntgDisplayRows } from "../../model/acntg/build-acntg-display-rows";
import { createSavePayloadBuilder } from "../build-save-payload";
import type { SeGridConfig } from "../grid-types";
const buildSavePayload = createSavePayloadBuilder<AcntgSeRow, AcntgSeMngSaveRequestDto>({
saveModes: ACNTG_SE_SAVE_MODE,
toDeleteDto: (row) => ({
mode: ACNTG_SE_SAVE_MODE.DELETE,
acntgSeCd: row.acntgSeCd,
acntgSeCdNm: row.acntgSeCdNm?.trim() || "",
upAcntgSeCd: row.upAcntgSeCd,
cdLvNo: row.cdLvNo,
useYn: row.useYn,
expln: row.expln?.trim() || undefined,
sortSeq: row.sortSeq,
}),
toCreateDto: (row) => ({
mode: ACNTG_SE_SAVE_MODE.CREATE,
acntgSeCd: row.acntgSeCd.trim(),
acntgSeCdNm: row.acntgSeCdNm.trim(),
upAcntgSeCd: row.upAcntgSeCd,
cdLvNo: row.cdLvNo,
useYn: row.useYn,
expln: row.expln?.trim() || undefined,
sortSeq: row.sortSeq,
}),
toUpdateDto: (row) => ({
mode: ACNTG_SE_SAVE_MODE.UPDATE,
acntgSeCd: row.acntgSeCd.trim(),
acntgSeCdNm: row.acntgSeCdNm.trim(),
upAcntgSeCd: row.upAcntgSeCd,
cdLvNo: row.cdLvNo,
useYn: row.useYn,
expln: row.expln?.trim() || undefined,
sortSeq: row.sortSeq,
}),
});
export const acntgGridConfig: SeGridConfig<
AcntgSeMngResponseDto,
AcntgSeGridState["baseByKey"][string],
AcntgSeRow,
AcntgSeDraft,
Partial<AcntgSeMngResponseDto>,
AcntgSeMngSaveRequestDto
> = {
getCode: (item) => item.acntgSeCd,
getName: (item) => item.acntgSeCdNm,
getParentCode: (item) => item.upAcntgSeCd,
createEmptyDraft: ({ rowKey, parentRowKey, cdLvNo }) => ({
rowKey,
parentRowKey,
cdLvNo,
acntgSeCd: "",
acntgSeCdNm: "",
expln: "",
useYn: "Y",
}),
applyDraftPatch: (draft, patch) => ({
...draft,
...(patch.acntgSeCd !== undefined ? { acntgSeCd: patch.acntgSeCd } : {}),
...(patch.acntgSeCdNm !== undefined ? { acntgSeCdNm: patch.acntgSeCdNm ?? "" } : {}),
...(patch.expln !== undefined ? { expln: patch.expln ?? "" } : {}),
...(patch.useYn !== undefined ? { useYn: patch.useYn } : {}),
...(patch.sortSeq !== undefined ? { sortSeq: patch.sortSeq } : {}),
}),
assembleDraftRow: (draft, parentCode) => ({
rowKey: draft.rowKey,
acntgSeCd: draft.acntgSeCd,
acntgSeCdNm: draft.acntgSeCdNm,
expln: draft.expln,
useYn: draft.useYn,
cdLvNo: draft.cdLvNo,
upAcntgSeCd: parentCode,
sortSeq: draft.sortSeq,
isNew: true,
isDirty: true,
isDeleted: false,
}),
buildDisplayRows: buildAcntgDisplayRows,
validateRow: (row) => {
if (!row.acntgSeCd.trim()) return "코드를 입력하세요.";
if (!row.acntgSeCdNm?.trim()) return "코드명을 입력하세요.";
const parentCd = row.upAcntgSeCd?.trim();
if (parentCd && row.acntgSeCd.trim() === parentCd) {
return "상위 코드와 동일한 코드는 사용할 수 없습니다.";
}
return null;
},
buildSavePayload,
};