Files
vexplor/frontend/components/pop/hardcoded/inbound/PackagingModal.tsx
SeongHyun Kim ecf79c9e50 feat: POP v2 하드코딩 화면 — 홈 + 입고 프로세스
- 홈 화면: KPI 캐러셀, 메뉴 아이콘, 최근 활동, 공지 배너
- 입고유형선택: 외부 7개 + 내부 3개 아이콘, 금일 입고 KPI
- 구매입고: 거래처 선택, 발주 품목 카드, 담기/취소
- 장바구니: 체크박스, 포장 정보, 검사 상태, 확정
- 숫자 키패드: 터치 입력, MAX, 포장등록
- 포장 선택: 6종 단위 (박스/포대/팩/묶음/롤/통)
- 검사 모달: 마스터 기반 체크리스트, 측정값, 양품/불량
- 공통 PopShell: 헤더(시계+프로필), 배너, 푸터
- 반응형 4모드 (태블릿/핸드폰 가로세로)
2026-04-01 17:19:12 +09:00

82 lines
3.0 KiB
TypeScript

"use client";
import React from "react";
/* ------------------------------------------------------------------ */
/* Types */
/* ------------------------------------------------------------------ */
export interface PackageUnit {
label: string;
icon: string;
value: string;
}
const PACKAGE_UNITS: PackageUnit[] = [
{ label: "박스", icon: "\uD83D\uDCE6", value: "박스" },
{ label: "포대", icon: "\uD83D\uDECD\uFE0F", value: "포대" },
{ label: "팩", icon: "\uD83D\uDCCB", value: "팩" },
{ label: "묶음", icon: "\uD83D\uDD17", value: "묶음" },
{ label: "롤", icon: "\uD83E\uDDFB", value: "롤" },
{ label: "통", icon: "\uD83E\uDEB3", value: "통" },
];
interface PackagingModalProps {
open: boolean;
onClose: () => void;
onSelect: (unit: PackageUnit) => void;
}
/* ------------------------------------------------------------------ */
/* Component */
/* ------------------------------------------------------------------ */
export function PackagingModal({ open, onClose, onSelect }: PackagingModalProps) {
if (!open) return null;
return (
<div className="fixed inset-0 z-[60] flex items-center justify-center">
{/* Overlay */}
<div className="absolute inset-0 bg-black/50" onClick={onClose} />
{/* Panel */}
<div className="relative bg-white w-[90%] max-w-[360px] rounded-2xl shadow-2xl z-10 overflow-hidden">
{/* Header */}
<div className="flex items-center justify-between px-5 py-4 border-b border-gray-100">
<h3 className="text-lg font-bold text-gray-900">
<span className="mr-1.5">{"\uD83D\uDCE6"}</span>
</h3>
<button
onClick={onClose}
className="w-8 h-8 rounded-lg bg-gray-100 flex items-center justify-center text-gray-500 hover:bg-gray-200 transition-colors"
>
<svg className="w-4 h-4" fill="none" stroke="currentColor" strokeWidth={2} viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
{/* Body: 3x2 grid */}
<div className="p-5">
<div className="grid grid-cols-3 gap-3">
{PACKAGE_UNITS.map((unit) => (
<button
key={unit.value}
onClick={() => {
onSelect(unit);
onClose();
}}
className="flex flex-col items-center gap-2 py-4 px-3 border-2 border-gray-200 rounded-xl bg-white text-sm font-medium text-gray-700 hover:border-blue-400 hover:bg-blue-50 active:scale-95 transition-all min-h-[80px]"
>
<span className="text-2xl">{unit.icon}</span>
<span>{unit.label}</span>
</button>
))}
</div>
</div>
</div>
</div>
);
}