- Enhanced the `createMoldSerial` function to automatically generate serial numbers based on defined numbering rules when the serial number is not provided. - Integrated error handling for the automatic numbering process, ensuring robust logging for success and failure cases. - Updated the `NumberingRuleService` to support reference column handling, allowing for dynamic prefix generation based on related data. - Modified the frontend components to accommodate new reference configurations, improving user experience in managing numbering rules. These changes significantly enhance the mold management functionality by automating serial number generation and improving the flexibility of numbering rules.
124 lines
4.3 KiB
TypeScript
124 lines
4.3 KiB
TypeScript
"use client";
|
|
|
|
import React from "react";
|
|
import { Card, CardContent, CardHeader } from "@/components/ui/card";
|
|
import { Button } from "@/components/ui/button";
|
|
import { Label } from "@/components/ui/label";
|
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select";
|
|
import { Badge } from "@/components/ui/badge";
|
|
import { Trash2 } from "lucide-react";
|
|
import { NumberingRulePart, CodePartType, GenerationMethod, CODE_PART_TYPE_OPTIONS } from "@/types/numbering-rule";
|
|
import { AutoConfigPanel } from "./AutoConfigPanel";
|
|
import { ManualConfigPanel } from "./ManualConfigPanel";
|
|
|
|
interface NumberingRuleCardProps {
|
|
part: NumberingRulePart;
|
|
onUpdate: (updates: Partial<NumberingRulePart>) => void;
|
|
onDelete: () => void;
|
|
isPreview?: boolean;
|
|
tableName?: string;
|
|
}
|
|
|
|
export const NumberingRuleCard: React.FC<NumberingRuleCardProps> = ({
|
|
part,
|
|
onUpdate,
|
|
onDelete,
|
|
isPreview = false,
|
|
tableName,
|
|
}) => {
|
|
return (
|
|
<Card className="border-border bg-card flex-1">
|
|
<CardHeader className="pb-3">
|
|
<div className="flex items-center justify-between">
|
|
<Badge variant="outline" className="text-xs sm:text-sm">
|
|
규칙 {part.order}
|
|
</Badge>
|
|
<Button
|
|
variant="ghost"
|
|
size="icon"
|
|
onClick={onDelete}
|
|
className="text-destructive h-7 w-7 sm:h-8 sm:w-8"
|
|
disabled={isPreview}
|
|
>
|
|
<Trash2 className="h-3 w-3 sm:h-4 sm:w-4" />
|
|
</Button>
|
|
</div>
|
|
</CardHeader>
|
|
|
|
<CardContent className="space-y-3 sm:space-y-4">
|
|
<div>
|
|
<Label className="text-xs font-medium sm:text-sm">구분 유형</Label>
|
|
<Select
|
|
value={part.partType}
|
|
onValueChange={(value) => {
|
|
const newPartType = value as CodePartType;
|
|
// 타입 변경 시 해당 타입의 기본 autoConfig 설정
|
|
const defaultAutoConfig: Record<string, any> = {
|
|
sequence: { sequenceLength: 3, startFrom: 1 },
|
|
number: { numberLength: 4, numberValue: 1 },
|
|
date: { dateFormat: "YYYYMMDD" },
|
|
text: { textValue: "CODE" },
|
|
category: { categoryKey: "", categoryMappings: [] },
|
|
reference: { referenceColumnName: "" },
|
|
};
|
|
onUpdate({
|
|
partType: newPartType,
|
|
autoConfig: defaultAutoConfig[newPartType] || {}
|
|
});
|
|
}}
|
|
disabled={isPreview}
|
|
>
|
|
<SelectTrigger className="h-8 text-xs sm:h-10 sm:text-sm">
|
|
<SelectValue />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
{CODE_PART_TYPE_OPTIONS.map((option) => (
|
|
<SelectItem key={option.value} value={option.value} className="text-xs sm:text-sm">
|
|
{option.label}
|
|
</SelectItem>
|
|
))}
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
|
|
<div>
|
|
<Label className="text-xs font-medium sm:text-sm">생성 방식</Label>
|
|
<Select
|
|
value={part.generationMethod}
|
|
onValueChange={(value) => onUpdate({ generationMethod: value as GenerationMethod })}
|
|
disabled={isPreview}
|
|
>
|
|
<SelectTrigger className="h-8 text-xs sm:h-10 sm:text-sm">
|
|
<SelectValue />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="auto" className="text-xs sm:text-sm">
|
|
자동 생성
|
|
</SelectItem>
|
|
<SelectItem value="manual" className="text-xs sm:text-sm">
|
|
직접 입력
|
|
</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
|
|
{part.generationMethod === "auto" ? (
|
|
<AutoConfigPanel
|
|
partType={part.partType}
|
|
config={part.autoConfig}
|
|
onChange={(autoConfig) => onUpdate({ autoConfig })}
|
|
isPreview={isPreview}
|
|
tableName={tableName}
|
|
/>
|
|
) : (
|
|
<ManualConfigPanel
|
|
config={part.manualConfig}
|
|
onChange={(manualConfig) => onUpdate({ manualConfig })}
|
|
isPreview={isPreview}
|
|
/>
|
|
)}
|
|
</CardContent>
|
|
</Card>
|
|
);
|
|
};
|