Compare commits

..

No commits in common. "aa3f52b7cfec74d2e555a3e4b039434d54451a96" and "1406047290fe685cb288e1f7ab07cc4ad7e0192a" have entirely different histories.

79 changed files with 863 additions and 2399 deletions

View File

@ -3146,12 +3146,6 @@
"@types/node": "*"
}
},
"@types/cookie": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
"dev": true
},
"@types/d3-array": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz",
@ -3266,16 +3260,6 @@
"@types/unist": "^2"
}
},
"@types/hoist-non-react-statics": {
"version": "3.3.5",
"resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
"integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==",
"dev": true,
"requires": {
"@types/react": "*",
"hoist-non-react-statics": "^3.3.0"
}
},
"@types/html-minifier-terser": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz",
@ -5567,11 +5551,6 @@
"domelementtype": "^2.2.0"
}
},
"dompurify": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.5.tgz",
"integrity": "sha512-lwG+n5h8QNpxtyrJW/gJWckL+1/DQiYMX8f7t8Z2AZTPw1esVrqjI63i7Zc2Gz0aKzLVMYC1V1PL/ky+aY/NgA=="
},
"domutils": {
"version": "2.8.0",
"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
@ -11128,17 +11107,6 @@
"warning": "^4.0.3"
}
},
"react-cookie": {
"version": "7.1.4",
"resolved": "https://registry.npmjs.org/react-cookie/-/react-cookie-7.1.4.tgz",
"integrity": "sha512-wDxxa/HYaSXSMlyWJvJ5uZTzIVtQTPf1gMksFgwAz/2/W3lCtY8r4OChCXMPE7wax0PAdMY97UkNJedGv7KnDw==",
"dev": true,
"requires": {
"@types/hoist-non-react-statics": "^3.3.5",
"hoist-non-react-statics": "^3.3.2",
"universal-cookie": "^7.0.0"
}
},
"react-copy-to-clipboard": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz",
@ -13017,24 +12985,6 @@
"crypto-random-string": "^2.0.0"
}
},
"universal-cookie": {
"version": "7.1.4",
"resolved": "https://registry.npmjs.org/universal-cookie/-/universal-cookie-7.1.4.tgz",
"integrity": "sha512-Q+DVJsdykStWRMtXr2Pdj3EF98qZHUH/fXv/gwFz/unyToy1Ek1w5GsWt53Pf38tT8Gbcy5QNsj61Xe9TggP4g==",
"dev": true,
"requires": {
"@types/cookie": "^0.6.0",
"cookie": "^0.6.0"
},
"dependencies": {
"cookie": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"dev": true
}
}
},
"universalify": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",

View File

@ -17,7 +17,6 @@
"apexcharts": "^3.45.2",
"bootstrap": "^5.3.2",
"date-fns": "^3.2.0",
"dompurify": "^3.1.5",
"prop-types": "^15.8.1",
"qs": "^6.11.0",
"react": "^18.2.0",
@ -45,8 +44,7 @@
"devDependencies": {
"@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^13.3.0",
"@testing-library/user-event": "^13.5.0",
"react-cookie": "^7.1.4"
"@testing-library/user-event": "^13.5.0"
},
"scripts": {
"start": "react-scripts start",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 535 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 554 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 563 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 880 B

View File

@ -1,8 +1,7 @@
import RootRoutes from './routes';
import ThemeCustomization from 'themes';
import ScrollTop from 'components/ScrollTop';
import React, { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
import React from 'react';
import 'bootstrap/dist/css/bootstrap.min.css';
import './css/base.css';
@ -12,34 +11,17 @@ import './css/page.css';
import './css/response.css';
import './css/Custom/customMain.css'
import URL from "constants/url";
function App() {
return (
<ThemeCustomization>
<ScrollTop>
<ScrollControl />
<RootRoutes />
</ScrollTop>
</ThemeCustomization>
)
}
const ScrollControl = () => {
const location = useLocation();
useEffect(() => {
const hideFooterPaths = [URL.STANDARD_CODE_VIEWER, URL.STANDARD_CODE_LIST];
if (hideFooterPaths.some(path => location.pathname.includes(path))) {
document.body.style.overflow = 'hidden';
} else {
document.body.style.overflow = '';
}
}, [location]);
return null;
};
console.log("process.env.NODE_ENV", process.env.NODE_ENV);
console.log("process.env.REACT_APP_EGOV_CONTEXT_URL", "[" + process.env.REACT_APP_EGOV_CONTEXT_URL + "]");

View File

@ -1,16 +1,14 @@
import React, { useState, useCallback } from 'react';
import {Link, NavLink} from 'react-router-dom';
import URL from "constants/url";
import URL from "../constants/url";
import Collapse from 'react-bootstrap/Collapse'
function EgovFooter() {
const [toggle, setToggle] = useState(false);
const toggleFunc = useCallback(() => setToggle(!toggle), [toggle]);
const hideFooterPaths = [URL.STANDARD_CODE_VIEWER, URL.STANDARD_CODE_LIST];
const currentPath = window.location.pathname;
if(hideFooterPaths.some(path => currentPath.includes(path))){
if(window.location.pathname.includes("/standardCode/viewer")){
return null;
}else{
return (

View File

@ -92,13 +92,20 @@ function EgovHeader({ loginUser, onChangeLogin }) {
// <!-- header -->
<div className="header">
<div className="inner">
<Row className="logo pt-4">
<Col xs={3}>
<div className="row logo w-100 justify-content-between pt-3">
<div className="col-3">
<Link to={URL.MAIN} className="w"><img src="/assets/images/logo.png" alt="국가건설기준센터" /></Link>
<Link to={URL.MAIN} className="m"><img src="/assets/images/logo_m.png" alt="국가건설기준센터" /></Link>
</Col>
<Col xs={6} className="text-center">
{/*<img src="/assets/images/copy.png" alt="국가건설기준센터" className="align-self-end" />*/}
</div>
<div className="col-6 d-flex justify-content-center align-items-end"><img src="/assets/images/copy.png" alt="국가건설기준센터" className="align-self-end" /></div>
<div className="col-3 d-flex justify-content-end align-items-end">
<div className="col-1 person" onClick={myHandler}></div>
<div className="col-1 right_a" onClick={allMenuControl}>
<button type="button" className="btn btnAllMenu" title="전체메뉴 닫힘">전체메뉴</button>
<button type="button" className="btn mobile btnAllMenuM" title="전체메뉴 닫힘">전체메뉴</button>
</div>
</div>
</div>
<div className="search">
<div className="search_input">
<form className="row justify-content-between w-100 m-0">
@ -118,65 +125,35 @@ function EgovHeader({ loginUser, onChangeLogin }) {
</form>
</div>
</div>
</Col>
<Col xs={3}>
<Row className="justify-content-end">
<Col xs={"auto"} className="person mt-2" onClick={myHandler}></Col>
<Col xs={"auto"} className="right_a mt-2" onClick={allMenuControl}>
<button type="button" className="btn btnAllMenu" title="전체메뉴 닫힘">전체메뉴</button>
<button type="button" className="btn mobile btnAllMenuM" title="전체메뉴 닫힘">전체메뉴</button>
</Col>
<div className="topcode d-flex justify-content-center w-100">
<div className={showMore ? 'topcode_c justify-content-center' : 'topcode_n justify-content-center'}>
<Row className="">
<Col><a href="/standardCode/list/1010" title="공통코드" className={"topcodebnt"}>공통코드</a></Col>
<Col><a href="/standardCode/list/101011" title="지반코드" className={"topcodebnt"}>지반코드</a></Col>
<Col><a href="/standardCode/list/101014" title="구조코드" className={"topcodebnt"}>구조코드</a></Col>
<Col><a href="/standardCode/list/101017" title="내진코드" className={"topcodebnt"}>내진코드</a></Col>
<Col><a href="/standardCode/list/102021" title="가설코드" className={"topcodebnt"}>가설코드</a></Col>
<Col><a href="/standardCode/list/102024" title="교량코드" className={"topcodebnt"}>교량코드</a></Col>
<Col><a href="/standardCode/list/102027" title="터널코드" className={"topcodebnt"}>터널코드</a></Col>
<Col><a href="/standardCode/list/102029" title="공동구코드" className={"topcodebnt"}>공동구코드</a></Col>
<Col><a href="/standardCode/list/102031" title="설비코드" className={"topcodebnt"}>설비코드</a></Col>
<Col><Link onClick={toggleShowMore} title="..." className={"topcodebnt"}>{showMore ? (<b> </b>) : (<b> · · · </b>)}</Link></Col>
</Row>
</Col>
{showMore && (
<Row className="">
<Col><a href="/standardCode/list/102034" title="조경코드" className="topcodebnt">조경코드</a></Col>
<Col><a href="/standardCode/list/102041" title="건축코드" className="topcodebnt">건축코드</a></Col>
<Col><a href="/standardCode/list/102044" title="도로코드" className="topcodebnt">도로코드</a></Col>
<Col><a href="/standardCode/list/102047" title="철도코드" className="topcodebnt">철도코드</a></Col>
<Col><a href="/standardCode/list/102051" title="하천코드" className="topcodebnt">하천코드</a></Col>
<Col><a href="/standardCode/list/102054" title="댐코드" className="topcodebnt">댐코드</a></Col>
<Col><a href="/standardCode/list/102057" title="상수도코드" className="topcodebnt">상수도코드</a></Col>
<Col><a href="/standardCode/list/102061" title="하수도코드" className="topcodebnt">하수도코드</a></Col>
<Col><a href="/standardCode/list/102067" title="농업기반코드" className="topcodebnt">농업기반코드</a></Col>
</Row>
{/*<div className="search">*/}
{/* <div className="search_input">*/}
{/* <form className="row justify-content-between w-100 m-0">*/}
{/* <div className="col-2">*/}
{/* <select name="" className="form-select shadow-none">*/}
{/* <option value="">코드명</option>*/}
{/* <option value="">목차</option>*/}
{/* <option value="">본문</option>*/}
{/* </select>*/}
{/* </div>*/}
{/* <div className="col-10 d-flex justify-content-between">*/}
{/* <div className="col-11"><input type="text" className="form-control shadow-none" placeholder="검색어를 입력하세요." lang="ko" /></div>*/}
{/* <div className="col-1 text-center">*/}
{/* <button type="button" className="topsearch" onClick={SearchHandler}></button>*/}
{/* </div>*/}
{/* </div>*/}
{/* </form>*/}
{/* </div>*/}
{/*</div>*/}
{/*<div className="topcode d-flex justify-content-center w-100">*/}
{/* <div className={showMore ? 'topcode_c justify-content-center' : 'topcode_n justify-content-center'}>*/}
{/* <Row className="">*/}
{/* <Col><a href="/standardCode/list/1010" title="공통코드" className={"topcodebnt"}>공통코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/101011" title="지반코드" className={"topcodebnt"}>지반코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/101014" title="구조코드" className={"topcodebnt"}>구조코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/101017" title="내진코드" className={"topcodebnt"}>내진코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/102021" title="가설코드" className={"topcodebnt"}>가설코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/102024" title="교량코드" className={"topcodebnt"}>교량코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/102027" title="터널코드" className={"topcodebnt"}>터널코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/102029" title="공동구코드" className={"topcodebnt"}>공동구코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/102031" title="설비코드" className={"topcodebnt"}>설비코드</a></Col>*/}
{/* <Col><Link onClick={toggleShowMore} title="..." className={"topcodebnt"}>{showMore ? (<b> </b>) : (<b> · · · </b>)}</Link></Col>*/}
{/* </Row>*/}
{/* {showMore && (*/}
{/* <Row className="">*/}
{/* <Col><a href="/standardCode/list/102034" title="조경코드" className="topcodebnt">조경코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/102041" title="건축코드" className="topcodebnt">건축코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/102044" title="도로코드" className="topcodebnt">도로코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/102047" title="철도코드" className="topcodebnt">철도코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/102051" title="하천코드" className="topcodebnt">하천코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/102054" title="댐코드" className="topcodebnt">댐코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/102057" title="상수도코드" className="topcodebnt">상수도코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/102061" title="하수도코드" className="topcodebnt">하수도코드</a></Col>*/}
{/* <Col><a href="/standardCode/list/102067" title="농업기반코드" className="topcodebnt">농업기반코드</a></Col>*/}
{/* </Row>*/}
{/* )}*/}
{/* </div>*/}
{/*</div>*/}
)}
</div>
</div>
{/*<h1 className="logo">*/}
{/* <Link to={URL.MAIN} className="w">*/}

View File

@ -1,131 +1,18 @@
import React, {useState} from 'react';
import React from 'react';
import { Link } from 'react-router-dom';
import { NavLink } from 'react-router-dom';
import URL from 'constants/url';
import Button from 'react-bootstrap/Button'
import Row from 'react-bootstrap/Row'
import Col from 'react-bootstrap/Col'
import { Box, Tabs, Tab, Typography } from '@mui/material';
function a11yProps(index) {
return {
id: `wrapped-tab-${index}`,
'aria-controls': `wrapped-tabpanel-${index}`,
};
}
function TabPanel(props) {
const { children, value, index, ...other } = props;
return (
<div
role="tabpanel"
hidden={value !== index}
id={`wrapped-tabpanel-${index}`}
aria-labelledby={`wrapped-tab-${index}`}
{...other}
>
{value === index && (
<Box sx={{ p: 3 }}>
<Typography>{children}</Typography>
</Box>
)}
</div>
);
}
function EgovLeftNavSupport() {
const [value, setValue] = useState(0);
const handleChange = (event, newValue) => {
setValue(newValue);
};
return (
<div className="nav3">
<div className="nav">
<div className="inner">
<div className="menu11">
<Row className={"m-0 pb-4"}>
<Col xs={"auto"} className={"person"}></Col>
<Col className={"pt-2 ps-0"}>
<Row>
<Col><span className={"fs-5 fw-bold"}>관리자</span> </Col>
</Row>
<Row className={"f_11"}>
<Col xs={"auto"}><Link to={URL.CHANGE_PW} className={"text-secondary"}>비밀번호변경</Link></Col>
<Col xs={"auto"}><Link to="" className={"text-secondary"}>회원탈퇴</Link></Col>
</Row>
</Col>
</Row>
<Box sx={{ borderBottom: 2, borderColor: '#22498E' }}>
<Tabs
value={value}
onChange={handleChange}
indicatorColor="secondary"
textColor="#fff"
>
<Tab value={0} {...a11yProps(0)} sx={{ fontWeight: 700, width: '50%', fontSize: 14 }} label="내 Q&A" wrapped />
<Tab value={1} {...a11yProps(1)} sx={{ fontWeight: 700, width: '50%', fontSize: 14 }} label="다운로드" />
</Tabs>
</Box>
<TabPanel value={value} index={0} className={"myPanel"}>
{/*<Row>*/}
{/* <Col className={"text-center py-4 f_14"}>질문한 Q&A가 없습니다.</Col>*/}
{/*</Row>*/}
<Row className={"f_11"}>
<Col xs={8} className="text-truncate">일반 건축 콘크리트공사 시공 허용 오차 기준 질의</Col>
<Col xs={4} className={"text-end p-0"}>2023.01.02</Col>
</Row>
<Row className={"f_11"}>
<Col xs={8} className="text-truncate">매입형 합성기둥의 설계기준 관련</Col>
<Col xs={4} className={"text-end p-0"}>2023.01.02</Col>
</Row>
<Row className={"f_11"}>
<Col xs={8} className="text-truncate">일반 건축 콘크리트공사 시공 허용 오차 기준 질의</Col>
<Col xs={4} className={"text-end p-0"}>2023.01.02</Col>
</Row>
<Row className={"f_11"}>
<Col xs={8} className="text-truncate">매입형 합성기둥의 설계기준 관련</Col>
<Col xs={4} className={"text-end p-0"}>2023.01.02</Col>
</Row>
<Row className={"f_11"}>
<Col xs={8} className="text-truncate">일반 건축 콘크리트공사 시공 허용 오차 기준 질의</Col>
<Col xs={4} className={"text-end p-0"}>2023.01.02</Col>
</Row>
<Row className={"f_11"}>
<Col xs={8} className="text-truncate">매입형 합성기둥의 설계기준 관련</Col>
<Col xs={4} className={"text-end p-0"}>2023.01.02</Col>
</Row>
</TabPanel>
<TabPanel value={value} index={1} className={"myPanel"}>
{/*<Row>*/}
{/* <Col className={"text-center py-4 f_14"}>다운로드한 파일이 없습니다.</Col>*/}
{/*</Row>*/}
<Row className={"f_11"}>
<Col xs={8} className="text-truncate">매입형 합성기둥의 설계기준 관련</Col>
<Col xs={4} className={"text-end p-0"}>2024.01.02</Col>
</Row>
<Row className={"f_11"}>
<Col xs={8} className="text-truncate">일반 건축 콘크리트공사 시공 허용 오차 기준 질의</Col>
<Col xs={4} className={"text-end p-0"}>2024.01.02</Col>
</Row>
<Row className={"f_11"}>
<Col xs={8} className="text-truncate">매입형 합성기둥의 설계기준 관련</Col>
<Col xs={4} className={"text-end p-0"}>2024.01.02</Col>
</Row>
<Row className={"f_11"}>
<Col xs={8} className="text-truncate">일반 건축 콘크리트공사 시공 허용 오차 기준 질의</Col>
<Col xs={4} className={"text-end p-0"}>2023.01.02</Col>
</Row>
<Row className={"f_11"}>
<Col xs={8} className="text-truncate">매입형 합성기둥의 설계기준 관련</Col>
<Col xs={4} className={"text-end p-0"}>2023.01.02</Col>
</Row>
<Row className={"f_11"}>
<Col xs={8} className="text-truncate">일반 건축 콘크리트공사 시공 허용 오차 기준 질의</Col>
<Col xs={4} className={"text-end p-0"}>2023.01.02</Col>
</Row>
</TabPanel>
</div>
<div className="mt-3"><Link to={URL.SUPPORT_QNA}><Button variant={"22498E"} className={"w-100"} >+ 질문 작성</Button></Link> </div>
<h2>고객지원</h2>
<ul className="menu4">
<li><NavLink to={URL.SUPPORT_DOWNLOAD} className={({ isActive }) => (isActive ? "cur" : "")}>자료실</NavLink></li>
<li><NavLink to={URL.SUPPORT_QNA} className={({ isActive }) => (isActive ? "cur" : "")}>묻고답하기</NavLink></li>
<li><NavLink to={URL.SUPPORT_APPLY} className={({ isActive }) => (isActive ? "cur" : "")}>서비스신청</NavLink></li>
</ul>
</div>
</div>
);

View File

@ -35,7 +35,7 @@ const URL = {
SUPPORT : "/support", // 고객지원
SUPPORT_QNA : "/support/qna", // 게시판/QNA 소개
SUPPORT_LIST : "/support/list/:BbsCode", // 게시판/리스트
SUPPORT_DETAIL : "/support/detail/:bbsContSeq", // 게시판/상세보기
SUPPORT_DETAIL : "/support/detail/:BbsCode", // 게시판/상세보기
SUPPORT_CREATE : "/support/create/:BbsCode", // 게시판/글쓰기
SUPPORT_LIST_NOCODE : "/support/list",
SUPPORT_DETAIL_NOCODE : "/support/detail", // 게시판/상세보기

View File

@ -12,55 +12,49 @@
background-color: #212121;
}
/*.code_list .head >span:nth-child(1),.code_list .result .List_Codes >div:nth-child(1){*/
/* text-align: left;*/
/* width: 12%;*/
/*}*/
/*.code_list .head >span:nth-child(2),.code_list .result .List_Codes >div:nth-child(2){*/
/* text-align: left;*/
/* width: 15%;*/
/*}*/
/*.code_list .head >span:nth-child(3),.code_list .result .List_Codes >div:nth-child(3){*/
/* text-align: left;*/
/* width: 10%;*/
/*}*/
/*.code_list .head >span:nth-child(4),.code_list .result .List_Codes >div:nth-child(4) {*/
/* width: 34%;*/
/* text-align: left;*/
/*}*/
/*.code_list .head >span:nth-child(5),.code_list .result .List_Codes >div:nth-child(5){*/
/* width: 15%;*/
/*}*/
/*.code_list .head >span:nth-child(6),.code_list .result .List_Codes >div:nth-child(6){*/
/* width: 15%;*/
/*}*/
/*.code_list .head > span:nth-child(7),.code_list .result .List_Codes >div:nth-child(7){*/
/* width: 7%;*/
/*}*/
/*.code_list .result .List_Codes >div:nth-child(1),*/
/*.code_list .result .List_Codes >div:nth-child(2),*/
/*.code_list .result .List_Codes >div:nth-child(3),*/
/*.code_list .result .List_Codes >div:nth-child(4),*/
/*.code_list .result .List_Codes >div:nth-child(5),*/
/*.code_list .result .List_Codes >div:nth-child(6),*/
/*.code_list .result .List_Codes >div:nth-child(7){*/
/* font-size: 14px;*/
/*}*/
.code_list .head >span:nth-child(1),.code_list .result .List_Codes >div:nth-child(1){
text-align: left;
width: 12%;
}
.code_list .head >span:nth-child(2),.code_list .result .List_Codes >div:nth-child(2){
text-align: left;
width: 15%;
}
.code_list .head >span:nth-child(3),.code_list .result .List_Codes >div:nth-child(3){
text-align: left;
width: 10%;
}
.code_list .head >span:nth-child(4),.code_list .result .List_Codes >div:nth-child(4) {
width: 34%;
text-align: left;
}
.code_list .head >span:nth-child(5),.code_list .result .List_Codes >div:nth-child(5){
width: 15%;
}
.code_list .head >span:nth-child(6),.code_list .result .List_Codes >div:nth-child(6){
width: 15%;
}
.code_list .head > span:nth-child(7),.code_list .result .List_Codes >div:nth-child(7){
width: 7%;
}
.code_list .result .List_Codes >div:nth-child(1),
.code_list .result .List_Codes >div:nth-child(2),
.code_list .result .List_Codes >div:nth-child(3),
.code_list .result .List_Codes >div:nth-child(4),
.code_list .result .List_Codes >div:nth-child(5),
.code_list .result .List_Codes >div:nth-child(6),
.code_list .result .List_Codes >div:nth-child(7){
font-size: 14px;
}
/*.standard_code_modal .head >span:nth-child(1),.standard_code_modal .result .list_item >div:nth-child(1){width: 12%;}*/
/*.standard_code_modal .head >span:nth-child(2),.standard_code_modal .result .list_item >div:nth-child(2){width: 15%;}*/
/*.standard_code_modal .head >span:nth-child(3),.standard_code_modal .result .list_item >div:nth-child(3){width: 10%;}*/
.standard_code_modal .head >span:nth-child(1),.standard_code_modal .result .list_item >div:nth-child(1){width: 12%;}
.standard_code_modal .head >span:nth-child(2),.standard_code_modal .result .list_item >div:nth-child(2){width: 15%;}
.standard_code_modal .head >span:nth-child(3),.standard_code_modal .result .list_item >div:nth-child(3){width: 10%;}
.standard_code_result{
max-height: calc(100vh - 238px);
overflow-y: scroll;
max-height: 520px;
overflow-y: auto;
}
.standard_code_result_detail{
max-height: calc(100vh - 577px);
overflow-y: scroll;
}
.download_list{
max-height: 550px;
overflow-y: auto;
@ -73,7 +67,7 @@
max-width: 100%;
}
.listTableDiv{
padding: 0 10px !important;
padding: 0 !important;
}
.vieweratag{
color: black;
@ -89,14 +83,8 @@
color: #fff;
}
/* 메인 슬라이더 도트 위치 조정 */
.slick-dots {
position: absolute;
bottom: 8%;
left: 50%;
transform: translate(-50%, 50%);
z-index: 10;
}

View File

@ -64,10 +64,8 @@ button {cursor: pointer;}
.w_full {width: 100%;}
.w_half {width: 50%;}
.w_quarter {width: 25%;}
.w_20 {width: 20px;}
.w_50 {width: 50px;}
.w_70 {width: 70px;}
.w_75 {width: 75px;}
.w_80 {width: 80px;}
.w_100 {width: 100px;}
.w_120 {width: 120px;}
@ -84,8 +82,6 @@ button {cursor: pointer;}
.mw_400 {max-width: 400px;}
.mw_450 {max-width: 450px;}
.h_10 {height: 10px;}
.h_20 {height: 20px;}
.h_25 {height: 25px;}
.h_30 {height: 30px;}
.h_40 {height: 40px;}
@ -101,7 +97,6 @@ button {cursor: pointer;}
.f_15 {font-size: 15px;}
.f_16 {font-size: 16px;}
.f_17 {font-size: 17px;}
.f_30 {font-size: 30px;}
/* 여백 */
@ -113,12 +108,10 @@ button {cursor: pointer;}
.bg-fa {background: #FAFAFA !important;}
.bg-224 {background: #22498E !important;}
.bg-f8f {background: #F8FAFC !important;}
.text-4c6 {color: #4C6C84 !important;}
.text-222 {color: #222222 !important;}
.text-224 {color: #22498E !important;}
.clickable{cursor: pointer;}
.cursor{cursor: pointer;}
/*.MuiTab-root.Mui-selected { color: #22498E; }*/

View File

@ -66,10 +66,6 @@
.board_list .result .list_item1 {display: table; width: 100%; table-layout: fixed; margin-left: 0px;}
.board_list .result .list_item1 > div {display: table-cell; padding: 5px 0; border-bottom: 1px solid #dde2e5; color: #666; font-size: 14px; text-align: center; vertical-align: middle; }
/* 건설기준 리스트 */
.board_list .result .list_item2 {display: table; width: 100%; table-layout: fixed; margin-left: 0px;}
.board_list .result .list_item2 > div {display: table-cell; padding-top: 5px; border-bottom: 1px solid #dde2e5; color: #666; font-size: 14px; text-align: center; vertical-align: middle; }
.board_bot {margin-top: 40px;}
.paging {text-align: center;}
@ -259,10 +255,9 @@ select::-ms-expand {display:none;}
/* 건설기준코드list 설계기준 표준시방서 전문시방서 통합 다운로드 탭 */
.right_col {display: flex; justify-content: space-between; align-items: center;}
.mini_board ul {display: flex; list-style: none; padding: 0; margin: 0;}
.tab {width: 100px; padding: 5px 0; cursor: pointer; border: 1px solid #ccc; border-radius: 10px; transition: background-color 0.3s;}
.tab {padding: 5px 10px; margin-right: 10px; cursor: pointer; border: 1px solid #ccc; border-radius: 5px; transition: background-color 0.3s;}
.tab:hover {background-color: #f0f0f0;}
.active {background-color: #22498E; color: #fff;}
.nav-item a {color: #6C6C6C;}
.active {background-color: #007bff; color: #fff;}
.f_input {height: 46px; padding: 0 20px; border: 0; border-radius: 5px; color: #222; font-size: 16px; background: #f7f7f7;}
.f_input1 {width:200px; height: 32px; padding: 0 30px 0 0; border: 0; border-radius: 5px; color: #222; font-size: 16px; background: #f7f7f7 url(css/images/bg_btn_calendar.png) no-repeat;background-position: right center; background-size: 32px 32px; cursor: pointer;} /* made by lim f_input1*/

View File

@ -4,7 +4,7 @@ body {min-width: 1400px;}
/*.header {position: relative;}*/
.header::after {content: ""; display: block; left: 0; bottom: 0; width: 100%; height: 1px; background: #dedede;}
.header > .inner {max-width: 1400px; height: 110px; margin: 0 auto; } /* position: relative; padding: 0 50px; */
.header > .inner {max-width: 1400px; height: 210px; margin: 0 auto; } /* position: relative; padding: 0 50px; */
.header h1 {display: inline-block; margin-top: 32px;}
.header h1 a,
.header h1 img {display: block;}
@ -28,8 +28,8 @@ body {min-width: 1400px;}
.header .right_a .btn.active {background: url(css/images/ico_allmenu_close.png) no-repeat center; background-size: 22px 18px;}
.header .right_a .btn.mobile {display: none;}
.header .search {height:66px; padding:0; margin: 0 auto; }
.header .search .search_input {max-width: 734px; width: calc(100% - 40px); height:52px; margin: 0 auto; border: 2px solid #004994; border-radius: 20px; padding: 5px}
.header .search {height:96px; padding:24px 0px 10px; margin: 0 auto; }
.header .search .search_input {max-width: 734px; width: calc(100% - 40px); height:62px; margin: 0 auto; border: 2px solid #004994; border-radius: 20px; padding: 10px}
.header .search .search_input select {border: none;}
.header .search .search_input input {ime-mode:active; border: none;}
.header .search .topsearch {width: 40px; height: 40px; background: url(css/images/ico_search_b.png) no-repeat center center; background-size: 22px 22px; filter: brightness(1) sepia(1) saturate(3) hue-rotate(175deg);}
@ -53,11 +53,11 @@ body {min-width: 1400px;}
box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.2);
}
/*.header .topcode .topcodebnt:hover{*/
/* background-color: #8F8F8F;*/
/* color: #fff;*/
/* box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.4);*/
/*}*/
.header .topcode .topcodebnt:hover{
background-color: #8F8F8F;
color: #fff;
box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.4);
}
/* All menu */
.all_menu {transition: transform .2s ease-in-out, opacity .2s ease-in-out; transform-origin: top; z-index: 10; padding: 50px 20px;}
@ -83,7 +83,7 @@ body {min-width: 1400px;}
.c_wrap .layout {display: table; width: 100%; table-layout: fixed; padding-bottom: 20px;} /* added by lim padding-bottom: 20px; */
/* 관리자 (왼쪽메뉴) */
.c_wrap .layout .nav:not(.tabs) {display: table-cell; width: 220px; vertical-align: top; padding-right: 30px;} /* changed by lim width: 260px; */
.c_wrap .layout .nav:not(.tabs) {display: table-cell; width: 220px; vertical-align: top;} /* changed by lim width: 260px; */
/*.c_wrap .layout .nav .inner {border: 1px solid #dde2e5; border-radius: 10px;}*/
.nav_title{padding: 35px 30px 26px 20px;} /* changed by lim border-bottom: 4px solid #dde2e5; */
.c_wrap .layout .nav h2 {color: #222; font-size: 24px; font-weight: 700;}
@ -95,7 +95,7 @@ body {min-width: 1400px;}
.c_wrap .layout .nav ul li a.cur {color: #222; font-weight: 700;}
/* (구)건설기준 (왼쪽메뉴) */
.c_wrap .layout .nav2:not(.tabs) {display: table-cell; width: 350px; vertical-align: top; padding-right: 30px;}
.c_wrap .layout .nav2:not(.tabs) {display: table-cell; width: 350px; vertical-align: top;}
/*.c_wrap .layout .nav2 h2 {color: #222; font-size: 22px; font-weight: 700;}*/
.c_wrap .layout .nav2 button {font-size: 15px;}
.c_wrap .layout .nav2 .accordion-button {background: #FAFAFA;}
@ -105,10 +105,10 @@ body {min-width: 1400px;}
.c_wrap .layout .contents .border-secondary {border : 1px solid #6c757d;}
.c_wrap .layout .contents .border-secondary-no_top {border-left: 1px solid #6c757d; border-right: 1px solid #6c757d; border-bottom: 1px solid #6c757d; height: 500px; overflow-y: scroll;}
.c_wrap .layout .contents {display: table-cell; width: auto; vertical-align: top; }
.c_wrap .layout .contents {display: table-cell; width: auto; vertical-align: top; padding-left: 30px;}
/* 센터소개 (왼쪽메뉴) */
.c_wrap .layout .nav1:not(.tabs) {display: table-cell; width: 220px; vertical-align: top; padding-right: 30px;}
.c_wrap .layout .nav1:not(.tabs) {display: table-cell; width: 220px; vertical-align: top;}
.c_wrap .layout .nav1 h2 {color: #222; font-size: 24px; font-weight: 700;}
.c_wrap .layout .nav1 .menu10 {mnargin: 0; border: 1px solid #dde2e5;}
.c_wrap .layout .nav1 .menu10 li + li {border-top: 1px solid #dde2e5; }
@ -116,13 +116,7 @@ body {min-width: 1400px;}
.c_wrap .layout .nav1 ul li a:hover::after {content: ""; display: block; position: absolute; right: 10px; top: 50%; transform: translateY(-50%); width: 9px; height: 15px; background: url(css/images/ico_arrow_r_gray_9x15.png) no-repeat; }
.c_wrap .layout .nav1 ul li a.cur {color: #fff; font-weight: 700; background-color: #004994; }
/* 내정보 (왼쪽메뉴) */
.c_wrap .layout .nav3:not(.tabs) {display: table-cell; width: 300px; vertical-align: top; padding-right: 30px;}
.c_wrap .layout .nav3 .menu11 {height : 300px; margin: 0; border: 1px solid #AFAFAF; border-radius: 10px;}
.c_wrap .layout .nav3 .menu11 .person::before {content: ""; display: inline-block; width: 50px; height: 50px; background: url(css/images/ico_user.png) no-repeat center bottom; background-size: 30px 30px; }
.c_wrap .layout .nav3 .menu11 .myPanel {height: 145px; overflow-x: hidden; overflow-y: auto;}
/* location */
/* location */
.location {height: 30px; padding-top: 23px; text-align: right;} /* chagned by lim height: 70px; padding-top: 43px; */
.location ul, .location ul li {display: inline-block; vertical-align: top;}
.location ul li {position: relative; color: #666; font-size: 14px;}

View File

@ -49,31 +49,20 @@
/* 메인 */
/*.P_MAIN {position: relative; background: #f5f5f5;}*/
/*.P_MAIN::before {content: ""; display: block; position: absolute; left: 0; top: 0; width: 100%; height: 360px; background: #fff;}*/
.P_MAIN .c_wrap .topbox {width: 100%; height:370px; background: #F8F8F8; margin: 0 auto;}
.P_MAIN .c_wrap .topbox .topbox_1 {width: 1400px; height: 340px; border: 1px solid #dde2e5; border-radius: 25px; box-shadow: 0 4px 5px #ccc; background: #fff; padding: 15px;}
.P_MAIN .c_wrap .topbox .topbox_1 .topbox_11{width: 1010px; padding: 0;}
.P_MAIN .c_wrap .topbox .topbox_1 .topbox_12{background: #004994; margin-left: 0; margin-right: -3px; color: #fff; line-height: 30px;}
.P_MAIN .c_wrap .topbox .topbox_1 .topbox_13{font-size: 14px; font-weight: 700; }
.P_MAIN .c_wrap .topbox .topbox_1 .topbox_14 {font-size: 12px; font-weight: 600; text-align: right; }
.P_MAIN .c_wrap .topbox .topbox_1 .topbox_14 span{border-radius: 20px; border: 1px solid #fff; padding: 3px 8px;}
.P_MAIN .c_wrap .topbox .topbox_1 .topbox_15{background: #E0E0E0; margin-left: -21px; margin-right: 12px; line-height: 30px;}
.P_MAIN .c_wrap .topbox .topbox_1 .topbox_16 {font-size: 12px; font-weight: 600; text-align: right; }
.P_MAIN .c_wrap .topbox .topbox_1 .topbox_16 span{border-radius: 20px; border: 1px solid #4C6C84; padding: 3px 8px;}
.P_MAIN .c_wrap .topbox .topbox_2 { height: 45px; border: 1px solid #EAEAEA; border-radius: 10px; padding: 10px; color: #222;}
.P_MAIN .c_wrap .topbox .topbox_2:hover {border: 1px solid #22498E; color: #22498E;}
.P_MAIN .c_wrap .topbox .topbox_2 img {filter: none; transition: filter 0.3s ease;}
.P_MAIN .c_wrap .topbox .topbox_2:hover img {filter: invert(39%) sepia(86%) saturate(2000%) hue-rotate(180deg) brightness(80%) contrast(66%);}
.P_MAIN .c_wrap .topbox .topbox_4 {width: 75px; height: 75px; border: 1px solid #EAEAEA; border-radius: 20px; padding: 10px 0; margin-left: 0;}
.P_MAIN .c_wrap .topbox .topbox_5 {width: 95px; font-size: 12px; padding: 0px; margin-left: -10px; text-align: center;}
.P_MAIN .c_wrap .topbox .topbox_3 {width: 350px; height: 310px; border: 1px solid #dde2e5; background: #fff; padding: 15px 30px;}
.P_MAIN .c_wrap .topbox .topbox_3 .topbox_31{font-size: 22px; font-weight: 700; padding-bottom: 20px;}
/*.P_MAIN .c_wrap .topbox .topbox_2 {width: 630px; height: 340px; border: 1px solid #dde2e5; border-radius: 25px; box-shadow: 0 4px 5px #ccc; background: #fff; margin: 0 25px; padding: 30px;}*/
/*.P_MAIN .c_wrap .topbox .topbox_2 .topbox_11{font-size: 22px; font-weight: 700; padding-bottom: 10px;}*/
/*.P_MAIN .c_wrap .topbox .topbox_2 .topbox_12{font-size: 19px; padding-bottom: 70px;}*/
/*.P_MAIN .c_wrap .topbox .topbox_2 .topbox_13 {width: 80px; height: 80px; border-radius: 50%; background: #E2E9F6; display: flex; justify-content: center; align-items: center; margin-left: 1.2rem;}*/
/*.P_MAIN .c_wrap .topbox .topbox_2 .topbox_14{font-size: 16px; font-weight: 600; text-align: center; line-height: 40px; color: #222;}*/
/*.P_MAIN .c_wrap .topbox .topbox_2 .topbox_15{text-align: center; line-height: 40px;}*/
.P_MAIN .c_wrap .topbox {width: 100%; height:390px; background: #F8F8F8; margin: 0 auto;}
.P_MAIN .c_wrap .topbox .topbox_1 {width: 360px; height: 340px; border: 1px solid #dde2e5; border-radius: 25px; box-shadow: 0 4px 5px #ccc; background: #fff; padding: 30px;}
.P_MAIN .c_wrap .topbox .topbox_1 .topbox_11{font-size: 22px; font-weight: 700; padding-bottom: 15px;}
.P_MAIN .c_wrap .topbox .topbox_1 .topbox_12{font-size: 14px; }
.P_MAIN .c_wrap .topbox .topbox_1 .topbox_13{font-size: 12px; font-weight: 700; color: #22498E; padding-bottom: 5px;}
.P_MAIN .c_wrap .topbox .topbox_1 .topbox_14{font-size: 17px; font-weight: 600; line-height: 42px; white-space: nowrap;}
.P_MAIN .c_wrap .topbox .topbox_2 {width: 630px; height: 340px; border: 1px solid #dde2e5; border-radius: 25px; box-shadow: 0 4px 5px #ccc; background: #fff; margin: 0 25px; padding: 30px;}
.P_MAIN .c_wrap .topbox .topbox_2 .topbox_11{font-size: 22px; font-weight: 700; padding-bottom: 10px;}
.P_MAIN .c_wrap .topbox .topbox_2 .topbox_12{font-size: 19px; padding-bottom: 70px;}
.P_MAIN .c_wrap .topbox .topbox_2 .topbox_13 {width: 80px; height: 80px; border-radius: 50%; background: #E2E9F6; display: flex; justify-content: center; align-items: center; margin-left: 1.2rem;}
.P_MAIN .c_wrap .topbox .topbox_2 .topbox_14{font-size: 16px; font-weight: 600; text-align: center; line-height: 40px; color: #222;}
.P_MAIN .c_wrap .topbox .topbox_2 .topbox_15{text-align: center; line-height: 40px;}
.P_MAIN .c_wrap .topbox .topbox_3 {width: 360px; height: 340px; border: 1px solid #dde2e5; border-radius: 25px; box-shadow: 0 4px 5px #ccc; background: #fff; padding: 30px;}
.P_MAIN .c_wrap .topbox .topbox_3 .topbox_11{font-size: 22px; font-weight: 700; padding-bottom: 20px;}
.P_MAIN .c_wrap .login_search {border: 1px solid #6F6F6F; border-radius: 10px; overflow: hidden;}
.P_MAIN .c_wrap .login_border {border: 1px solid #6F6F6F; margin-top: 5px;}
.P_MAIN .c_wrap .login_search_word {max-height: 125px; padding: 5px; overflow-x: auto; overflow-y: auto;}
@ -81,37 +70,29 @@
.P_MAIN .c_wrap .menubox .menubox_n {padding: 0 50px;}
.P_MAIN .c_wrap .menubox .menu_img {width: 100px; height: 100px; border-radius: 50%; background: #E2E9F6; display: flex; justify-content: center; align-items: center;}
.P_MAIN .c_wrap .menubox .menu_text {font-size: 16px; font-weight: 700; padding-top: 10px; justify-content: center; color: #222;}
.P_MAIN .c_wrap .bbsbox {width: 100%; height:300px; margin: 0 auto; padding-top: 15px;} /* border-bottom: 1px solid #E6E6E6; */
.P_MAIN .c_wrap .bbsbox .bbsbox_1 {width: 500px; }
.P_MAIN .c_wrap .bbsbox .bbsbox_3 {width: 500px; margin-left: 10px;}
.P_MAIN .c_wrap .bbsbox .bbsbox_1 .MuiBox-root,
.P_MAIN .c_wrap .bbsbox .bbsbox_3 .MuiBox-root {padding-top: 0px; }
.P_MAIN .c_wrap .bbsbox .bbsbox_1 .bbsbox_11,
.P_MAIN .c_wrap .bbsbox .bbsbox_3 .bbsbox_11 {border-bottom: 1px solid #D3D3D3; padding: 14px 0;}
.P_MAIN .c_wrap .bbsbox .bbsbox_1 .bbsbox_11 .bbsbox_11_title,
.P_MAIN .c_wrap .bbsbox .bbsbox_3 .bbsbox_11 .bbsbox_11_title {font-size: 15px; color: #222;}
.P_MAIN .c_wrap .bbsbox .bbsbox_2 {width: 370px; margin-left: 20px;}
.P_MAIN .c_wrap .bbsbox .bbsbox_2 img {width: 370px; height: 270px; border-radius: 20px; }
.P_MAIN .c_wrap .qna_count {width: 100%; margin: 0 auto; padding-bottom: 10px; border-bottom: 1px solid #eaeaea; }
.P_MAIN .c_wrap .qnabox {max-width: 1010px; padding: 0; height:215px; }
.P_MAIN .c_wrap .qnabox .qnabox_1 {width: 1010px; max-height: 45px; margin:0 auto; padding: 0 10px; font-size: 35px; font-weight: 700; color: #004994;}
.P_MAIN .c_wrap .qnabox .qnabox_11 {width: 50%; font-size: 30px; font-weight: 700; color: #004994;}
.P_MAIN .c_wrap .qnabox .qnabox_12 {width: 50%; font-size: 16px; font-weight: 500; color: #6C6C6C;}
.P_MAIN .c_wrap .qnabox {width: 100%; height:340px; background: #F8FAFC;}
.P_MAIN .c_wrap .qnabox .qnabox_1 {width: 1400px; height: 80px; margin:0 auto; padding: 0 10px; font-size: 35px; font-weight: 700; color: #004994;}
.P_MAIN .c_wrap .qnabox .qnabox_11 {width: 50%; font-size: 35px; font-weight: 700; color: #004994;}
.P_MAIN .c_wrap .qnabox .qnabox_12 {width: 50%; font-size: 20px; font-weight: 500; color: #6C6C6C;}
.P_MAIN .c_wrap .qnabox .qnabox_12 .rounded_circle_qna {width: 32px; height: 32px; border-radius: 50%; background: #FFF; box-shadow: 0 4px 5px #ccc; align-items: center; text-align: center; display: flex; }
.P_MAIN .c_wrap .qnabox .qnabox_2 {width: 1010px; margin:0 auto; }
.P_MAIN .c_wrap .qnabox .qnabox_n {width: 25%; height: 158px; border: 1px solid #dde2e5; border-radius: 10px; box-shadow: 0 4px 5px #ccc; background: #fff; margin: 10px; padding: 15px 30px;}
.P_MAIN .c_wrap .qnabox .qnabox_2 {width: 1400px; margin:0 auto; }
.P_MAIN .c_wrap .qnabox .qnabox_n {width: 330px; height: 200px; border: 1px solid #dde2e5; border-radius: 10px; box-shadow: 0 4px 5px #ccc; background: #fff; margin: 20px 10px; padding: 30px;}
.P_MAIN .c_wrap .qnabox .qnabox_n .qnabox_n_file {background: #EBF1FF; border-radius: 10px; color: #22498E; font-size: 12px;}
.P_MAIN .c_wrap .qnabox .qnabox_n .qnabox_n_title {height: 90px; font-size: 14px; font-weight: 600; overflow: hidden; text-overflow: ellipsis; }
.P_MAIN .c_wrap .qnabox .qnabox_n .qnabox_n_title a {display: block; height: 88px;}
.P_MAIN .c_wrap .qnabox .qnabox_n .qnabox_n_title {height: 100px; font-size: 18px; overflow: hidden; text-overflow: ellipsis; font-weight: 600;}
.P_MAIN .c_wrap .qnabox .qnabox_n .qnabox_n_date {font-size: 13px; }
.P_MAIN .c_wrap .numbox {max-width: 370px; height: 215px; border-radius: 20px; background: #EBF1F9; margin-left: 20px; padding: 20px 30px; }
.P_MAIN .c_wrap .numbox .numbox_n {width: auto; background: #fff; border-radius: 10px; margin-bottom: 10px;}
.P_MAIN .c_wrap .numbox .numbox_n:nth-child(4) {margin-bottom: 0px; }
.P_MAIN .c_wrap .numbox .num_text {font-size: 12px; color: #fff; font-weight: 600; background: #3378C1; border-radius: 10px; max-width: 100px; line-height: 35px; text-align: center; }
.P_MAIN .c_wrap .numbox .num_count {font-size: 14px; font-weight: 700; color: #3378C1; line-height: 35px; text-align: right;}
.P_MAIN .c_wrap .numbox .num_count span.unit {font-size: 11px;}
.P_MAIN .c_wrap .numbox {width: 100%; height:100px; background: #4C6C84;}
.P_MAIN .c_wrap .numbox .numbox_n {width: 300px; color: #fff; text-align: center;}
.P_MAIN .c_wrap .numbox .num_text {font-size: 16px; font-weight: 600;}
.P_MAIN .c_wrap .numbox .num_count {font-size: 25px; font-weight: 700;}
.P_MAIN .c_wrap .numbox .num_count span.unit {font-size: 20px;}
.P_MAIN .c_wrap .bbsbox {width: 100%; height:350px; border-bottom: 1px solid #E6E6E6; margin: 0 auto; padding-top: 25px;}
.P_MAIN .c_wrap .bbsbox .bbsbox_1 {width: 980px; }
.P_MAIN .c_wrap .bbsbox .bbsbox_1 .bbsbox_11 {border-bottom: 1px solid #D3D3D3; padding: 14px 0;}
.P_MAIN .c_wrap .bbsbox .bbsbox_1 .bbsbox_11 .bbsbox_11_title {font-size: 15px; color: #222;}
.P_MAIN .c_wrap .bbsbox .bbsbox_2 {width: 370px; margin-left: 50px;}
.P_MAIN .c_wrap .bbsbox .bbsbox_2 img {max-width: 370px; border-radius: 20px; }
.P_MAIN .c_wrap .bannerbox {width: 1400px; height:80px; margin: 0 auto; }
.P_MAIN .c_wrap .bannerbox {width: 1400px; height:80px; margin: 0 auto;}
/*.P_MAIN .c_wrap .bannerbox .slick-list {width: 1400px; margin: 0 auto;}*/
.P_MAIN .c_wrap .bannerbox .banner_slide {max-width: 210px; max-height: 60px; border: 1px solid #dde2e5; border-radius: 15px; text-align: center; padding: 10px; margin: 10px;}
.P_MAIN .c_wrap .bannerbox .slick-slide img {max-width: 180px; max-height: 60px;}
@ -165,9 +146,73 @@
/*.P_MAIN .banner_bot > div.b4 > div {background: url(css/images/ico_bn04.png) no-repeat center 60px;}*/
/* 오늘의 행사 */
.BRD001 .head > span:nth-child(1) {width: 150px;}
.BRD001 .head > span:nth-child(3) {width: 150px;}
.BRD001 .result .list_item > div:nth-child(1) {width: 150px;}
.BRD001 .result .list_item > div:nth-child(3) {width: 150px;}
/* 공지사항 */
.BRD002 .head > span:nth-child(1) {width: 60px;}
.BRD002 .head > span:nth-child(3) {width: 100px;}
.BRD002 .head > span:nth-child(4) {width: 120px;}
.BRD002 .head > span:nth-child(5) {width: 100px;}
.BRD002 .result .list_item > div:nth-child(1) {width: 60px;}
.BRD002 .result .list_item > div:nth-child(2) {text-overflow: ellipsis; white-space: nowrap; overflow: hidden;}
.BRD002 .result .list_item > div:nth-child(3) {width: 100px;}
.BRD002 .result .list_item > div:nth-child(4) {width: 120px;}
.BRD002 .result .list_item > div:nth-child(5) {width: 100px;}
/* 금주의 행사 */
.BRD003 .head > span:nth-child(1) {width: 200px;}
.BRD003 .head > span:nth-child(2) {width: 150px;}
.BRD003 .head > span:nth-child(3) {width: 470px;}
.BRD003 .head > span:nth-child(4) {width: 150px;}
.BRD003 .result .list_item > div:nth-child(1) {width: 200px;}
.BRD003 .result .list_item > div:nth-child(2) {width: auto;}
.BRD003 .result .list_item > div:nth-child(2) > a {display: table; width: 100%; color: #666;}
.BRD003 .result .list_item > div:nth-child(2) > a:hover {text-decoration: underline;}
.BRD003 .result .list_item > div:nth-child(2) > a > * {display: table-cell;}
.BRD003 .result .list_item > div:nth-child(2) > a > span:nth-child(1) {width: 150px;}
.BRD003 .result .list_item > div:nth-child(2) > a > span:nth-child(2) {width: auto; text-align: center;}
.BRD003 .result .list_item > div:nth-child(2) > a > span:nth-child(3) {width: 150px;}
/* 게시판템플릿관리 */
.BRD004 .head > span:nth-child(1) {width: 70px;}
.BRD004 .head > span:nth-child(2) {width: 150px;}
.BRD004 .head > span:nth-child(3) {width: 120px;}
.BRD004 .head > span:nth-child(5) {width: 100px;}
.BRD004 .head > span:nth-child(6) {width: 140px;}
.BRD004 .result .list_item > div:nth-child(1) {width: 70px;}
.BRD004 .result .list_item > div:nth-child(2) {width: 150px;}
.BRD004 .result .list_item > div:nth-child(3) {width: 120px;}
.BRD004 .result .list_item > div:nth-child(5) {width: 100px;}
.BRD004 .result .list_item > div:nth-child(6) {width: 140px;}
/* 사이트관리 미리보기 게시판 */
.BRD005 .head > span:nth-child(1) {width: 60px;}
.BRD005 .head > span:nth-child(3) {width: 100px;}
.BRD005 .head > span:nth-child(4) {width: 120px;}
.BRD005 .head > span:nth-child(5) {width: 100px;}
.BRD005 .result .list_item > div:nth-child(1) {width: 60px;}
.BRD005 .result .list_item > div:nth-child(3) {width: 100px;}
.BRD005 .result .list_item > div:nth-child(4) {width: 120px;}
.BRD005 .result .list_item > div:nth-child(5) {width: 100px;}
/* 게시판 관리 */
.BRD006 .head > span:nth-child(1) {width: 160px; text-align: left;}
.BRD006 .head > span:nth-child(3) {width: 160px;}
.BRD006 .head > span:nth-child(4) {width: 70px;}
.BRD006 .head > span:nth-child(5) {width: 70px;}
.BRD006 .head > span:nth-child(6) {width: 120px;}
.BRD006 .result .list_item > div:nth-child(1) {width: 160px; text-align: left;}
.BRD006 .result .list_item > div:nth-child(3) {width: 160px;}
.BRD006 .result .list_item > div:nth-child(4) {width: 70px;}
.BRD006 .result .list_item > div:nth-child(5) {width: 70px;}
.BRD006 .result .list_item > div:nth-child(6) {width: 120px;}
/* 사이트관리 > 사용자관리 > 사용자목록 */
.userList .head > span:nth-child(1) {width: 20px;}
.userList .head > span:nth-child(1) {width: 60px;}
.userList .head > span:nth-child(2) {width: 100px;}
.userList .head > span:nth-child(3) {width: 100px;}
.userList .head > span:nth-child(4) {width: 120px;}
@ -272,85 +317,20 @@
.PDS_LIST .board_list {margin-top: 50px;}
/* 오늘의 행사 */
.BRD001 .head > span:nth-child(1) {width: 150px;}
.BRD001 .head > span:nth-child(3) {width: 150px;}
.BRD001 .result .list_item > div:nth-child(1) {width: 150px;}
.BRD001 .result .list_item > div:nth-child(3) {width: 150px;}
/* 공지사항 */
.BRD002 .head > span:nth-child(1) {width: 60px;}
.BRD002 .head > span:nth-child(3) {width: 100px;}
.BRD002 .head > span:nth-child(4) {width: 120px;}
.BRD002 .head > span:nth-child(5) {width: 100px;}
.BRD002 .result .list_item > div:nth-child(1) {width: 60px;}
.BRD002 .result .list_item > div:nth-child(2) {text-overflow: ellipsis; white-space: nowrap; overflow: hidden;}
.BRD002 .result .list_item > div:nth-child(3) {width: 100px;}
.BRD002 .result .list_item > div:nth-child(4) {width: 120px;}
.BRD002 .result .list_item > div:nth-child(5) {width: 100px;}
/* 금주의 행사 */
.BRD003 .head > span:nth-child(1) {width: 200px;}
.BRD003 .head > span:nth-child(2) {width: 150px;}
.BRD003 .head > span:nth-child(3) {width: 470px;}
.BRD003 .head > span:nth-child(4) {width: 150px;}
.BRD003 .result .list_item > div:nth-child(1) {width: 200px;}
.BRD003 .result .list_item > div:nth-child(2) {width: auto;}
.BRD003 .result .list_item > div:nth-child(2) > a {display: table; width: 100%; color: #666;}
.BRD003 .result .list_item > div:nth-child(2) > a:hover {text-decoration: underline;}
.BRD003 .result .list_item > div:nth-child(2) > a > * {display: table-cell;}
.BRD003 .result .list_item > div:nth-child(2) > a > span:nth-child(1) {width: 150px;}
.BRD003 .result .list_item > div:nth-child(2) > a > span:nth-child(2) {width: auto; text-align: center;}
.BRD003 .result .list_item > div:nth-child(2) > a > span:nth-child(3) {width: 150px;}
/* 게시판템플릿관리 */
.BRD004 .head > span:nth-child(1) {width: 70px;}
.BRD004 .head > span:nth-child(2) {width: 150px;}
.BRD004 .head > span:nth-child(3) {width: 120px;}
.BRD004 .head > span:nth-child(5) {width: 100px;}
.BRD004 .head > span:nth-child(6) {width: 140px;}
.BRD004 .result .list_item > div:nth-child(1) {width: 70px;}
.BRD004 .result .list_item > div:nth-child(2) {width: 150px;}
.BRD004 .result .list_item > div:nth-child(3) {width: 120px;}
.BRD004 .result .list_item > div:nth-child(5) {width: 100px;}
.BRD004 .result .list_item > div:nth-child(6) {width: 140px;}
/* 관리자 - 건설기준연구 관리 */
.BRD005 .head > span:nth-child(1) {width: 60px;}
.BRD005 .head > span:nth-child(3) {width: 200px;}
.BRD005 .head > span:nth-child(4) {width: 300px;}
.BRD005 .result .list_item > div:nth-child(1) {width: 60px;}
.BRD005 .result .list_item > div:nth-child(2) {text-overflow: ellipsis; white-space: nowrap; overflow: hidden;}
.BRD005 .result .list_item > div:nth-child(3) {width: 200px;}
.BRD005 .result .list_item > div:nth-child(4) {width: 300px; text-align: left;}
/* 게시판 관리 */
.BRD006 .head > span:nth-child(1) {width: 160px;}
.BRD006 .head > span:nth-child(3) {width: 180px;}
.BRD006 .head > span:nth-child(4) {width: 140px;}
.BRD006 .head > span:nth-child(5) {width: 100px;}
.BRD006 .head > span:nth-child(6) {width: 120px;}
.BRD006 .result .list_item > div:nth-child(1) {width: 160px;}
.BRD006 .result .list_item > div:nth-child(2) {text-align: left;}
.BRD006 .result .list_item > div:nth-child(3) {width: 180px;}
.BRD006 .result .list_item > div:nth-child(4) {width: 140px;}
.BRD006 .result .list_item > div:nth-child(5) {width: 100px;}
.BRD006 .result .list_item > div:nth-child(6) {width: 120px;}
/* 사이트관리 > 게시판현황 > 게시물관리 */
.BRD007 .head > span:nth-child(1) {width: 70px;}
.BRD007 .head > span:nth-child(3) {width: 70px;}
.BRD007 .head > span:nth-child(4) {width: 80px;}
.BRD007 .head > span:nth-child(5) {width: 100px;}
.BRD007 .head > span:nth-child(4) {width: 120px;}
.BRD007 .head > span:nth-child(5) {width: 160px;}
.BRD007 .head > span:nth-child(6) {width: 120px;}
.BRD007 .head > span:nth-child(7) {width: 100px;}
.BRD007 .head > span:nth-child(7) {width: 140px;}
.BRD007 .result .list_item > div:nth-child(1) {width: 70px;}
.BRD007 .result .list_item > div:nth-child(3) {width: 70px;}
.BRD007 .result .list_item > div:nth-child(4) {width: 80px;}
.BRD007 .result .list_item > div:nth-child(5) {width: 100px;}
.BRD007 .result .list_item > div:nth-child(4) {width: 120px;}
.BRD007 .result .list_item > div:nth-child(5) {width: 160px;}
.BRD007 .result .list_item > div:nth-child(6) {width: 120px;}
.BRD007 .result .list_item > div:nth-child(7) {width: 100px;}
.BRD007 .result .list_item > div:nth-child(7) {width: 140px;}
.PDS_REG .pds_desc_edit {margin: 14px 0 30px 0;}
@ -430,9 +410,6 @@
.BOARD_USE_LIST .board_view2 dl dt {width: 185px;}
.BOARD_USE_LIST .board_view2 dl:nth-child(2) dd .f_input2 {width: 490px; margin-left: 17px;}
/* 검색화면 */
/*.board_view2*/
/* 사용자 게시판 */
.BRD013 .head > span:nth-child(1) {position: relative; width: 60px;}
@ -528,42 +505,6 @@
.BRD020 .result .list_item > div:nth-child(6) {width: 120px;}
.BRD020 .result .list_item > div:nth-child(7) {width: 100px;}
/* 기준코드 리스트 */
.BRD021 .head > span:nth-child(1) {position: relative; width: 120px;}
.BRD021 .head > span:nth-child(2) {position: relative; }
.BRD021 .head > span:nth-child(3) {position: relative; width: 120px;}
.BRD021 .head > span:nth-child(4) {position: relative; width: 200px;}
.BRD021 .head > span:nth-child(5) {position: relative; width: 250px;}
.BRD021 .head > span:nth-child(6) {position: relative; width: 100px;}
.BRD021 .head > span:nth-child(7) {width: 100px;} /* 스크롤바 크기만큼 width 더 잡아야 함.*/
.BRD021 .head > span:nth-child(-n+6)::after {position: absolute; content: ''; right: 0; bottom: 0; height: 50%; border-right: 1px solid #B5B5B5;}
.BRD021 .result .list_item2 > div:nth-child(1) {width: 120px;}
.BRD021 .result .list_item2 > div:nth-child(2) {text-overflow: ellipsis; white-space: nowrap; overflow: hidden; text-align: left; padding-left: 10px;}
.BRD021 .result .list_item2 > div:nth-child(3) {width: 120px;}
.BRD021 .result .list_item2 > div:nth-child(4) {width: 200px;}
.BRD021 .result .list_item2 > div:nth-child(5) {width: 250px; padding-left: 10px;}
.BRD021 .result .list_item2 > div:nth-child(6) {width: 100px;}
.BRD021 .result .list_item2 > div:nth-child(7) {width: 80px;}
/* 통합다운로드 */
.BRD022 .head > span:nth-child(1) {position: relative; width: 40%; }
.BRD022 .head > span:nth-child(2) {position: relative; width: 30%; }
.BRD022 .head > span:nth-child(3) {position: relative; width: 30%; }
.BRD022 .head > span:nth-child(-n+2)::after {position: absolute; content: ''; right: 0; bottom: 0; height: 50%; border-right: 1px solid #B5B5B5;}
.BRD022 .result .list_item > div:nth-child(1) {width: 40%; text-align: center;}
.BRD022 .result .list_item > div:nth-child(2) {width: 30%; text-align: center;}
.BRD022 .result .list_item > div:nth-child(3) {width: 30%; text-align: center;}
/* 즐겨찾기 */
.BRD023 .head > span:nth-child(1) {position: relative; width: 100px; }
.BRD023 .head > span:nth-child(2) {position: relative; }
.BRD023 .head > span:nth-child(3) {position: relative; width: 200px; }
.BRD023 .head > span:nth-child(4) {position: relative; width: 100px; }
.BRD023 .head > span:nth-child(-n+3)::after {position: absolute; content: ''; right: 0; bottom: 0; height: 50%; border-right: 1px solid #B5B5B5;}
.BRD023 .result .list_item > div:nth-child(1) {width: 100px; text-align: center;}
.BRD023 .result .list_item > div:nth-child(2) {text-align: left; padding-left: 10px;}
.BRD023 .result .list_item > div:nth-child(3) {width: 200px; text-align: center;}
.BRD023 .result .list_item > div:nth-child(4) {width: 100px; text-align: center;}
/* 찾아오시는길 */
.SITE_CONTACT_US .map {margin-top: 43px;}
@ -648,7 +589,7 @@
.calendar_info ul li a {color: #222; font-size: 16px; font-weight: 300;}
.calendar_info ul li span {position: absolute; right: 15px; top: 15px; color: #808080; font-size: 16px; font-weight: 300;}
.viewerDiv{height: calc(100vh - 153px); overflow-y: auto;}
.viewerDiv{height: calc(100vh - 190px); overflow-y: auto;}
.openDoc{background-color: bisque;}
.docLink{color: black;background-color: palegreen}
.docLink:hover{cursor: pointer}
@ -672,10 +613,7 @@
.modalDocInfoActive{filter: grayscale(0%);}
.docInfoRow > div{--bs-gutter-x: 0.5rem;}
.bookmarkModalHeader{--bs-modal-title-line-height:1;}
.optionBtn{--bs-btn-padding-y: 0.15rem;--bs-btn-padding-x: 0.25rem;--bs-btn-font-size: 0.7rem; margin-right: 7px;}
.detailInfoDiv {position: relative;}
.datailcollapse {position: absolute; top: 0; left: 0; margin-top: 200px; margin-left: 0;}
.datailcollapse img {position: fixed;}
.optionBtn{--bs-btn-padding-y: 0.1rem;--bs-btn-padding-x: 0.25rem;--bs-btn-font-size: 0.7rem; margin-right: 7px;}
/* 건설기준코드 안내*/

View File

@ -5,8 +5,8 @@
/* Layout */
body {min-width: auto;}
.header .inner {width: 100%; padding: 0 10px;}
/*.header h1 {margin-top: 22.5px;}*/
.header .inner {width: 100%; height: 70px; padding: 0 20px;}
.header h1 {margin-top: 22.5px;}
.header .logo .w {display: none;}
.header .logo .m {display: block;}
.header .logo .m img {height: 25px;}

View File

@ -5,8 +5,6 @@ import Modal from "react-bootstrap/Modal";
import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
import CODE from 'constants/code';
import Col from "react-bootstrap/Col";
import Row from "react-bootstrap/Row";
import {default as EgovLeftNav} from 'components/leftmenu/EgovLeftNavAdmin';
import EgovRadioButtonGroup from 'components/EgovRadioButtonGroup';
@ -155,7 +153,7 @@ function AdminPostMgtEdit({props, reloadFunction, searchCondition}) {
const [selectedBbsSeq, setSelectedBbsSeq] = useState(props?.selectedBbsSeq ? props?.selectedBbsSeq : props?.bbsSeq);
const handleSelectChange = (e) => {
const selectedBbsSeq = e.target.selectedOptions[0].dataset.bbsSeq;
const selectedBbsSeq = e.target.value;
setSelectedBbsSeq(selectedBbsSeq);
}
@ -237,7 +235,7 @@ function AdminPostMgtEdit({props, reloadFunction, searchCondition}) {
<Form.Select id="select1" name="bbsId" onChange={handleSelectChange}>
<option value="">선택</option>
{categoryList.map((item) => (
<option key={item.bbsSeq} value={item.bbsId} data-bbs-seq={item.bbsSeq}
<option key={item.bbsSeq} value={item.bbsSeq}
selected={props?.mode === CODE.MODE_MODIFY ? item.bbsSeq == props.bbsSeq : item.bbsSeq == props.selectedBbsSeq}>{item.bbsTitle}</option>
))}
</Form.Select>
@ -277,19 +275,19 @@ function AdminPostMgtEdit({props, reloadFunction, searchCondition}) {
)}
{/* <!-- 버튼영역 --> */}
<Row className="pt-3">
<Col xs={6}>
<div className="board_btn_area">
<div className="left_col btn1">
{modeInfo.mode === CODE.MODE_MODIFY &&
<button type={"button"} className="btn btn_red_h32 w_100" onClick={() => {
<button type={"button"} className="btn btn_red_h46 w_100" onClick={() => {
deletePost(props)
}}>삭제</button>
}
</Col>
</div>
<Col xs={6} className="text-end">
<button type="submit" className="btn btn_blue_h32 w_100">저장</button>
</Col>
</Row>
<div className="right_col btn1">
<button type="submit" className="btn btn_skyblue_h46 w_100">저장</button>
</div>
</div>
{/* <!--// 버튼영역 --> */}
</Form>
</div>

View File

@ -74,7 +74,7 @@ function AdminPostMgtList(props) {
<div>{item?.fileGrpId && <img src={fileIconPath} alt="File Icon" />}</div>
<div>{item?.frstCrtId}</div>
<div>{formattedDate}</div>
<div><button className={"btn btn_skyblue_h32 px-1"} onClick={()=>{editPost(item)}}>수정</button></div>
<div><button className={"btn btn_blue_h31 px-1"} onClick={()=>{editPost(item)}}>수정</button></div>
</div>
);
});
@ -90,7 +90,7 @@ function AdminPostMgtList(props) {
<div>{item?.fileGrpId && <img src={fileIconPath} alt="File Icon" />}</div>
<div>{item?.frstCrtId}</div>
<div>{formattedDate}</div>
<div><button className={"btn btn_skyblue_h32 px-1"} onClick={()=>{editPost(item)}}>수정</button></div>
<div><button className={"btn btn_blue_h31 px-1"} onClick={()=>{editPost(item)}}>수정</button></div>
</div>
);
});

View File

@ -5,8 +5,6 @@ import Modal from "react-bootstrap/Modal";
import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
import CODE from 'constants/code';
import Col from "react-bootstrap/Col";
import Row from "react-bootstrap/Row";
import {default as EgovLeftNav} from 'components/leftmenu/EgovLeftNavAdmin';
import EgovRadioButtonGroup from 'components/EgovRadioButtonGroup';
@ -303,16 +301,16 @@ function EgovAdminBoardEdit({props, reloadFunction}) {
</dl>
{/* <!-- 버튼영역 --> */}
<Row className="pt-3">
<Col xs={6}>
<div className="board_btn_area">
<div className="left_col btn1">
{modeInfo.mode === CODE.MODE_MODIFY && (
<button type={"button"} className="btn btn_red_h32 w_100" onClick={()=>{deleteBoard(props)}}>삭제</button>
<button type={"button"} className="btn btn_red_h46 w_100" onClick={()=>{deleteBoard(props)}}>삭제</button>
)}
</Col>
<Col xs={6} className="text-end">
<button type="submit" className="btn btn_blue_h32 w_100">저장</button>
</Col>
</Row>
</div>
<div className="right_col btn1">
<button type="submit" className="btn btn_skyblue_h46 w_100">저장</button>
</div>
</div>
{/* <!--// 버튼영역 --> */}
</Form>
</div>

View File

@ -63,7 +63,7 @@ function EgovAdminBoardList(props) {
<div>{item.frstCrtId}</div>
<div>{formattedDate}</div>
<div>{item.useYn}</div>
<div><button className={"btn btn_skyblue_h32 px-1"} onClick={()=>{editBoard(item)}}>수정</button></div>
<div><button className={"btn btn_blue_h31 px-1"} onClick={()=>{editBoard(item)}}>수정</button></div>
</div>
);
});

View File

@ -212,8 +212,8 @@ function ProgressStatus(props) {
<div>{it.orgNm}</div>
<div>진행단계표시</div>
<div>{it.regDate}</div>
<div><button type='button' className='btn btn_skyblue_h32 px-1'>수정</button></div>
<div><button type='button' className='btn btn_red_h32 px-1'>삭제</button></div>
<div><button type='button' className='btn btn_blue_h31 px-1'>수정</button></div>
<div><button type='button' className='btn btn_red_h31 px-1'>삭제</button></div>
</div>
))}
</div>
@ -233,7 +233,7 @@ function ProgressStatus(props) {
getList({ ...searchCondition, pageIndex: passedPage })
}} />
<div className="right_col btn1">
<Link to={URL.ADMIN__COMMITTEE__PROGRESS_STATUS__CREATE} className="btn btn_blue_h32 w_100">등록</Link>
<Link to={URL.ADMIN__COMMITTEE__PROGRESS_STATUS__CREATE} className="btn btn_blue_h46 w_100">등록</Link>
</div>
</div>

View File

@ -4,8 +4,6 @@ import { Link, useLocation, useNavigate } from 'react-router-dom';
import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
import CODE from 'constants/code';
import Col from "react-bootstrap/Col";
import Row from "react-bootstrap/Row";
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
@ -153,15 +151,11 @@ function SchedulesDetail(props) {
</dl>
{/* <!-- 버튼영역 --> */}
<Row className="pt-3">
<Col xs={6}>
<Link to={URL.ADMIN__COMMITTEE__PROGRESS_STATUS} className="btn btn_skyblue_h32 w_100">목록</Link>
<button className="btn btn_red_h32 w_100 ms-2">삭제</button>
</Col>
<Col xs={6} className="text-end">
<Link to="" className="btn btn_blue_h32 w_100">수정</Link>
</Col>
</Row>
<div className="board_btn_area">
<div className="right_col btn1">
<Link to={URL.ADMIN__COMMITTEE__PROGRESS_STATUS} className="btn btn_blue_h46 w_100">목록</Link>
</div>
</div>
{/* <!--// 버튼영역 --> */}

View File

@ -5,8 +5,6 @@ import AttachFile from "components/file/AttachFile";
import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
import CODE from 'constants/code';
import Col from "react-bootstrap/Col";
import Row from "react-bootstrap/Row";
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
@ -542,18 +540,18 @@ function ProgressStatusEdit(props) {
</dl>
{/* <!-- 버튼영역 --> */}
<Row className="pt-3">
<Col xs={6}>
<Link to={URL.ADMIN__COMMITTEE__PROGRESS_STATUS} className="btn btn_skyblue_h32 w_100">목록</Link>
</Col>
<Col xs={6} className="text-end">
<button className="btn btn_blue_h32 w_100"
<div className="board_btn_area">
<div className="left_col btn1">
<button className="btn btn_skyblue_h46 w_100"
onClick={() => updateSchedule()}
> 저장</button>
</Col>
</div>
</Row>
<div className="right_col btn1">
<Link to={URL.ADMIN__COMMITTEE__PROGRESS_STATUS} className="btn btn_blue_h46 w_100">목록</Link>
</div>
</div>
{/* <!--// 버튼영역 --> */}
</StyledDiv>
{/* <!-- 게시판 상세보기 --> */}

View File

@ -3,8 +3,7 @@ import { Link, useLocation, useNavigate } from 'react-router-dom';
import styled from "styled-components";
import Col from "react-bootstrap/Col";
import Row from "react-bootstrap/Row";
import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
import CODE from 'constants/code';
@ -156,22 +155,22 @@ function SchedulesDetail(props) {
</dl>
{/* <!-- 버튼영역 --> */}
<Row className="pt-3">
<Col xs={6}>
<Link to={URL.ADMIN__COMMITTEE__SCHEDULES} className="btn btn_skyblue_h32 w_100">목록</Link>
<button className="btn btn_red_h32 w_100 ms-2"
onClick={(e) => {
onClickDeleteSchedule(location.state?.schdulId);
}}>삭제</button>
</Col>
<Col xs={6} className="text-end">
<div className="board_btn_area">
<div className="left_col btn1">
<Link to={{pathname: URL.ADMIN__COMMITTEE__SCHEDULES__MODIFY}}
state={{
schdulId: location.state?.schdulId
}}
className="btn btn_blue_h32 w_100">수정</Link>
</Col>
</Row>
className="btn btn_skyblue_h46 w_100">수정</Link>
<button className="btn btn_skyblue_h46 w_100"
onClick={(e) => {
onClickDeleteSchedule(location.state?.schdulId);
}}>삭제</button>
</div>
<div className="right_col btn1">
<Link to={URL.ADMIN__COMMITTEE__SCHEDULES} className="btn btn_blue_h46 w_100">목록</Link>
</div>
</div>
{/* <!--// 버튼영역 --> */}
</div>
{/* <!-- 게시판 상세보기 --> */}

View File

@ -2,8 +2,7 @@ import React, { useState, useEffect } from 'react';
import { Link, useLocation, useNavigate } from 'react-router-dom';
import DatePicker from "react-datepicker";
import Col from "react-bootstrap/Col";
import Row from "react-bootstrap/Row";
import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
@ -53,12 +52,12 @@ const StyledDiv = styled.div`
width: 100%;
}
}
//.right_col {
// position: absolute;
// right: 0px;
// top: 0px;
// text-align: right;
//}
.right_col {
position: absolute;
right: 0px;
top: 0px;
text-align: right;
}
`;
function SchedulesEdit(props) {
@ -458,22 +457,24 @@ function SchedulesEdit(props) {
</dl>
{/* <!-- 버튼영역 --> */}
<Row className="pt-3">
<Col xs={6}>
<Link to={URL.ADMIN__COMMITTEE__SCHEDULES} className="btn btn_skyblue_h32 w_100">목록</Link>
<div className="board_btn_area">
<div className="left_col btn1">
<button className="btn btn_skyblue_h46 w_100"
onClick={() => updateSchedule()}
> 저장</button>
{modeInfo.mode === CODE.MODE_MODIFY &&
<button className="btn btn_red_h32 w_100 ms-2"
<button className="btn btn_skyblue_h46 w_100"
onClick={(e) => {
onClickDeleteSchedule(location.state?.schdulId);
}}>삭제</button>
}
</Col>
<Col xs={6} className={"text-end"}>
<button className="btn btn_blue_h32 w_100"
onClick={() => updateSchedule()}
> 저장</button>
</Col>
</Row>
</div>
<div className="right_col btn1">
<Link to={URL.ADMIN__COMMITTEE__SCHEDULES} className="btn btn_blue_h46 w_100">목록</Link>
</div>
</div>
{/* <!--// 버튼영역 --> */}
</StyledDiv>
{/* <!-- 게시판 상세보기 --> */}

View File

@ -57,7 +57,7 @@ function StandardCodeMgt(props) {
<div><Image src={SERVER_URL+"/admin/config/about-site-mgt/get-site-image?fileGrpId=" + item.fileGrpId} alt="이미지" onClick={(e) => window.open(e.target.src)} width={"150"}/></div>
<div>{item.siteOrder}</div>
<div>{item.useYn}</div>
<div><button className={"btn btn_skyblue_h31 px-1"} onClick={()=>{editPartnerSite(item)}}>수정</button></div>
<div><button className={"btn btn_blue_h31 px-1"} onClick={()=>{editPartnerSite(item)}}>수정</button></div>
</div>
);
});

View File

@ -262,17 +262,17 @@ function AboutSiteModal({props, reloadFunction}) {
</dl>
{/* <!-- 버튼영역 --> */}
<Row className="pt-3">
<Row className="board_btn_area">
<Col>
{/*<button type={"button"} className="btn btn_skyblue_h32" onClick={()=>{reloadFunction()}}>목록</button>*/}
<button type={"button"} className="btn btn_blue_h32" onClick={()=>{reloadFunction()}}>목록</button>
</Col>
<Col className="text-end">
<button type="submit" className="btn btn_skyblue_h32">저장
</button>
{modeInfo.mode === CODE.MODE_MODIFY &&
<button type={"button"} className="btn btn_red_h32" onClick={()=>{deletePartnerSite(props)}}>삭제</button>
}
</Col>
<Col className="text-end">
<button type="submit" className="btn btn_blue_h32">저장
</button>
</Col>
</Row>
{/* <!--// 버튼영역 --> */}
</Form>

View File

@ -6,8 +6,6 @@ import LinearProgress from '@mui/material/LinearProgress';
import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
import CODE from 'constants/code';
import Col from "react-bootstrap/Col";
import Row from "react-bootstrap/Row";
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
import EgovPagingPaginationInfo from 'components/EgovPagingPaginationInfo';
@ -186,18 +184,16 @@ function PopUp(props) {
{/* <!-- Paging --> */}
<Row className="pt-3">
<Col xs={3}></Col>
<Col xs={6}>
<div className="board-bot">
<div></div>
<EgovPagingPaginationInfo pagination={paginationInfo} setPaginationInfo={setPaginationInfo} moveToPage={passedPage => {
getList({ ...searchCondition, pageIndex: passedPage })
}} />
</Col>
<Col xs={3} className="text-end">
<Link to={URL.ADMIN__CONTENTS__POP_UP__CREATE} className="btn btn_blue_h32 w_100">등록</Link>
</Col>
<div className="right_col btn1">
<Link to={URL.ADMIN__CONTENTS__POP_UP__CREATE} className="btn btn_blue_h46 w_100">등록</Link>
</div>
</Row>
</div>
{/* <!--/ Paging --> */}

View File

@ -6,8 +6,6 @@ import AttachFile from "../../../../components/file/AttachFile";
import RichTextEditor from "../../../../components/editor/RichTextEditor";
import AlertDialogSlide from "../../../../components/alert/AlertDialogSlide";
import LoadingProgress from "../../../../components/progress/LoadingProgress";
import Col from "react-bootstrap/Col";
import Row from "react-bootstrap/Row";
import CODE from 'constants/code';
@ -417,22 +415,23 @@ function PopupEditor(props) {
{/* <!--// 게시판 --> */}
{/* <!-- 버튼영역 --> */}
<Row>
<Col xs={6}>
<button className="btn btn_skyblue_h32 w_100" onClick={onClickList}>목록</button>
<div className="board_btn_area">
<div className="left_col btn1">
<button className="btn btn_blue_h46 w_100"
onClick={onClickList}>목록</button>
</div>
<div className="right_col btn1">
<button className="btn btn_skyblue_h46 w_100"
onClick={() => createPopup()}
> 저장</button>
{modeInfo.mode === CODE.MODE_MODIFY &&
<button className="btn btn_red_h32 w_100 ms-2"
<button className="btn btn_red_h46 w_100"
onClick={(e) => {
onClickDelete(location.state?.popupId);
}}>삭제</button>
}
</Col>
<Col xs={6} className="text-end">
<button className="btn btn_blue_h32 w_100"
onClick={() => createPopup()}
> 저장</button>
</Col>
</Row>
</div>
</div>
{/* <!--// 버튼영역 --> */}
<AlertDialogSlide confirm={confirm} setConfirm={setConfirm} />

View File

@ -5,8 +5,6 @@ import LinearProgress from '@mui/material/LinearProgress';
import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
import CODE from 'constants/code';
import Col from "react-bootstrap/Col";
import Row from "react-bootstrap/Row";
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
import EgovPagingPaginationInfo from 'components/EgovPagingPaginationInfo';
@ -164,7 +162,7 @@ function StandardResearch(props) {
{/* <!-- 게시판목록 --> */}
<div className="board_list BRD005">
<div className="board_list BRD008">
<div className="head">
<span>번호</span>
<span>연구명</span>
@ -182,7 +180,7 @@ function StandardResearch(props) {
{list && list.map((it)=>(
<div className='list_item' key={it.id}>
<div>{it.number}</div>
<div className="al"><Link to={URL.ADMIN__CONTENTS__STANDARDS_RESEARCH__MODIFY} state={{rsId: it.id} } key={it.id} className='title' className={"text-222"}>{it.title}</Link></div>
<div className="al"><Link to={URL.ADMIN__CONTENTS__STANDARDS_RESEARCH__MODIFY} state={{rsId: it.id} } key={it.id} className='title' >{it.title}</Link></div>
<div>{it.researchStartDate} ~ {it.researchEndDate}</div>
<div>{it.director}</div>
</div>
@ -196,17 +194,16 @@ function StandardResearch(props) {
{/* <!-- Paging --> */}
<Row className="pt-3">
<Col xs={3}></Col>
<Col xs={6}><EgovPagingPaginationInfo pagination={paginationInfo} setPaginationInfo={setPaginationInfo} moveToPage={passedPage => {
<div className="board-bot">
<div></div>
<EgovPagingPaginationInfo pagination={paginationInfo} setPaginationInfo={setPaginationInfo} moveToPage={passedPage => {
getList({ ...searchCondition, pageIndex: passedPage })
}} />
</Col>
<Col xs={3} className="text-end">
<Link to={URL.ADMIN__CONTENTS__STANDARDS_RESEARCH__CREATE} className="btn btn_blue_h32 w_100">등록</Link>
</Col>
<div className="right_col btn1">
<Link to={URL.ADMIN__CONTENTS__STANDARDS_RESEARCH__CREATE} className="btn btn_blue_h46 w_100">등록</Link>
</div>
</Row>
</div>
{/* <!--/ Paging --> */}

View File

@ -1,9 +1,6 @@
import React, { useState, useEffect } from 'react';
import { Link, useLocation, useNavigate } from 'react-router-dom';
import DatePicker from "react-datepicker";
import Col from "react-bootstrap/Col";
import Row from "react-bootstrap/Row";
import LinearProgress from '@mui/material/LinearProgress';
import EgovAttachFile from 'components/EgovAttachFile';
@ -406,23 +403,23 @@ function StandardResearchEditor(props) {
{/* <!--// 게시판 --> */}
{/* <!-- 버튼영역 --> */}
<Row className="pt-3">
<Col xs={6}>
<button className="btn btn_skyblue_h32 w_100"
onClick={onClickList}>목록</button>
<div className="board_btn_area">
<div className="left_col btn1">
<button className="btn btn_skyblue_h46 w_100"
onClick={() => createItem()}
> 저장</button>
{modeInfo.mode === CODE.MODE_MODIFY &&
<button className="btn btn_red_h32 w_100 ms-2"
<button className="btn btn_skyblue_h46 w_100"
onClick={(e) => {
onClickDelete(location.state?.rsId);
}}>삭제</button>
}
</Col>
<Col xs={6} className="text-end">
<button className="btn btn_blue_h32 w_100"
onClick={() => createItem()}
> 저장</button>
</Col>
</Row>
</div>
<div className="right_col btn1">
<button className="btn btn_blue_h46 w_100"
onClick={onClickList}>목록</button>
</div>
</div>
{/* <!--// 버튼영역 --> */}
<AlertDialogSlide confirm={confirm} setConfirm={setConfirm} />

View File

@ -37,12 +37,12 @@ function Survey({}) {
<div className={"list_item"} key={"surveyListDiv_"+index}>
<div>{item.svyTitle}</div>
<div>{item.svyStartDt}~{item.svyEndDt}</div>
<div><button className={"btn btn_blue_h32 px-1"} onClick={()=>{editSurveyQt(item)}}>질문관리</button></div>
<div><button className={"btn btn_blue_h31 px-1"} onClick={()=>{editSurveyQt(item)}}>질문관리</button></div>
<div><Form.Check type={"switch"} defaultChecked={item.useYn==="Y"} onChange={()=>editUseYn(item.svySeq)}/></div>
<div><button className={"btn btn_blue_h32 px-1"}>설문지 보기</button></div>
<div><button className={"btn btn_blue_h32 px-1"}>통계 보기</button></div>
<div><button className={"btn btn_blue_h31 px-1"}>설문지 보기</button></div>
<div><button className={"btn btn_blue_h31 px-1"}>통계 보기</button></div>
<div>
<button className={"btn btn_skyblue_h32 px-1"} onClick={()=>{editSurvey(item)}}>수정</button>
<button className={"btn btn_blue_h31 px-1"} onClick={()=>{editSurvey(item)}}>수정</button>
</div>
</div>
);

View File

@ -145,7 +145,7 @@ function List({}) {
</ul>
</div>
<div className="board_list "> {/* userList 칸이 안맞아서 제거함.*/}
<div className="board_list userList">
<div className="head">
<span>아이디</span>
<span>이름</span>

View File

@ -173,7 +173,7 @@ function UserInfoModal({savedInfo, cmtList, reloadFunction}){
<Row className="mb-3">
<Form.Label column xs={{span:8, offset:2}} id="findResultLabel"></Form.Label>
<Col xs={2}>
<Button variant={"22498E"} type="submit">저장</Button>
<Button type="submit">저장</Button>
</Col>
</Row>
</Form>

View File

@ -1,96 +1,13 @@
import React, { useState } from 'react';
import {Link, useLocation, useNavigate} from 'react-router-dom';
import * as EgovNet from 'api/egovFetch';
import URL from "constants/url";
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavSupport';
import Row from "react-bootstrap/Row";
import Col from "react-bootstrap/Col";
import Button from "react-bootstrap/Button";
function My(){
return (
<div className="container">
<div className="c_wrap">
{/* <!-- Location --> */}
<div className="location">
<ul>
<li><Link to={URL.MAIN} className="home" >Home</Link></li>
<li>내정보</li>
</ul>
</div>
{/* <!--// Location --> */}
<div className="layout">
{/* <!-- Navigation --> */}
<EgovLeftNav></EgovLeftNav>
{/* <!--// Navigation --> */}
<div className="contents" id="contents">
{/* <!-- 본문 --> */}
<h1 className="tit_3">내정보</h1>
<div className="card bg-fa mb-3">
<Row className="p-3">
<Col xs={"auto"} className="px-4"><img src="/assets/images/icon_qna.png" /></Col>
<Col xs={"auto"} className="">
사용자가 즐겨찾기한 목록입니다.<br />
코드명을 선택하시면 즐겨찾기한 페이지로 이동됩니다.
</Col>
</Row>
</div>
{/* <!-- 게시판목록 --> */}
<div className="board_list BRD023">
<div className="head">
<span>선택</span>
<span>코드명</span>
<span>개정이력</span>
<span>파일</span>
</div>
<div className="result">
{/* <!-- case : 데이터 없을때 --> */}
{/* <p className="no_data" key="0">검색된 결과가 없습니다.</p> */}
{/* <!-- case : 데이터 있을때 --> */}
<Row className="list_item m-0">
<Col><input type={"checkbox"} name={"list1"} id={"list1"} /></Col>
<Col><Link to="" className={"text-secondary"}>1212</Link></Col>
<Col></Col>
<Col><img src="/assets/images/down.png" className={"h_20"} /></Col>
</Row>
<Row className="list_item m-0">
<Col><input type={"checkbox"} name={"list1"} id={"list1"} /></Col>
<Col><Link to="" className={"text-secondary"}>1212</Link></Col>
<Col></Col>
<Col><img src="/assets/images/down.png" className={"h_20"} /></Col>
</Row>
<Row className="list_item m-0">
<Col><input type={"checkbox"} name={"list1"} id={"list1"} /></Col>
<Col><Link to="" className={"text-secondary"}>1212</Link></Col>
<Col></Col>
<Col><img src="/assets/images/down.png" className={"h_20"} /></Col>
</Row>
</div>
</div>
{/* <!--// 게시판목록 --> */}
<Row className="board_bot justify-content-between">
<Col xs={3} className=""><Button type={"button"} variant={"22498E"} className={"px-3 f_13"} >선택삭제</Button></Col>
{/* <!-- Paging --> */}
<Col xs={6}></Col>
{/* <!--/ Paging --> */}
{/* 수요조사는 버튼명 "의견 접수" 수요조사와 QNA만 작성가능하게 관리자 세팅되어야 함/관리자 쓰기권한만 작성가능 */}
<Col xs={3} className="text-end"></Col>
</Row>
</div>
</div>
</div>
</div>
<div>마이 페이지</div>
);
}

View File

@ -19,8 +19,6 @@ import {getLocalItem, setLocalItem} from "utils/storage";
import URL from 'constants/url';
import CODE from "constants/code";
import CustomModal from './EgovModal';
import { useCookies } from "react-cookie";
function a11yProps(index) {
return {
@ -29,27 +27,6 @@ function a11yProps(index) {
};
}
function TabPanel(props) {
const { children, value, index, ...other } = props;
return (
<div
role="tabpanel"
hidden={value !== index}
id={`wrapped-tabpanel-${index}`}
aria-labelledby={`wrapped-tab-${index}`}
{...other}
>
{value === index && (
<Box sx={{ p: 3 }}>
<Typography component="div">{children}</Typography>
</Box>
)}
</div>
);
}
function EgovMain(props) {
console.group("EgovMain");
console.log("[Start] EgovMain ------------------------------");
@ -62,20 +39,7 @@ function EgovMain(props) {
const [user, setUser] = useState(parseJwt(getLocalItem('accessToken')) || null);
console.log(user);
//
const [show, setShow] = React.useState(false);
const [modalContent, setModalContent] = React.useState({});
const [showModals, setShowModals] = useState([]);
const [cookies, setCookie] = useCookies([`MainModal_${modalContent.id}`]);
const handleShow = (content) => {
setShowModals(prev => [...prev, content]);
};
const handleClose = (id) => {
setShowModals(prev => prev.filter(modal => modal.id !== id));
};
const handlePlusClick = (currentTabValue) => {
const handlePlusClick = () => {
const urls = [
URL.SUPPORT_LIST_NOCODE+'/KCSC-NOT',
URL.SUPPORT_LIST_NOCODE+'/KCSC-NTC',
@ -84,8 +48,8 @@ function EgovMain(props) {
URL.SUPPORT_LIST_NOCODE+'/KCSC-TEC',
URL.SUPPORT_LIST_NOCODE+'/KCSC-NWS'
];
if (currentTabValue >= 0 && currentTabValue < urls.length) {
navigate(urls[currentTabValue]);
if (value >= 0 && value < urls.length) {
navigate(urls[value]);
}
};
@ -101,18 +65,6 @@ function EgovMain(props) {
pauseOnHover: true
};
const settings1 = {
dots: true,
infinite: true,
speed: 1000,
slidesToShow: 1,
slidesToScroll: 1,
arrows: false,
autoplay: true,
autoplaySpeed: 5000,
pauseOnHover: true
};
const banners = [
{ src: '/assets/images/f-logo.png', url: 'https://talbakkum.com' },
{ src: '/assets/images/copy2.png', url: 'https://talbakkum.com' },
@ -134,15 +86,9 @@ function EgovMain(props) {
];
// TAB .
const [leftTabValue, setLeftTabValue] = useState(0);
const [rightTabValue, setRightTabValue] = useState(3);
const handleLeftTabChange = (event, newValue) => {
setLeftTabValue(newValue);
};
const handleRightTabChange = (event, newValue) => {
setRightTabValue(newValue);
const [value, setValue] = useState(0);
const handleChange = (event, newValue) => {
setValue(newValue);
};
// eslint-disable-next-line no-unused-vars
@ -230,36 +176,6 @@ function EgovMain(props) {
// retrieveList();
// }, [retrieveList]);
useEffect(() => {
//
const modalContents = [
{
id: 1,
title: `제목 제목 제목 제목 제목 제목 1`,
body: `내용 내용 내용 내용 내용 내용 내용 내용 내용 내용\\n내용 내용 내용 내용 내용 내용 내용 내용 내용 내용\\n내용 내용 내용 내용 내용 내용 내용 내용 내용 내용 1`,
files: [
{ name: '파일1.txt', imageSrc: '/assets/images/file.png' },
{ name: '파일2.txt', imageSrc: '/assets/images/file.png' }
]
},
{
id: 2,
title: `제목 2`,
body: `내용 2\n내용 2`,
files: [
{ name: '파일3.txt', imageSrc: '/assets/images/file.png' },
{ name: '파일4.txt', imageSrc: '/assets/images/file.png' }
]
}
];
//
modalContents.forEach(content => {
if (!cookies[`MainModal_${content.id}`]) {
handleShow(content);
}
});
}, [cookies]);
const onChangeLogin = (user) => {
setUser(user);
@ -302,268 +218,89 @@ function EgovMain(props) {
<div className="P_MAIN">{/* container */}
<div className="c_wrap">
<div className="topbox d-flex justify-content-center align-items-center">
<Row className="topbox_1">
<Col className={"topbox_11"}>
<div className="topbox_1">
<div className="topbox_11">실시간 인기키워드</div>
{/*<div className="topbox_12">현재 기준 사용자가 가장 많이 검색하는 키워드입니다.</div>*/}
<div className="topbox_13">2024 5 9 목요일 오전 11:45</div>
<Row className="topbox_14">
<Col xs={6}>
<div className={"text-truncate"}>1 가설공사</div>
<div className={"text-truncate"}>2 가설공사</div>
<div className={"text-truncate"}>3 가설공사</div>
<div className={"text-truncate"}>4 가설공사가설공사</div>
<div className={"text-truncate"}>5 가설공사</div>
</Col>
<Col xs={6}>
<div className={"text-truncate"}>&nbsp;&nbsp;6 가설공사</div>
<div className={"text-truncate"}>&nbsp;&nbsp;7 가설공사가설공사가설공사가설공사</div>
<div className={"text-truncate"}>&nbsp;&nbsp;8 가설공사</div>
<div className={"text-truncate"}>&nbsp;&nbsp;9 가설공사</div>
<div className={"text-truncate"}>10 가설공사</div>
</Col>
</Row>
</div>
<div className="topbox_2">
<div className={"topbox_11"}>자주찾는 서비스</div>
{/*<div className={"topbox_12"}>버튼을 선택하시면 해당 서비스로 이동합니다.</div>*/}
<Row>
<Col xs={6}>
<Row className={"topbox_12 justify-content-between"}>
<Col className={"topbox_13"}>설계기준</Col>
<Col className={"topbox_14"}><span>더보기 +</span></Col>
</Row>
</Col>
<Col xs={6}>
<Row className={"topbox_15 justify-content-between"}>
<Col className={"topbox_13"}>표준시방서</Col>
<Col className={"topbox_16"}><span>더보기 +</span></Col>
</Row>
</Col>
</Row>
<Row className={"pt-3 mx-0"}>
<Col xs={2}>
<Link to="/standardCode/list/1010" title="공통코드">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col xs={7}>공통</Col>
<Col xs={5} className={"text-end"}><img src={"/assets/images/x1.png"} className={"h_25"} /></Col>
</Row>
<Col>
<Link to={URL.STANDARD_CODE_LIST} className="link-wrapper">
<div className={"topbox_13"}><img src="/assets/images/ico-landing1.png" /></div>
<div className={"topbox_14"}>코드검색</div>
{/*<div className={"topbox_15"}><Button type={"button"} className={"btn btn-22498E px-3"}>바로가기</Button> </div>*/}
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/101011" title="지반">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>지반</Col>
<Col className={"text-end"}><img src={"/assets/images/x2.png"} className={"h_25"} /></Col>
</Row>
<Col>
<Link to={URL.STANDARD_CODE_INFO} className="link-wrapper">
<div className={"topbox_13"}><img src="/assets/images/ico-landing2.png" /></div>
<div className={"topbox_14"}>코드안내</div>
{/*<div className={"topbox_15"}><Button type={"button"} className={"btn btn-22498E px-3"}>바로가기</Button> </div>*/}
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/101014" title="구조">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>구조</Col>
<Col className={"text-end"}><img src={"/assets/images/x3.png"} className={"h_25"} /></Col>
</Row>
<Col>
<Link to={URL.COMMITTEE_SCHEDULE} className="link-wrapper">
<div className={"topbox_13"}><img src="/assets/images/ico-landing3.png" /></div>
<div className={"topbox_14"}>위원회일정</div>
{/*<div className={"topbox_15"}><Button type={"button"} className={"btn btn-22498E px-3"}>바로가기</Button> </div>*/}
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/102034" title="조경">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>조경</Col>
<Col className={"text-end"}><img src={"/assets/images/x4.png"} className={"h_25"} /></Col>
</Row>
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/102041" title="건축">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>건축</Col>
<Col className={"text-end"}><img src={"/assets/images/x5.png"} className={"h_25"} /></Col>
</Row>
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/102067" title="농업기반">
<Row className={"topbox_2 justify-content-between me-0"}>
<Col>농업기반</Col>
<Col className={"text-end"}><img src={"/assets/images/x6.png"} className={"h_25"} /></Col>
</Row>
<Col>
<Link to={URL.STANDARD_CODE_LIST + '/5000'} className="link-wrapper">
<div className={"topbox_13"}><img src="/assets/images/ico-landing4.png" /></div>
<div className={"topbox_14"}>전문시방서</div>
{/*<div className={"topbox_15"}><Button type={"button"} className={"btn btn-22498E px-3"}>바로가기</Button> </div>*/}
</Link>
</Col>
</Row>
<Row className={"pt-2 mx-0"}>
<Col xs={2}>
<Link to="/standardCode/list/101017" title="내진">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>내진</Col>
<Col className={"text-end"}><img src={"/assets/images/x7.png"} className={"h_25"} /></Col>
</Row>
<Row>
<Col>
<Link to={URL.STANDARD_CODE_OLD_NOCODE+'/5'} className="link-wrapper">
<div className={"topbox_13"}><img src="/assets/images/ico-landing5.png" /></div>
<div className={"topbox_14"}>훈령/예규/지침</div>
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/102021" title="가설">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>가설</Col>
<Col className={"text-end"}><img src={"/assets/images/x8.png"} className={"h_25"} /></Col>
</Row>
<Col>
<Link to={URL.STANDARD_CODE_ENG} className="link-wrapper">
<div className={"topbox_13"}><img src="/assets/images/ico-landing6.png" /></div>
<div className={"topbox_14"}>영문건설기준</div>
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/102024" title="교량">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>교량</Col>
<Col className={"text-end"}><img src={"/assets/images/x9.png"} className={"h_25"} /></Col>
</Row>
<Col>
<Link to={URL.STANDARD_CODE_TERM} className="link-wrapper">
<div className={"topbox_13"}><img src="/assets/images/ico-landing8.png" /></div>
<div className={"topbox_14"}>건설기준용어</div>
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/102047" title="철도">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>철도</Col>
<Col className={"text-end"}><img src={"/assets/images/x10.png"} className={"h_25"} /></Col>
</Row>
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/102051" title="하천">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>하천</Col>
<Col className={"text-end"}><img src={"/assets/images/x11.png"} className={"h_25"} /></Col>
</Row>
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/102054" title="댐">
<Row className={"topbox_2 justify-content-between me-0"}>
<Col></Col>
<Col className={"text-end"}><img src={"/assets/images/x12.png"} className={"h_25"} /></Col>
</Row>
<Col>
<Link to={URL.SUPPORT_API} className="link-wrapper">
<div className={"topbox_13"}><img src="/assets/images/ico-landing10.png" /></div>
<div className={"topbox_14"}>API 서비스</div>
</Link>
</Col>
</Row>
<Row className={"pt-2 mx-0"}>
<Col xs={2}>
<Link to="/standardCode/list/102027" title="터널">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>터널</Col>
<Col className={"text-end"}><img src={"/assets/images/x13.png"} className={"h_25"} /></Col>
</Row>
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/102029" title="공동구">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>공동구</Col>
<Col className={"text-end"}><img src={"/assets/images/x14.png"} className={"h_25"} /></Col>
</Row>
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/102031" title="설비">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>설비</Col>
<Col className={"text-end"}><img src={"/assets/images/x15.png"} className={"h_25"} /></Col>
</Row>
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/102057" title="상수도">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>상수도</Col>
<Col className={"text-end"}><img src={"/assets/images/x16.png"} className={"h_25"} /></Col>
</Row>
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/102061" title="하수도">
<Row className={"topbox_2 justify-content-between me-1"}>
<Col>하수도</Col>
<Col className={"text-end"}><img src={"/assets/images/x17.png"} className={"h_25"} /></Col>
</Row>
</Link>
</Col>
<Col xs={2}>
<Link to="/standardCode/list/102044" title="도로">
<Row className={"topbox_2 justify-content-between me-0"}>
<Col>도로</Col>
<Col className={"text-end"}><img src={"/assets/images/x18.png"} className={"h_25"} /></Col>
</Row>
</Link>
</Col>
</Row>
<Row className={"pt-3 mx-0 justify-content-between"}>
<Col xs={"auto"} className={"p-0"}>
<Link to={URL.STANDARD_CODE_INFO} title="건설기준안내" className={"w_75"}>
<Row className={"topbox_4 justify-content-center"}>
<Col><img src="/assets/images/ico-landing2.png" className={"w_50 h_50"} /></Col>
</Row>
<Row className={"topbox_5 justify-content-center"}>
<Col className={"text-222 text-center"}>건설기준안내</Col>
</Row>
</Link>
</Col>
<Col xs={"auto"}>
<Link to={URL.COMMITTEE_SCHEDULE} title="위원회일정" className={"w_75"}>
<Row className={"topbox_4 justify-content-center"}>
<Col><img src="/assets/images/ico-landing3.png" className={"w_50 h_50"} /></Col>
</Row>
<Row className={"topbox_5 justify-content-center"}>
<Col className={"text-222"}>위원회일정</Col>
</Row>
</Link>
</Col>
<Col xs={"auto"}>
<Link to={URL.STANDARD_CODE_LIST + '/5000'} title="전문시방서" className={"w_75"}>
<Row className={"topbox_4 justify-content-center"}>
<Col><img src="/assets/images/ico-landing4.png" className={"w_50 h_50"} /></Col>
</Row>
<Row className={"topbox_5 justify-content-center"}>
<Col className={"text-222"}>전문시방서</Col>
</Row>
</Link>
</Col>
<Col xs={"auto"}>
<Link to={URL.STANDARD_CODE_OLD_NOCODE+'/5'} title="훈련/예규/지침" className={"w_75"}>
<Row className={"topbox_4 justify-content-center"}>
<Col><img src="/assets/images/ico-landing5.png" className={"w_50 h_50"} /></Col>
</Row>
<Row className={"topbox_5 justify-content-center"}>
<Col className={"text-222"}>훈련/예규/지침</Col>
</Row>
</Link>
</Col>
<Col xs={"auto"}>
<Link to={URL.STANDARD_CODE_ENG} title="영문건설기준" className={"w_75"}>
<Row className={"topbox_4 justify-content-center"}>
<Col><img src="/assets/images/ico-landing6.png" className={"w_50 h_50"} /></Col>
</Row>
<Row className={"topbox_5 justify-content-center"}>
<Col className={"text-222"}>영문건설기준</Col>
</Row>
</Link>
</Col>
<Col xs={"auto"}>
<Link to={URL.STANDARD_CODE_TERM} title="건설기준용어" className={"w_75"}>
<Row className={"topbox_4 justify-content-center"}>
<Col><img src="/assets/images/ico-landing8.png" className={"w_50 h_50"} /></Col>
</Row>
<Row className={"topbox_5 justify-content-center"}>
<Col className={"text-222"}>건설기준용어</Col>
</Row>
</Link>
</Col>
<Col xs={"auto"}>
<Link to={URL.STANDARD_CODE_LIST} title="최근수정코드" className={"w_75"}>
<Row className={"topbox_4 justify-content-center"}>
<Col><img src="/assets/images/ico-landing13.png" className={"w_50 h_50"} /></Col>
</Row>
<Row className={"topbox_5 justify-content-center"}>
<Col className={"text-222"}>최근수정코드</Col>
</Row>
</Link>
</Col>
<Col xs={"auto"}>
<Link to={URL.SUPPORT_LIST_NOCODE+'/KCKC-INV'} title="수요조사" className={"w_75"}>
<Row className={"topbox_4 justify-content-center"}>
<Col><img src="/assets/images/ico-landing12.png" className={"w_50 h_50"} /></Col>
</Row>
<Row className={"topbox_5 justify-content-center"}>
<Col className={"text-222"}>수요조사</Col>
</Row>
</Link>
</Col>
<Col xs={"auto"}>
<Link to={URL.SUPPORT_API} title="오픈 API" className={"w_75"}>
<Row className={"topbox_4 justify-content-center"}>
<Col><img src="/assets/images/ico-landing10.png" className={"w_50 h_50"} /></Col>
</Row>
<Row className={"topbox_5 justify-content-center"}>
<Col className={"text-222"}>오픈 API</Col>
</Row>
</Link>
</Col>
</Row>
</Col>
<Col xs={"auto"} className={"justify-content-end p-0"}>
</div>
<div className="topbox_3">
<div className={"topbox_31"}>{user ? (
<div className={"topbox_11"}>{user ? (
<>
<Row>
<Col xs={6}>{user.id} .</Col>
@ -576,127 +313,105 @@ function EgovMain(props) {
<EgovLogin onChangeLogin={onChangeLogin}></EgovLogin>
</div>
</div>
</Col>
</Row>
</div>
<div className="numbox d-flex justify-content-center align-items-center">
<div className="numbox_n"><div className="num_text">다운로드 </div><div className="num_count"><CountUp start={0} end={334345} duration={2.5} separator="," /><span className="unit"></span></div></div>
<div className="numbox_n"><div className="num_text">회원가입자 </div><div className="num_count"><CountUp start={0} end={12345} duration={2.5} separator="," /><span className="unit"></span></div></div>
<div className="numbox_n"><div className="num_text"> 평균 방문자</div><div className="num_count"><CountUp start={0} end={56427} duration={2.5} separator="," /><span className="unit"></span></div></div>
<div className="numbox_n"><div className="num_text">개정고시</div><div className="num_count"><CountUp start={0} end={99875} duration={2.5} separator="," /><span className="unit"></span></div></div>
</div>
{/*<div className="menubox d-flex justify-content-center align-items-center">*/}
{/* <div className="menubox_n text-center"><Link to={URL.STANDARD_CODE_OLD}><div className="menu_img"><img src="/assets/images/ico-landing5.png" /></div><div className="menu_text">훈령/예규/지침</div></Link></div>*/}
{/* <div className="menubox_n text-center"><Link to={URL.STANDARD_CODE_ENG}><div className="menu_img"><img src="/assets/images/ico-landing6.png" /></div><div className="menu_text">영문건설기준</div></Link></div>*/}
{/* <div className="menubox_n text-center"><Link to={URL.STANDARD_CODE_TERM}><div className="menu_img"><img src="/assets/images/ico-landing8.png" /></div><div className="menu_text">건설기준용어</div></Link></div>*/}
{/* <div className="menubox_n text-center"><Link to={URL.SUPPORT_LIST_NOCODE+'/KCSC-EVT'}><div className="menu_img"><img src="/assets/images/ico-landing7.png" /></div><div className="menu_text">주요행사</div></Link></div>*/}
{/* <div className="menubox_n text-center"><Link to={URL.SUPPORT_LIST_NOCODE+'/KCSC-INV'}><div className="menu_img"><img src="/assets/images/ico-landing9.png" /></div><div className="menu_text">수요조사</div></Link></div>*/}
{/* <div className="menubox_n text-center"><Link to={URL.SUPPORT_API}><div className="menu_img"><img src="/assets/images/ico-landing10.png" /></div><div className="menu_text">API 서비스</div></Link></div>*/}
{/* <div className="menubox_n text-center"><Link to={URL.SUPPORT_SITE}><div className="menu_img"><img src="/assets/images/ico-landing11.png" /></div><div className="menu_text">관련사이트</div></Link></div>*/}
{/*</div>*/}
<div className="bbsbox d-flex justify-content-center align-items-start">
<div className="bbsbox_1">
<Box sx={{ borderBottom: 2, borderColor: 'divider' }}>
<Tabs
value={leftTabValue}
onChange={handleLeftTabChange}
value={value}
onChange={handleChange}
indicatorColor="secondary"
textColor="inherit"
sx={{
'& .Mui-selected': {
color: '#22498E', //
},
}}
textColor="#22498E"
>
<Tab value={0} {...a11yProps(0)} sx={{ fontSize: leftTabValue === 0 ? '1.3rem' : '1rem', fontWeight: 700, color: leftTabValue === 0 ? '#22498E' : 'secondary'}} label="건설기준고시" wrapped />
<Tab value={1} {...a11yProps(1)} sx={{ fontSize: leftTabValue === 1 ? '1.3rem' : '1rem', fontWeight: 700, color: leftTabValue === 1 ? '#22498E' : 'secondary'}} label="건설기준연구" />
<Tab value={2} {...a11yProps(2)} sx={{ fontSize: leftTabValue === 2 ? '1.3rem' : '1rem', fontWeight: 700, color: leftTabValue === 2 ? '#22498E' : 'secondary'}} label="위원회 진행현황" />
<Tab value="" label="+" sx={{ fontSize: '1.75rem', ml: 'auto' }} onClick={() => handlePlusClick(leftTabValue)} />
<Tab value={0} {...a11yProps(0)} sx={{ fontSize: value === 0 ? '1.5rem' : '1rem', fontWeight: 700, color: value === 0 ? '#22498E' : 'secondary'}} label="건설기준고시" wrapped />
<Tab value={1} {...a11yProps(1)} sx={{ fontSize: value === 1 ? '1.5rem' : '1rem', fontWeight: 700, color: value === 1 ? '#22498E' : 'secondary'}} label="공지사항" />
<Tab value={2} {...a11yProps(2)} sx={{ fontSize: value === 2 ? '1.5rem' : '1rem', fontWeight: 700, color: value === 2 ? '#22498E' : 'secondary'}} label="위원회 진행현황" />
<Tab value={3} {...a11yProps(3)} sx={{ fontSize: value === 3 ? '1.5rem' : '1rem', fontWeight: 700, color: value === 3 ? '#22498E' : 'secondary'}} label="건설기준연구" />
<Tab value={4} {...a11yProps(4)} sx={{ fontSize: value === 4 ? '1.5rem' : '1rem', fontWeight: 700, color: value === 4 ? '#22498E' : 'secondary'}} label="기술자료" />
<Tab value={5} {...a11yProps(5)} sx={{ fontSize: value === 5 ? '1.5rem' : '1rem', fontWeight: 700, color: value === 5 ? '#22498E' : 'secondary'}} label="보도자료" />
<Tab value="" label="+" sx={{ fontSize: '1.75rem', ml: 'auto' }} onClick={handlePlusClick} />
</Tabs>
</Box>
<TabPanel value={leftTabValue} index={0}>
<TabPanel value={value} index={0}>
<Row className={"bbsbox_11"}>
<Col xs={9} className={"text-truncate"}><Link to={URL.SUPPORT_DETAIL} className={"bbsbox_11_title"}>국토교통부고시_제2024-147(내진설계일반(KDS_17_10_00))_정정_고시</Link></Col>
<Col xs={3} className={"text-end"}>2024.01.23.</Col>
{/*<Col xs={1} className={"text-end"}><img src={"/assets/images/file.png"} /></Col>*/}
<Col xs={2} className={"text-end"}>2024.01.23.</Col>
<Col xs={1} className={"text-end"}><img src={"/assets/images/file.png"} /></Col>
</Row>
<Row className={"bbsbox_11"}>
<Col xs={9} className={"text-truncate"}><Link to={URL.SUPPORT_DETAIL} className={"bbsbox_11_title"}>국토교통부고시_제2024-147(내진설계일반(KDS_17_10_00))_정정_고시</Link></Col>
<Col xs={3} className={"text-end"}>2024.01.23.</Col>
<Col xs={2} className={"text-end"}>2024.01.23.</Col>
<Col xs={1} className={"text-end"}><img src={"/assets/images/file.png"} /></Col>
</Row>
<Row className={"bbsbox_11"}>
<Col xs={9} className={"text-truncate"}><Link to={URL.SUPPORT_DETAIL} className={"bbsbox_11_title"}>국토교통부고시_제2024-147(내진설계일반(KDS_17_10_00))_정정_고시</Link></Col>
<Col xs={3} className={"text-end"}>2024.01.23.</Col>
<Col xs={2} className={"text-end"}>2024.01.23.</Col>
<Col xs={1} className={"text-end"}><img src={"/assets/images/file.png"} /></Col>
</Row>
<Row className={"bbsbox_11"}>
<Col xs={9} className={"text-truncate"}><Link to={URL.SUPPORT_DETAIL} className={"bbsbox_11_title"}>국토교통부고시_제2024-147(내진설계일반(KDS_17_10_00))_정정_고시_정정_고시_정정_고시_정정_고시_정정_고시_정정_고시_정정_고시</Link></Col>
<Col xs={3} className={"text-end"}>2024.01.23.</Col>
<Col xs={2} className={"text-end"}>2024.01.23.</Col>
<Col xs={1} className={"text-end"}><img src={"/assets/images/file.png"} /></Col>
</Row>
</TabPanel>
<TabPanel value={leftTabValue} index={1}>
<TabPanel value={value} index={1}>
<Row className={"bbsbox_11"}>
<Col xs={9} className={"text-truncate"}><Link to={URL.SUPPORT_DETAIL} className={"bbsbox_11_title"}>2024 제7차 건설기준연구</Link></Col>
<Col xs={3} className={"text-end"}>2024.01.23.</Col>
<Col xs={9} className={"text-truncate"}>2024 제7차 건설기준위원회</Col>
<Col xs={2} className={"text-end"}>2024.01.23.</Col>
<Col xs={1} className={"text-end"}><img src={"/assets/images/file.png"} /></Col>
</Row>
<Row className={"bbsbox_11"}>
<Col xs={9} className={"text-truncate"}>2024 제7차 건설기준위원회</Col>
<Col xs={3} className={"text-end"}>2024.01.23.</Col>
<Col xs={2} className={"text-end"}>2024.01.23.</Col>
<Col xs={1} className={"text-end"}><img src={"/assets/images/file.png"} /></Col>
</Row>
<Row className={"bbsbox_11"}>
<Col xs={9} className={"text-truncate"}>2024 제7차 건설기준위원회</Col>
<Col xs={3} className={"text-end"}>2024.01.23.</Col>
<Col xs={2} className={"text-end"}>2024.01.23.</Col>
<Col xs={1} className={"text-end"}><img src={"/assets/images/file.png"} /></Col>
</Row>
<Row className={"bbsbox_11"}>
<Col xs={9} className={"text-truncate"}>2024 제7차 건설기준위원회</Col>
<Col xs={3} className={"text-end"}>2024.01.23.</Col>
</Row>
</TabPanel>
<TabPanel value={leftTabValue} index={2}>위원회 진행현황 리스트 출력</TabPanel>
</div>
<div className="bbsbox_3">
<Box sx={{ borderBottom: 2, borderColor: 'divider' }}>
<Tabs
value={rightTabValue}
onChange={handleRightTabChange}
indicatorColor="secondary"
textColor="inherit"
sx={{
'& .Mui-selected': {
color: '#22498E', //
},
}}
>
<Tab value={3} {...a11yProps(3)} sx={{ fontSize: rightTabValue === 3 ? '1.3rem' : '1rem', fontWeight: 700, color: rightTabValue === 3 ? '#22498E' : 'secondary'}} label="공지사항" />
<Tab value={4} {...a11yProps(4)} sx={{ fontSize: rightTabValue === 4 ? '1.3rem' : '1rem', fontWeight: 700, color: rightTabValue === 4 ? '#22498E' : 'secondary'}} label="기술자료" />
<Tab value={5} {...a11yProps(5)} sx={{ fontSize: rightTabValue === 5 ? '1.3rem' : '1rem', fontWeight: 700, color: rightTabValue === 5 ? '#22498E' : 'secondary'}} label="보도자료" />
<Tab value="" label="+" sx={{ fontSize: '1.75rem', ml: 'auto' }} onClick={() => handlePlusClick(rightTabValue)} />
</Tabs>
</Box>
<TabPanel value={rightTabValue} index={3}>
<Row className={"bbsbox_11"}>
<Col xs={9} className={"text-truncate"}><Link to={URL.SUPPORT_DETAIL} className={"bbsbox_11_title"}>2024 제7차 공지사항</Link></Col>
<Col xs={3} className={"text-end"}>2024.01.23.</Col>
</Row>
<Row className={"bbsbox_11"}>
<Col xs={9} className={"text-truncate"}>2024 제7차 건설기준연구</Col>
<Col xs={3} className={"text-end"}>2024.01.23.</Col>
</Row>
<Row className={"bbsbox_11"}>
<Col xs={9} className={"text-truncate"}>2024 제7차 건설기준연구</Col>
<Col xs={3} className={"text-end"}>2024.01.23.</Col>
</Row>
<Row className={"bbsbox_11"}>
<Col xs={9} className={"text-truncate"}>2024 제7차 건설기준연구</Col>
<Col xs={3} className={"text-end"}>2024.01.23.</Col>
</Row>
</TabPanel>
<TabPanel value={rightTabValue} index={4}>기술자료 리스트 출력</TabPanel>
<TabPanel value={rightTabValue} index={5}>보도자료 리스트 출력</TabPanel>
</div>
<div className="bbsbox_2">
{/*<Link to={URL.ABOUT_PROMOTE}><img src="/assets/images/narae.jpg" /></Link>*/}
<Slider {...settings1}>
<Link to={URL.ABOUT_PROMOTE}><img src="/assets/images/narae.jpg" /></Link>
<Link to={URL.ABOUT_PROMOTE}><img src="/assets/images/narae.jpg" /></Link>
</Slider>
<Col xs={2} className={"text-end"}>2024.01.23.</Col>
<Col xs={1} className={"text-end"}><img src={"/assets/images/file.png"} /></Col>
</Row></TabPanel>
<TabPanel value={value} index={2}>건설기준고시 리스트 출력</TabPanel>
<TabPanel value={value} index={3}>건설기준연구 리스트 출력</TabPanel>
<TabPanel value={value} index={4}>기술자료 리스트 출력</TabPanel>
<TabPanel value={value} index={5}>보도자료 리스트 출력</TabPanel>
</div>
<div className="bbsbox_2"><Link to={URL.ABOUT_PROMOTE}><img src="/assets/images/narae.jpg" /></Link></div>
</div>
<Row className={"qna_count d-flex justify-content-center"}>
<Col className="qnabox">
<div className="qnabox">
<div className="qnabox_1 d-flex justify-content-center">
<div className="qnabox_11 text-start align-items-end">Q&A</div>
<Row className="qnabox_12 text-center justify-content-center align-items-end">
<Col xs={8}></Col>
<div className="qnabox_11 d-flex justify-content-start align-items-end">Q&A</div>
<Row className="qnabox_12 text-center align-items-end">
<Col xs={9}></Col>
<Col xs={1} className={"rounded_circle_qna"}><img src={"/assets/images/left.png"} /></Col>
<Col xs={2} className={""}> 1/2 </Col>
<Col xs={1} className={""}> 1/2 </Col>
<Col xs={1} className={"rounded_circle_qna"}><img src={"/assets/images/right.png"} /></Col>
</Row>
</div>
@ -706,7 +421,7 @@ function EgovMain(props) {
<Col xs={10} className={"qnabox_n_file py-1"}>00.jpg</Col>
<Col xs={2} className={"text-end p-0"}><img src={"/assets/images/file.png"} /></Col>
</Row>
<Row className={"qnabox_n_title pt-2"}><Link to={URL.SUPPORT_DETAIL} className={"text-secondary p-0"}>콘크리트 내구성 설계 평가 문의요.. 정말 되나요? 콘크리트 내구성 설계 평가 문의요.. 정말 되나요? 정말 되나요? 정말 되나요? 정말 되나요? 정말 되나요?</Link></Row>
<Row className={"qnabox_n_title pt-2"}><Link to={URL.SUPPORT_DETAIL} className={"text-secondary p-0"}>콘크리트 내구성 설계 평가 문의요.. 정말 되나요? 콘크리트 내구성 설계 평가 문의요.. 정말 되나요?</Link></Row>
<Row className={"qnabox_n_date justify-content-end"}>2024.01.23</Row>
</div>
<div className="qnabox_n">
@ -734,26 +449,8 @@ function EgovMain(props) {
<Row className={"qnabox_n_date justify-content-end"}>2024.01.23</Row>
</div>
</div>
</Col>
<Col className={"numbox"}>
<Row className="numbox_n">
<Col className="num_text">다운로드 </Col>
<Col className="num_count"><CountUp start={0} end={334345} duration={2.5} separator="," /><span className="unit"></span></Col>
</Row>
<Row className="numbox_n">
<Col className="num_text">회원가입자 </Col>
<Col className="num_count"><CountUp start={0} end={12345} duration={2.5} separator="," /><span className="unit"></span></Col>
</Row>
<Row className="numbox_n">
<Col className="num_text"> 평균 방문자</Col>
<Col className="num_count"><CountUp start={0} end={56427} duration={2.5} separator="," /><span className="unit"></span></Col>
</Row>
<Row className="numbox_n">
<Col className="num_text">개정고시</Col>
<Col className="num_count"><CountUp start={0} end={99875} duration={2.5} separator="," /><span className="unit"></span></Col>
</Row>
</Col>
</Row>
</div>
<div className="bannerbox">
<Slider {...settings}>
@ -767,19 +464,30 @@ function EgovMain(props) {
</Slider>
</div>
</div>
{showModals.map(modalContent => (
<CustomModal
key={modalContent.id}
show={true}
handleClose={() => handleClose(modalContent.id)}
modalContent={modalContent}
/>
))}
</div>
);
}
function TabPanel(props) {
const { children, value, index, ...other } = props;
return (
<div
role="tabpanel"
hidden={value !== index}
id={`wrapped-tabpanel-${index}`}
aria-labelledby={`wrapped-tab-${index}`}
{...other}
>
{value === index && (
<Box sx={{ p: 3 }}>
<Typography>{children}</Typography>
</Box>
)}
</div>
);
}
export default EgovMain;

View File

@ -1,70 +0,0 @@
import React from 'react';
import Modal from 'react-bootstrap/Modal';
import { Row, Col, Button } from 'react-bootstrap';
import { useCookies } from 'react-cookie';
const CustomModal = ({ show, handleClose, modalContent }) => {
const [dontShowAgain, setDontShowAgain] = React.useState(false);
const [cookies, setCookie] = useCookies([`MainModal_${modalContent.id}`]);
const handleCheckboxChange = () => {
const newDontShowAgain = !dontShowAgain;
setDontShowAgain(newDontShowAgain);
if (newDontShowAgain) {
const expirationDate = new Date();
expirationDate.setDate(expirationDate.getDate() + 1);
setCookie(`MainModal_${modalContent.id}`, "true", { expires: expirationDate });
handleClose();
}
};
React.useEffect(() => {
if (cookies[`MainModal_${modalContent.id}`]) {
handleClose();
}
}, [cookies, modalContent.id, handleClose]);
return (
<Modal show={show} onHide={handleClose} backdrop="static">
<Modal.Header closeButton className={"bg-224 text-white rounded-0"}>
<Modal.Title className={"fs-6"}>{modalContent.title}</Modal.Title>
</Modal.Header>
<Modal.Body className={"px-4 pb-0"}>
<Row className={"pb-3"}>
<Col xs={12} className="text-start">
{modalContent.body && modalContent.body.split("\n").map((line, index) => (
<React.Fragment key={index}>
{line}
<br />
</React.Fragment>
))}
</Col>
</Row>
{modalContent.files && modalContent.files.map((file, index) => (
<Row key={index} className={`py-2 ${index === 0 ? 'border-top' : ''}`}>
<Col xs={1}><img src={file.imageSrc} className={"h_20"} alt="파일" /></Col>
<Col xs={11} className="text-start">{file.name}</Col>
</Row>
))}
{/*<Row className={"py-2 border-top"}>*/}
{/* <Col xs={1} ><img src={"/assets/images/file.png"} className={"h_20"} /></Col>*/}
{/* <Col xs={11} className="text-start">파일명</Col>*/}
{/*</Row>*/}
{/*<Row className={"py-2"}>*/}
{/* <Col xs={1} ><img src={"/assets/images/file.png"} className={"h_20"} /></Col>*/}
{/* <Col xs={11} className="text-start">파일명</Col>*/}
{/*</Row>*/}
{/*<Row className={"py-2"}>*/}
{/* <Col xs={1} ><img src={"/assets/images/file.png"} className={"h_20"} /></Col>*/}
{/* <Col xs={11} className="text-start">파일명</Col>*/}
{/*</Row>*/}
</Modal.Body>
<Modal.Footer className={"h_30 py-1 mb-1 bg-fa"}>
<input type="checkbox" checked={dontShowAgain} onChange={handleCheckboxChange} id={`MainModal_${modalContent.id}`} />
<label className={"f_12"} htmlFor={`MainModal_${modalContent.id}`}> 오늘 하루 열지 않음</label>
</Modal.Footer>
</Modal>
);
};
export default CustomModal;

View File

@ -97,92 +97,92 @@ function StandardCodeInfo({}){
<Col className={"code_border"}></Col>
</Row>
</Col>
<Col xs={"auto"} className={"h-100"}>
<Col xs={8} className={"h-100"}>
<Row>
<Col xs={"auto"}>
<Col xs={2}>
<Row>
<Col xs={"auto"}>
<Col xs={1}>
<Row className={"pt-5"}>
<Col className={"code_border"}></Col>
</Row>
</Col>
<Col xs={8} className={"code_circle py-4"}>개정 <br />용이성</Col>
<Col xs={"auto"}>
<Col xs={1}>
<Row className={"pt-5"}>
<Col className={"code_border"}></Col>
</Row>
</Col>
</Row>
</Col>
<Col xs={"auto"}>
<Col xs={2}>
<Row>
<Col xs={"auto"}>
<Col xs={1}>
<Row className={"pt-5"}>
<Col className={"code_border"}></Col>
</Row>
</Col>
<Col xs={8} className={"code_circle py-4"}>중복성 <br />최소화</Col>
<Col xs={"auto"}>
<Col xs={1}>
<Row className={"pt-5"}>
<Col className={"code_border"}></Col>
</Row>
</Col>
</Row>
</Col>
<Col xs={"auto"}>
<Col xs={2}>
<Row>
<Col xs={"auto"}>
<Col xs={1}>
<Row className={"pt-5"}>
<Col className={"code_border"}></Col>
</Row>
</Col>
<Col xs={8} className={"code_circle py-4"}>상층성 <br />해결</Col>
<Col xs={"auto"}>
<Col xs={1}>
<Row className={"pt-5"}>
<Col className={"code_border"}></Col>
</Row>
</Col>
</Row>
</Col>
<Col xs={"auto"}>
<Col xs={2}>
<Row>
<Col xs={"auto"}>
<Col xs={1}>
<Row className={"pt-5"}>
<Col className={"code_border"}></Col>
</Row>
</Col>
<Col xs={8} className={"code_circle py-4"}>사용자 <br />편의성</Col>
<Col xs={"auto"}>
<Col xs={1}>
<Row className={"pt-5"}>
<Col className={"code_border"}></Col>
</Row>
</Col>
</Row>
</Col>
<Col xs={"auto"}>
<Col xs={2}>
<Row>
<Col xs={"auto"}>
<Col xs={1}>
<Row className={"pt-5"}>
<Col className={"code_border"}></Col>
</Row>
</Col>
<Col xs={8} className={"code_circle py-4"}>코드추가 <br />확장성</Col>
<Col xs={"auto"}>
<Col xs={1}>
<Row className={"pt-5"}>
<Col className={"code_border"}></Col>
</Row>
</Col>
</Row>
</Col>
<Col xs={"auto"}>
<Col xs={2}>
<Row>
<Col xs={"auto"}>
<Col xs={1}>
<Row className={"pt-5"}>
<Col className={"code_border"}></Col>
</Row>
</Col>
<Col xs={8} className={"code_circle py-4"}>성능 <br />중심지향</Col>
<Col xs={"auto"}>
<Col xs={1}>
<Row className={"pt-5"}>
<Col className={"code_border"}></Col>
</Row>

View File

@ -3,8 +3,6 @@ import {Button, Modal, Nav} from "react-bootstrap";
import Col from "react-bootstrap/Col";
import Row from "react-bootstrap/Row";
import * as EgovNet from "api/egovFetch";
import URL from "constants/url";
import {Link} from "react-router-dom";
function DownloadModal({closeFn}){
@ -35,40 +33,22 @@ function DownloadModal({closeFn}){
<Modal.Title id="example-modal-sizes-title-lg">통합다운로드</Modal.Title>
</Modal.Header>
<Modal.Body>
<div className="condition bg-fa">
<ul className={"d-flex justify-content-start"}>
<li className="col-auto">
<Row className={"justify-content-start py-1 mx-1"}>
<Col xs={"auto px-1"}>
<div className={`tab ${tab === 10 ? 'active' : ''}`}
onClick={() => {setTab(10); setSubTabsVisible(false)}}>설계기준</div>
</li>
<li className="col-auto">
</Col>
<Col xs={"auto px-1"}>
<div className={`tab ${tab === 20 ? 'active' : ''}`}
onClick={() => {setTab(20); setSubTabsVisible(false)}}>표준시방서</div>
</li>
<li className="col-auto">
</Col>
<Col xs={"auto px-1"}>
<div className={`tab ${[40, 50, 60, 70, 80, 90].includes(tab) ? 'active' : ''}`}
onClick={() => {setTab(40); setSubTabsVisible(true)}}>전문시방서</div>
</li>
</ul>
</div>
{/*<Row className={"justify-content-start py-1 mx-1"}>*/}
{/* <Col xs={"auto px-1"}>*/}
{/* <div className={`tab ${tab === 10 ? 'active' : ''}`}*/}
{/* onClick={() => {setTab(10); setSubTabsVisible(false)}}>설계기준</div>*/}
{/* </Col>*/}
{/* <Col xs={"auto px-1"}>*/}
{/* <div className={`tab ${tab === 20 ? 'active' : ''}`}*/}
{/* onClick={() => {setTab(20); setSubTabsVisible(false)}}>표준시방서</div>*/}
{/* </Col>*/}
{/* <Col xs={"auto px-1"}>*/}
{/* <div className={`tab ${[40, 50, 60, 70, 80, 90].includes(tab) ? 'active' : ''}`}*/}
{/* onClick={() => {setTab(40); setSubTabsVisible(true)}}>전문시방서</div>*/}
{/* </Col>*/}
{/*</Row>*/}
</Col>
</Row>
{subTabsVisible && (
<Nav className={"tabs mt-2 text-4c6"} variant={"tabs"} >
<Nav className={"tabs"} variant={"tabs"} >
<Nav.Item><Nav.Link className={`${tab === 40 ? 'active' : ''}`} onClick={() => {setTab(40)}}>서울특별시</Nav.Link></Nav.Item>
<Nav.Item><Nav.Link className={`${tab === 50 ? 'active' : ''}`} onClick={() => {setTab(50)}}>고속도로공사</Nav.Link></Nav.Item>
<Nav.Item><Nav.Link className={`${tab === 60 ? 'active' : ''}`} onClick={() => {setTab(60)}}>한국농어촌공사</Nav.Link></Nav.Item>
@ -77,7 +57,7 @@ function DownloadModal({closeFn}){
<Nav.Item><Nav.Link className={`${tab === 90 ? 'active' : ''}`} onClick={() => {setTab(90)}}>K-Water</Nav.Link></Nav.Item>
</Nav>
)}
<div className="board_list BRD022 download_list"> {/*standard_code_modal */}
<div className="board_list standard_code_modal download_list">
<div className="head">
<span>구분</span>
<span>코드</span>
@ -92,8 +72,7 @@ function DownloadModal({closeFn}){
<div className="mainCategory">{item.groupNm}</div>
<div className="middleCategory">{item.groupCurCd}</div>
<div className="kcscCd">
{/*<Button size={"sm"} variant={"outline-secondary"}>다운로드</Button>*/}
<Link to=""><img src={"/assets/images/down.png"} className={"h_20"} /></Link>
<Button size={"sm"} variant={"outline-secondary"}>다운로드</Button>
</div>
</div>
)
@ -101,7 +80,7 @@ function DownloadModal({closeFn}){
</div>
</div>
</Modal.Body>
{/*<Modal.Footer><Button onClick={closeFn}>닫기</Button></Modal.Footer>*/}
<Modal.Footer><Button onClick={closeFn}>닫기</Button></Modal.Footer>
</>
)
}

View File

@ -38,7 +38,7 @@ function FavoriteIcon({item}){
alert("로그인 후 이용 가능한 서비스 입니다.")
}
}}>
<AiFillStar color={favoriteChk?'#FFC000':''} size={25} />
<AiFillStar color={favoriteChk?'#FFC000':''}/>
</div>
);
}

View File

@ -1,6 +1,4 @@
import React from "react";
import {Link} from "react-router-dom";
import * as File from "utils/file"
import {Button, Modal, Nav} from "react-bootstrap";
@ -13,7 +11,7 @@ function HistoryModal({closeFn, standardCode}){
</Modal.Header>
<Modal.Body>
<div>코드 : {standardCode.kcscCd}</div>
<div className="board_list BRD022">
<div className="board_list standard_code_modal">
<div className="head">
<span>고시일</span>
<span>기준코드</span>
@ -27,12 +25,12 @@ function HistoryModal({closeFn, standardCode}){
<div className="list_item">
<div className="mainCategory">{history.rvsnYmd.split('T')[0]}</div>
<div className="middleCategory">
{/*{history.docFileGrpId}*/}
{history.docFileGrpId?<Link to={""} onClick={()=>File.standardCode(history.docFileGrpId)}><img src={"/assets/images/down.png"} className={"h_20"} /> </Link>:''}
{history.docFileGrpId}
{history.docFileGrpId?<Button size={"sm"} variant={"outline-secondary"} onClick={()=>File.standardCode(history.docFileGrpId)}>다운로드 </Button>:''}
</div>
<div className="kcscCd">
{/*{history.rvsnFileGrpId}*/}
{history.rvsnFileGrpId?<Link to={""} onClick={()=>File.download(history.rvsnFileGrpId)}><img src={"/assets/images/down.png"} className={"h_20"} /> </Link>:''}
{history.rvsnFileGrpId}
{history.rvsnFileGrpId?<Button size={"sm"} variant={"outline-secondary"} onClick={()=>File.download(history.rvsnFileGrpId)}>다운로드 </Button>:''}
</div>
</div>
)
@ -40,7 +38,7 @@ function HistoryModal({closeFn, standardCode}){
</div>
</div>
</Modal.Body>
{/*<Modal.Footer><Button onClick={closeFn}>닫기</Button></Modal.Footer>*/}
<Modal.Footer><Button onClick={closeFn}>닫기</Button></Modal.Footer>
</>
)
}

View File

@ -1,19 +1,17 @@
import React from 'react';
import {Link} from 'react-router-dom';
import Col from "react-bootstrap/Col";
import Row from "react-bootstrap/Row";
import FavoriteIcon from "./FavoriteIcon";
import Button from "react-bootstrap/Button";
function StandardCodeList({listData, filterData, getHistoryModal, isDetailSearchOpen}) {
function StandardCodeList({listData, filterData, getHistoryModal}) {
function historyBtn(item){
getHistoryModal(item);
}
return (
<div className={isDetailSearchOpen ? 'result standard_code_result_detail' : 'result standard_code_result'}>
<div className={"result standard_code_result"}>
{listData.filter(item => {
if (item.groupNm.includes(filterData)) {
return item
@ -21,12 +19,15 @@ function StandardCodeList({listData, filterData, getHistoryModal, isDetailSearch
return null
}).map(item => {
return (
<div className="list_item2 List_Codes">
<div className="kcscCd">{item.kcscCd}</div>
<div className="groupNm">{item.groupNm}<br /><span className={"text-danger f_12 pt-0"}>{item.rvsnRemark}</span></div>
<div className="list_item List_Codes">
<div className="mainCategory">{item.mainCategory}</div>
<div className="middleCategory">{item.middleCategory}</div>
<div className="">
<div className="kcscCd">{item.kcscCd}</div>
<div className="groupNm">{item.groupNm}<br/><span className={"text-danger"}>{item.rvsnRemark}</span></div>
<div className="Revisionhistory">
<Button size={"sm"} variant={"outline-secondary"} onClick={()=>{historyBtn(item)}}>개정 이력</Button>
</div>
<div className="fille">
<Row className={"justify-content-start"}>
{item.historyList.filter(history => {
return history;
@ -38,43 +39,25 @@ function StandardCodeList({listData, filterData, getHistoryModal, isDetailSearch
}else{
buttonClass += "btn-primary "
}
const handleClick = () => {
const rvsnYmd = new Date(history.rvsnYmd);
rvsnYmd.setHours(rvsnYmd.getHours() + 9);
window.open("/standardCode/viewer/" + history.kcscCd + ":" + rvsnYmd.toISOString().split('T')[0]);
};
return (
<Col xs={"auto"} className={"px-1"}>
{/*<input type="button"*/}
{/* className={buttonClass}*/}
{/* value={history.docEr==='E'?'제':'개'}*/}
{/* onClick={()=>{*/}
{/* const rvsnYmd = new Date(history.rvsnYmd)*/}
{/* rvsnYmd.setHours(rvsnYmd.getHours()+9)*/}
{/* window.open("/standardCode/viewer/"+history.kcscCd+":"+rvsnYmd.toISOString().split('T')[0]);*/}
{/* }}*/}
{/*/>*/}
<Link to="" onClick={handleClick}>
<img
src={history.docEr === 'E' ? '/assets/images/je.png' : '/assets/images/ge.png'}
alt={history.docEr === 'E' ? '제' : '개'}
className={"h_20"}
<input type="button"
className={buttonClass}
value={history.docEr==='E'?'제':'개'}
onClick={()=>{
const rvsnYmd = new Date(history.rvsnYmd)
rvsnYmd.setHours(rvsnYmd.getHours()+9)
window.open("/standardCode/viewer/"+history.kcscCd+":"+rvsnYmd.toISOString().split('T')[0]);
}}
/>
<br/>
<p className={pClass}>{history.docYr}</p>
</Link>
</Col>
)
})}
</Row>
</div>
<div className="Revisionhistory">
{/*<Button size={"sm"} variant={"outline-secondary"} onClick={()=>{historyBtn(item)}}>개정 이력</Button>*/}
<Link to="" onClick={()=>{historyBtn(item)}}><img src={"/assets/images/down.png"} className={"h_20"} /></Link>
</div>
<FavoriteIcon item={item} />
<FavoriteIcon item={item}/>
</div>
)
})}

View File

@ -18,7 +18,6 @@ function StandardCodePage({}) {
const [resultCnt, setResultCnt] = useState(0);
const [remarkCnt, setRemarkCnt] = useState(0);
const [modalContent, setModalContent] = useState([]);
const [isDetailSearchOpen, setIsDetailSearchOpen] = useState(false);
const [show, setShow] = useState(false);
function close() {
@ -57,34 +56,39 @@ function StandardCodePage({}) {
setModalContent(<HistoryModal closeFn={close} standardCode={item}/>)
}
const toggleDetailSearch = () => {
setIsDetailSearchOpen(prevState => !prevState);
};
return (
<div className="">
<div className="c_wrap">
{/*<div className="location">
<ul>
<li><Link to={URL.MAIN} className="home">Home</Link></li>
<li>건설기준코드</li>
<li><Link to={URL.STANDARD_CODE_LIST} >건설기준코드 검색</Link></li>
</ul>
</div>*/}
<div className="layout">
<div className="contents NOTICE_LIST" id="contents">
{/*<div className="top_tit">
<h1 className="tit_1">건설기준코드 검색</h1>
</div>*/}
<div className="StandardCodeList container">
<div className="c_wrap codeListContent">
<div className="layout">
{/*<div className="contents NOTICE_LIST" id="contents">*/}
{/* <div className="StandardCodeList container">*/}
{/* <div className="c_wrap codeListContent">*/}
{/* <div className="layout">*/}
<div className="contents NOTICE_LIST listTableDiv">
<StandardCodeSearchForm param={listCode?listCode:'10'} reloadFunction={retrieveList} resultCnt={resultCnt} remarkCnt={remarkCnt} downloadModal={downloadModal}
toggleDetailSearch={toggleDetailSearch} isDetailSearchOpen={isDetailSearchOpen}/>
<div className="board_list BRD021"> {/*code_list*/}
<StandardCodeSearchForm param={listCode?listCode:'10'} reloadFunction={retrieveList} resultCnt={resultCnt} remarkCnt={remarkCnt} downloadModal={downloadModal}/>
<div className="board_list code_list">
<div className="head">
<span>코드번호</span>
<span>코드명</span>
<span>대분류</span>
<span>중분류</span>
<span>코드번호</span>
<span>코드명</span>
<span>개정이력</span>
<span>다운로드</span>
<span className={"text-start"}>보기</span>
<span>즐겨찾기</span>
</div>
{
listLoading?(<Loading loadingState={true}/>):(
<StandardCodeList listData={listData} filterData={filterData} getHistoryModal={historyModal} isDetailSearchOpen={isDetailSearchOpen} />
<StandardCodeList listData={listData} filterData={filterData} getHistoryModal={historyModal}/>
)
}
</div>
@ -92,10 +96,10 @@ function StandardCodePage({}) {
{modalContent}
</Modal>
</div>
{/* </div>*/}
{/* </div>*/}
{/* </div>*/}
{/*</div>*/}
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,15 +1,12 @@
import React, {useEffect, useState, memo} from "react";
import {Link} from "react-router-dom";
import URL from "constants/url";
import React, {useEffect, useState} from "react";
import {Nav} from "react-bootstrap";
import Row from "react-bootstrap/Row";
import Col from "react-bootstrap/Col";
import {Link} from "react-router-dom";
import Button from "react-bootstrap/Button";
import * as EgovNet from "../../../api/egovFetch";
import * as EgovNet from "api/egovFetch";
function StandardCodeSearchForm({param, reloadFunction, resultCnt, remarkCnt, downloadModal, toggleDetailSearch, isDetailSearchOpen}){
function StandardCodeSearchForm({param, reloadFunction, resultCnt, remarkCnt, downloadModal}){
const [searchCondition, setSearchCondition] = useState({
tab: Number(param?.substring(0, 2)),
@ -56,7 +53,7 @@ function StandardCodeSearchForm({param, reloadFunction, resultCnt, remarkCnt, do
getSelectBoxOption(groupCd, (resp)=>{
const options = [];
resp.result.groupList.forEach(function (item, index){
options.push(<option key={item.groupCurCd} value={item.groupCurCd}>{item.groupNm}</option>)
options.push(<option value={item.groupCurCd}>{item.groupNm}</option>)
})
setCat1SelectOption(options)
})
@ -68,7 +65,7 @@ function StandardCodeSearchForm({param, reloadFunction, resultCnt, remarkCnt, do
getSelectBoxOption(groupCd, (resp)=>{
const options = [];
resp.result.groupList.forEach(function (item, index){
options.push(<option key={item.groupCurCd} value={item.groupCurCd}>{item.groupNm}</option>)
options.push(<option value={item.groupCurCd}>{item.groupNm}</option>)
})
setCat2SelectOption(options)
})
@ -80,199 +77,88 @@ function StandardCodeSearchForm({param, reloadFunction, resultCnt, remarkCnt, do
getSelectBoxOption(groupCd, (resp)=>{
const options = [];
resp.result.groupList.forEach(function (item, index){
options.push(<option key={item.groupCurCd} value={item.groupCurCd}>{item.groupNm}</option>)
options.push(<option value={item.groupCurCd}>{item.groupNm}</option>)
})
setCat3SelectOption(options)
})
}, [searchCondition.category2]);
//
const handleSearch = () => {
reloadFunction({ param });
if (isDetailSearchOpen) {
toggleDetailSearch();
}
};
return (
<>
{/* <!-- 검색조건 --> */}
<div className="condition my-2 bg-fa">
<ul className={"d-flex justify-content-between"}>
<li className="col-auto">
<Button type="button" variant={"outline-22498E"} className="px-4" onClick={downloadModal}>통합다운로드</Button>
<div className="condition">
<ul>
<li className="third_1 L">
<div className={`tab ${searchCondition.tab === 10 ? 'active' : ''}`}
onClick={() => {setSearchCondition({...searchCondition, tab: 10})}}>설계기준</div>
</li>
<li className="col-auto">
<Button type="button" variant={"outline-22498E"} className="px-4" href={URL.STANDARD_CODE_INFO}>건설기준코드 안내</Button>
<li className="third_1 L">
<div className={`tab ${searchCondition.tab === 20 ? 'active' : ''}`}
onClick={() => {setSearchCondition({...searchCondition, tab: 20})}}>표준시방서</div>
</li>
<li className="w-100">
<li className="third_1 L">
<div className={`tab ${[40, 50, 60, 70, 80, 90].includes(searchCondition.tab) ? 'active' : ''}`}
onClick={() => {setSearchCondition({...searchCondition, tab: 40})}}>전문시방서</div>
</li>
{/*<li className="col-auto">*/}
{/* <input type="text" name="" placeholder="검색어를 입력해 주세요." className="form-control shadow-none rounded-2" />*/}
{/*</li>*/}
{/*<li className="col-auto">*/}
{/* <Button type="button" className="btn btn-22498E px-4" onClick={handleSearch}>검색</Button>*/}
{/*</li>*/}
<li className="col-auto d-flex align-items-center">
{remarkCnt?(
<span>전체 {resultCnt} / <span className={"text-danger"}>{remarkCnt}</span> </span>
):(
<span>전체 {resultCnt} </span>
)}
</li>
<li className="col-auto">
<Button type="button" variant={"outline-22498E"} className="px-4" onClick={toggleDetailSearch}>상세검색 {isDetailSearchOpen ? '∧' : ''}</Button>
</li>
</ul>
</div>
{/* <!--// 검색조건 --> */}
{isDetailSearchOpen && (
<div className="detail-search">
{/* 상세 검색 조건을 여기에 추가 */}
<div className="board_view2">
<dl className={"bg-f8f border-bottom"}>
<dd>
<Row>
<Col xs={"auto"} className={"d-flex align-items-center"}><Button type={"button"} variant={"outline-secondary"} className={"w_20 h_20 px-0 pt-0 me-2 f_12 rounded-0"}>X</Button>설계기준(KDS)</Col>
<Col xs={"auto"} className={"d-flex align-items-center"}><Button type={"button"} variant={"outline-secondary"} className={"w_20 h_20 px-0 pt-0 me-2 f_12 rounded-0"}>X</Button>설계기준(KDS)</Col>
<Col xs={"auto"} className={"d-flex align-items-center"}><Button type={"button"} variant={"outline-secondary"} className={"w_20 h_20 px-0 pt-0 me-2 f_12 rounded-0"}>X</Button>설계기준(KDS)</Col>
<Col xs={"auto"} className={"d-flex align-items-center"}><Button type={"button"} variant={"outline-secondary"} className={"w_20 h_20 px-0 pt-0 me-2 f_12 rounded-0"}>X</Button>설계기준(KDS)</Col>
</Row>
</dd>
</dl>
<dl>
<dt>건설기준</dt>
<dd>
<input type={"checkbox"} name={"chk1"} id={"chk1"} className={"form-check-inline me-1"} /> <label className="pe-3" htmlFor="chk1">설계기준(KDS)</label>
<input type={"checkbox"} name={"chk2"} id={"chk2"} className={"form-check-inline me-1"} /> <label className="pe-3" htmlFor="chk2">표준시방서(KCS)</label>
</dd>
</dl>
<dl>
<dt>전문시방서</dt>
<dd>
<input type={"checkbox"} name={"chk3"} id={"chk3"} className={"form-check-inline me-1"} /> <label className="pe-3" htmlFor="chk3">서울시(SMCS)</label>
<input type={"checkbox"} name={"chk4"} id={"chk4"} className={"form-check-inline me-1"} /> <label className="pe-3" htmlFor="chk4">고속도로공사(EXCS)</label>
<input type={"checkbox"} name={"chk5"} id={"chk5"} className={"form-check-inline me-1"} /> <label className="pe-3" htmlFor="chk5">농업생산기반시설(KRCCS)</label>
<input type={"checkbox"} name={"chk6"} id={"chk6"} className={"form-check-inline me-1"} /> <label className="pe-3" htmlFor="chk6">철도건설공사(KRACS)</label>
<input type={"checkbox"} name={"chk7"} id={"chk7"} className={"form-check-inline me-1"} /> <label className="pe-3" htmlFor="chk7">LH 한국토지주택공사(LHCS)</label>
<input type={"checkbox"} name={"chk8"} id={"chk8"} className={"form-check-inline me-1"} /> <label className="pe-3" htmlFor="chk8">K-water(KWCS)</label>
</dd>
</dl>
<dl>
<dt>카테고리</dt>
<dd>
<label className="pe-3" htmlFor="sel1">
<select className={"form-select form-select-sm shadow-none"} id="sel1" title="조건" value={searchCondition.category1}
<li className="third_1 L">
<label className="f_select" htmlFor="sel1">
<select id="sel1" title="조건" value={searchCondition.category1}
onChange={(e)=>{setSearchCondition({...searchCondition, category1: e.target.value})}}>
<option value="">전체</option>
{cat1SelectOption}
</select>
</label>
<label className="pe-3" htmlFor="sel1">
<select className={"form-select form-select-sm shadow-none"} id="sel2" title="조건" value={searchCondition.category2}
</li>
<li className="third_1 L">
<label className="f_select w_306" htmlFor="sel1">
<select id="sel2" title="조건" value={searchCondition.category2}
onChange={(e)=>{setSearchCondition({...searchCondition, category2: e.target.value})}}>
<option value="">전체</option>
{cat2SelectOption}
</select>
</label>
<label className="pe-3" htmlFor="sel1">
<select className={"form-select form-select-sm shadow-none"} id="sel3" title="조건" value={searchCondition.category3}
</li>
<li className="third_1 L">
<label className="f_select w_306" htmlFor="sel1">
<select id="sel3" title="조건" value={searchCondition.category3}
onChange={(e)=>{setSearchCondition({...searchCondition, category3: e.target.value})}}>
<option value="">전체</option>
{cat3SelectOption}
</select>
</label>
</dd>
</dl>
<dl>
<dt>검색어</dt>
<dd>
<input type="text" name="" placeholder="검색어를 입력해 주세요." className="form-control shadow-none rounded-2" />
</dd>
</dl>
</div>
<div className="text-center w-100 py-3">
<Button type="button" variant={"secondary"} className="px-4 me-3">초기화</Button>
<Button type="button" variant={"22498E"} className="px-4">상세검색</Button>
</div>
</div>
</li>
<li className="third_1 L">
{remarkCnt?(
<span>전체 {resultCnt} / <span className={"text-danger"}>{remarkCnt}</span> </span>
):(
<span>전체 {resultCnt} </span>
)}
{/*<div className="condition">*/}
{/* <ul>*/}
{/* <li className="third_1 L">*/}
{/* <div className={`tab ${searchCondition.tab === 10 ? 'active' : ''}`}*/}
{/* onClick={() => {setSearchCondition({...searchCondition, tab: 10})}}>설계기준</div>*/}
{/* </li>*/}
{/* <li className="third_1 L">*/}
{/* <div className={`tab ${searchCondition.tab === 20 ? 'active' : ''}`}*/}
{/* onClick={() => {setSearchCondition({...searchCondition, tab: 20})}}>표준시방서</div>*/}
{/* </li>*/}
{/* <li className="third_1 L">*/}
{/* <div className={`tab ${[40, 50, 60, 70, 80, 90].includes(searchCondition.tab) ? 'active' : ''}`}*/}
{/* onClick={() => {setSearchCondition({...searchCondition, tab: 40})}}>전문시방서</div>*/}
{/* </li>*/}
{/* <li className="third_1 L">*/}
{/* <label className="f_select" htmlFor="sel1">*/}
{/* <select id="sel1" title="조건" value={searchCondition.category1}*/}
{/* onChange={(e)=>{setSearchCondition({...searchCondition, category1: e.target.value})}}>*/}
{/* <option value="">전체</option>*/}
{/* {cat1SelectOption}*/}
{/* </select>*/}
{/* </label>*/}
{/* </li>*/}
{/* <li className="third_1 L">*/}
{/* <label className="f_select w_306" htmlFor="sel1">*/}
{/* <select id="sel2" title="조건" value={searchCondition.category2}*/}
{/* onChange={(e)=>{setSearchCondition({...searchCondition, category2: e.target.value})}}>*/}
{/* <option value="">전체</option>*/}
{/* {cat2SelectOption}*/}
{/* </select>*/}
{/* </label>*/}
{/* </li>*/}
{/* <li className="third_1 L">*/}
{/* <label className="f_select w_306" htmlFor="sel1">*/}
{/* <select id="sel3" title="조건" value={searchCondition.category3}*/}
{/* onChange={(e)=>{setSearchCondition({...searchCondition, category3: e.target.value})}}>*/}
{/* <option value="">전체</option>*/}
{/* {cat3SelectOption}*/}
{/* </select>*/}
{/* </label>*/}
{/* </li>*/}
{/* <li className="third_1 L">*/}
{/* {remarkCnt?(*/}
{/* <span>전체 {resultCnt} / <span className={"text-danger"}>{remarkCnt}</span> 건</span>*/}
{/* ):(*/}
{/* <span>전체 {resultCnt} 건</span>*/}
{/* )}*/}
{/* </li>*/}
{/* <li className="third_1 L">*/}
{/* <div className={`tab`} onClick={downloadModal}>통합 다운로드</div>*/}
{/* </li>*/}
{/* </ul>*/}
{/*</div>*/}
{/*<Row className={"justify-content-between"}>*/}
{/* <Col>*/}
{/* {subTabsVisible && (*/}
{/* <Nav className={"tabs"} variant={"tabs"} >*/}
{/* <Nav.Item><Nav.Link className={`${searchCondition.tab === 40 ? 'active' : ''}`} onClick={() => {setSearchCondition({...searchCondition, tab: 40})}}>서울특별시</Nav.Link></Nav.Item>*/}
{/* <Nav.Item><Nav.Link className={`${searchCondition.tab === 50 ? 'active' : ''}`} onClick={() => {setSearchCondition({...searchCondition, tab: 50})}}>고속도로공사</Nav.Link></Nav.Item>*/}
{/* <Nav.Item><Nav.Link className={`${searchCondition.tab === 60 ? 'active' : ''}`} onClick={() => {setSearchCondition({...searchCondition, tab: 60})}}>한국농어촌공사</Nav.Link></Nav.Item>*/}
{/* <Nav.Item><Nav.Link className={`${searchCondition.tab === 70 ? 'active' : ''}`} onClick={() => {setSearchCondition({...searchCondition, tab: 70})}}>철도건설공사</Nav.Link></Nav.Item>*/}
{/* <Nav.Item><Nav.Link className={`${searchCondition.tab === 80 ? 'active' : ''}`} onClick={() => {setSearchCondition({...searchCondition, tab: 80})}}>LH한국토지주택공사</Nav.Link></Nav.Item>*/}
{/* <Nav.Item><Nav.Link className={`${searchCondition.tab === 90 ? 'active' : ''}`} onClick={() => {setSearchCondition({...searchCondition, tab: 90})}}>K-Water</Nav.Link></Nav.Item>*/}
{/* </Nav>*/}
{/* )}*/}
{/* </Col>*/}
{/* <Col xs={"auto"}>*/}
{/* <Button href={"/standardCode/info"} size={"sm"} variant={"secondary"}>건설기준코드 안내</Button>*/}
{/* </Col>*/}
{/*</Row>*/}
</li>
<li className="third_1 L">
<div className={`tab`} onClick={downloadModal}>통합 다운로드</div>
</li>
</ul>
</div>
<Row className={"justify-content-between"}>
<Col>
{subTabsVisible && (
<Nav className={"tabs"} variant={"tabs"} >
<Nav.Item><Nav.Link className={`${searchCondition.tab === 40 ? 'active' : ''}`} onClick={() => {setSearchCondition({...searchCondition, tab: 40})}}>서울특별시</Nav.Link></Nav.Item>
<Nav.Item><Nav.Link className={`${searchCondition.tab === 50 ? 'active' : ''}`} onClick={() => {setSearchCondition({...searchCondition, tab: 50})}}>고속도로공사</Nav.Link></Nav.Item>
<Nav.Item><Nav.Link className={`${searchCondition.tab === 60 ? 'active' : ''}`} onClick={() => {setSearchCondition({...searchCondition, tab: 60})}}>한국농어촌공사</Nav.Link></Nav.Item>
<Nav.Item><Nav.Link className={`${searchCondition.tab === 70 ? 'active' : ''}`} onClick={() => {setSearchCondition({...searchCondition, tab: 70})}}>철도건설공사</Nav.Link></Nav.Item>
<Nav.Item><Nav.Link className={`${searchCondition.tab === 80 ? 'active' : ''}`} onClick={() => {setSearchCondition({...searchCondition, tab: 80})}}>LH한국토지주택공사</Nav.Link></Nav.Item>
<Nav.Item><Nav.Link className={`${searchCondition.tab === 90 ? 'active' : ''}`} onClick={() => {setSearchCondition({...searchCondition, tab: 90})}}>K-Water</Nav.Link></Nav.Item>
</Nav>
)}
</Col>
<Col xs={"auto"}>
<Button href={"/standardCode/info"} size={"sm"} variant={"secondary"}>건설기준코드 안내</Button>
</Col>
</Row>
</>
);
}
export default memo(StandardCodeSearchForm);;
export default StandardCodeSearchForm;

View File

@ -1,5 +1,5 @@
import React, { useState, useEffect, useCallback } from 'react';
import { useLocation, useParams, Link } from 'react-router-dom';
import { useLocation, useParams } from 'react-router-dom';
import Loading from 'components/Loading'
import BookmarkModal from './BookmarkModal';
import {VwDiv, VwPtag} from './Vw.style'
@ -31,7 +31,8 @@ function CodeViewer(props) {
const [show, setShow] = useState(false);
const [bookMarkModal, setBookMarkModal] = useState();
const [colList, setColList] = useState([3,7,2]);
const [colList, setColList] = useState([3,2,7]);
const sessionUser = parseJwt(getLocalItem('accessToken'));
const sessionUserSe = sessionUser?.userSe;
@ -70,9 +71,9 @@ function CodeViewer(props) {
if(docInfo.length>0){
let optionTag = [];
let activeIndex = 0;
let docTitle = "";
let docFileGrpId = "";
let rvsnFileGrpId = "";
let docTitle = "";
if(ymd===undefined){
activeIndex = docInfo.length-1
docTitle = docInfo[docInfo.length-1].doc_nm
@ -93,8 +94,8 @@ function CodeViewer(props) {
buttonClass += "btn-primary "
}
if(index === activeIndex){
buttonClass += "docInfoActive "
pClass += "yearInfoActive "
buttonClass += "docInfoActive"
pClass += "yearInfoActive"
docFileGrpId = item.doc_file_grp_id;
rvsnFileGrpId = item.rvsn_file_grp_id;
}
@ -107,50 +108,24 @@ function CodeViewer(props) {
onClick={docInfoSelectorChange}
data-ymd={item.rvsn_ymd}
data-doccode={item.kcsc_cd}
data-docinfoseq={item.doc_info_seq} />
{/*<div onClick={docInfoSelectorChange} value={item.doc_er==='E'?'제':'개'} data-ymd={item.rvsn_ymd} data-doccode={item.kcsc_cd} data-docinfoseq={item.doc_info_seq}>*/}
{/* <img*/}
{/* src={item.doc_er === 'E' ? '/assets/images/je.png' : '/assets/images/ge.png'}*/}
{/* alt={item.rvsn_ymd}*/}
{/* className={"h_20"}*/}
{/* />*/}
data-docinfoseq={item.doc_info_seq}/>
<br/>
<p className={pClass}>{item.doc_yr}</p>
{/*</Button>*/}
</Col>)
})
headTag.push(
<>
<Col xs={3} className={"d-flex align-items-center fw-bold"}>{docCode} {docTitle}</Col>
<Col xs={9}>
<Row className="justify-content-between">
<Col xs={"auto"}>
<Row>
<Col xs={"auto"}>
<Row className="docInfoRow">
{/*<Col className="docInfoTitle">{docCode} {docTitle}</Col>*/}
<Col className="docInfoTitle">{docCode} {docTitle}</Col>
{optionTag}
</Row>
</Col>
<Col className={"d-flex align-items-center"}>
<Button type="button" variant={"22498E"} className="optionBtn w_75 h_30" >연혁</Button>
<Button type="button" variant={"22498E"} className="optionBtn w_75 h_30" >2단비교</Button>
{rvsnFileGrpId?<Button type="button" variant={"22498E"} className="optionBtn w_75 h_30" onClick={()=>{File.download(rvsnFileGrpId)}} >신구조문</Button>:''}
{docFileGrpId?<Button type="button" variant={"22498E"} className="optionBtn w_75 h_30" onClick={()=>{File.standardCode(docFileGrpId)}} >첨부파일</Button>:''}
<Button type="button" variant={"22498E"} className="optionBtn w_75 h_30" >인용(3)</Button>
<Button type="button" variant={"22498E"} className="optionBtn w_75 h_30" >피인용(5)</Button>
<Button type="button" variant={"22498E"} className="optionBtn w_75 h_30" >인쇄</Button>
</Col>
</Row>
</Col>
<Col xs={"auto"}>
<InputGroup>
<Form.Control type="text" size={"sm"} placeholder={"문서 내 검색"} className={"me-2 rounded-1"}/>
{errorSelector}
<Button type={"button"} variant={"outline-22498E"} className={"px-3 rounded-1 btn-sm"} ><img src={"/assets/images/menu.png"} className={"h_10 mt-1"} /> 목차 닫기</Button>
</InputGroup>
</Col>
</Row>
<Col>
<input type="button" className="btn btn-sm btn-primary optionBtn" value="연혁"/>
<input type="button" className="btn btn-sm btn-primary optionBtn" value="2단비교"/>
{rvsnFileGrpId?<input type="button" className="btn btn-sm btn-primary optionBtn" value="신구조문" onClick={()=>{File.download(rvsnFileGrpId)}}/>:''}
{docFileGrpId?<input type="button" className="btn btn-sm btn-primary optionBtn" value="첨부파일" onClick={()=>{File.standardCode(docFileGrpId)}}/>:''}
</Col>
</>
)
@ -287,7 +262,7 @@ function CodeViewer(props) {
setDocSummary(summaryTag);
setDocDetail(detailTag);
if(optionTag.length>0){
errorTag.push(<Form.Select size="sm" onChange={errorSelectorChange} className={"me-2 rounded-1"}><option value="">선택</option>{optionTag}</Form.Select>)
errorTag.push(<Form.Select size="sm" onChange={errorSelectorChange}><option value="">선택</option>{optionTag}</Form.Select>)
setErrorSelector(errorTag);
}
setDocLoading(false);
@ -428,9 +403,9 @@ function CodeViewer(props) {
}
function treeControl(){
if(colList[0]===3){
setColList([0,10,2]);
setColList([0,3,9]);
}else{
setColList([3,7,2]);
setColList([3,2,7]);
}
}
@ -447,44 +422,38 @@ function CodeViewer(props) {
<Loading loadingState={treeLoading || docLoading}/>
<Row className={`mx-0 ${treeLoading || docLoading?'d-none':''}`}>
<Col xs={12} className="border-bottom">
<Row className={"pt-1"}>
{/*<Col xs={3}></Col>*/}
{/*<Col xs={9}>*/}
{/* <Row className="justify-content-between">*/}
{/* <Col xs={"auto"}>*/}
{/* <Row>*/}
<Row>
<Col xs={3}></Col>
<Col xs={9}>
<Row className="justify-content-between">
<Col xs={"auto"}>
<Row>
{docInfo}
{/* </Row>*/}
{/* </Col>*/}
{/* <Col xs={"auto"}>*/}
{/* <InputGroup>*/}
{/* <Form.Control type="text" size={"sm"} placeholder={"문서 내 검색"}/>*/}
{/* {errorSelector}*/}
{/* </InputGroup>*/}
{/* </Col>*/}
{/* </Row>*/}
{/*</Col>*/}
</Row>
</Col>
<Col xs={"auto"}>
<InputGroup>
<Form.Control type="text" size={"sm"} placeholder={"문서 내 검색"}/>
{errorSelector}
</InputGroup>
</Col>
</Row>
</Col>
</Row>
</Col>
<Col xs={colList[0]} className={`border-end viewerDiv ${colList[0]===3?'':'d-none'}`}>
{/*{codeTree}*/}
<ViewerTree docCode={docCode} updateDocCode={updateDocCode} setTreeLoading={setTreeLoading}/>
</Col>
<Col xs={colList[1]} className="viewerDiv detailInfoDiv" ref={actionAppend}>
<div className={"datailcollapse"}>
{/*<Button size={"sm"} variant={"outline-secondary"} onClick={treeControl}>{colList[0]===3?'트리 접기':'트리 펼치기'}</Button>*/}
<img
src={colList[0]===3 ? "/assets/images/close.png" : "/assets/images/open.png"}
alt={colList[0]===3 ? "접기" : "열기"}
onClick={treeControl}
className={"cursor"}
/>
<Col xs={colList[1]} className="border-end viewerDiv">
<div>
<Button size={"sm"} variant={"outline-secondary"} onClick={treeControl}>{colList[0]===3?'트리 접기':'트리 펼치기'}</Button>
</div>
{docDetail}
</Col>
<Col xs={colList[2]} className="border-end viewerDiv">
{docSummary}
</Col>
<Col xs={colList[2]} className="viewerDiv detailInfoDiv" ref={actionAppend}>
{docDetail}
</Col>
</Row>
<Modal show={show} onHide={handleClose} size="xl" keyboard={false} scrollable>
{bookMarkModal}

View File

@ -30,7 +30,7 @@ const SbItem = ({item, openDocCode, updateDocCode}) => {
<SbTitle depth={item.doc_level} onClick={toggleCollapse}>{icon1}{icon2}&nbsp;{(item.doc_level === 1?'':item.doc_code)+' '+item.doc_code_name}</SbTitle>
<SbSub isOpen={collapsed}>
{item.childrens.map((child) => (
<SbItem key={child.seq} item={child} openDocCode={openDocCode} updateDocCode={updateDocCode} />
<SbItem item={child} openDocCode={openDocCode} updateDocCode={updateDocCode} />
))}
</SbSub>
</div>

View File

@ -38,7 +38,7 @@ function ViewerTree({docCode, updateDocCode, setTreeLoading}){
return (
<SbContainer>
{tree.map((subItem) =>
<SbItem key={subItem.seq} item={subItem} openDocCode={docCode} updateDocCode={updateDocCode} />
<SbItem item={subItem} openDocCode={docCode} updateDocCode={updateDocCode} />
)}
</SbContainer>
);

View File

@ -67,7 +67,7 @@ export function CodeTree({docCode, setdoccodandname}) {
//TODO
export function CodeCotentData({docCode}) {
const [codeChapter, setcodeChapter] = useState([]);
const [codeContent, setcodeContent] = useState([]);
const [codeContent, setcodeContetn] = useState([]);
let result =[];
const getCodeDetail = (docCode) => {
EgovNet.requestFetch(
@ -98,7 +98,7 @@ export function CodeCotentData({docCode}) {
</VwDiv>
)
}))
setcodeContent(result.map(item =>{
setcodeContetn(result.map(item =>{
const isTitle = item.full_content.includes(item.group_title);
const docLinkReg = /([A-Z]{3,5}(\s[0-9]{2}){3,4})/g
const docPartReg = /\((?:표|그림|부록)?\s*([A-Z]\.)?(?!\d\))\d+(\.\d+)*(\s?\(\d\))?(-\d+)?(?:\s*[A-Z])?\)/g

View File

@ -1,5 +1,5 @@
import React, {useCallback, useEffect, useState} from 'react';
import {Link, useLocation, useNavigate, useParams} from 'react-router-dom';
import React, { useState } from 'react';
import {Link, useNavigate} from 'react-router-dom';
import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
@ -7,24 +7,10 @@ import URL from 'constants/url';
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';
import Button from 'react-bootstrap/Button';
import {format} from "date-fns";
import DOMPurify from 'dompurify';
import CODE from "../../constants/code";
function Detail(){
const navigate = useNavigate();
const {bbsContSeq} = useParams();
console.log("@@@ bbsContSeq : " + bbsContSeq);
const location = useLocation();
const item = location.state?.item;
console.log("@@@ item : " + JSON.stringify(item));
const [listTag, setListTag] = useState([]);
const [comment, setComment] = useState('');
const goToList = () => {
navigate('/support/list/KCSC-QA');
};
@ -33,114 +19,6 @@ function Detail(){
navigate('/support/create/KCSC-QA');
};
const retrieveList = useCallback(() => {
console.log("@@@ retrieveList 호출됨");
const retrieveListURL = '/user/boards/reply/reply-list?bbsContSeq=' + bbsContSeq;
const requestOptions = {
method: "GET",
headers: {
'Content-type': 'application/json',
}
}
EgovNet.requestFetch(retrieveListURL,
requestOptions,
(resp) => {
let mutListTag = [];
setListTag([]);
resp.result.replyList.forEach(function (item) {
const finalModifiedDate = item?.lastChgDt || item?.frstCrtDt;
const formattedDate = finalModifiedDate ? format(finalModifiedDate, "yyyy-MM-dd HH:mm:ss") : "";
mutListTag.push(
<li key={item.replSeq}>
<span>{item?.frstCrtId}, {formattedDate}</span>
{item?.replCont}
<Link to="#" className="btn delete" onClick={() => deleteReply(item.replSeq)}>삭제</Link>
</li>
);
});
if(!mutListTag.length) mutListTag.push(<p className="no_data" key="0">댓글이 없습니다.</p>); //
setListTag(mutListTag);
},
function (resp) {
console.log("err response : ", resp);
}
);
},[bbsContSeq]);
useEffect(() => {
retrieveList();
}, []);
const handleChange = (event) => {
setComment(event.target.value);
};
const handleSubmit = (e) => {
console.log(comment);
editReply(e);
};
const editReply = (e) => {
e.preventDefault();
e.stopPropagation();
const data = {
bbsContSeq: bbsContSeq,
replCont: comment
};
console.log("@@@ data : " + JSON.stringify(data));
EgovNet.requestFetch(
'/user/boards/reply/reply-mgt',
{
method: "POST",
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(data)
},
(resp) => {
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
alert("저장되었습니다.");
setComment('');
retrieveList();
} else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) {
console.log("토큰 갱신중.")
} else {
alert(resp.result.resultMessage)
}
}
)
}
const deleteReply = (replSeq) => {
if (window.confirm("삭제하시겠습니까?")) {
EgovNet.requestFetch(
'/user/boards/reply/reply-mgt',
{
method: "DELETE",
headers: {
'Content-type': 'application/json'
},
body: JSON.stringify({replSeq})
},
(resp) => {
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
console.log("@@@ 삭제 성공, retrieveList 호출");
retrieveList();
} else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) {
console.log("토큰 갱신중.")
} else {
alert(resp.result.resultMessage)
}
}
)
}
}
return (
<div className="container">
<div className="c_wrap">
@ -167,34 +45,38 @@ function Detail(){
</dd>
<dt>등록일자</dt>
<dd>
{format(new Date(item.frstCrtDt), 'yyyy-MM-dd HH:mm:ss')}
2011-08-08 11:11:11
</dd>
</dl>
<dl>
<dt>작성자</dt>
<dd>
{item.frstCrtId}
박성환
</dd>
<dt>조회</dt>
<dd>
{item.bbsReadCnt}
100
</dd>
</dl>
<dl>
<dt>첨부파일</dt>
<dd>
<span className="file_attach">
<Link to="">{item.fileGrpId}</Link> <span>[3626] byte</span>
<Link to="">file_name.hwp</Link> <span>[3626] byte</span>
</span>
</dd>
</dl>
<dl>
<dd>{item.bbsContTitle}</dd>
<dd>[공지] jsp파일을 못찼습니다. 제목 뿌려주세요.</dd>
</dl>
</div>
<div className="qna_q">
<span>Q</span>
<div dangerouslySetInnerHTML={{ __html: DOMPurify.sanitize(item.bbsContents) }}></div>
안녕하세요 웹호스팅에 올렸더니 jsp파일에서 이런에러로그가 남았는데요 jsp파일을 못찾는것같습니다? xml을 수정해야하나요?<br/>
심각: Servlet.service() for servlet action threw exception<br/>
javax.servlet.ServletException: Could not get RequestDispatcher for [/WEB-INF/jsp/egovframework//main/main.jsp]: check that
this file exists within your WAR<br/>
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:217)
</div>
<div className="qna_a">
<span>A</span>
@ -226,18 +108,32 @@ function Detail(){
</Col>
<Col xs={10} className="">
{/*<div>*/}
<textarea className="f_txtar w-100 h-100" name="" id="replay_write" rows="4"
value={comment} onChange={handleChange}></textarea>
<textarea className="f_txtar w-100 h-100" name="" id="replay_write" rows="4"></textarea>
{/*</div>*/}
</Col>
<Col xs={1} className="">
<Button type={"button"} className="btn btn-22498E w-100 h-100" onClick={handleSubmit}>등록</Button>
<Button type={"button"} className="btn btn-22498E w-100 h-100" >등록</Button>
</Col>
</Row>
{/* <!--// 답변달기 --> */}
<div className="qna_a">
<ul>
{listTag}
<li>
<span>chanjin, 2011-08-08 12:33:33</span>
심각: Servlet.service() for servlet action threw exception은 jsp파일을 열어서 보셔야합니다.<br />
javax.servlet.ServletException: Could not get RequestDispatcher for [/WEB-INF/jsp/egovframework//main/main.jsp]: check that<br />
<Link to="#" className="btn delete">삭제</Link>
</li>
<li>
<span>sunrise, 2011-08-07 11:11:11</span>
tomcat서버를 재시동해보세요. 그렇게 하니깐 되던데요.
<Link to="#" className="btn delete">삭제</Link>
</li>
<li>
<span>auto, 2011-08-07 11:11:11</span>
제가 살펴볼께요 메일로 주세요. test@naver.com
<Link to="#" className="btn delete">삭제</Link>
</li>
</ul>
</div>

View File

@ -1,5 +1,5 @@
import React, {useCallback, useEffect, useState} from 'react';
import {Link, useLocation, useNavigate, useParams} from 'react-router-dom';
import React, { useState } from 'react';
import {Link, useNavigate} from 'react-router-dom';
import * as EgovNet from 'api/egovFetch';
import URL from 'constants/url';
@ -7,9 +7,6 @@ import URL from 'constants/url';
import Row from 'react-bootstrap/Row';
import Col from 'react-bootstrap/Col';
import Button from 'react-bootstrap/Button';
import {format} from "date-fns";
import EgovPaging from "../../components/EgovPaging";
import Detail from "./Detail";
function List(){
const navigate = useNavigate();
@ -17,95 +14,6 @@ function List(){
const goToCreate = () => {
navigate('/support/create/KCSC-QA');
};
const location = useLocation();
const {BbsCode} = useParams();
const [searchCondition, setSearchCondition] = useState(location.state?.searchCondition || { pageIndex: 1, searchCnd: '0', searchKeyword: '', bbsId:BbsCode });// ||
const [paginationInfo, setPaginationInfo] = useState({});
const [listTag, setListTag] = useState([]);
const [categoryList, setCategoryList] = useState([]);
const [show, setShow] = useState(false);
const [modalBody, setModalBody] = useState();
const handleClose = () => setShow(false);
const handleShow = () => setShow(true);
console.log("@@@ BbsCode : " + BbsCode);
function Detail(item) {
const detailUrl = '/support/detail/' + item.bbsContSeq;
console.log(detailUrl);
navigate(detailUrl, {state : {item}});
}
const retrieveList = useCallback((searchCondition) => {
handleClose();
const params = EgovNet.convParams(searchCondition);
console.groupCollapsed("EgovUserPostList.retrieveList()");
const retrieveListURL = '/user/boards/posts/post-list' + params;
const requestOptions = {
method: "GET",
headers: {
'Content-type': 'application/json',
}
}
EgovNet.requestFetch(retrieveListURL,
requestOptions,
(resp) => {
setPaginationInfo(resp.result.paginationInfo);
setCategoryList(resp.result.categoryList);
console.log("@@@ resultCnt : " + resp.result.resultCnt);
let mutListTag = [];
setListTag([]);
resp.result.fixedList.forEach(function (item) {
const finalModifiedDate = item?.lastChgDt ? item?.lastChgDt : item?.frstCrtDt;
const formattedDate = finalModifiedDate ? format(finalModifiedDate, "yyyy-MM-dd") : "";
mutListTag.push(
<div className="list_item">
<div>공지</div>
<div className="al" onClick={()=>{Detail(item)}}>{item?.bbsContTitle}</div>
<div>{item?.frstCrtId}</div>
<div>{item?.bbsReadCnt}</div>
<div>{formattedDate}</div>
<div>{item?.fileGrpId && <img src="/assets/images/file.png" />}</div>
</div>
);
});
resp.result.postList.forEach(function (item, index) {
const finalModifiedDate = item?.lastChgDt ? item?.lastChgDt : item?.frstCrtDt;
const formattedDate = finalModifiedDate ? format(finalModifiedDate, "yyyy-MM-dd") : "";
mutListTag.push(
<div className="list_item">
<div>{resp.result.resultCnt - (resp.result.paginationInfo.pageIndex -1) * resp.result.paginationInfo.rowCnt - index}</div>
<div className="al" onClick={()=>{Detail(item)}}>{item?.bbsContTitle}</div>
<div>{item?.frstCrtId}</div>
<div>{item?.bbsReadCnt}</div>
<div>{formattedDate}</div>
<div>{item?.fileGrpId && <img src="/assets/images/file.png" />}</div>
</div>
);
});
if(!mutListTag.length) mutListTag.push(<p className="no_data" key="0">검색된 결과가 없습니다.</p>); //
setListTag(mutListTag);
},
function (resp) {
console.log("err response : ", resp);
}
);
console.groupEnd("EgovUserPostList.retrieveList()");
},[listTag]);
useEffect(() => {
retrieveList(searchCondition);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [searchCondition]);
return (
@ -164,8 +72,7 @@ function List(){
{/* <p className="no_data" key="0">검색된 결과가 없습니다.</p> */}
{/* <!-- case : 데이터 있을때 --> */}
{listTag}
{/*<Link to={URL.SUPPORT_DETAIL_NOCODE+'/KCSC-NTC'} className="list_item">
<Link to={URL.SUPPORT_DETAIL_NOCODE+'/KCSC-NTC'} className="list_item">
<div>3</div>
<div className="al">[공지] 공통컴포넌트 모니터링 관련 서비스 실행시 오류가 발생합니다 [15] <img src="/assets/images/lock.png" className="pt-1" /> <img src="/assets/images/new.png" className="pt-1" /></div>
<div>관리자</div>
@ -184,16 +91,16 @@ function List(){
<Link to={URL.SUPPORT_DETAIL_NOCODE+'/KCSC-NTC'} className="list_item">
<div>1</div>
<div className="al d-flex align-items-center">
미답변시 아이콘
{/*미답변시 아이콘*/}
<img src="/assets/images/icon_answer0.png" className="pt-1 h_30 pb-1" /> &nbsp;
답변완료시 아이콘
<img src="/assets/images/icon_answer.png" className="pt-1 h_30 pb-1" /> &nbsp;
{/*답변완료시 아이콘*/}
{/*<img src="/assets/images/icon_answer.png" className="pt-1 h_30 pb-1" /> &nbsp;*/}
공통컴포넌트 모니터링 관련 서비스 실행시 오류가 발생합니다.</div>
<div>홍길동</div>
<div>3</div>
<div>2021-7-24</div>
<div></div>
</Link>*/}
</Link>
</div>
</div>
{/* <!--// 게시판목록 --> */}
@ -201,10 +108,23 @@ function List(){
<Row className="board_bot justify-content-between">
<Col xs={3} className=""></Col>
{/* <!-- Paging --> */}
<Col xs={6}>
<EgovPaging pagination={paginationInfo} moveToPage={passedPage => {
retrieveList({ ...searchCondition, pageIndex: passedPage}) //, searchCnd: cndRef.current.value, searchKeyword: wrdRef.current.value
}} />
<Col xs={6} className="paging">
<ul>
<li className="btn"><button to="" className="first">처음</button></li>
<li className="btn"><button to="" className="prev">이전</button></li>
<li><button to="" className="cur">1</button></li>
<li><button to="">2</button></li>
<li><button to="">3</button></li>
<li><button to="">4</button></li>
<li><button to="">5</button></li>
<li><button to="">6</button></li>
<li><button to="">7</button></li>
<li><button to="">8</button></li>
<li><button to="">9</button></li>
<li><button to="">10</button></li>
<li className="btn"><button to="" className="next">다음</button></li>
<li className="btn"><button to="" className="last">마지막</button></li>
</ul>
</Col>
{/* <!--/ Paging --> */}

View File

@ -2,9 +2,10 @@ package com.dbnt.kcscbackend.admin.boards;
import com.dbnt.kcscbackend.admin.boards.entity.TnBbs;
import com.dbnt.kcscbackend.admin.boards.entity.TnBbsContents;
import com.dbnt.kcscbackend.admin.boards.entity.TnBbsRepl;
import com.dbnt.kcscbackend.admin.boards.service.AdminBoardsService;
import com.dbnt.kcscbackend.admin.config.entity.TcMenu;
import com.dbnt.kcscbackend.auth.entity.LoginVO;
import com.dbnt.kcscbackend.commonCode.CommonCodeController;
import com.dbnt.kcscbackend.commonCode.service.CommonCodeService;
import com.dbnt.kcscbackend.config.common.BaseController;
import com.dbnt.kcscbackend.config.common.ResponseCode;
@ -25,6 +26,7 @@ import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
@ -169,15 +171,15 @@ public class AdminBoardsController extends BaseController {
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.GET, value = "/posts/post-list", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResultVO getPostList(TnBbsContents tnBbsContents) throws Exception {
public ResultVO getPostList(TnBbsContents params) throws Exception {
ResultVO resultVO = new ResultVO();
tnBbsContents.setQueryInfo();
Map<String, Object> resultMap = adminBoardsService.selectPostList(tnBbsContents);
params.setQueryInfo();
Map<String, Object> resultMap = adminBoardsService.selectPostList(params);
resultMap.put("categoryList", adminBoardsService.selectBoardList());
int totCnt = Integer.parseInt((String)resultMap.get("resultCnt"));
tnBbsContents.setContentCnt(totCnt);
tnBbsContents.setPaginationInfo();
resultMap.put("paginationInfo", tnBbsContents);
params.setContentCnt(totCnt);
params.setPaginationInfo();
resultMap.put("paginationInfo", params);
resultVO.setResult(resultMap);
return resultVO;
}

View File

@ -1,57 +0,0 @@
package com.dbnt.kcscbackend.admin.boards.entity;
import com.dbnt.kcscbackend.config.common.BoardParams;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.time.LocalDateTime;
@Getter
@Setter
@Entity
@NoArgsConstructor
@DynamicInsert
@DynamicUpdate
@Table(name = "tn_bbs_repl")
public class TnBbsRepl extends BoardParams {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "repl_seq")
private Long replSeq;
@Column(name = "bbs_cont_seq", nullable = false)
private Long bbsContSeq;
@Column(name = "repl_cont", nullable = false, length = 550)
private String replCont;
@Column(name = "repl_cont_parent")
private Long replContParent;
@Column(name = "repl_cont_level", nullable = false)
private Long replContLevel;
@Column(name = "ip_address", nullable = false, length = 50)
private String ipAddress;
@Column(name = "frst_crt_id", nullable = false, length = 50)
private String frstCrtId;
@Column(name = "frst_crt_dt", nullable = false)
private LocalDateTime frstCrtDt;
@Column(name = "last_chg_id", length = 50)
private String lastChgId;
@Column(name = "last_chg_dt")
private LocalDateTime lastChgDt;
@Column(name = "use_yn", nullable = false, columnDefinition = "bpchar(1)")
private String useYn;
@Column(name = "old_seq")
private Long oldSeq;
}

View File

@ -1,14 +0,0 @@
package com.dbnt.kcscbackend.admin.boards.repository;
import com.dbnt.kcscbackend.admin.boards.entity.TnBbs;
import com.dbnt.kcscbackend.admin.boards.entity.TnBbsRepl;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
import java.util.Optional;
public interface TnBbsReplRepository extends JpaRepository<TnBbsRepl, Long> {
List<TnBbsRepl> findByBbsContSeq(Long bbsContSeq);
Long countByBbsContSeq(Long bbsContSeq);
}

View File

@ -2,13 +2,11 @@ package com.dbnt.kcscbackend.admin.boards.service;
import com.dbnt.kcscbackend.admin.boards.entity.TnBbs;
import com.dbnt.kcscbackend.admin.boards.entity.TnBbsContents;
import com.dbnt.kcscbackend.admin.boards.entity.TnBbsRepl;
import com.dbnt.kcscbackend.admin.boards.mapper.AdminBoardsMapper;
import com.dbnt.kcscbackend.admin.boards.repository.TnBbsContentsRepository;
import com.dbnt.kcscbackend.admin.boards.repository.TnBbsReplRepository;
import com.dbnt.kcscbackend.admin.boards.repository.TnBbsRepository;
import com.dbnt.kcscbackend.admin.config.entity.TcMenu;
import com.dbnt.kcscbackend.auth.entity.LoginVO;
import com.dbnt.kcscbackend.config.util.ClientUtils;
import com.dbnt.kcscbackend.file.entity.TnAttachFile;
import com.dbnt.kcscbackend.file.service.FileService;
import lombok.RequiredArgsConstructor;
@ -28,7 +26,6 @@ public class AdminBoardsService extends EgovAbstractServiceImpl {
private final TnBbsRepository tnBbsRepository;
private final TnBbsContentsRepository tnBbsContentsRepository;
private final TnBbsReplRepository tnBbsReplRepository;
private final AdminBoardsMapper adminBoardsMapper;
private final FileService fileService;

View File

@ -1,10 +1,10 @@
package com.dbnt.kcscbackend.standardCode.repository;
import com.dbnt.kcscbackend.standardCode.entity.TnDocumentContent;
import com.dbnt.kcscbackend.standardCode.service.StandardCodeContentInterface;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
import java.util.Optional;
@ -12,21 +12,13 @@ import java.util.Optional;
public interface TnDocumentContentRepository extends JpaRepository<TnDocumentContent, Integer> {
@Query(value = "select * from get_recent_full_context_by_content(:docCode, :docPart)", nativeQuery = true)
List<StandardCodeContentInterface> getRecentFullContextByContent(
String docCode,
String docPart);
List<StandardCodeContentInterface> getRecentFullContextByContent(String docCode, String docPart);
@Query(value = "select * from get_year_full_context_by_content(:docInfoSeq, :docCode, :docPart, null, null)", nativeQuery = true)
List<StandardCodeContentInterface> getYearFullContextByContent(
Integer docInfoSeq,
String docCode,
String docPart);
List<StandardCodeContentInterface> getYearFullContextByContent(Integer docInfoSeq, String docCode, String docPart);
@Query(value = "select * from sp_get_recent_full_context_by_content(:docCode, :docPart, :ymd)", nativeQuery = true)
List<StandardCodeContentInterface> spGetRecentFullContextByContent(
String docCode,
String docPart,
String ymd);
List<StandardCodeContentInterface> spGetRecentFullContextByContent(String docCode, String docPart, String ymd);
Optional<TnDocumentContent> findByDocContSeq(Integer docContSeq);

View File

@ -4,7 +4,6 @@ import com.dbnt.kcscbackend.standardCode.entity.TnDocumentInfo;
import com.dbnt.kcscbackend.standardCode.service.TnDocumentInfoInterface;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
import java.util.Optional;

View File

@ -1,255 +0,0 @@
package com.dbnt.kcscbackend.user;
import com.dbnt.kcscbackend.admin.boards.entity.TnBbsContents;
import com.dbnt.kcscbackend.admin.boards.entity.TnBbsRepl;
import com.dbnt.kcscbackend.admin.boards.service.AdminBoardsService;
import com.dbnt.kcscbackend.auth.entity.LoginVO;
import com.dbnt.kcscbackend.commonCode.service.CommonCodeService;
import com.dbnt.kcscbackend.config.common.BaseController;
import com.dbnt.kcscbackend.config.common.ResponseCode;
import com.dbnt.kcscbackend.config.common.ResultVO;
import com.dbnt.kcscbackend.config.util.ClientUtils;
import com.dbnt.kcscbackend.file.entity.TnAttachFile;
import com.dbnt.kcscbackend.file.service.FileService;
import com.dbnt.kcscbackend.user.service.UserBoardsService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.validation.Errors;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
@RequiredArgsConstructor
@RequestMapping("/user/boards")
@Tag(name = "UserBoardsController", description = "사이트관리 게시판현황")
public class UserBoardsController extends BaseController {
private final AdminBoardsService adminBoardsService;
private final UserBoardsService userBoardsService;
private final CommonCodeService commonCodeService;
private final FileService fileService;
/* ---- 게시물관리 ----- */
@Operation(
summary = "게시물 목록 조회",
description = "게시물 목록 조회",
tags = {"UserBoardsController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.GET, value = "/posts/post-list", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResultVO getPostList(TnBbsContents tnBbsContents) throws Exception {
ResultVO resultVO = new ResultVO();
tnBbsContents.setQueryInfo();
Map<String, Object> resultMap = adminBoardsService.selectPostList(tnBbsContents);
resultMap.put("categoryList", adminBoardsService.selectBoardList());
int totCnt = Integer.parseInt((String)resultMap.get("resultCnt"));
tnBbsContents.setContentCnt(totCnt);
tnBbsContents.setPaginationInfo();
resultMap.put("paginationInfo", tnBbsContents);
resultVO.setResult(resultMap);
return resultVO;
}
@Operation(
summary = "게시물 카테고리 셀렉트박스 옵션, 파일 목록 조회",
description = "게시물 카테고리 셀렉트박스 옵션, 파일 목록 조회",
tags = {"UserBoardsController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.POST, value = "/posts/get-category-and-file-list", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResultVO getCategoryList(@RequestBody TnBbsContents tnBbsContents) throws Exception {
ResultVO resultVO = new ResultVO();
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("categoryList", adminBoardsService.selectBoardList());
//첨부파일명을 가져온다.
List<TnAttachFile> tnAttachFileList = fileService.findByFileGrpId(tnBbsContents.getFileGrpId());
System.out.println("@@@ fileGrpId : " + tnBbsContents.getFileGrpId());
if (tnAttachFileList != null) {
List<Map<String, Object>> files = new ArrayList<Map<String, Object>>();
for (TnAttachFile item : tnAttachFileList) {
Map<String, Object> fileDto = new HashMap<String, Object>();
fileDto.put("seq", item.getFileSeq());
fileDto.put("name", item.getFileOldName());
files.add(fileDto);
}
resultMap.put("files", files);
System.out.println("@@@ files : " + files);
} else {
resultMap.put("files", null);
}
resultVO.setResult(resultMap);
return resultVO;
}
@Operation(
summary = "게시물 저장",
description = "게시물 저장",
tags = {"UserBoardsController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "저장 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.PUT, value = "/posts/post-mgt")
public ResultVO savePostMgt(
@Valid TnBbsContents contents,
HttpServletRequest request,
Errors errors,
@RequestParam(required = false) long[] survivingFiles,
@RequestParam(required = false) MultipartFile[] files,
@AuthenticationPrincipal LoginVO user) throws Exception {
ResultVO resultVO = new ResultVO();
if (user == null) {
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
} else {
if (errors.hasErrors()) {
StringBuilder msg = new StringBuilder();
for (FieldError error : errors.getFieldErrors()) {
msg.append(error.getDefaultMessage());
msg.append("\n");
}
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
resultVO.setResultMessage(msg.toString());
} else {
System.out.println("@@@ contents.getBbsSeq() : " + contents.getBbsSeq());
contents.setIpAddress(ClientUtils.getRemoteIP(request));
adminBoardsService.savePost(contents, request, user, files, survivingFiles);
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
}
}
return resultVO;
}
@Operation(
summary = "게시물 삭제",
description = "게시물 삭제",
tags = {"UserBoardsController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "삭제 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.DELETE, value = "/posts/post-mgt")
public ResultVO deletePostMgt(@RequestBody TnBbsContents contents, HttpServletRequest request, @AuthenticationPrincipal LoginVO user) {
ResultVO resultVO = new ResultVO();
if (user == null) {
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
} else {
contents.setIpAddress(ClientUtils.getRemoteIP(request));
String result = adminBoardsService.deletePost(contents);
if (result == null) {
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
} else if (result.equals("notFind")) {
resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode());
resultVO.setResultMessage("대상이 존재하지 않습니다.");
}
}
return resultVO;
}
/* ---- 댓글관리 ----- */
@Operation(
summary = "댓글 목록 조회",
description = "댓글 목록 조회",
tags = {"UserBoardsController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "조회 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.GET, value = "/reply/reply-list", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResultVO getReplyList(TnBbsRepl tnBbsRepl) throws Exception {
ResultVO resultVO = new ResultVO();
Map<String, Object> resultMap = userBoardsService.selectReplyList(tnBbsRepl.getBbsContSeq());
resultVO.setResult(resultMap);
return resultVO;
}
@Operation(
summary = "댓글 저장",
description = "댓글 저장",
tags = {"UserBoardsController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "저장 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.POST, value = "/reply/reply-mgt")
public ResultVO saveReplyMgt(
@Valid @RequestBody TnBbsRepl tnBbsRepl,
HttpServletRequest request,
Errors errors,
@AuthenticationPrincipal LoginVO user) throws Exception {
System.out.println("@@@ : " + tnBbsRepl.getBbsContSeq());
System.out.println("@@@ : " + tnBbsRepl.getReplCont());
ResultVO resultVO = new ResultVO();
if (user == null) {
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
} else {
if (errors.hasErrors()) {
StringBuilder msg = new StringBuilder();
for (FieldError error : errors.getFieldErrors()) {
msg.append(error.getDefaultMessage());
msg.append("\n");
}
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
resultVO.setResultMessage(msg.toString());
} else {
System.out.println("@@@ tnBbsRepl.getBbsSeq() : " + tnBbsRepl.getBbsContSeq());
userBoardsService.saveReply(tnBbsRepl, request, user);
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
}
}
return resultVO;
}
@Operation(
summary = "댓글 삭제",
description = "댓글 삭제",
tags = {"AdminBoardsController"}
)
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "삭제 성공"),
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
})
@RequestMapping(method = RequestMethod.DELETE, value = "/reply/reply-mgt")
public ResultVO deleteReplyMgt(@RequestBody TnBbsRepl tnBbsRepl, HttpServletRequest request, @AuthenticationPrincipal LoginVO user) {
ResultVO resultVO = new ResultVO();
if (user == null) {
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
} else {
tnBbsRepl.setIpAddress(ClientUtils.getRemoteIP(request));
String result = userBoardsService.deleteReply(tnBbsRepl);
if (result == null) {
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
} else if (result.equals("notFind")) {
resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode());
resultVO.setResultMessage("대상이 존재하지 않습니다.");
}
}
return resultVO;
}
}

View File

@ -1,64 +0,0 @@
package com.dbnt.kcscbackend.user.service;
import com.dbnt.kcscbackend.admin.boards.entity.TnBbs;
import com.dbnt.kcscbackend.admin.boards.entity.TnBbsContents;
import com.dbnt.kcscbackend.admin.boards.entity.TnBbsRepl;
import com.dbnt.kcscbackend.admin.boards.mapper.AdminBoardsMapper;
import com.dbnt.kcscbackend.admin.boards.repository.TnBbsContentsRepository;
import com.dbnt.kcscbackend.admin.boards.repository.TnBbsReplRepository;
import com.dbnt.kcscbackend.admin.boards.repository.TnBbsRepository;
import com.dbnt.kcscbackend.auth.entity.LoginVO;
import com.dbnt.kcscbackend.config.util.ClientUtils;
import com.dbnt.kcscbackend.file.entity.TnAttachFile;
import com.dbnt.kcscbackend.file.service.FileService;
import lombok.RequiredArgsConstructor;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
@Service
@RequiredArgsConstructor
public class UserBoardsService extends EgovAbstractServiceImpl {
private final TnBbsRepository tnBbsRepository;
private final TnBbsContentsRepository tnBbsContentsRepository;
private final TnBbsReplRepository tnBbsReplRepository;
private final AdminBoardsMapper adminBoardsMapper;
private final FileService fileService;
public Map<String, Object> selectReplyList(Long bbsContSeq) {
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("replyList", tnBbsReplRepository.findByBbsContSeq(bbsContSeq));
resultMap.put("resultCnt", tnBbsReplRepository.countByBbsContSeq(bbsContSeq));
return resultMap;
}
public void saveReply(TnBbsRepl tnBbsRepl, HttpServletRequest request, LoginVO user) throws Exception {
tnBbsRepl.setBbsContSeq(tnBbsRepl.getBbsContSeq());
tnBbsRepl.setReplCont(tnBbsRepl.getReplCont());
tnBbsRepl.setReplContLevel(1L);
tnBbsRepl.setIpAddress(ClientUtils.getRemoteIP(request));
tnBbsRepl.setFrstCrtId(user.getId());
tnBbsRepl.setFrstCrtDt(LocalDateTime.now());
tnBbsRepl.setUseYn("Y");
tnBbsReplRepository.save(tnBbsRepl);
}
@Transactional
public String deleteReply(TnBbsRepl tnBbsRepl) {
TnBbsRepl savedReply = tnBbsReplRepository.findById(tnBbsRepl.getReplSeq()).orElse(null);
if (savedReply == null) {
return "notFind";
} else {
tnBbsReplRepository.deleteById(tnBbsRepl.getReplSeq());
return null;
}
}
}

View File

@ -52,9 +52,6 @@
<if test='searchKeyword != null and searchKeyword != ""'>
and bbs_cont_title like '%'||#{searchKeyword}||'%'
</if>
<if test='bbsId != null and bbsId != ""'>
and bbs_id = #{bbsId}
</if>
</where>
</sql>
</mapper>