feat(WEB): DynamicItemForm 필드 타입 확장 및 컴포넌트 레지스트리 추가

- DynamicFieldRenderer에 신규 필드 타입 추가 (Currency, File, MultiSelect, Radio, Reference, Toggle, UnitValue, Computed)
- DynamicTableSection 및 TableCellRenderer 추가
- 필드 프리셋 및 설정 구조 분리
- 컴포넌트 레지스트리 개발 도구 페이지 추가
- UniversalListPage 개선
- 근태관리 코드 정리
- 즐겨찾기 기능 및 동적 필드 타입 백엔드 스펙 문서 추가

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
유병철
2026-02-12 11:17:57 +09:00
parent 4decb99856
commit 020d74f36c
39 changed files with 12368 additions and 116 deletions

View File

@@ -200,6 +200,27 @@ export interface LinkSectionRequest {
// 필드 관리
// ============================================
/**
* 필드 타입 정의
* 기본 6종 + 확장 8종 = 14종
* 2026-02-11: 동적 필드 타입 확장 (Phase 1~3)
*/
export type ItemFieldType =
// 기본 타입 (기존)
| 'textbox' | 'number' | 'dropdown' | 'checkbox' | 'date' | 'textarea'
// Phase 1: 핵심 타입
| 'reference' | 'multi-select' | 'file'
// Phase 2: 편의 타입
| 'currency' | 'unit-value' | 'radio'
// Phase 3: 고급 타입
| 'toggle' | 'computed';
/**
* 섹션 타입 정의
* 2026-02-11: 'table' 타입 추가 (범용 테이블 섹션)
*/
export type ItemSectionType = 'fields' | 'bom' | 'table';
/**
* 필드 생성/수정 요청
* POST /v1/item-master/sections/{sectionId}/fields
@@ -208,7 +229,7 @@ export interface LinkSectionRequest {
export interface ItemFieldRequest {
field_name: string;
field_key?: string | null; // 2025-11-28: 필드 키 (영문, 숫자, 언더스코어만 허용, 영문으로 시작)
field_type: 'textbox' | 'number' | 'dropdown' | 'checkbox' | 'date' | 'textarea';
field_type: ItemFieldType;
section_id?: number | null;
master_field_id?: number | null;
order_no?: number;
@@ -235,7 +256,7 @@ export interface ItemFieldResponse {
master_field_id?: number | null; // 마스터 항목 ID (마스터에서 가져온 경우)
field_name: string;
field_key: string | null; // 2025-11-28: 필드 키 (형식: {ID}_{사용자입력})
field_type: 'textbox' | 'number' | 'dropdown' | 'checkbox' | 'date' | 'textarea';
field_type: ItemFieldType;
order_no: number;
is_required: boolean;
placeholder: string | null;
@@ -280,7 +301,7 @@ export interface IndependentFieldRequest {
group_id?: number;
field_name: string;
field_key?: string; // 2025-11-28: 필드 키 (영문, 숫자, 언더스코어만 허용, 영문으로 시작)
field_type: 'textbox' | 'number' | 'dropdown' | 'checkbox' | 'date' | 'textarea';
field_type: ItemFieldType;
is_required?: boolean;
default_value?: string;
placeholder?: string;
@@ -524,7 +545,7 @@ export interface SectionTemplateResponse {
*/
export interface MasterFieldRequest {
field_name: string;
field_type: 'textbox' | 'number' | 'dropdown' | 'checkbox' | 'date' | 'textarea';
field_type: ItemFieldType;
category?: string;
description?: string;
is_common?: boolean;
@@ -544,7 +565,7 @@ export interface MasterFieldResponse {
tenant_id: number;
field_name: string;
field_key: string | null; // 2025-11-28: 필드 키 추가 (형식: {ID}_{사용자입력})
field_type: 'textbox' | 'number' | 'dropdown' | 'checkbox' | 'date' | 'textarea';
field_type: ItemFieldType;
category: string | null;
description: string | null;
is_common: boolean;

View File

@@ -3,6 +3,8 @@
* ItemMasterContext에서 분리됨 (2026-01-06)
*/
import type { ItemFieldType } from './item-master-api';
// ===== 기본 타입 =====
// 전개도 상세 정보
@@ -244,7 +246,7 @@ export interface ItemMasterField {
tenant_id: number;
field_name: string;
field_key?: string | null; // 2025-11-28: field_key 추가 (형식: {ID}_{사용자입력})
field_type: 'textbox' | 'number' | 'dropdown' | 'checkbox' | 'date' | 'textarea'; // API와 동일
field_type: ItemFieldType; // API와 동일
category: string | null;
description: string | null;
is_common: boolean; // 공통 필드 여부
@@ -280,7 +282,7 @@ export interface ItemField {
master_field_id?: number | null; // 마스터 항목 ID (마스터에서 가져온 경우)
field_name: string; // 항목명 (name → field_name)
field_key?: string | null; // 2025-11-28: 필드 키 (형식: {ID}_{사용자입력}, 백엔드에서 생성)
field_type: 'textbox' | 'number' | 'dropdown' | 'checkbox' | 'date' | 'textarea'; // 필드 타입
field_type: ItemFieldType; // 필드 타입
order_no: number; // 항목 순서 (order → order_no, required)
is_required: boolean; // 필수 여부
placeholder?: string | null; // 플레이스홀더