feat: ESLint 정리 및 전체 코드 품질 개선

- eslint.config.mjs 규칙 강화 및 정리
- 전역 unused import/변수 제거 (312개 파일)
- next.config.ts, middleware, proxy route 개선
- CopyableCell molecule 추가
- 회계/결재/HR/생산/건설/품질/영업 등 전 도메인 lint 정리
- IntegratedListTemplateV2, DataTable, MobileCard 등 공통 컴포넌트 개선
- execute-server-action 에러 핸들링 보강
This commit is contained in:
유병철
2026-03-11 10:27:10 +09:00
parent 924726cba1
commit 81affdc441
315 changed files with 1977 additions and 1344 deletions

View File

@@ -139,7 +139,7 @@ export function ShipmentDetail({ id }: ShipmentDetailProps) {
loadData();
}, [loadData]);
const handleGoBack = useCallback(() => {
const _handleGoBack = useCallback(() => {
router.push('/ko/outbound/shipments');
}, [router]);

View File

@@ -44,7 +44,7 @@ import {
SHIPMENT_STATUS_STYLES,
DELIVERY_METHOD_LABELS,
} from './types';
import type { ShipmentItem, ShipmentStatus, ShipmentStats } from './types';
import type { ShipmentItem, ShipmentStatus } from './types';
import { parseISO } from 'date-fns';
import { getLocalDateString } from '@/lib/utils/date';
import { isNextRedirectError } from '@/lib/utils/redirect-error';
@@ -228,16 +228,16 @@ export function ShipmentList() {
// 테이블 컬럼 (11개)
columns: [
{ key: 'no', label: '번호', className: 'w-[50px] text-center' },
{ key: 'lotNo', label: '로트번호', className: 'min-w-[120px]' },
{ key: 'siteName', label: '현장명', className: 'min-w-[100px]' },
{ key: 'orderCustomer', label: '수주처', className: 'min-w-[100px]' },
{ key: 'receiver', label: '수신자', className: 'w-[80px] text-center' },
{ key: 'receiverAddress', label: '수신주소', className: 'min-w-[140px]' },
{ key: 'receiverCompany', label: '수신처', className: 'min-w-[100px]' },
{ key: 'lotNo', label: '로트번호', className: 'min-w-[120px]', copyable: true },
{ key: 'siteName', label: '현장명', className: 'min-w-[100px]', copyable: true },
{ key: 'orderCustomer', label: '수주처', className: 'min-w-[100px]', copyable: true },
{ key: 'receiver', label: '수신자', className: 'w-[80px] text-center', copyable: true },
{ key: 'receiverAddress', label: '수신주소', className: 'min-w-[140px]', copyable: true },
{ key: 'receiverCompany', label: '수신처', className: 'min-w-[100px]', copyable: true },
{ key: 'status', label: '상태', className: 'w-[80px] text-center' },
{ key: 'dispatch', label: '배차', className: 'w-[80px] text-center' },
{ key: 'writer', label: '작성자', className: 'w-[80px] text-center' },
{ key: 'shipmentDate', label: '출고일', className: 'w-[100px] text-center' },
{ key: 'dispatch', label: '배차', className: 'w-[80px] text-center', copyable: true },
{ key: 'writer', label: '작성자', className: 'w-[80px] text-center', copyable: true },
{ key: 'shipmentDate', label: '출고일', className: 'w-[100px] text-center', copyable: true },
],
// 배송방식 필터

View File

@@ -16,7 +16,7 @@ interface TransactionStatementProps {
export function TransactionStatement({ data }: TransactionStatementProps) {
// 제품 합계 계산
const totalAmount = data.products.reduce((sum, product) => {
const totalAmount = data.products.reduce((sum, _product) => {
// 실제로는 단가 * 수량
return sum + 0;
}, 0);
@@ -107,7 +107,7 @@ export function TransactionStatement({ data }: TransactionStatementProps) {
</tr>
</thead>
<tbody>
{data.products.map((product, index) => (
{data.products.map((product, _index) => (
<tr key={product.id}>
<td className="border px-2 py-2 text-center">{product.no}</td>
<td className="border px-2 py-2">{product.itemName}</td>

View File

@@ -163,18 +163,18 @@ export function VehicleDispatchList() {
// 테이블 컬럼 (13개)
columns: [
{ key: 'no', label: 'No.', className: 'w-[50px] text-center' },
{ key: 'dispatchNo', label: '배차번호', className: 'min-w-[130px]' },
{ key: 'lotNo', label: '로트번호', className: 'min-w-[120px]' },
{ key: 'siteName', label: '현장명', className: 'min-w-[100px]' },
{ key: 'orderCustomer', label: '수주처', className: 'min-w-[100px]' },
{ key: 'logisticsCompany', label: '물류업체', className: 'min-w-[90px]' },
{ key: 'supplyAmount', label: '공급가액', className: 'w-[100px] text-right' },
{ key: 'vat', label: '부가세', className: 'w-[90px] text-right' },
{ key: 'totalAmount', label: '합계', className: 'w-[100px] text-right' },
{ key: 'freightCostType', label: '선/착불', className: 'w-[70px] text-center' },
{ key: 'writer', label: '작성자', className: 'w-[80px] text-center' },
{ key: 'dispatchNo', label: '배차번호', className: 'min-w-[130px]', copyable: true },
{ key: 'lotNo', label: '로트번호', className: 'min-w-[120px]', copyable: true },
{ key: 'siteName', label: '현장명', className: 'min-w-[100px]', copyable: true },
{ key: 'orderCustomer', label: '수주처', className: 'min-w-[100px]', copyable: true },
{ key: 'logisticsCompany', label: '물류업체', className: 'min-w-[90px]', copyable: true },
{ key: 'supplyAmount', label: '공급가액', className: 'w-[100px] text-right', copyable: true },
{ key: 'vat', label: '부가세', className: 'w-[90px] text-right', copyable: true },
{ key: 'totalAmount', label: '합계', className: 'w-[100px] text-right', copyable: true },
{ key: 'freightCostType', label: '선/착불', className: 'w-[70px] text-center', copyable: true },
{ key: 'writer', label: '작성자', className: 'w-[80px] text-center', copyable: true },
{ key: 'status', label: '상태', className: 'w-[80px] text-center' },
{ key: 'remarks', label: '비고', className: 'min-w-[100px]' },
{ key: 'remarks', label: '비고', className: 'min-w-[100px]', copyable: true },
],
// 상태 필터