diff options
Diffstat (limited to 'lib/docu-list-rule/document-class/table')
8 files changed, 112 insertions, 16 deletions
diff --git a/lib/docu-list-rule/document-class/table/delete-document-class-dialog.tsx b/lib/docu-list-rule/document-class/table/delete-document-class-dialog.tsx index e81e4df6..08e73a36 100644 --- a/lib/docu-list-rule/document-class/table/delete-document-class-dialog.tsx +++ b/lib/docu-list-rule/document-class/table/delete-document-class-dialog.tsx @@ -29,7 +29,7 @@ import { } from "@/components/ui/drawer" import { deleteDocumentClassCodeGroup, getDocumentClassOptionsCount } from "@/lib/docu-list-rule/document-class/service" -import { documentClasses } from "@/db/schema" +import { documentClasses } from "@/db/schema/docu-list-rule" interface DeleteDocumentClassDialogProps extends React.ComponentPropsWithoutRef<typeof Dialog> { diff --git a/lib/docu-list-rule/document-class/table/delete-document-class-option-dialog.tsx b/lib/docu-list-rule/document-class/table/delete-document-class-option-dialog.tsx index 34ce239f..4ac4eae0 100644 --- a/lib/docu-list-rule/document-class/table/delete-document-class-option-dialog.tsx +++ b/lib/docu-list-rule/document-class/table/delete-document-class-option-dialog.tsx @@ -28,7 +28,7 @@ import { } from "@/components/ui/drawer" import { deleteDocumentClassOption } from "@/lib/docu-list-rule/document-class/service" -import { documentClassOptions } from "@/db/schema" +import { documentClassOptions } from "@/db/schema/docu-list-rule" interface DeleteDocumentClassOptionDialogProps extends React.ComponentPropsWithoutRef<typeof Dialog> { diff --git a/lib/docu-list-rule/document-class/table/document-class-add-dialog.tsx b/lib/docu-list-rule/document-class/table/document-class-add-dialog.tsx index ef9c50a8..dfd1d7f2 100644 --- a/lib/docu-list-rule/document-class/table/document-class-add-dialog.tsx +++ b/lib/docu-list-rule/document-class/table/document-class-add-dialog.tsx @@ -26,11 +26,19 @@ import { FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" - +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from "@/components/ui/select" import { createDocumentClassCodeGroup } from "@/lib/docu-list-rule/document-class/service" +import { getProjectLists } from "@/lib/projects/service" const createDocumentClassSchema = z.object({ + projectId: z.string().min(1, "프로젝트는 필수입니다."), value: z.string().min(1, "Value는 필수입니다."), description: z.string().optional(), }) @@ -46,20 +54,49 @@ export function DocumentClassAddDialog({ }: DocumentClassAddDialogProps) { const [open, setOpen] = React.useState(false) const [isPending, startTransition] = React.useTransition() + const [projects, setProjects] = React.useState<Array<{ id: number; code: string; name: string }>>([]) const form = useForm<CreateDocumentClassSchema>({ resolver: zodResolver(createDocumentClassSchema), defaultValues: { + projectId: "", value: "", description: "", }, mode: "onChange" }) + // 프로젝트 목록 로드 + React.useEffect(() => { + if (open) { + const loadProjects = async () => { + try { + const result = await getProjectLists({ + page: 1, + perPage: 1000, + search: "", + sort: [], + filters: [], + joinOperator: "and", + flags: [] + }) + if (result.data) { + setProjects(result.data) + } + } catch (error) { + console.error("Failed to load projects:", error) + toast.error("프로젝트 목록을 불러오는데 실패했습니다.") + } + } + loadProjects() + } + }, [open]) + async function onSubmit(input: CreateDocumentClassSchema) { startTransition(async () => { try { - const result = await createDocumentClassCodeGroup({ + const result = await createDocumentClassCodeGroup({ + projectId: parseInt(input.projectId), value: input.value, description: input.description, }) @@ -94,16 +131,41 @@ export function DocumentClassAddDialog({ </DialogTrigger> <DialogContent className="sm:max-w-[425px]"> <DialogHeader> - <DialogTitle>Document Class 추가</DialogTitle> - <DialogDescription> - 새로운 Document Class를 추가합니다. - <span className="text-red-500 mt-1 block text-sm">* 표시된 항목은 필수 입력사항입니다.</span> - </DialogDescription> + <DialogTitle>Document Class 추가</DialogTitle> + <DialogDescription> + 새로운 Document Class를 추가합니다. + <span className="text-red-500 mt-1 block text-sm">* 표시된 항목은 필수 입력사항입니다.</span> + </DialogDescription> </DialogHeader> <Form {...form}> <form onSubmit={form.handleSubmit(onSubmit)} className="space-y-4"> <FormField control={form.control} + name="projectId" + render={({ field }) => ( + <FormItem> + <FormLabel>프로젝트 *</FormLabel> + <Select onValueChange={field.onChange} defaultValue={field.value}> + <FormControl> + <SelectTrigger> + <SelectValue placeholder="프로젝트를 선택하세요" /> + </SelectTrigger> + </FormControl> + <SelectContent> + {projects.map((project) => ( + <SelectItem key={project.id} value={project.id.toString()}> + {project.code} - {project.name} + </SelectItem> + ))} + </SelectContent> + </Select> + <FormMessage /> + </FormItem> + )} + /> + + <FormField + control={form.control} name="value" render={({ field }) => ( <FormItem> diff --git a/lib/docu-list-rule/document-class/table/document-class-edit-sheet.tsx b/lib/docu-list-rule/document-class/table/document-class-edit-sheet.tsx index 5ad23b22..32c1976d 100644 --- a/lib/docu-list-rule/document-class/table/document-class-edit-sheet.tsx +++ b/lib/docu-list-rule/document-class/table/document-class-edit-sheet.tsx @@ -28,7 +28,7 @@ import { import { Input } from "@/components/ui/input" import { updateDocumentClassCodeGroup } from "@/lib/docu-list-rule/document-class/service" -import { documentClasses } from "@/db/schema" +import { documentClasses } from "@/db/schema/docu-list-rule" const updateDocumentClassSchema = z.object({ value: z.string().min(1, "Value는 필수입니다."), diff --git a/lib/docu-list-rule/document-class/table/document-class-option-edit-sheet.tsx b/lib/docu-list-rule/document-class/table/document-class-option-edit-sheet.tsx index bc2318c6..8444285e 100644 --- a/lib/docu-list-rule/document-class/table/document-class-option-edit-sheet.tsx +++ b/lib/docu-list-rule/document-class/table/document-class-option-edit-sheet.tsx @@ -26,7 +26,7 @@ import { import { Input } from "@/components/ui/input" import { updateDocumentClassOption } from "@/lib/docu-list-rule/document-class/service" -import { documentClassOptions } from "@/db/schema" +import { documentClassOptions } from "@/db/schema/docu-list-rule" const updateOptionSchema = z.object({ optionCode: z.string().min(1, "코드는 필수입니다."), diff --git a/lib/docu-list-rule/document-class/table/document-class-table-columns.tsx b/lib/docu-list-rule/document-class/table/document-class-table-columns.tsx index 8c391def..ad8494c7 100644 --- a/lib/docu-list-rule/document-class/table/document-class-table-columns.tsx +++ b/lib/docu-list-rule/document-class/table/document-class-table-columns.tsx @@ -107,6 +107,20 @@ export function getColumns({ setRowAction, onDetail }: GetColumnsProps): ColumnD // ---------------------------------------------------------------- const dataColumns: ColumnDef<typeof documentClasses.$inferSelect>[] = [ { + accessorKey: "projectCode", + enableResizing: true, + enableColumnFilter: true, + header: ({ column }) => ( + <DataTableColumnHeaderSimple column={column} title="프로젝트 코드" /> + ), + meta: { + excelHeader: "프로젝트 코드", + type: "text", + }, + cell: ({ row }) => row.getValue("projectCode") ?? "", + minSize: 120 + }, + { accessorKey: "code", enableResizing: true, header: ({ column }) => ( diff --git a/lib/docu-list-rule/document-class/table/document-class-table-toolbar.tsx b/lib/docu-list-rule/document-class/table/document-class-table-toolbar.tsx index 9b43f43d..a9ab660a 100644 --- a/lib/docu-list-rule/document-class/table/document-class-table-toolbar.tsx +++ b/lib/docu-list-rule/document-class/table/document-class-table-toolbar.tsx @@ -3,9 +3,9 @@ import * as React from "react" import { type Table } from "@tanstack/react-table" -import { DeleteDocumentClassDialog } from "./delete-document-class-dialog" -import { DocumentClassAddDialog } from "./document-class-add-dialog" -import { documentClasses } from "@/db/schema" +import { DeleteDocumentClassDialog } from "@/lib/docu-list-rule/document-class/table/delete-document-class-dialog" +import { DocumentClassAddDialog } from "@/lib/docu-list-rule/document-class/table/document-class-add-dialog" +import { documentClasses } from "@/db/schema/docu-list-rule" interface DocumentClassTableToolbarActionsProps { table: Table<typeof documentClasses.$inferSelect> diff --git a/lib/docu-list-rule/document-class/table/document-class-table.tsx b/lib/docu-list-rule/document-class/table/document-class-table.tsx index c66a1395..c9156ff7 100644 --- a/lib/docu-list-rule/document-class/table/document-class-table.tsx +++ b/lib/docu-list-rule/document-class/table/document-class-table.tsx @@ -46,9 +46,9 @@ export function DocumentClassTable({ promises }: DocumentClassTableProps) { ] const { table } = useDataTable({ - data: rawData[0].data as typeof documentClasses.$inferSelect[], + data: rawData[0]?.data as typeof documentClasses.$inferSelect[] || [], columns, - pageCount: rawData[0].pageCount, + pageCount: rawData[0]?.pageCount || 0, enablePinning: true, enableAdvancedFilter: true, initialState: { @@ -59,6 +59,26 @@ export function DocumentClassTable({ promises }: DocumentClassTableProps) { clearOnDefault: true, }) + + // 컴포넌트 마운트 후 그룹핑 설정 + React.useEffect(() => { + if (rawData[0]?.data && table.getState().grouping.length === 0) { + table.setGrouping(["projectCode"]) + } + }, [table, rawData]) + + // 정렬 시 펼쳐진 상태 유지 + React.useEffect(() => { + const currentExpanded = table.getState().expanded + if (Object.keys(currentExpanded).length > 0) { + // 약간의 지연 후 현재 펼쳐진 상태를 다시 설정 + const timer = setTimeout(() => { + table.setExpanded(currentExpanded) + }, 100) + return () => clearTimeout(timer) + } + }, [table.getState().sorting, table]) + return ( <> <DataTable table={table}> |
