summaryrefslogtreecommitdiff
path: root/lib/docu-list-rule/document-class/table
diff options
context:
space:
mode:
Diffstat (limited to 'lib/docu-list-rule/document-class/table')
-rw-r--r--lib/docu-list-rule/document-class/table/document-class-option-add-dialog.tsx161
1 files changed, 152 insertions, 9 deletions
diff --git a/lib/docu-list-rule/document-class/table/document-class-option-add-dialog.tsx b/lib/docu-list-rule/document-class/table/document-class-option-add-dialog.tsx
index 93681c09..31337675 100644
--- a/lib/docu-list-rule/document-class/table/document-class-option-add-dialog.tsx
+++ b/lib/docu-list-rule/document-class/table/document-class-option-add-dialog.tsx
@@ -5,7 +5,7 @@ import { zodResolver } from "@hookform/resolvers/zod"
import { useForm } from "react-hook-form"
import { toast } from "sonner"
import * as z from "zod"
-import { Plus } from "lucide-react"
+import { Plus, Check, ChevronsUpDown } from "lucide-react"
import { Button } from "@/components/ui/button"
import {
@@ -25,12 +25,62 @@ import {
FormLabel,
FormMessage,
} from "@/components/ui/form"
-import { Input } from "@/components/ui/input"
+import {
+ Command,
+ CommandEmpty,
+ CommandGroup,
+ CommandInput,
+ CommandItem,
+} from "@/components/ui/command"
+import {
+ Popover,
+ PopoverContent,
+ PopoverTrigger,
+} from "@/components/ui/popover"
+import { cn } from "@/lib/utils"
+import { useParams } from "next/navigation"
import { createDocumentClassOptionItem } from "@/lib/docu-list-rule/document-class/service"
+import { getProjectCode } from "@/lib/projects/service"
+
+// API 응답 타입
+interface ScheduleSetting {
+ COL_NM: string
+ DC_OBX_USE_YN: string
+ PROJ_COL_NM: string
+ PROJ_COL_NM_EN: string
+ SCD_VIEW_MGNT: string
+ USE_YN1: string
+ USE_YN2: string
+}
+
+// 프로젝트 일정 설정을 가져오는 함수
+async function getProjectKindScheduleSetting(projectCode: string): Promise<ScheduleSetting[]> {
+ try {
+ const response = await fetch(
+ `http://60.100.99.217/DDP/Services/VNDRService.svc/GetProjectKindScheduleSetting?PROJ_NO=${projectCode}`,
+ {
+ method: 'GET',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ }
+ )
+
+ if (!response.ok) {
+ throw new Error('Failed to fetch schedule settings')
+ }
+
+ const data = await response.json()
+ return data.GetProjectKindScheduleSettingResult || []
+ } catch (error) {
+ console.error('Error fetching schedule settings:', error)
+ return []
+ }
+}
const createOptionSchema = z.object({
- optionCode: z.string().min(1, "코드는 필수입니다."),
+ optionCode: z.string().min(1, "옵션을 선택해주세요."),
})
type CreateOptionSchema = z.infer<typeof createOptionSchema>
@@ -42,7 +92,12 @@ interface DocumentClassOptionAddDialogProps {
export function DocumentClassOptionAddDialog({ documentClassId, onSuccess }: DocumentClassOptionAddDialogProps) {
const [open, setOpen] = React.useState(false)
+ const [comboboxOpen, setComboboxOpen] = React.useState(false)
const [isPending, startTransition] = React.useTransition()
+ const [scheduleSettings, setScheduleSettings] = React.useState<ScheduleSetting[]>([])
+ const [isLoading, setIsLoading] = React.useState(false)
+ const params = useParams()
+ const projectId = Number(params?.projectId)
const form = useForm<CreateOptionSchema>({
resolver: zodResolver(createOptionSchema),
@@ -51,6 +106,35 @@ export function DocumentClassOptionAddDialog({ documentClassId, onSuccess }: Doc
},
})
+ // Dialog가 열릴 때 데이터 로드
+ React.useEffect(() => {
+ if (open && projectId) {
+ loadScheduleSettings()
+ }
+ }, [open, projectId])
+
+ const loadScheduleSettings = async () => {
+ setIsLoading(true)
+ try {
+ // 먼저 projectId로 프로젝트 코드 가져오기
+ const projectCode = await getProjectCode(projectId)
+
+ if (!projectCode) {
+ toast.error("프로젝트 코드를 찾을 수 없습니다.")
+ return
+ }
+
+ // 프로젝트 코드로 일정 설정 가져오기
+ const settings = await getProjectKindScheduleSetting(projectCode)
+ setScheduleSettings(settings)
+ } catch (error) {
+ console.error("Error loading schedule settings:", error)
+ toast.error("옵션 목록을 불러오는 중 오류가 발생했습니다.")
+ } finally {
+ setIsLoading(false)
+ }
+ }
+
const handleSubmit = (data: CreateOptionSchema) => {
startTransition(async () => {
try {
@@ -79,6 +163,10 @@ export function DocumentClassOptionAddDialog({ documentClassId, onSuccess }: Doc
form.reset()
}
+ const selectedOption = scheduleSettings.find(
+ (setting) => setting.COL_NM === form.watch("optionCode")
+ )
+
return (
<Dialog open={open} onOpenChange={setOpen}>
<DialogTrigger asChild>
@@ -100,11 +188,66 @@ export function DocumentClassOptionAddDialog({ documentClassId, onSuccess }: Doc
control={form.control}
name="optionCode"
render={({ field }) => (
- <FormItem>
- <FormLabel>코드</FormLabel>
- <FormControl>
- <Input {...field} placeholder="옵션 코드" />
- </FormControl>
+ <FormItem className="flex flex-col">
+ <FormLabel>옵션 선택</FormLabel>
+ <Popover open={comboboxOpen} onOpenChange={setComboboxOpen}>
+ <PopoverTrigger asChild>
+ <FormControl>
+ <Button
+ variant="outline"
+ role="combobox"
+ aria-expanded={comboboxOpen}
+ className={cn(
+ "w-full justify-between",
+ !field.value && "text-muted-foreground"
+ )}
+ disabled={isLoading}
+ >
+ {isLoading
+ ? "로딩 중..."
+ : selectedOption
+ ? `${selectedOption.COL_NM} - ${selectedOption.PROJ_COL_NM}`
+ : "옵션을 선택하세요"}
+ <ChevronsUpDown className="ml-2 h-4 w-4 shrink-0 opacity-50" />
+ </Button>
+ </FormControl>
+ </PopoverTrigger>
+ <PopoverContent className="w-full p-0">
+ <Command>
+ <CommandInput placeholder="옵션 검색..." />
+ <CommandEmpty>
+ {isLoading ? "로딩 중..." : "검색 결과가 없습니다."}
+ </CommandEmpty>
+ <CommandGroup className="max-h-[200px] overflow-auto">
+ {scheduleSettings.map((setting) => (
+ <CommandItem
+ key={setting.COL_NM}
+ value={`${setting.COL_NM} ${setting.PROJ_COL_NM}`}
+ onSelect={() => {
+ form.setValue("optionCode", setting.COL_NM)
+ setComboboxOpen(false)
+ }}
+ >
+ <Check
+ className={cn(
+ "mr-2 h-4 w-4",
+ field.value === setting.COL_NM
+ ? "opacity-100"
+ : "opacity-0"
+ )}
+ />
+ <div className="flex flex-col">
+ <span className="font-medium">{setting.COL_NM}</span>
+ <span className="text-sm text-muted-foreground">
+ {setting.PROJ_COL_NM}
+ </span>
+ </div>
+ </CommandItem>
+ ))}
+ </CommandGroup>
+ </Command>
+ </PopoverContent>
+ </Popover>
<FormMessage />
</FormItem>
)}
@@ -122,4 +265,4 @@ export function DocumentClassOptionAddDialog({ documentClassId, onSuccess }: Doc
</DialogContent>
</Dialog>
)
-} \ No newline at end of file
+} \ No newline at end of file