100 lines
3.3 KiB
TypeScript
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,
|
|
};
|