From 1a2241c40e10193c5ff7008a7b7b36cc1d855d96 Mon Sep 17 00:00:00 2001 From: joonhoekim <26rote@gmail.com> Date: Tue, 25 Mar 2025 15:55:45 +0900 Subject: initial commit --- components/ProjectSelector.tsx | 124 +++ .../data-table-column-simple-header.tsx | 61 ++ .../client-data-table/data-table-filter-list.tsx | 662 +++++++++++++ .../client-data-table/data-table-group-list.tsx | 279 ++++++ .../client-data-table/data-table-pagination.tsx | 132 +++ .../client-data-table/data-table-resizer.tsx | 119 +++ .../client-data-table/data-table-sort-list.tsx | 272 ++++++ .../client-data-table/data-table-toolbar.tsx | 100 ++ .../client-data-table/data-table-view-options.tsx | 192 ++++ components/client-data-table/data-table.tsx | 336 +++++++ .../data-table/data-table-advanced-toolbar.tsx | 104 ++ components/data-table/data-table-column-header.tsx | 109 +++ .../data-table/data-table-column-resizable.tsx | 57 ++ .../data-table/data-table-column-simple-header.tsx | 61 ++ .../data-table/data-table-faceted-filter.tsx | 151 +++ components/data-table/data-table-filter-list.tsx | 787 +++++++++++++++ components/data-table/data-table-grobal-filter.tsx | 49 + components/data-table/data-table-group-list.tsx | 317 ++++++ components/data-table/data-table-pagination.tsx | 132 +++ components/data-table/data-table-pin-left.tsx | 95 ++ components/data-table/data-table-pin-right.tsx | 88 ++ components/data-table/data-table-pin.tsx | 146 +++ components/data-table/data-table-resizer.tsx | 98 ++ components/data-table/data-table-skeleton.tsx | 169 ++++ components/data-table/data-table-sort-list.tsx | 370 +++++++ components/data-table/data-table-toolbar.tsx | 119 +++ components/data-table/data-table-view-options.tsx | 191 ++++ components/data-table/data-table.tsx | 209 ++++ components/date-range-picker.tsx | 146 +++ .../document-lists/vendor-doc-list-client.tsx | 81 ++ components/documents/RevisionForm.tsx | 115 +++ components/documents/StageList.tsx | 256 +++++ components/documents/StageListfromSHI.tsx | 187 ++++ components/documents/add-document-dialog.tsx | 515 ++++++++++ components/documents/document-container.tsx | 85 ++ components/documents/project-swicher.tsx | 138 +++ components/documents/vendor-docs.client.tsx | 80 ++ components/documents/view-document-dialog.tsx | 226 +++++ components/faq/FaqCard.tsx | 36 + components/faq/FaqManager.tsx | 192 ++++ components/form-data/form-data-table-columns.tsx | 138 +++ components/form-data/form-data-table.tsx | 545 +++++++++++ components/form-data/update-form-sheet.tsx | 239 +++++ components/kbd.tsx | 54 ++ components/layout/Footer.tsx | 16 + components/layout/Header.tsx | 225 +++++ components/layout/MobileMenu.tsx | 88 ++ components/layout/command-menu.tsx | 139 +++ components/layout/createEmotionCashe.ts | 5 + components/layout/mode-switcher.tsx | 35 + components/layout/providers.tsx | 38 + components/layout/sidebar-nav.tsx | 44 + components/login/login-form-skeleton.tsx | 71 ++ components/login/login-form.tsx | 322 +++++++ components/login/partner-auth-form.tsx | 241 +++++ components/pq/pq-input-tabs.tsx | 780 +++++++++++++++ components/pq/pq-review-detail.tsx | 712 ++++++++++++++ components/pq/pq-review-table.tsx | 340 +++++++ components/settings/account-form.tsx | 263 +++++ components/settings/appearance-form.tsx | 244 +++++ components/shell.tsx | 37 + components/signup/join-form-skeleton.tsx | 75 ++ components/signup/join-form.tsx | 1010 ++++++++++++++++++++ components/system/permissionDialog.tsx | 301 ++++++ components/system/permissionsTree.tsx | 167 ++++ components/ui/accordion.tsx | 57 ++ components/ui/action-dialog.tsx | 54 ++ components/ui/alert-dialog.tsx | 141 +++ components/ui/alert.tsx | 59 ++ components/ui/aspect-ratio.tsx | 7 + components/ui/avatar.tsx | 50 + components/ui/badge.tsx | 36 + components/ui/breadcrumb.tsx | 115 +++ components/ui/button.tsx | 60 ++ components/ui/calendar.tsx | 76 ++ components/ui/card.tsx | 76 ++ components/ui/carousel.tsx | 262 +++++ components/ui/chart.tsx | 365 +++++++ components/ui/checkbox.tsx | 30 + components/ui/collapsible.tsx | 11 + components/ui/command.tsx | 153 +++ components/ui/context-menu.tsx | 200 ++++ components/ui/dialog.tsx | 122 +++ components/ui/drawer.tsx | 118 +++ components/ui/dropdown-menu.tsx | 201 ++++ components/ui/dropzone-primitive.tsx | 192 ++++ components/ui/dropzone.tsx | 87 ++ components/ui/faceted-filter.tsx | 106 ++ components/ui/file-list.tsx | 173 ++++ components/ui/form.tsx | 178 ++++ components/ui/hover-card.tsx | 29 + components/ui/input-otp.tsx | 71 ++ components/ui/input.tsx | 22 + components/ui/label.tsx | 26 + components/ui/menubar.tsx | 236 +++++ components/ui/multi-select.tsx | 379 ++++++++ components/ui/navigation-menu.tsx | 128 +++ components/ui/pagination.tsx | 117 +++ components/ui/popover.tsx | 33 + components/ui/portal.tsx | 7 + components/ui/progress.tsx | 28 + components/ui/radio-group.tsx | 44 + components/ui/resizable.tsx | 45 + components/ui/scroll-area.tsx | 48 + components/ui/select.tsx | 159 +++ components/ui/separator.tsx | 31 + components/ui/sheet.tsx | 140 +++ components/ui/sidebar.tsx | 763 +++++++++++++++ components/ui/skeleton.tsx | 15 + components/ui/slider.tsx | 28 + components/ui/sonner.tsx | 31 + components/ui/sortable.tsx | 336 +++++++ components/ui/switch.tsx | 29 + components/ui/table.tsx | 120 +++ components/ui/tabs.tsx | 55 ++ components/ui/textarea.tsx | 22 + components/ui/toast.tsx | 129 +++ components/ui/toaster.tsx | 35 + components/ui/toasterSonner.tsx | 32 + components/ui/toggle-group.tsx | 61 ++ components/ui/toggle.tsx | 45 + components/ui/tooltip.tsx | 32 + components/vendor-data/project-swicher.tsx | 116 +++ components/vendor-data/sidebar.tsx | 235 +++++ .../vendor-data/tag-table/add-tag-dialog.tsx | 357 +++++++ .../vendor-data/tag-table/tag-table-column.tsx | 196 ++++ components/vendor-data/tag-table/tag-table.tsx | 39 + .../vendor-data/tag-table/tag-type-definitions.ts | 87 ++ components/vendor-data/vendor-data-container.tsx | 231 +++++ 129 files changed, 21181 insertions(+) create mode 100644 components/ProjectSelector.tsx create mode 100644 components/client-data-table/data-table-column-simple-header.tsx create mode 100644 components/client-data-table/data-table-filter-list.tsx create mode 100644 components/client-data-table/data-table-group-list.tsx create mode 100644 components/client-data-table/data-table-pagination.tsx create mode 100644 components/client-data-table/data-table-resizer.tsx create mode 100644 components/client-data-table/data-table-sort-list.tsx create mode 100644 components/client-data-table/data-table-toolbar.tsx create mode 100644 components/client-data-table/data-table-view-options.tsx create mode 100644 components/client-data-table/data-table.tsx create mode 100644 components/data-table/data-table-advanced-toolbar.tsx create mode 100644 components/data-table/data-table-column-header.tsx create mode 100644 components/data-table/data-table-column-resizable.tsx create mode 100644 components/data-table/data-table-column-simple-header.tsx create mode 100644 components/data-table/data-table-faceted-filter.tsx create mode 100644 components/data-table/data-table-filter-list.tsx create mode 100644 components/data-table/data-table-grobal-filter.tsx create mode 100644 components/data-table/data-table-group-list.tsx create mode 100644 components/data-table/data-table-pagination.tsx create mode 100644 components/data-table/data-table-pin-left.tsx create mode 100644 components/data-table/data-table-pin-right.tsx create mode 100644 components/data-table/data-table-pin.tsx create mode 100644 components/data-table/data-table-resizer.tsx create mode 100644 components/data-table/data-table-skeleton.tsx create mode 100644 components/data-table/data-table-sort-list.tsx create mode 100644 components/data-table/data-table-toolbar.tsx create mode 100644 components/data-table/data-table-view-options.tsx create mode 100644 components/data-table/data-table.tsx create mode 100644 components/date-range-picker.tsx create mode 100644 components/document-lists/vendor-doc-list-client.tsx create mode 100644 components/documents/RevisionForm.tsx create mode 100644 components/documents/StageList.tsx create mode 100644 components/documents/StageListfromSHI.tsx create mode 100644 components/documents/add-document-dialog.tsx create mode 100644 components/documents/document-container.tsx create mode 100644 components/documents/project-swicher.tsx create mode 100644 components/documents/vendor-docs.client.tsx create mode 100644 components/documents/view-document-dialog.tsx create mode 100644 components/faq/FaqCard.tsx create mode 100644 components/faq/FaqManager.tsx create mode 100644 components/form-data/form-data-table-columns.tsx create mode 100644 components/form-data/form-data-table.tsx create mode 100644 components/form-data/update-form-sheet.tsx create mode 100644 components/kbd.tsx create mode 100644 components/layout/Footer.tsx create mode 100644 components/layout/Header.tsx create mode 100644 components/layout/MobileMenu.tsx create mode 100644 components/layout/command-menu.tsx create mode 100644 components/layout/createEmotionCashe.ts create mode 100644 components/layout/mode-switcher.tsx create mode 100644 components/layout/providers.tsx create mode 100644 components/layout/sidebar-nav.tsx create mode 100644 components/login/login-form-skeleton.tsx create mode 100644 components/login/login-form.tsx create mode 100644 components/login/partner-auth-form.tsx create mode 100644 components/pq/pq-input-tabs.tsx create mode 100644 components/pq/pq-review-detail.tsx create mode 100644 components/pq/pq-review-table.tsx create mode 100644 components/settings/account-form.tsx create mode 100644 components/settings/appearance-form.tsx create mode 100644 components/shell.tsx create mode 100644 components/signup/join-form-skeleton.tsx create mode 100644 components/signup/join-form.tsx create mode 100644 components/system/permissionDialog.tsx create mode 100644 components/system/permissionsTree.tsx create mode 100644 components/ui/accordion.tsx create mode 100644 components/ui/action-dialog.tsx create mode 100644 components/ui/alert-dialog.tsx create mode 100644 components/ui/alert.tsx create mode 100644 components/ui/aspect-ratio.tsx create mode 100644 components/ui/avatar.tsx create mode 100644 components/ui/badge.tsx create mode 100644 components/ui/breadcrumb.tsx create mode 100644 components/ui/button.tsx create mode 100644 components/ui/calendar.tsx create mode 100644 components/ui/card.tsx create mode 100644 components/ui/carousel.tsx create mode 100644 components/ui/chart.tsx create mode 100644 components/ui/checkbox.tsx create mode 100644 components/ui/collapsible.tsx create mode 100644 components/ui/command.tsx create mode 100644 components/ui/context-menu.tsx create mode 100644 components/ui/dialog.tsx create mode 100644 components/ui/drawer.tsx create mode 100644 components/ui/dropdown-menu.tsx create mode 100644 components/ui/dropzone-primitive.tsx create mode 100644 components/ui/dropzone.tsx create mode 100644 components/ui/faceted-filter.tsx create mode 100644 components/ui/file-list.tsx create mode 100644 components/ui/form.tsx create mode 100644 components/ui/hover-card.tsx create mode 100644 components/ui/input-otp.tsx create mode 100644 components/ui/input.tsx create mode 100644 components/ui/label.tsx create mode 100644 components/ui/menubar.tsx create mode 100644 components/ui/multi-select.tsx create mode 100644 components/ui/navigation-menu.tsx create mode 100644 components/ui/pagination.tsx create mode 100644 components/ui/popover.tsx create mode 100644 components/ui/portal.tsx create mode 100644 components/ui/progress.tsx create mode 100644 components/ui/radio-group.tsx create mode 100644 components/ui/resizable.tsx create mode 100644 components/ui/scroll-area.tsx create mode 100644 components/ui/select.tsx create mode 100644 components/ui/separator.tsx create mode 100644 components/ui/sheet.tsx create mode 100644 components/ui/sidebar.tsx create mode 100644 components/ui/skeleton.tsx create mode 100644 components/ui/slider.tsx create mode 100644 components/ui/sonner.tsx create mode 100644 components/ui/sortable.tsx create mode 100644 components/ui/switch.tsx create mode 100644 components/ui/table.tsx create mode 100644 components/ui/tabs.tsx create mode 100644 components/ui/textarea.tsx create mode 100644 components/ui/toast.tsx create mode 100644 components/ui/toaster.tsx create mode 100644 components/ui/toasterSonner.tsx create mode 100644 components/ui/toggle-group.tsx create mode 100644 components/ui/toggle.tsx create mode 100644 components/ui/tooltip.tsx create mode 100644 components/vendor-data/project-swicher.tsx create mode 100644 components/vendor-data/sidebar.tsx create mode 100644 components/vendor-data/tag-table/add-tag-dialog.tsx create mode 100644 components/vendor-data/tag-table/tag-table-column.tsx create mode 100644 components/vendor-data/tag-table/tag-table.tsx create mode 100644 components/vendor-data/tag-table/tag-type-definitions.ts create mode 100644 components/vendor-data/vendor-data-container.tsx (limited to 'components') diff --git a/components/ProjectSelector.tsx b/components/ProjectSelector.tsx new file mode 100644 index 00000000..50d5b9d5 --- /dev/null +++ b/components/ProjectSelector.tsx @@ -0,0 +1,124 @@ +"use client" + +import * as React from "react" +import { Check, ChevronsUpDown } from "lucide-react" +import { Button } from "@/components/ui/button" +import { Popover, PopoverTrigger, PopoverContent } from "@/components/ui/popover" +import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem } from "@/components/ui/command" +import { cn } from "@/lib/utils" +import { getProjects, type Project } from "@/lib/rfqs/service" + +interface ProjectSelectorProps { + selectedProjectId?: number | null; + onProjectSelect: (project: Project) => void; + placeholder?: string; +} + +export function ProjectSelector({ + selectedProjectId, + onProjectSelect, + placeholder = "프로젝트 선택..." +}: ProjectSelectorProps) { + const [open, setOpen] = React.useState(false) + const [searchTerm, setSearchTerm] = React.useState("") + const [projects, setProjects] = React.useState([]) + const [isLoading, setIsLoading] = React.useState(false) + const [selectedProject, setSelectedProject] = React.useState(null) + + // 모든 프로젝트 데이터 로드 (한 번만) + React.useEffect(() => { + async function loadAllProjects() { + setIsLoading(true); + try { + const allProjects = await getProjects(); + setProjects(allProjects); + + // 초기 선택된 프로젝트가 있으면 설정 + if (selectedProjectId) { + const selected = allProjects.find(p => p.id === selectedProjectId); + if (selected) { + setSelectedProject(selected); + } + } + } catch (error) { + console.error("프로젝트 목록 로드 오류:", error); + } finally { + setIsLoading(false); + } + } + + loadAllProjects(); + }, [selectedProjectId]); + + // 클라이언트 측에서 검색어로 필터링 + const filteredProjects = React.useMemo(() => { + if (!searchTerm.trim()) return projects; + + const lowerSearch = searchTerm.toLowerCase(); + return projects.filter( + project => + project.projectCode.toLowerCase().includes(lowerSearch) || + project.projectName.toLowerCase().includes(lowerSearch) + ); + }, [projects, searchTerm]); + + // 프로젝트 선택 처리 + const handleSelectProject = (project: Project) => { + setSelectedProject(project); + onProjectSelect(project); + setOpen(false); + }; + + return ( + + + + + + + + + 검색 결과가 없습니다 + {isLoading ? ( +
로딩 중...
+ ) : ( + + {filteredProjects.map((project) => ( + handleSelectProject(project)} + > + + {project.projectCode} + - {project.projectName} + + ))} + + )} +
+
+
+
+ ); +} \ No newline at end of file diff --git a/components/client-data-table/data-table-column-simple-header.tsx b/components/client-data-table/data-table-column-simple-header.tsx new file mode 100644 index 00000000..0f3997c6 --- /dev/null +++ b/components/client-data-table/data-table-column-simple-header.tsx @@ -0,0 +1,61 @@ +"use client" + +import * as React from "react" +import { cn } from "@/lib/utils" +import { type Column } from "@tanstack/react-table" +import { ArrowDown, ArrowUp, ChevronsUpDown } from "lucide-react" + +interface DataTableColumnHeaderSimpleProps + extends React.HTMLAttributes { + column: Column + title: string +} + +export function ClientDataTableColumnHeaderSimple({ + column, + title, + className, +}: DataTableColumnHeaderSimpleProps) { + // 정렬 불가능 시 → 제목만 보여주기 + if (!column.getCanSort()) { + return
{title}
+ } + + // 정렬 상태: "asc" | "desc" | false + const sorted = column.getIsSorted() + + // 아이콘 결정 + let icon =