"use client" import PageBreadcrumb from "@/components/common/PageBreadCrumb2"; import ComponentCard from '@/components/common/ComponentCard2'; import Button from '@/components/ui/button/Button2'; import { DocsIcon, FileIcon, PlusIcon, TrashBinIcon, TableIcon, PencilIcon } from "@/icons"; import Label from '@/components/form/Label'; import WithLabel from '@/components/form/WithLabel'; import Input from '@/components/form/input/InputField2'; import DatePicker from '@/components/form/date-picker2'; import React, { Key } from "react"; import { useEffect, useState } from 'react'; import api, { convertDateTime3 } from '@/lib/_AG'; import { useModal } from "@/hooks/useModal"; import AddModifyLocationModal, { LocationModalProps } from "./AddModifyLocationModal"; import { useMultiState } from "@/hooks/useMultiState"; import CtTree, { CtTreeNode, expandAndSelectTreeNode, getAllNodeKeys, findParentKeys, findNodeByKey, addNodeByKey, changeNodeByKey, deleteNodeByKey } from "@/components/CtTree"; const SEARCH_LABEL_WIDTH = 24; export default function Location() { const { isOpen, openModal, closeModal } = useModal(); // tree part const [ treeData, setTreeData] = useState([]); const [ selectedTreeKeys, setSelectedTreeKeys] = useState([]); const [ expandedTreeKeys, setExpandedTreeKeys] = useState([]); // search fields const [ name, setName] = useState(""); const [ description, setDescription] = useState(""); const [ address, setAddress] = useState(""); const [ date_start, setDateStart] = useState(""); const [ date_end, setDateEnd] = useState(""); // // form fields const [ form_name, setFormName] = useState(""); const [ form_description, setFormDescription] = useState(""); const [ form_address, setFormAddress] = useState(""); // const modalData = useMultiState({isModify: false, pid: "", name: "", description, address: "" }); // function part // function reqLocationTree(isRoot: boolean, location_id: string) { const params: any = { isRoot: isRoot, id: location_id, date_start: date_start, date_end: date_end, } if (isRoot == true) { params.name = name; params.description = description; params.address = address; } api.post('/api/get-location2.do', params).then((resp) => { console.log(resp); if (resp.data.errCode == 0) { if (resp.data.result.tree.length == 0) { if (isRoot == true) { alert("조회 결과가 없습니다."); setTreeData([]); } return; } if (location_id == "") { setTreeData(resp.data.result.tree); } else { setTreeData(treeData => addNodeByKey(treeData, location_id, resp.data.result.tree)); } } else { alert("일시적으로 사용할 수 없습니다 : " + resp.data.errCode); } }) .catch((err) => console.error(err)) } function reqRemoveLocation(location_id: Key) { const params = { ids: location_id } api.post('/api/remove-location.do', params).then((resp) => { console.log(resp); if (resp.data.errCode == 0) { setTreeData(treeData => deleteNodeByKey(treeData, location_id)); } else { alert("일시적으로 사용할 수 없습니다 : " + resp.data.errCode); } }) .catch((err) => console.error(err)) } function reqModifyLocation(location_id: Key) { if (form_name == "") { alert("위치명을 입력하셔야 합니다."); return; } const params = { location_id: location_id, name: form_name, description: form_description, address: form_address, } api.post('/api/modify-location.do', params).then((resp) => { console.log(resp); if (resp.data.errCode == 0) { const node = findNodeByKey(treeData, location_id); node.key = location_id; node.title = form_name node.name = form_name; node.description = form_description; node.address = form_address; setTreeData(treeData => changeNodeByKey(treeData, location_id, node)); } else { alert("일시적으로 사용할 수 없습니다 : " + resp.data.errCode); } }) .catch((err) => console.error(err)) } // // event processing part // const handleClickSearch = () => { reqLocationTree(true, ""); }; const handleClickTreeExpanded = (key: Key) => { //console.log("handleClickTreeExpanded, key = ", key); const node = findNodeByKey(treeData, key); if (node.children == undefined) reqLocationTree(false, key as string); } const handleClickNode = (key: Key) => { //console.log("handleClickNode, key = ", key); const node = findNodeByKey(treeData, key); //console.log("findNodeByKey = ", node); setFormName(node.name); setFormDescription(node.description); setFormAddress(node.address); } const handleClickAdd = () => { modalData.reset(); if (selectedTreeKeys.length > 0) { modalData.set("pid", String(selectedTreeKeys[0])); } //... expandAndSelectTreeNode(treeData, String(selectedTreeKeys[0]), setSelectedTreeKeys, expandedTreeKeys, setExpandedTreeKeys); openModal(); }; const handleClickModify = () => { if (selectedTreeKeys.length <= 0) return; const node = findNodeByKey(treeData, selectedTreeKeys[0]); if (confirm("수정 하시겠습니까?")) { reqModifyLocation(selectedTreeKeys[0]); } }; const handleClickDelete = () => { if (selectedTreeKeys.length <= 0) return; const node = findNodeByKey(treeData, selectedTreeKeys[0]); if (confirm("'" + node.title + "' 사업자를 삭제하시겠습니까?")) { //const newTreeData = deleteNodeByKey(treeData, selectedTreeKeys[0]); //setTreeData(newTreeData); reqRemoveLocation(selectedTreeKeys[0]); } }; const handleModalOk = (insertedId: number) => { closeModal(); const newNode = { isModify: false, key: String(insertedId), title: modalData.values.name, pid: modalData.values.pid, name: modalData.values.name, description: modalData.values.description, address: modalData.values.address, isLeaf: false, }; setTreeData(treeData => addNodeByKey(treeData, newNode.pid, newNode)); setFormName(newNode.name); setFormDescription(newNode.description); setFormAddress(newNode.address); //... setTimeout(() => { // expandAndSelectTreeNode(treeData, newNode.pid, setSelectedTreeKeys, expandedTreeKeys, setExpandedTreeKeys); //}, 2500); //queueMicrotask(() => { //console.log('렌더링 후 실행'); //expandAndSelectTreeNode(treeData, insertedId, setSelectedTreeKeys, expandedTreeKeys, setExpandedTreeKeys); //}); }; useEffect(() => { //reqLocationTree(true, ''); }, []); return (
}>
setName(e.target.value)} onKeyDown={(e) => {if (e.key === "Enter") handleClickSearch()}} /> setDescription(e.target.value)} onKeyDown={(e) => {if (e.key === "Enter") handleClickSearch()}} /> setAddress(e.target.value)} onKeyDown={(e) => {if (e.key === "Enter") handleClickSearch()}} />

위치를 선택하고 [신규추가] 버튼을 클릭하면 하위에 추가됩니다.

setFormName(e.target.value)} />
setFormDescription(e.target.value)} />
setFormAddress(e.target.value)} />
); }