diff options
| author | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-13 11:05:09 +0000 |
|---|---|---|
| committer | dujinkim <dujin.kim@dtsolution.co.kr> | 2025-08-13 11:05:09 +0000 |
| commit | 33be47506f0aa62b969d82521580a29e95080268 (patch) | |
| tree | 6b7e232f2d78ef8775944ea085a36b3ccbce7d95 /components/pq/project-select.tsx | |
| parent | 2ac95090157c355ea1bd0b8eb1e1e5e2bd56faf4 (diff) | |
(대표님) 입찰, 법무검토, EDP 변경사항 대응, dolce 개선, form-data 개선, 정규업체 등록관리 추가
(최겸) pq 미사용 컴포넌트 및 페이지 제거, 파일 라우트에 pq 적용
Diffstat (limited to 'components/pq/project-select.tsx')
| -rw-r--r-- | components/pq/project-select.tsx | 173 |
1 files changed, 0 insertions, 173 deletions
diff --git a/components/pq/project-select.tsx b/components/pq/project-select.tsx deleted file mode 100644 index 0d6e6445..00000000 --- a/components/pq/project-select.tsx +++ /dev/null @@ -1,173 +0,0 @@ -"use client" - -import * as React from "react" -import { Check, ChevronsUpDown, X } from "lucide-react" -import { Button } from "@/components/ui/button" -import { Popover, PopoverTrigger, PopoverContent } from "@/components/ui/popover" -import { Command, CommandInput, CommandList, CommandEmpty, CommandGroup, CommandItem, CommandSeparator } 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 | null) => void; - placeholder?: string; - showClearOption?: boolean; - clearOptionText?: string; -} - -export function ProjectSelector({ - selectedProjectId, - onProjectSelect, - placeholder = "프로젝트 선택...", - showClearOption = true, - clearOptionText = "일반 PQ 보기" -}: ProjectSelectorProps) { - const [open, setOpen] = React.useState(false) - const [searchTerm, setSearchTerm] = React.useState("") - const [projects, setProjects] = React.useState<Project[]>([]) - const [isLoading, setIsLoading] = React.useState(false) - const [selectedProject, setSelectedProject] = React.useState<Project | null>(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); - }; - - // 선택 해제 처리 - const handleClearSelection = () => { - setSelectedProject(null); - onProjectSelect(null); - setOpen(false); - }; - - return ( - <div className="space-y-1"> - {/* 선택된 프로젝트 정보 표시 (선택된 경우에만) */} - {selectedProject && ( - <div className="flex items-center justify-between px-2"> - <div className="flex flex-col"> - <div className="text-sm font-medium">{selectedProject.projectCode}</div> - <div className="text-xs text-muted-foreground truncate max-w-[300px]"> - {selectedProject.projectName} - </div> - </div> - <Button - variant="ghost" - size="sm" - className="h-7 w-7 p-0 text-muted-foreground hover:text-destructive" - onClick={handleClearSelection} - > - <X className="h-4 w-4" /> - <span className="sr-only">선택 해제</span> - </Button> - </div> - )} - - {/* 셀렉터 컴포넌트 */} - <Popover open={open} onOpenChange={setOpen}> - <PopoverTrigger asChild> - <Button - variant="outline" - role="combobox" - aria-expanded={open} - className="w-full justify-between" - > - {selectedProject ? "프로젝트 변경..." : placeholder} - <ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" /> - </Button> - </PopoverTrigger> - - <PopoverContent className="w-[400px] p-0"> - <Command> - <CommandInput - placeholder="프로젝트 코드/이름 검색..." - onValueChange={setSearchTerm} - /> - <CommandList className="max-h-[300px]"> - <CommandEmpty>검색 결과가 없습니다</CommandEmpty> - - {showClearOption && selectedProject && ( - <> - <CommandGroup> - <CommandItem - onSelect={handleClearSelection} - className="text-blue-600 font-medium" - > - {clearOptionText} - </CommandItem> - </CommandGroup> - <CommandSeparator /> - </> - )} - - {isLoading ? ( - <div className="py-6 text-center text-sm">로딩 중...</div> - ) : ( - <CommandGroup> - {filteredProjects.map((project) => ( - <CommandItem - key={project.id} - value={`${project.projectCode} ${project.projectName}`} - onSelect={() => handleSelectProject(project)} - > - <Check - className={cn( - "mr-2 h-4 w-4", - selectedProject?.id === project.id - ? "opacity-100" - : "opacity-0" - )} - /> - <span className="font-medium">{project.projectCode}</span> - <span className="ml-2 text-gray-500 truncate">- {project.projectName}</span> - </CommandItem> - ))} - </CommandGroup> - )} - </CommandList> - </Command> - </PopoverContent> - </Popover> - </div> - ); -}
\ No newline at end of file |
