ERP-node/frontend/types/unified-web-types.ts

196 lines
5.7 KiB
TypeScript
Raw Normal View History

/**
*
*
*
* 주의: .
*/
// 기본 웹 타입 (DB web_type_standards와 동기화)
export type BaseWebType =
| "text" // 일반 텍스트
| "number" // 숫자 (정수)
| "decimal" // 소수점 숫자
| "date" // 날짜
| "datetime" // 날짜시간
| "time" // 시간
| "textarea" // 여러줄 텍스트
| "select" // 선택박스
| "dropdown" // 드롭다운 (select와 동일)
| "checkbox" // 체크박스
| "radio" // 라디오버튼
| "boolean" // 불린값
| "file" // 파일 업로드
| "email" // 이메일
| "tel" // 전화번호
| "url" // URL
| "password" // 패스워드
| "code" // 공통코드 참조
| "entity" // 엔티티 참조
| "button"; // 버튼
// 레거시 지원용 (기존 시스템과의 호환성)
export type LegacyWebType = "text_area"; // textarea와 동일
// 전체 웹 타입 (DB 동적 로딩 지원)
export type WebType = BaseWebType | LegacyWebType;
// 동적 웹 타입 (런타임에 DB에서 로드되는 타입 포함)
export type DynamicWebType = WebType | string;
// 웹 타입 카테고리
export type WebTypeCategory =
| "input" // 입력 컴포넌트
| "selection" // 선택 컴포넌트
| "display" // 표시 컴포넌트
| "action" // 액션 컴포넌트
| "upload" // 업로드 컴포넌트
| "reference"; // 참조 컴포넌트
// 웹 타입 정보
export interface WebTypeInfo {
webType: WebType;
typeName: string;
typeNameEng?: string;
description?: string;
category: WebTypeCategory;
defaultConfig?: Record<string, any>;
validationRules?: Record<string, any>;
componentName?: string;
configPanel?: string;
isActive: boolean;
}
// 웹 타입 매핑 (레거시 지원)
export const WEB_TYPE_MAPPINGS: Record<LegacyWebType, BaseWebType> = {
text_area: "textarea",
};
// 웹 타입 정규화 함수
export const normalizeWebType = (webType: DynamicWebType): WebType => {
if (webType in WEB_TYPE_MAPPINGS) {
return WEB_TYPE_MAPPINGS[webType as LegacyWebType];
}
return webType as WebType;
};
// 웹 타입 검증 함수
export const isValidWebType = (webType: string): webType is WebType => {
return (
[
"text",
"number",
"decimal",
"date",
"datetime",
"time",
"textarea",
"select",
"dropdown",
"checkbox",
"radio",
"boolean",
"file",
"email",
"tel",
"url",
"password",
"code",
"entity",
"button",
"text_area", // 레거시 지원
] as string[]
).includes(webType);
};
// DB 타입과 웹 타입 매핑
export const DB_TYPE_TO_WEB_TYPE: Record<string, WebType> = {
// 텍스트 타입
"character varying": "text",
varchar: "text",
text: "textarea",
char: "text",
// 숫자 타입
integer: "number",
bigint: "number",
smallint: "number",
serial: "number",
bigserial: "number",
numeric: "decimal",
decimal: "decimal",
real: "decimal",
"double precision": "decimal",
// 날짜/시간 타입
date: "date",
timestamp: "datetime",
"timestamp with time zone": "datetime",
"timestamp without time zone": "datetime",
time: "time",
"time with time zone": "time",
"time without time zone": "time",
// 불린 타입
boolean: "boolean",
// JSON 타입 (텍스트로 처리)
json: "textarea",
jsonb: "textarea",
// 배열 타입 (텍스트로 처리)
ARRAY: "textarea",
// UUID 타입
uuid: "text",
};
// 웹 타입별 기본 설정
export const WEB_TYPE_DEFAULT_CONFIGS: Record<WebType, Record<string, any>> = {
text: { maxLength: 255, placeholder: "텍스트를 입력하세요" },
number: { min: 0, max: 2147483647, step: 1 },
decimal: { min: 0, step: 0.01, decimalPlaces: 2 },
date: { format: "YYYY-MM-DD" },
datetime: { format: "YYYY-MM-DD HH:mm:ss", showTime: true },
time: { format: "HH:mm:ss" },
textarea: { rows: 4, cols: 50, maxLength: 1000 },
select: { placeholder: "선택하세요", searchable: false },
dropdown: { placeholder: "선택하세요", searchable: true },
checkbox: { defaultChecked: false },
radio: { inline: false },
boolean: { trueValue: true, falseValue: false },
file: { multiple: false, preview: true },
email: { placeholder: "이메일을 입력하세요" },
tel: { placeholder: "전화번호를 입력하세요" },
url: { placeholder: "URL을 입력하세요" },
password: { placeholder: "비밀번호를 입력하세요" },
code: { placeholder: "코드를 선택하세요", searchable: true },
entity: { placeholder: "항목을 선택하세요", searchable: true },
button: { variant: "default" },
text_area: { rows: 4, cols: 50, maxLength: 1000 }, // 레거시 지원
};
// 웹 타입별 검증 규칙
export const WEB_TYPE_VALIDATION_RULES: Record<WebType, Record<string, any>> = {
text: { type: "string", trim: true },
number: { type: "number", integer: true },
decimal: { type: "number", float: true },
date: { type: "date", format: "YYYY-MM-DD" },
datetime: { type: "datetime" },
time: { type: "time" },
textarea: { type: "string", multiline: true },
select: { type: "string", options: true },
dropdown: { type: "string", options: true },
checkbox: { type: "boolean" },
radio: { type: "string", options: true },
boolean: { type: "boolean" },
file: { type: "file" },
email: { type: "email" },
tel: { type: "tel" },
url: { type: "url" },
password: { type: "string", password: true },
code: { type: "string", code: true },
entity: { type: "string", entity: true },
button: { type: "action" },
text_area: { type: "string", multiline: true }, // 레거시 지원
};