feat: 모바일 반응형 UI 개선 및 공휴일/일정 시스템 통합
- MobileCard 접기/펼치기(collapsible) 기능 추가 및 반응형 레이아웃 개선 - DatePicker 공휴일/세무일정 색상 코딩 통합, DateTimePicker 신규 추가 - useCalendarScheduleInit 훅으로 전역 공휴일/일정 데이터 캐싱 - 전 도메인 날짜 필드 DatePicker 표준화 (104 files) - 생산대시보드/작업지시 모바일 호환성 강화 - 견적서/주문관리 반응형 그리드 적용 - 회계 모듈 기능 개선 (매입상세 결재연동, 미수금현황 조회조건 등) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -853,7 +853,7 @@ export function OrderRegistration({
|
||||
<div className="space-y-2 md:col-span-4">
|
||||
<Label>주소</Label>
|
||||
<div className="flex gap-2">
|
||||
<Button variant="outline" type="button" onClick={openPostcode}>
|
||||
<Button variant="outline" type="button" onClick={openPostcode} className="shrink-0">
|
||||
우편번호 찾기
|
||||
</Button>
|
||||
<Input
|
||||
@@ -864,15 +864,14 @@ export function OrderRegistration({
|
||||
}
|
||||
className="w-32"
|
||||
/>
|
||||
<Input
|
||||
placeholder="주소"
|
||||
value={form.address}
|
||||
onChange={(e) =>
|
||||
setForm((prev) => ({ ...prev, address: e.target.value }))
|
||||
}
|
||||
className="flex-1"
|
||||
/>
|
||||
</div>
|
||||
<Input
|
||||
placeholder="주소"
|
||||
value={form.address}
|
||||
onChange={(e) =>
|
||||
setForm((prev) => ({ ...prev, address: e.target.value }))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
</FormSection>
|
||||
|
||||
@@ -337,11 +337,11 @@ export function OrderSalesDetailEdit({ orderId }: OrderSalesDetailEditProps) {
|
||||
const customHeaderActions = useMemo(() => {
|
||||
if (!form) return null;
|
||||
return (
|
||||
<div className="flex items-center gap-2">
|
||||
<code className="text-sm font-mono bg-gray-100 px-2 py-1 rounded">
|
||||
<div className="flex items-center gap-1 sm:gap-2 min-w-0 overflow-hidden">
|
||||
<code className="text-xs sm:text-sm font-mono bg-gray-100 px-1.5 py-0.5 sm:px-2 sm:py-1 rounded truncate max-w-[100px] sm:max-w-none">
|
||||
{form.lotNumber}
|
||||
</code>
|
||||
{getOrderStatusBadge(form.status)}
|
||||
<span className="shrink-0 [&>span]:text-xs [&>span]:sm:text-sm">{getOrderStatusBadge(form.status)}</span>
|
||||
</div>
|
||||
);
|
||||
}, [form]);
|
||||
@@ -361,7 +361,7 @@ export function OrderSalesDetailEdit({ orderId }: OrderSalesDetailEditProps) {
|
||||
</CardTitle>
|
||||
</CardHeader>
|
||||
<CardContent>
|
||||
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-4">
|
||||
<div className="space-y-1">
|
||||
<Label className="text-muted-foreground text-sm">로트번호</Label>
|
||||
<p className="font-medium">{form.lotNumber}</p>
|
||||
@@ -372,7 +372,7 @@ export function OrderSalesDetailEdit({ orderId }: OrderSalesDetailEditProps) {
|
||||
</div>
|
||||
<div className="space-y-1">
|
||||
<Label className="text-muted-foreground text-sm">수주처</Label>
|
||||
<p className="font-medium">{form.client}</p>
|
||||
<p className="font-medium truncate">{form.client}</p>
|
||||
</div>
|
||||
<div className="space-y-1">
|
||||
<Label className="text-muted-foreground text-sm">현장명</Label>
|
||||
@@ -541,8 +541,8 @@ export function OrderSalesDetailEdit({ orderId }: OrderSalesDetailEditProps) {
|
||||
{/* 제품내용 (아코디언) */}
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<div className="flex items-center justify-between">
|
||||
<CardTitle className="text-lg flex items-center gap-2">
|
||||
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2">
|
||||
<CardTitle className="text-lg flex items-center gap-2 shrink-0">
|
||||
제품내용
|
||||
{!form.canEditItems && (
|
||||
<span className="flex items-center gap-1 text-sm font-normal text-orange-600">
|
||||
@@ -552,7 +552,7 @@ export function OrderSalesDetailEdit({ orderId }: OrderSalesDetailEditProps) {
|
||||
)}
|
||||
</CardTitle>
|
||||
{form.products && form.products.length > 0 && (
|
||||
<div className="flex items-center gap-2">
|
||||
<div className="flex items-center gap-2 shrink-0">
|
||||
<button
|
||||
type="button"
|
||||
onClick={expandAllProducts}
|
||||
@@ -589,27 +589,25 @@ export function OrderSalesDetailEdit({ orderId }: OrderSalesDetailEditProps) {
|
||||
<button
|
||||
type="button"
|
||||
onClick={() => toggleProduct(productKey)}
|
||||
className="w-full flex items-center justify-between p-4 bg-gray-50 hover:bg-gray-100 transition-colors text-left"
|
||||
className="w-full flex items-center p-3 sm:p-4 bg-gray-50 hover:bg-gray-100 transition-colors text-left gap-2"
|
||||
>
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="shrink-0 w-7 h-7 flex items-center justify-center">
|
||||
{isExpanded ? (
|
||||
<ChevronDown className="h-5 w-5 text-gray-500" />
|
||||
) : (
|
||||
<ChevronRight className="h-5 w-5 text-gray-500" />
|
||||
)}
|
||||
<Package className="h-5 w-5 text-blue-600" />
|
||||
<div>
|
||||
<span className="font-medium">{product.productName}</span>
|
||||
</div>
|
||||
<Package className="h-5 w-5 text-blue-600 shrink-0" />
|
||||
<div className="min-w-0 flex-1">
|
||||
<div className="font-medium break-words">{product.productName}</div>
|
||||
<div className="flex flex-wrap items-center gap-x-2 text-sm text-gray-500">
|
||||
{product.openWidth && product.openHeight && (
|
||||
<span className="ml-2 text-sm text-gray-500">
|
||||
({product.openWidth} × {product.openHeight})
|
||||
</span>
|
||||
<span className="whitespace-nowrap">({product.openWidth} × {product.openHeight})</span>
|
||||
)}
|
||||
<span className="whitespace-nowrap">부품 {productItems.length}개</span>
|
||||
</div>
|
||||
</div>
|
||||
<span className="text-sm text-gray-500">
|
||||
{productItems.length}개 부품
|
||||
</span>
|
||||
</button>
|
||||
|
||||
{/* 부품 목록 (확장 시 표시) */}
|
||||
@@ -716,7 +714,7 @@ export function OrderSalesDetailEdit({ orderId }: OrderSalesDetailEditProps) {
|
||||
|
||||
</div>
|
||||
);
|
||||
}, [form]);
|
||||
}, [form, expandedProducts]);
|
||||
|
||||
return (
|
||||
<IntegratedDetailTemplate
|
||||
|
||||
@@ -474,7 +474,9 @@ export function OrderSalesDetailView({ orderId }: OrderSalesDetailViewProps) {
|
||||
<InfoItem label="운임비용" value={order.shippingCostLabel || ""} />
|
||||
<InfoItem label="수신(반장/업체)" value={order.receiver || ""} />
|
||||
<InfoItem label="수신처 연락처" value={order.receiverContact || ""} />
|
||||
<InfoItem label="수신처 주소" value={order.address || ""} />
|
||||
<div className="col-span-2 md:col-span-4">
|
||||
<InfoItem label="주소" value={order.address || ""} />
|
||||
</div>
|
||||
</div>
|
||||
</CardContent>
|
||||
</Card>
|
||||
|
||||
Reference in New Issue
Block a user