136 lines
2.9 KiB
TypeScript
136 lines
2.9 KiB
TypeScript
"use client";
|
|
|
|
import React from "react";
|
|
import { ModalRepeaterTableComponent } from "@/lib/registry/components/modal-repeater-table";
|
|
import type {
|
|
RepeaterColumnConfig,
|
|
CalculationRule,
|
|
} from "@/lib/registry/components/modal-repeater-table";
|
|
|
|
/**
|
|
* 수주 등록 전용 품목 반복 테이블 컴포넌트
|
|
*
|
|
* 이 컴포넌트는 수주 등록 화면 전용이며, 설정이 고정되어 있습니다.
|
|
* 범용 ModalRepeaterTable과 달리 item_info 테이블만 조회하며,
|
|
* 수주 등록에 필요한 컬럼과 계산 공식이 미리 설정되어 있습니다.
|
|
*/
|
|
|
|
interface OrderItemRepeaterTableProps {
|
|
/** 현재 선택된 품목 목록 */
|
|
value: any[];
|
|
/** 품목 목록 변경 시 콜백 */
|
|
onChange: (items: any[]) => void;
|
|
/** 비활성화 여부 */
|
|
disabled?: boolean;
|
|
}
|
|
|
|
// 수주 등록 전용 컬럼 설정 (고정)
|
|
const ORDER_COLUMNS: RepeaterColumnConfig[] = [
|
|
{
|
|
field: "item_number",
|
|
label: "품번",
|
|
editable: false,
|
|
width: "120px",
|
|
},
|
|
{
|
|
field: "item_name",
|
|
label: "품명",
|
|
editable: false,
|
|
width: "180px",
|
|
},
|
|
{
|
|
field: "specification",
|
|
label: "규격",
|
|
editable: false,
|
|
width: "150px",
|
|
},
|
|
{
|
|
field: "material",
|
|
label: "재질",
|
|
editable: false,
|
|
width: "120px",
|
|
},
|
|
{
|
|
field: "quantity",
|
|
label: "수량",
|
|
type: "number",
|
|
editable: true,
|
|
required: true,
|
|
defaultValue: 1,
|
|
width: "100px",
|
|
},
|
|
{
|
|
field: "selling_price",
|
|
label: "단가",
|
|
type: "number",
|
|
editable: true,
|
|
required: true,
|
|
width: "120px",
|
|
},
|
|
{
|
|
field: "amount",
|
|
label: "금액",
|
|
type: "number",
|
|
editable: false,
|
|
calculated: true,
|
|
width: "120px",
|
|
},
|
|
{
|
|
field: "order_date",
|
|
label: "수주일",
|
|
type: "date",
|
|
editable: true,
|
|
width: "130px",
|
|
},
|
|
{
|
|
field: "delivery_date",
|
|
label: "납기일",
|
|
type: "date",
|
|
editable: true,
|
|
width: "130px",
|
|
},
|
|
];
|
|
|
|
// 수주 등록 전용 계산 공식 (고정)
|
|
const ORDER_CALCULATION_RULES: CalculationRule[] = [
|
|
{
|
|
result: "amount",
|
|
formula: "quantity * selling_price",
|
|
dependencies: ["quantity", "selling_price"],
|
|
},
|
|
];
|
|
|
|
export function OrderItemRepeaterTable({
|
|
value,
|
|
onChange,
|
|
disabled = false,
|
|
}: OrderItemRepeaterTableProps) {
|
|
return (
|
|
<ModalRepeaterTableComponent
|
|
// 고정 설정 (수주 등록 전용)
|
|
sourceTable="item_info"
|
|
sourceColumns={[
|
|
"item_number",
|
|
"item_name",
|
|
"specification",
|
|
"material",
|
|
"unit",
|
|
"selling_price",
|
|
]}
|
|
sourceSearchFields={["item_name", "item_number", "specification"]}
|
|
modalTitle="품목 검색 및 선택"
|
|
modalButtonText="품목 검색"
|
|
multiSelect={true}
|
|
columns={ORDER_COLUMNS}
|
|
calculationRules={ORDER_CALCULATION_RULES}
|
|
uniqueField="item_number"
|
|
|
|
// 외부에서 제어 가능한 prop
|
|
value={value}
|
|
onChange={onChange}
|
|
disabled={disabled}
|
|
/>
|
|
);
|
|
}
|
|
|