diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-10-27 10:03:06 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-10-27 10:03:06 +0000 |
| commit | a3525f8bdfcf849cc1716fab81cb8facadbe9a8e (patch) | |
| tree | 0b5b534e92bcfe188d4906db7d16c37044262c2f /lib/pq/pq-criteria | |
| parent | e87b7b06d92dc7e7235ecda24c212169f30e82ec (diff) | |
(최겸) 구매 협력업체 관리(PQ/실사관리, 정기평가 협력업체 제출 상세 dialog 개발,
Diffstat (limited to 'lib/pq/pq-criteria')
| -rw-r--r-- | lib/pq/pq-criteria/add-pq-dialog.tsx | 2 | ||||
| -rw-r--r-- | lib/pq/pq-criteria/pq-table-column.tsx | 50 | ||||
| -rw-r--r-- | lib/pq/pq-criteria/pq-table-toolbar-actions.tsx | 48 | ||||
| -rw-r--r-- | lib/pq/pq-criteria/pq-table.tsx | 10 | ||||
| -rw-r--r-- | lib/pq/pq-criteria/update-pq-sheet.tsx | 1 |
5 files changed, 82 insertions, 29 deletions
diff --git a/lib/pq/pq-criteria/add-pq-dialog.tsx b/lib/pq/pq-criteria/add-pq-dialog.tsx index 33e656c2..660eb360 100644 --- a/lib/pq/pq-criteria/add-pq-dialog.tsx +++ b/lib/pq/pq-criteria/add-pq-dialog.tsx @@ -68,7 +68,9 @@ const inputFormatOptions = [ { value: "FILE", label: "파일" },
{ value: "EMAIL", label: "이메일" },
{ value: "PHONE", label: "전화번호" },
+ { value: "FAX", label: "팩스번호" },
{ value: "NUMBER", label: "숫자" },
+ { value: "NUMBER_WITH_UNIT", label: "숫자+단위" },
{ value: "TEXT_FILE", label: "텍스트 + 파일" },
];
diff --git a/lib/pq/pq-criteria/pq-table-column.tsx b/lib/pq/pq-criteria/pq-table-column.tsx index 32d6cc32..ed1180f7 100644 --- a/lib/pq/pq-criteria/pq-table-column.tsx +++ b/lib/pq/pq-criteria/pq-table-column.tsx @@ -18,13 +18,16 @@ import { Button } from "@/components/ui/button" import { Ellipsis } from "lucide-react" import { Badge } from "@/components/ui/badge" import { PqCriterias } from "@/db/schema/pq" +import { toast } from "sonner" interface GetColumnsProps { setRowAction: React.Dispatch<React.SetStateAction<DataTableRowAction<PqCriterias> | null>> + pqListInfo?: Awaited<ReturnType<typeof import("../service").getPQListInfo>> } export function getColumns({ setRowAction, + pqListInfo, }: GetColumnsProps): ColumnDef<PqCriterias>[] { return [ { @@ -205,6 +208,12 @@ export function getColumns({ id: "actions", enableHiding: false, cell: function Cell({ row }) { + const isActive = pqListInfo?.success && pqListInfo.data.status === "ACTIVE"; + + const handleRestrictedAction = () => { + toast.error("활성화된 PQ 목록은 수정할 수 없습니다. 먼저 PQ 목록을 비활성화해주세요."); + }; + return ( <DropdownMenu> <DropdownMenuTrigger asChild> @@ -217,18 +226,37 @@ export function getColumns({ </Button> </DropdownMenuTrigger> <DropdownMenuContent align="end" className="w-40"> - <DropdownMenuItem - onSelect={() => setRowAction({ row, type: "update" })} - > - Edit - </DropdownMenuItem> + {isActive ? ( + <DropdownMenuItem + onSelect={handleRestrictedAction} + className="text-muted-foreground" + > + Edit + </DropdownMenuItem> + ) : ( + <DropdownMenuItem + onSelect={() => setRowAction({ row, type: "update" })} + > + Edit + </DropdownMenuItem> + )} - <DropdownMenuItem - onSelect={() => setRowAction({ row, type: "delete" })} - > - Delete - <DropdownMenuShortcut>⌘⌫</DropdownMenuShortcut> - </DropdownMenuItem> + {isActive ? ( + <DropdownMenuItem + onSelect={handleRestrictedAction} + className="text-muted-foreground" + > + Delete + <DropdownMenuShortcut>⌘⌫</DropdownMenuShortcut> + </DropdownMenuItem> + ) : ( + <DropdownMenuItem + onSelect={() => setRowAction({ row, type: "delete" })} + > + Delete + <DropdownMenuShortcut>⌘⌫</DropdownMenuShortcut> + </DropdownMenuItem> + )} </DropdownMenuContent> </DropdownMenu> ) diff --git a/lib/pq/pq-criteria/pq-table-toolbar-actions.tsx b/lib/pq/pq-criteria/pq-table-toolbar-actions.tsx index f168b83d..cdc4f813 100644 --- a/lib/pq/pq-criteria/pq-table-toolbar-actions.tsx +++ b/lib/pq/pq-criteria/pq-table-toolbar-actions.tsx @@ -17,37 +17,59 @@ import { type Table } from "@tanstack/react-table" import { DeletePqsDialog } from "./delete-pqs-dialog" import { AddPqDialog } from "./add-pq-dialog" import { PqCriterias } from "@/db/schema/pq" +import { toast } from "sonner" // import { ImportPqButton } from "./import-pq-button" // import { exportPqTemplate } from "./pq-excel-template" interface PqTableToolbarActionsProps { table: Table<PqCriterias> pqListId: number + pqListInfo: Awaited<ReturnType<typeof import("../service").getPQListInfo>> } export function PqTableToolbarActions({ table, - pqListId + pqListId, + pqListInfo }: PqTableToolbarActionsProps) { - // const [refreshKey, setRefreshKey] = React.useState(0) + // PQ 리스트가 ACTIVE 상태인지 확인 + const isActive = pqListInfo.success && pqListInfo.data.status === "ACTIVE"; - // // Import 성공 후 테이블 갱신 - // const handleImportSuccess = () => { - // setRefreshKey(prev => prev + 1) - // } + // ACTIVE 상태일 때 기능 제한 + const handleRestrictedAction = () => { + toast.error("활성화된 PQ 목록은 수정할 수 없습니다. 먼저 PQ 목록을 비활성화해주세요."); + }; return ( <div className="flex items-center gap-2"> {table.getFilteredSelectedRowModel().rows.length > 0 ? ( - <DeletePqsDialog - pqs={table - .getFilteredSelectedRowModel() - .rows.map((row) => row.original)} - onSuccess={() => table.toggleAllRowsSelected(false)} - /> + isActive ? ( + <button + onClick={handleRestrictedAction} + className="inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border border-input bg-background hover:bg-accent hover:text-accent-foreground h-9 px-3 text-destructive hover:text-destructive" + > + PQ 항목 삭제 + </button> + ) : ( + <DeletePqsDialog + pqs={table + .getFilteredSelectedRowModel() + .rows.map((row) => row.original)} + onSuccess={() => table.toggleAllRowsSelected(false)} + /> + ) ) : null} - <AddPqDialog pqListId={pqListId} /> + {isActive ? ( + <button + onClick={handleRestrictedAction} + className="inline-flex items-center justify-center rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 bg-primary text-primary-foreground hover:bg-primary/90 h-9 px-3" + > + PQ 항목 추가 + </button> + ) : ( + <AddPqDialog pqListId={pqListId} /> + )} {/* Import 버튼 */} {/* <ImportPqButton diff --git a/lib/pq/pq-criteria/pq-table.tsx b/lib/pq/pq-criteria/pq-table.tsx index e0e3dee5..187a727b 100644 --- a/lib/pq/pq-criteria/pq-table.tsx +++ b/lib/pq/pq-criteria/pq-table.tsx @@ -18,7 +18,7 @@ import { getColumns } from "./pq-table-column" import { UpdatePqSheet } from "./update-pq-sheet" interface DocumentListTableProps { - promises: Promise<[Awaited<ReturnType<typeof getPQsByListId>>]> + promises: Promise<[Awaited<ReturnType<typeof getPQsByListId>>, Awaited<ReturnType<typeof getPQListInfo>>]> pqListId: number } @@ -27,14 +27,14 @@ export function PqsTable({ pqListId }: DocumentListTableProps) { // 1) 데이터를 가져옴 (server component -> use(...) pattern) - const [{ data, pageCount }] = React.use(promises) + const [{ data, pageCount }, pqListInfo] = React.use(promises) const [rowAction, setRowAction] = React.useState<DataTableRowAction<PqCriterias> | null>(null) const columns = React.useMemo( - () => getColumns({ setRowAction }), - [setRowAction] + () => getColumns({ setRowAction, pqListInfo }), + [setRowAction, pqListInfo] ) // Filter fields @@ -105,7 +105,7 @@ export function PqsTable({ filterFields={advancedFilterFields} shallow={false} > - <PqTableToolbarActions table={table} pqListId={pqListId}/> + <PqTableToolbarActions table={table} pqListId={pqListId} pqListInfo={pqListInfo}/> </DataTableAdvancedToolbar> </DataTable> diff --git a/lib/pq/pq-criteria/update-pq-sheet.tsx b/lib/pq/pq-criteria/update-pq-sheet.tsx index 245627e6..fb298e9b 100644 --- a/lib/pq/pq-criteria/update-pq-sheet.tsx +++ b/lib/pq/pq-criteria/update-pq-sheet.tsx @@ -63,6 +63,7 @@ const inputFormatOptions = [ { value: "EMAIL", label: "이메일" },
{ value: "PHONE", label: "전화번호" },
{ value: "NUMBER", label: "숫자" },
+ { value: "NUMBER_WITH_UNIT", label: "숫자+단위" },
{ value: "TEXT_FILE", label: "텍스트 + 파일" }
];
|
