kcscDev/egovframe-template-simple-r.../src/pages/standardCode/viewer.js

164 lines
6.3 KiB
JavaScript
Raw Normal View History

2023-10-12 08:05:49 +00:00
import React, { useState, useEffect, useCallback } from 'react';
2023-10-19 08:30:40 +00:00
import { useLocation, useParams } from 'react-router-dom';
2023-10-13 08:59:12 +00:00
import SbItem from './SbItem'
import {SbContainer, VwDiv, VwPtag} from './Sb.style'
2023-10-12 08:05:49 +00:00
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';
import * as EgovNet from 'api/egovFetch';
function CodeViewer(props) {
2023-10-19 08:30:40 +00:00
const {linkedDocCode} = useParams();
const [docCode, setDocCode] = useState(linkedDocCode !== undefined?linkedDocCode:props.docCode);
2023-10-17 09:01:49 +00:00
const [docName, setDocName] = useState(props.docName);
2023-10-16 09:00:12 +00:00
const [codeTree, setCodeTree] = useState();
const [docSummary, setDocSummary] = useState();
const [docDetail, setDocDetail] = useState();
2023-10-12 08:05:49 +00:00
console.group("viewer");
console.log("[Start] viewer ------------------------------");
console.log("viewer [props] : ", props);
const location = useLocation();
console.log("viewer [location] : ", location);
2023-10-16 09:00:12 +00:00
console.log("viewer [docCode] : ", docCode);
2023-10-12 08:05:49 +00:00
const updateDocCode = (docCode, docName)=>{
2023-10-17 09:01:49 +00:00
setDocCode(docCode);
setDocName(docName);
getCodeDetailInfo(docCode);
}
2023-10-17 09:01:49 +00:00
const getCodeTree = ()=>{
2023-10-17 09:01:49 +00:00
EgovNet.requestFetch(
'/standardCode/getCodeTree.do',
{
method: "POST",
headers: {
'Content-type': 'application/json'
},
body: JSON.stringify({})
},
2023-10-12 08:05:49 +00:00
(resp) => {
2023-10-13 08:59:12 +00:00
const menuData = resp.result.codeTree;
// 코드 목록 트리 구성
// https://garve32.tistory.com/52 참고
const nest = (menuData, parent_seq = null, link = 'parent_seq') =>
menuData.filter(item => item[link] === parent_seq)
.map(item => ({ ...item, childrens: nest(menuData, item.seq) }));
const tree = nest(menuData);
let treeTag = [];
if(tree.length>0){
treeTag.push(
<SbContainer>
2023-10-17 09:01:49 +00:00
{tree.map((subItem) =>
2023-10-18 09:10:44 +00:00
<SbItem item={subItem} openDocCode={docCode} updateDocCode={updateDocCode} />
2023-10-13 08:59:12 +00:00
)}
</SbContainer>
)
}else{
treeTag.push(<div>검색된 결과가 없습니다.</div>); // 코드 목록 초기값
}
setCodeTree(treeTag);
2023-10-17 09:01:49 +00:00
},
function (resp) {
console.log("err response : ", resp);
}
);
}
2023-10-13 08:59:12 +00:00
2023-10-17 09:01:49 +00:00
const getCodeDetailInfo = useCallback((docCode) => {
console.groupCollapsed("EgovMain.getCodeDetailInfo()");
EgovNet.requestFetch(
'/standardCode/getCodeDetailInfo.do',
{
method: "POST",
headers: {
'Content-type': 'application/json'
},
body: JSON.stringify({
docCode: docCode
})
},
(resp) => {
2023-10-13 08:59:12 +00:00
// 목차 구성
let summaryTag = [];
// 문서 전문 구성
let detailTag = [];
if(resp.result.document.length>0){
2023-10-19 05:53:40 +00:00
const reg = /([A-Z]{3,5}(\s[0-9]{2}){3,4})/g
2023-10-13 08:59:12 +00:00
resp.result.document.forEach(function (item, index){
const isTitle = item.full_content.includes(item.group_title);
if(isTitle){
2023-10-17 09:01:49 +00:00
summaryTag.push(
<VwDiv depth={item.cont_level} isTitle={isTitle}>
<VwPtag href="#" isTitle={isTitle} onClick={() => {
document.location.hash="#"+item.cont_type_cd;
}}>
{item.group_title}
</VwPtag>
</VwDiv>
2023-10-17 09:01:49 +00:00
)
}
2023-10-19 05:53:40 +00:00
if(reg.test(item.full_content)){
const docCodeAry = item.full_content.match(reg);
const docCodeLink = [];
for(let i=0; i<docCodeAry.length; i++) {
docCodeLink.push('<a class="docLink" href="/standardCode/viewer/' + docCode + '" target="_blank">' + docCode + '</a>')
}
for(let i=0; i<docCodeAry.length; i++){
const docCode = docCodeAry[i];
item.full_content = item.full_content.replaceAll(docCode, docCodeLink[i]);
}
2023-10-19 05:53:40 +00:00
}
2023-10-13 08:59:12 +00:00
detailTag.push(
<VwDiv depth={item.cont_level} isTitle={isTitle} id={item.cont_type_cd} dangerouslySetInnerHTML={ {__html: item.full_content} }></VwDiv>
2023-10-13 08:59:12 +00:00
)
})
}else{
summaryTag.push(<li key="0">검색된 결과가 없습니다.</li>);
}
setDocSummary(summaryTag);
setDocDetail(detailTag);
2023-10-12 08:05:49 +00:00
},
function (resp) {
console.log("err response : ", resp);
}
);
2023-10-17 09:01:49 +00:00
console.groupEnd("EgovMain.getCodeDetailInfo()");
2023-10-12 08:05:49 +00:00
},[]);
2023-10-16 09:00:12 +00:00
2023-10-17 09:01:49 +00:00
useEffect(() => {
getCodeTree();
getCodeDetailInfo(docCode);
2023-10-17 09:01:49 +00:00
}, []);
2023-10-12 08:05:49 +00:00
console.log("------------------------------viewer [End]");
console.groupEnd("viewer");
return (
<Row className="mx-0">
2023-10-17 09:01:49 +00:00
<Col xs={12} className="border-bottom">
<Row>
<Col xs={3}></Col>
<Col xs={9}>{docCode} {docName}</Col>
</Row>
</Col>
<Col xs={3} className="border-end viewerDiv">
2023-10-13 08:59:12 +00:00
{codeTree}
</Col>
2023-10-17 09:01:49 +00:00
<Col xs={3} className="border-end viewerDiv">
2023-10-13 08:59:12 +00:00
{docSummary}
</Col>
2023-10-17 09:01:49 +00:00
<Col xs={6} className="viewerDiv">
2023-10-13 08:59:12 +00:00
{docDetail}
</Col>
</Row>
2023-10-12 08:05:49 +00:00
);
}
2023-10-18 09:10:44 +00:00
CodeViewer.defaultProps = {
docCode: 'KDS 21 45 00',
docName: '가설교량 및 노면복공 설계기준'
}
2023-10-16 09:00:12 +00:00
2023-10-12 08:05:49 +00:00
export default CodeViewer;