5f945363b2
V2DateConfigPanel(262줄) + V2Date 본체(1046줄) + V2DateConfig 타입 + lib/registry/components/v2-date/ + DynamicComponentRenderer 의 LEGACY alias 모두 삭제. 솔루션 정의 단계 정확한 1안. 데이터 모델 - FieldType / InputFieldType union 에 time, daterange 2종 추가하여 12종 확장 - canonical 키: dateFormat / minDate / maxDate / showToday / weekStart / dateDefault / rangePresets / maxRangeDays - 옛 v2-date 의 snake_case (min_date / max_date / show_today) 와 dateType / type / range / format 키 충돌 종결 런타임 (InputComponent + pickers.tsx) - V2Date 본체에 있던 SingleDatePicker / DateTimePicker / TimePicker / RangeDatePicker 4 picker 를 input/pickers.tsx 로 통합 - InputComponent 의 case "date"/"datetime" 의 native input 분기를 datepicker 로 교체하고 case "time"/"daterange" 신규 추가 - type 결정 로직에 inputType prop 인식 (DB input_type 매핑) → date/time 입력이 text 로 fallback 되던 silent breakage 해결 FC 계층 - FieldRenderer / CellRenderer / FcSearch 에 time / daterange 분기 추가 - TimeField, DateRangeField 신규 컴포넌트 - adapters.normalizeType allowed 배열 확장 ConfigPanel - InvFieldConfigPanel.DateOptions 에 showToday CPRow + CPSwitch 신규 - 옛 호환 코드 (showSeconds:ss 보정 / dateType-format 격상 등) 모두 제거 - InvInputConfigPanel.TYPE_OPTIONS / 날짜 옵션 분기에 time/daterange 추가 dead code 삭제 14곳 + 잔존 정리 - V2Date / V2DateConfigPanel / V2DateConfig / lib/registry/v2-date/ 폴더 - LEGACY_TO_UNIFIED / CONFIG_PANEL_MAP / CONFIG_PANEL_ALIAS / register / V2PropertiesPanel hardcoded require / config-panels barrel / hidden 목록 - componentConfig 스키마, templateMigrate, webTypeMapping, DynamicConfigPanel - withContainerQuery.css 의 v2-date 컨테이너 룰 - db/migrations/so_modal_layout(_kr).json 의 v2-date → input + type=date 37 files, +287 / -854. Codex GO 판정 기준 (2회 NO-GO 후 FC 계층 / inputType prop / FieldType union / 잔존 v2-date / console.log 모두 처리 후 GO). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
255 lines
7.3 KiB
JSON
255 lines
7.3 KiB
JSON
{
|
|
"version": "2.0",
|
|
"components": [
|
|
{
|
|
"id": "comp_order_no",
|
|
"url": "@/lib/registry/components/v2-input",
|
|
"size": { "width": 300, "height": 60 },
|
|
"position": { "x": 20, "y": 20, "z": 1 },
|
|
"overrides": {
|
|
"type": "v2-input",
|
|
"label": "수주번호",
|
|
"fieldName": "order_no",
|
|
"placeholder": "수주번호를 입력하세요",
|
|
"required": true
|
|
},
|
|
"displayOrder": 0
|
|
},
|
|
{
|
|
"id": "comp_order_date",
|
|
"url": "@/lib/registry/components/input",
|
|
"size": { "width": 300, "height": 60 },
|
|
"position": { "x": 340, "y": 20, "z": 1 },
|
|
"overrides": {
|
|
"type": "date",
|
|
"label": "수주일",
|
|
"fieldName": "order_date",
|
|
"required": true
|
|
},
|
|
"displayOrder": 1
|
|
},
|
|
{
|
|
"id": "comp_partner_id",
|
|
"url": "@/lib/registry/components/v2-select",
|
|
"size": { "width": 300, "height": 60 },
|
|
"position": { "x": 20, "y": 100, "z": 1 },
|
|
"overrides": {
|
|
"type": "v2-select",
|
|
"label": "거래처",
|
|
"fieldName": "partner_id",
|
|
"required": true,
|
|
"config": {
|
|
"mode": "dropdown",
|
|
"source": "table",
|
|
"sourceTable": "customer_mng",
|
|
"valueField": "id",
|
|
"labelField": "name"
|
|
}
|
|
},
|
|
"displayOrder": 2
|
|
},
|
|
{
|
|
"id": "comp_part_code",
|
|
"url": "@/lib/registry/components/v2-input",
|
|
"size": { "width": 300, "height": 60 },
|
|
"position": { "x": 340, "y": 100, "z": 1 },
|
|
"overrides": {
|
|
"type": "v2-input",
|
|
"label": "품목코드",
|
|
"fieldName": "part_code",
|
|
"placeholder": "품목코드를 입력하세요",
|
|
"required": true
|
|
},
|
|
"displayOrder": 3
|
|
},
|
|
{
|
|
"id": "comp_part_name",
|
|
"url": "@/lib/registry/components/v2-input",
|
|
"size": { "width": 300, "height": 60 },
|
|
"position": { "x": 20, "y": 180, "z": 1 },
|
|
"overrides": {
|
|
"type": "v2-input",
|
|
"label": "품명",
|
|
"fieldName": "part_name",
|
|
"placeholder": "품명을 입력하세요"
|
|
},
|
|
"displayOrder": 4
|
|
},
|
|
{
|
|
"id": "comp_spec",
|
|
"url": "@/lib/registry/components/v2-input",
|
|
"size": { "width": 300, "height": 60 },
|
|
"position": { "x": 340, "y": 180, "z": 1 },
|
|
"overrides": {
|
|
"type": "v2-input",
|
|
"label": "규격",
|
|
"fieldName": "spec",
|
|
"placeholder": "규격을 입력하세요"
|
|
},
|
|
"displayOrder": 5
|
|
},
|
|
{
|
|
"id": "comp_material",
|
|
"url": "@/lib/registry/components/v2-input",
|
|
"size": { "width": 300, "height": 60 },
|
|
"position": { "x": 20, "y": 260, "z": 1 },
|
|
"overrides": {
|
|
"type": "v2-input",
|
|
"label": "재질",
|
|
"fieldName": "material",
|
|
"placeholder": "재질을 입력하세요"
|
|
},
|
|
"displayOrder": 6
|
|
},
|
|
{
|
|
"id": "comp_order_qty",
|
|
"url": "@/lib/registry/components/v2-input",
|
|
"size": { "width": 300, "height": 60 },
|
|
"position": { "x": 340, "y": 260, "z": 1 },
|
|
"overrides": {
|
|
"type": "v2-input",
|
|
"inputType": "number",
|
|
"label": "수주수량",
|
|
"fieldName": "order_qty",
|
|
"placeholder": "수주수량을 입력하세요",
|
|
"required": true
|
|
},
|
|
"displayOrder": 7
|
|
},
|
|
{
|
|
"id": "comp_unit_price",
|
|
"url": "@/lib/registry/components/v2-input",
|
|
"size": { "width": 300, "height": 60 },
|
|
"position": { "x": 20, "y": 340, "z": 1 },
|
|
"overrides": {
|
|
"type": "v2-input",
|
|
"inputType": "number",
|
|
"label": "단가",
|
|
"fieldName": "unit_price",
|
|
"placeholder": "단가를 입력하세요",
|
|
"required": true
|
|
},
|
|
"displayOrder": 8
|
|
},
|
|
{
|
|
"id": "comp_due_date",
|
|
"url": "@/lib/registry/components/input",
|
|
"size": { "width": 300, "height": 60 },
|
|
"position": { "x": 340, "y": 340, "z": 1 },
|
|
"overrides": {
|
|
"type": "date",
|
|
"label": "납기일",
|
|
"fieldName": "due_date"
|
|
},
|
|
"displayOrder": 9
|
|
},
|
|
{
|
|
"id": "comp_status",
|
|
"url": "@/lib/registry/components/v2-select",
|
|
"size": { "width": 300, "height": 60 },
|
|
"position": { "x": 20, "y": 420, "z": 1 },
|
|
"overrides": {
|
|
"type": "v2-select",
|
|
"label": "상태",
|
|
"fieldName": "status",
|
|
"required": true,
|
|
"config": {
|
|
"mode": "dropdown",
|
|
"source": "static",
|
|
"options": [
|
|
{ "value": "수주", "label": "수주" },
|
|
{ "value": "진행중", "label": "진행중" },
|
|
{ "value": "완료", "label": "완료" },
|
|
{ "value": "취소", "label": "취소" }
|
|
]
|
|
}
|
|
},
|
|
"displayOrder": 10
|
|
},
|
|
{
|
|
"id": "comp_shipping_method",
|
|
"url": "@/lib/registry/components/v2-select",
|
|
"size": { "width": 300, "height": 60 },
|
|
"position": { "x": 340, "y": 420, "z": 1 },
|
|
"overrides": {
|
|
"type": "v2-select",
|
|
"label": "배송방법",
|
|
"fieldName": "shipping_method",
|
|
"config": {
|
|
"mode": "dropdown",
|
|
"source": "static",
|
|
"options": [
|
|
{ "value": "택배", "label": "택배" },
|
|
{ "value": "화물", "label": "화물" },
|
|
{ "value": "직송", "label": "직송" },
|
|
{ "value": "퀵서비스", "label": "퀵서비스" },
|
|
{ "value": "해상운송", "label": "해상운송" }
|
|
]
|
|
}
|
|
},
|
|
"displayOrder": 11
|
|
},
|
|
{
|
|
"id": "comp_delivery_address",
|
|
"url": "@/lib/registry/components/v2-input",
|
|
"size": { "width": 620, "height": 60 },
|
|
"position": { "x": 20, "y": 500, "z": 1 },
|
|
"overrides": {
|
|
"type": "v2-input",
|
|
"label": "납품장소",
|
|
"fieldName": "delivery_address",
|
|
"placeholder": "납품장소를 입력하세요"
|
|
},
|
|
"displayOrder": 12
|
|
},
|
|
{
|
|
"id": "comp_manager_name",
|
|
"url": "@/lib/registry/components/v2-input",
|
|
"size": { "width": 300, "height": 60 },
|
|
"position": { "x": 20, "y": 580, "z": 1 },
|
|
"overrides": {
|
|
"type": "v2-input",
|
|
"label": "담당자",
|
|
"fieldName": "manager_name",
|
|
"placeholder": "담당자를 입력하세요"
|
|
},
|
|
"displayOrder": 13
|
|
},
|
|
{
|
|
"id": "comp_memo",
|
|
"url": "@/lib/registry/components/v2-input",
|
|
"size": { "width": 620, "height": 80 },
|
|
"position": { "x": 20, "y": 660, "z": 1 },
|
|
"overrides": {
|
|
"type": "v2-input",
|
|
"inputType": "textarea",
|
|
"label": "메모",
|
|
"fieldName": "memo",
|
|
"placeholder": "메모를 입력하세요"
|
|
},
|
|
"displayOrder": 14
|
|
},
|
|
{
|
|
"id": "comp_btn_save",
|
|
"url": "@/lib/registry/components/v2-button-primary",
|
|
"size": { "width": 100, "height": 40 },
|
|
"position": { "x": 540, "y": 760, "z": 1 },
|
|
"overrides": {
|
|
"text": "저장",
|
|
"type": "v2-button-primary",
|
|
"label": "저장 버튼",
|
|
"action": {
|
|
"type": "save",
|
|
"closeModalAfterSave": true,
|
|
"refreshParentTable": true,
|
|
"successMessage": "저장되었습니다.",
|
|
"errorMessage": "저장 중 오류가 발생했습니다."
|
|
},
|
|
"variant": "primary",
|
|
"actionType": "button"
|
|
},
|
|
"displayOrder": 15
|
|
}
|
|
]
|
|
}
|