feat: 모바일 반응형 UI 개선 및 공휴일/일정 시스템 통합
- MobileCard 접기/펼치기(collapsible) 기능 추가 및 반응형 레이아웃 개선 - DatePicker 공휴일/세무일정 색상 코딩 통합, DateTimePicker 신규 추가 - useCalendarScheduleInit 훅으로 전역 공휴일/일정 데이터 캐싱 - 전 도메인 날짜 필드 DatePicker 표준화 - 생산대시보드/작업지시/견적서/주문관리 모바일 호환성 강화 - 회계 모듈 기능 개선 (매입상세 결재연동, 미수금현황 조회조건 등) - 달력 일정 관리 API 연동 및 대량 등록 다이얼로그 개선 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -261,7 +261,7 @@ export function LocationDetailPanel({
|
||||
|
||||
if (!location) {
|
||||
return (
|
||||
<div className="flex flex-col items-center justify-center h-full bg-gray-50 text-gray-500">
|
||||
<div className="flex flex-col items-center justify-center h-full bg-gray-50 text-gray-500 px-6 text-center">
|
||||
<Package className="h-12 w-12 mb-4 text-gray-300" />
|
||||
<p className="text-lg font-medium">개소를 선택해주세요</p>
|
||||
<p className="text-sm">왼쪽 목록에서 개소를 선택하면 상세 정보가 표시됩니다</p>
|
||||
@@ -279,7 +279,7 @@ export function LocationDetailPanel({
|
||||
<div className="bg-gray-50 border-b">
|
||||
{/* 1행: 층, 부호, 가로, 세로, 제품코드 */}
|
||||
<div className="px-4 py-3 space-y-3">
|
||||
<div className="grid grid-cols-5 gap-3">
|
||||
<div className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3">
|
||||
<div>
|
||||
<label className="text-xs text-gray-600">층</label>
|
||||
<Input
|
||||
@@ -357,7 +357,7 @@ export function LocationDetailPanel({
|
||||
</div>
|
||||
|
||||
{/* 2행: 가이드레일, 전원, 제어기 */}
|
||||
<div className="grid grid-cols-3 gap-3">
|
||||
<div className="grid grid-cols-1 sm:grid-cols-3 gap-3">
|
||||
<div>
|
||||
<label className="text-xs text-gray-600 flex items-center gap-1">
|
||||
🔧 가이드레일
|
||||
@@ -424,7 +424,7 @@ export function LocationDetailPanel({
|
||||
</div>
|
||||
|
||||
{/* 3행: 제작사이즈, 산출중량, 산출면적, 수량, 산출하기 */}
|
||||
<div className="grid grid-cols-5 gap-3 text-sm pt-2 border-t border-gray-200">
|
||||
<div className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-5 gap-3 text-sm pt-2 border-t border-gray-200">
|
||||
<div>
|
||||
<span className="text-xs text-gray-500">제작사이즈</span>
|
||||
<p className="font-semibold">
|
||||
|
||||
@@ -285,7 +285,7 @@ export function LocationListPanel({
|
||||
{!disabled && (
|
||||
<div className="bg-gray-50 p-4 space-y-3 border-b border-gray-200">
|
||||
{/* 1행: 층, 부호, 가로, 세로, 제품코드, 수량 */}
|
||||
<div className="grid grid-cols-6 gap-2">
|
||||
<div className="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-2">
|
||||
<div>
|
||||
<label className="text-xs text-gray-600">층</label>
|
||||
<Input
|
||||
@@ -364,8 +364,8 @@ export function LocationListPanel({
|
||||
</div>
|
||||
|
||||
{/* 2행: 가이드레일, 전원, 제어기, 추가 버튼 */}
|
||||
<div className="flex items-end gap-2">
|
||||
<div className="flex-1">
|
||||
<div className="grid grid-cols-2 sm:grid-cols-4 gap-2 items-end">
|
||||
<div>
|
||||
<label className="text-xs text-gray-600 flex items-center gap-1">
|
||||
🔧 가이드레일
|
||||
</label>
|
||||
@@ -437,7 +437,7 @@ export function LocationListPanel({
|
||||
|
||||
{/* 발주 개소 목록 헤더 */}
|
||||
<div className="bg-blue-100 px-4 py-3 border-b border-blue-200">
|
||||
<div className="flex items-center justify-between">
|
||||
<div className="flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2">
|
||||
<h3 className="font-semibold text-blue-800">
|
||||
📋 발주 개소 목록 ({locations.length})
|
||||
</h3>
|
||||
|
||||
@@ -77,22 +77,22 @@ export function QuoteFooterBar({
|
||||
}: QuoteFooterBarProps) {
|
||||
return (
|
||||
<div className="sticky bottom-0 bg-gradient-to-r from-blue-50 to-indigo-50 border-t border-blue-200 shadow-lg">
|
||||
<div className="px-3 py-3 md:px-6 md:py-4 flex items-center justify-between">
|
||||
<div className="px-3 py-3 md:px-6 md:py-4 flex flex-col sm:flex-row sm:items-center sm:justify-between gap-2 sm:gap-0">
|
||||
{/* 왼쪽: 뒤로가기 + 금액 표시 */}
|
||||
<div className="flex items-center gap-3 md:gap-6">
|
||||
<Button
|
||||
variant="outline"
|
||||
onClick={onBack}
|
||||
size="sm"
|
||||
className="md:size-default"
|
||||
className="md:size-default shrink-0"
|
||||
>
|
||||
<ArrowLeft className="h-4 w-4 md:mr-2" />
|
||||
<span className="hidden md:inline">목록으로</span>
|
||||
</Button>
|
||||
|
||||
<div>
|
||||
<p className="text-xs md:text-sm text-gray-600">예상 전체 견적금액</p>
|
||||
<p className="text-lg md:text-3xl font-bold text-blue-600">
|
||||
<div className="min-w-0">
|
||||
<p className="text-xs md:text-sm text-gray-600 whitespace-nowrap">예상 전체 견적금액</p>
|
||||
<p className="text-lg md:text-3xl font-bold text-blue-600 whitespace-nowrap">
|
||||
{formatNumber(totalAmount)}
|
||||
<span className="text-sm md:text-lg font-normal text-gray-500 ml-1">원</span>
|
||||
</p>
|
||||
@@ -100,7 +100,7 @@ export function QuoteFooterBar({
|
||||
</div>
|
||||
|
||||
{/* 오른쪽: 버튼들 */}
|
||||
<div className="flex items-center gap-1 md:gap-3">
|
||||
<div className="flex items-center flex-wrap gap-1 md:gap-3 justify-end">
|
||||
{/* 견적서 보기 */}
|
||||
<Button
|
||||
onClick={onQuoteView}
|
||||
|
||||
@@ -471,7 +471,7 @@ export function QuoteManagementClient({
|
||||
variant="outline"
|
||||
className="bg-gray-100 text-gray-700 font-mono text-xs"
|
||||
>
|
||||
#{globalIndex}
|
||||
{globalIndex}
|
||||
</Badge>
|
||||
<code className="inline-block text-xs bg-gray-100 text-gray-700 px-2.5 py-0.5 rounded-md font-mono whitespace-nowrap">
|
||||
{quote.quoteNumber}
|
||||
|
||||
@@ -250,23 +250,23 @@ export function QuoteSummaryPanel({
|
||||
</div>
|
||||
|
||||
{/* 하단 바: 총 개소 수, 예상 견적금액, 견적 상태 */}
|
||||
<div className="bg-gray-900 text-white px-6 py-5 flex items-center justify-between">
|
||||
<div className="flex items-center gap-10">
|
||||
<div className="bg-gray-900 text-white px-4 py-4 md:px-6 md:py-5 flex flex-wrap items-center justify-between gap-3">
|
||||
<div className="flex items-center gap-4 md:gap-10">
|
||||
<div>
|
||||
<p className="text-sm text-gray-400">총 개소 수</p>
|
||||
<p className="text-4xl font-bold">{locations.length}</p>
|
||||
<p className="text-xs md:text-sm text-gray-400">총 개소 수</p>
|
||||
<p className="text-2xl md:text-4xl font-bold">{locations.length}</p>
|
||||
</div>
|
||||
<div>
|
||||
<p className="text-sm text-gray-400">예상 견적금액</p>
|
||||
<p className="text-4xl font-bold text-blue-400">
|
||||
<p className="text-xs md:text-sm text-gray-400">예상 견적금액</p>
|
||||
<p className="text-2xl md:text-4xl font-bold text-blue-400">
|
||||
{formatNumber(totalAmount)}
|
||||
<span className="text-xl ml-1">원</span>
|
||||
<span className="text-base md:text-xl ml-1">원</span>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="text-right">
|
||||
<p className="text-sm text-gray-400">견적 상태</p>
|
||||
<span className="inline-block bg-blue-500/20 text-blue-300 border border-blue-500/50 text-lg px-4 py-1 rounded">
|
||||
<p className="text-xs md:text-sm text-gray-400">견적 상태</p>
|
||||
<span className="inline-block bg-blue-500/20 text-blue-300 border border-blue-500/50 text-sm md:text-lg px-3 py-1 md:px-4 rounded">
|
||||
작성중
|
||||
</span>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user