Compare commits
No commits in common. "ac4625a1746d22802fcce1801b812a1d3cb9a32c" and "4d60a1510485bf2525ebb963a8b1cd35ff0ec48a" have entirely different histories.
ac4625a174
...
4d60a15104
|
|
@ -6,7 +6,6 @@
|
||||||
"@ant-design/colors": "^6.0.0",
|
"@ant-design/colors": "^6.0.0",
|
||||||
"@ant-design/icons": "^4.7.0",
|
"@ant-design/icons": "^4.7.0",
|
||||||
"@babel/runtime": "^7.23.9",
|
"@babel/runtime": "^7.23.9",
|
||||||
"@base2/pretty-print-object": "^1.0.2",
|
|
||||||
"@emotion/react": "^11.11.3",
|
"@emotion/react": "^11.11.3",
|
||||||
"@emotion/styled": "^11.11.0",
|
"@emotion/styled": "^11.11.0",
|
||||||
"@material-ui/core": "^4.12.4",
|
"@material-ui/core": "^4.12.4",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import React, {useEffect, useState} from 'react';
|
import React, {useState} from 'react';
|
||||||
import { Link, NavLink, useNavigate } from 'react-router-dom';
|
import { Link, NavLink, useNavigate } from 'react-router-dom';
|
||||||
|
|
||||||
import * as EgovNet from 'api/egovFetch';
|
import * as EgovNet from 'api/egovFetch';
|
||||||
|
|
@ -64,9 +64,6 @@ function EgovHeader({ loginUser, onChangeLogin }) {
|
||||||
console.log("------------------------------EgovHeader [End]");
|
console.log("------------------------------EgovHeader [End]");
|
||||||
console.groupEnd("EgovHeader");
|
console.groupEnd("EgovHeader");
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setMenuDiv(false);
|
|
||||||
}, [navigate]);
|
|
||||||
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
||||||
|
|
@ -1,214 +0,0 @@
|
||||||
import React, { useState, useEffect } from 'react';
|
|
||||||
import AttachFileIcon from '@mui/icons-material/AttachFile';
|
|
||||||
import IconButton from '@mui/material/IconButton';
|
|
||||||
import DeleteIcon from '@mui/icons-material/Delete';
|
|
||||||
import styled from "styled-components";
|
|
||||||
import FileDragDrop from "./FileDragDrop";
|
|
||||||
|
|
||||||
const StyledDiv = styled.div`
|
|
||||||
label {
|
|
||||||
//background: red;
|
|
||||||
width: 100%;
|
|
||||||
height: auto;
|
|
||||||
border: 2px dashed #888;
|
|
||||||
border-radius: 6px;
|
|
||||||
& > div {
|
|
||||||
height: 100%;
|
|
||||||
line-height: 37px;
|
|
||||||
padding: 20px;
|
|
||||||
color: #999999;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
|
|
||||||
function AttachFile(props) {
|
|
||||||
|
|
||||||
const multiple = props.multiple ? props.multiple : false;
|
|
||||||
|
|
||||||
// 삭제 버튼 눌렀을 때 파일선택 dialog가 뜨는 것을 방지
|
|
||||||
let oldTagName;
|
|
||||||
useEffect(function () {
|
|
||||||
|
|
||||||
const labelEle = document.querySelectorAll("label[for='preDataFile']")[0];
|
|
||||||
console.log(labelEle); // NodeList(3) [li, li, li]
|
|
||||||
// event
|
|
||||||
const onClickLabel = (e) => {
|
|
||||||
|
|
||||||
const tagName = String(e.target.tagName).toLowerCase();
|
|
||||||
|
|
||||||
if( tagName !== 'input' ) {
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
oldTagName = tagName;
|
|
||||||
e.preventDefault();
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
if(
|
|
||||||
oldTagName === 'path' ||
|
|
||||||
oldTagName === 'svg' ||
|
|
||||||
oldTagName === 'button'
|
|
||||||
) {
|
|
||||||
oldTagName = undefined;
|
|
||||||
e.preventDefault();
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
// remove Event
|
|
||||||
labelEle.removeEventListener("click", onClickLabel);
|
|
||||||
labelEle.addEventListener("click", onClickLabel);
|
|
||||||
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
|
|
||||||
//기존 server에 upload된 file인 props.serverFiles file들을 렌더링 초기에 넣어 놓기
|
|
||||||
useEffect(function () {
|
|
||||||
|
|
||||||
|
|
||||||
if( !props.serverFiles ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let items = [];
|
|
||||||
let nNewIndex = 0;
|
|
||||||
for( let idx in props.serverFiles ) {
|
|
||||||
props.serverFiles[idx].index=nNewIndex++;
|
|
||||||
items.push( props.serverFiles[idx] );
|
|
||||||
}
|
|
||||||
setFileItem(items);
|
|
||||||
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [props.serverFiles]);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const [disabled, setDisabled] = useState( props.disabled ? props.disabled : false );
|
|
||||||
useEffect(function () {
|
|
||||||
if( !props.disabled ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setDisabled(props.disabled);
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [props.disabled]);
|
|
||||||
|
|
||||||
|
|
||||||
const [maxSize, setMaxSize] = useState(props.maxSize ? props.maxSize : 100);
|
|
||||||
useEffect(function () {
|
|
||||||
if( !props.maxSize ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setMaxSize(props.maxSize);
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [props.maxSize]);
|
|
||||||
|
|
||||||
|
|
||||||
const [fileItem, setFileItem] = useState();
|
|
||||||
|
|
||||||
const onDrop = (e) => {
|
|
||||||
//alert('ddd');
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const handleChange = (files) => {
|
|
||||||
|
|
||||||
|
|
||||||
if( !files ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let items = [];
|
|
||||||
let nNewIndex = 0;
|
|
||||||
|
|
||||||
//파일이 이미 첨부되어 있는 상태에서 추가로 첨부한 경우 기존 것을 먼저 추가 후 새로운 항목을 추가한다.
|
|
||||||
for( let idx in fileItem ) {
|
|
||||||
fileItem[idx].index=nNewIndex++;
|
|
||||||
items.push( fileItem[idx] );
|
|
||||||
}
|
|
||||||
|
|
||||||
Object.keys(files).forEach(function(key, index) {
|
|
||||||
//console.log(key, props.files[key]);
|
|
||||||
if( typeof files[key].name === 'undefined' ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
files[key].index=nNewIndex++;
|
|
||||||
items.push( files[key] );
|
|
||||||
});
|
|
||||||
console.log('%o\n%o', files, items);
|
|
||||||
setFileItem(items);
|
|
||||||
props.setFiles(items);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
const onClickDeleteItem = (e, targetEle) => {
|
|
||||||
|
|
||||||
const dataIndex = Number(targetEle.getAttribute('data-index'));
|
|
||||||
|
|
||||||
let items = [];
|
|
||||||
let nNewIndex = 0;
|
|
||||||
Object.keys(fileItem).forEach(function(key, index) {
|
|
||||||
if( dataIndex !== index ) {
|
|
||||||
fileItem[key].index=nNewIndex++;
|
|
||||||
items.push( fileItem[key] );
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
setFileItem(items);
|
|
||||||
props.setFiles(items);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<StyledDiv>
|
|
||||||
<FileDragDrop
|
|
||||||
className="file-drag-drop"
|
|
||||||
multiple={multiple}
|
|
||||||
name={props.name}
|
|
||||||
fileTypes={props.fileTypes}
|
|
||||||
onDrop={onDrop}
|
|
||||||
handleChange={handleChange}
|
|
||||||
dropMessageStyle={{backgroundColor: '#cfe2ff'}}
|
|
||||||
maxSize={maxSize}
|
|
||||||
disabled={disabled}
|
|
||||||
>
|
|
||||||
<div>
|
|
||||||
|
|
||||||
{fileItem && fileItem.length > 0
|
|
||||||
?
|
|
||||||
fileItem.map((item) => (
|
|
||||||
<span key={item.index} data-index={item.index}>
|
|
||||||
<IconButton aria-label="delete" size="small"
|
|
||||||
onClick={(e)=> {
|
|
||||||
e = e || window.event;
|
|
||||||
const target = e.target || e.srcElement;
|
|
||||||
|
|
||||||
console.log('%o', target);
|
|
||||||
const tagName = String(target.tagName).toLowerCase();
|
|
||||||
|
|
||||||
// target 보정
|
|
||||||
let targetEle = target.parentNode.parentNode.parentNode;
|
|
||||||
if( tagName === 'svg' ) {
|
|
||||||
targetEle = target.parentNode.parentNode;
|
|
||||||
} else if( tagName === 'button' ) {
|
|
||||||
targetEle = target.parentNode;
|
|
||||||
}
|
|
||||||
|
|
||||||
onClickDeleteItem(e, targetEle);
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<DeleteIcon fontSize="small" />
|
|
||||||
</IconButton>
|
|
||||||
{item.name}<br />
|
|
||||||
</span>
|
|
||||||
))
|
|
||||||
:
|
|
||||||
<span><AttachFileIcon /> 파일을 마우스로 끌어놓으세요.</span>
|
|
||||||
}
|
|
||||||
</div>
|
|
||||||
</FileDragDrop>
|
|
||||||
</StyledDiv>
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
|
||||||
export default AttachFile;
|
|
||||||
|
|
@ -7,25 +7,17 @@ import { FileUploader } from "react-drag-drop-files";
|
||||||
* @param {fileTypes} const fileTypes = ["JPG", "PNG", "GIF"];
|
* @param {fileTypes} const fileTypes = ["JPG", "PNG", "GIF"];
|
||||||
* @returns
|
* @returns
|
||||||
*/
|
*/
|
||||||
function FileDragDrop({fileTypes, children, multiple, label, onDrop, handleChange, file, setFile, dropMessageStyle, name, maxSize, disabled}) {
|
function FileDragDrop({fileTypes, children, multiple, label, onDrop, handleChange, file, setFile, dropMessageStyle, name}) {
|
||||||
|
|
||||||
const temp = 0;
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<FileUploader
|
<FileUploader
|
||||||
hoverTitle="여기에 파일을 놓아주세요"
|
|
||||||
handleChange={handleChange}
|
handleChange={handleChange}
|
||||||
name={name}
|
name={name}
|
||||||
types={fileTypes ? fileTypes : "*"}
|
types={fileTypes ? fileTypes : "*"}
|
||||||
multiple={multiple ? multiple : false}
|
multiple={multiple && false}
|
||||||
label={label}
|
label={label}
|
||||||
onDrop={onDrop}
|
onDrop={onDrop}
|
||||||
dropMessageStyle={dropMessageStyle}
|
dropMessageStyle={dropMessageStyle}
|
||||||
maxSize={maxSize}
|
|
||||||
disabled={disabled}
|
|
||||||
onSelect={(e)=> {
|
|
||||||
e = e || window.event;
|
|
||||||
}}
|
|
||||||
>
|
>
|
||||||
{children && children}
|
{children && children}
|
||||||
</FileUploader>
|
</FileUploader>
|
||||||
|
|
|
||||||
|
|
@ -182,12 +182,14 @@
|
||||||
.menuList .result .list_item > div:nth-child(5) {width: 100px;}
|
.menuList .result .list_item > div:nth-child(5) {width: 100px;}
|
||||||
|
|
||||||
/* 사이트관리 > 환경설정 > 메뉴권한관리 */
|
/* 사이트관리 > 환경설정 > 메뉴권한관리 */
|
||||||
.roleList .head > span:nth-child(1) {width: 180px;}
|
.roleList .head > span:nth-child(1) {width: 120px;}
|
||||||
.roleList .head > span:nth-child(2) {width: 120px;}
|
.roleList .head > span:nth-child(2) {width: 180px;}
|
||||||
|
.roleList .head > span:nth-child(3) {width: 120px;}
|
||||||
.roleList .head .checkboxDiv {width: 60px;}
|
.roleList .head .checkboxDiv {width: 60px;}
|
||||||
.roleList .head .saveBtnDiv {width: 100px;}
|
.roleList .head .saveBtnDiv {width: 100px;}
|
||||||
.roleList .result .list_item > div:nth-child(1) {width: 180px;}
|
.roleList .result .list_item > div:nth-child(1) {width: 120px;}
|
||||||
.roleList .result .list_item > div:nth-child(2) {width: 120px;}
|
.roleList .result .list_item > div:nth-child(2) {width: 180px;}
|
||||||
|
.roleList .result .list_item > div:nth-child(3) {width: 120px;}
|
||||||
.roleList .result .list_item .checkboxDiv {width: 60px;}
|
.roleList .result .list_item .checkboxDiv {width: 60px;}
|
||||||
.roleList .result .list_item .saveBtnDiv {width: 100px;}
|
.roleList .result .list_item .saveBtnDiv {width: 100px;}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
import React, {useState, useEffect, useRef, useCallback} from 'react';
|
import React, {useState, useEffect, useRef} from 'react';
|
||||||
import {Link, useNavigate, useLocation, useParams} from 'react-router-dom';
|
import {Link, useNavigate, useLocation, useParams} from 'react-router-dom';
|
||||||
import Modal from "react-bootstrap/Modal";
|
import Modal from "react-bootstrap/Modal";
|
||||||
|
|
||||||
|
|
@ -9,7 +9,6 @@ import CODE from 'constants/code';
|
||||||
import {default as EgovLeftNav} from 'components/leftmenu/EgovLeftNavAdmin';
|
import {default as EgovLeftNav} from 'components/leftmenu/EgovLeftNavAdmin';
|
||||||
import EgovRadioButtonGroup from 'components/EgovRadioButtonGroup';
|
import EgovRadioButtonGroup from 'components/EgovRadioButtonGroup';
|
||||||
import {Form} from "react-bootstrap";
|
import {Form} from "react-bootstrap";
|
||||||
import RichTextEditor from "../../../components/editor/RichTextEditor";
|
|
||||||
|
|
||||||
|
|
||||||
function AdminPostMgtEdit({props, reloadFunction}) {
|
function AdminPostMgtEdit({props, reloadFunction}) {
|
||||||
|
|
@ -31,33 +30,7 @@ function AdminPostMgtEdit({props, reloadFunction}) {
|
||||||
const [boardDetail, setBoardDetail] = useState({});
|
const [boardDetail, setBoardDetail] = useState({});
|
||||||
console.log("@@@ mode : " + modeInfo.mode);
|
console.log("@@@ mode : " + modeInfo.mode);
|
||||||
|
|
||||||
const [categoryList, setCategoryList] = useState([]);
|
|
||||||
|
|
||||||
const retrieveList = useCallback(() => {
|
|
||||||
const retrieveListURL = '/admin/boards/get-category-list';
|
|
||||||
|
|
||||||
const requestOptions = {
|
|
||||||
method: "GET",
|
|
||||||
headers: {
|
|
||||||
'Content-type': 'application/json',
|
|
||||||
},
|
|
||||||
body: JSON.stringify()
|
|
||||||
}
|
|
||||||
|
|
||||||
EgovNet.requestFetch(retrieveListURL,
|
|
||||||
requestOptions,
|
|
||||||
(resp) => {
|
|
||||||
setCategoryList(resp.result.categoryList);
|
|
||||||
console.log("@@@ categoryList : " + JSON.stringify(resp.result.categoryList));
|
|
||||||
},
|
|
||||||
function (resp) {
|
|
||||||
console.log("err response : ", resp);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
},[]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
retrieveList();
|
|
||||||
initMode();
|
initMode();
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, []);
|
}, []);
|
||||||
|
|
@ -68,24 +41,22 @@ function AdminPostMgtEdit({props, reloadFunction}) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function editPost(e) {
|
function editPartnerSite(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
const form = e.target;
|
const form = e.target;
|
||||||
const info = {
|
const info = {
|
||||||
fixedYn: defaultFixedYn,
|
siteTitle: form.siteTitle.value,
|
||||||
secretYn: defaultSecretYn,
|
siteUrl: form.siteUrl.value,
|
||||||
bbsId: form.bbsId.value,
|
|
||||||
bbsSeq: selectedBbsSeq,
|
|
||||||
bbsContTitle: form.bbsContTitle.value,
|
|
||||||
fileGrpId: form.fileGrpId.value,
|
fileGrpId: form.fileGrpId.value,
|
||||||
bbsContents: text
|
siteOrder: form.siteOrder.value,
|
||||||
|
useYn: form.useYn.value
|
||||||
}
|
}
|
||||||
if (modeInfo.mode === CODE.MODE_MODIFY) {
|
if (modeInfo.mode === CODE.MODE_MODIFY) {
|
||||||
info.bbsContSeq = props.bbsContSeq;
|
info.siteSeq = props.siteSeq;
|
||||||
}
|
}
|
||||||
EgovNet.requestFetch(
|
EgovNet.requestFetch(
|
||||||
'/admin/boards/post-mgt',
|
'/admin/config/partner-site-mgt',
|
||||||
{
|
{
|
||||||
method: "PUT",
|
method: "PUT",
|
||||||
headers: {
|
headers: {
|
||||||
|
|
@ -106,16 +77,16 @@ function AdminPostMgtEdit({props, reloadFunction}) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
function deletePost(post){
|
function deletePartnerSite(partnerSite){
|
||||||
if(window.confirm("삭제하시겠습니까?")) {
|
if(window.confirm("삭제하시겠습니까?")) {
|
||||||
EgovNet.requestFetch(
|
EgovNet.requestFetch(
|
||||||
'/admin/boards/post-mgt',
|
'/admin/config/partner-site-mgt',
|
||||||
{
|
{
|
||||||
method: "DELETE",
|
method: "DELETE",
|
||||||
headers: {
|
headers: {
|
||||||
'Content-type': 'application/json'
|
'Content-type': 'application/json'
|
||||||
},
|
},
|
||||||
body: JSON.stringify(post)
|
body: JSON.stringify(partnerSite)
|
||||||
},
|
},
|
||||||
(resp) => {
|
(resp) => {
|
||||||
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
|
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
|
||||||
|
|
@ -135,25 +106,9 @@ function AdminPostMgtEdit({props, reloadFunction}) {
|
||||||
console.groupEnd("AdminPostMgtEdit");
|
console.groupEnd("AdminPostMgtEdit");
|
||||||
|
|
||||||
const [defaultFixedYn, setDefaultFixedYn] = useState(props?.fixedYn || "N");
|
const [defaultFixedYn, setDefaultFixedYn] = useState(props?.fixedYn || "N");
|
||||||
const [defaultSecretYn, setDefaultSecretYn] = useState(props?.secretYn || "N");
|
|
||||||
const [text, setText] = useState(props?.bbsContents);
|
|
||||||
const [selectedBbsSeq, setSelectedBbsSeq] = useState(null);
|
|
||||||
|
|
||||||
const handleSelectChange = (e) => {
|
|
||||||
const selectedBbsId = e.target.value;
|
|
||||||
const selectedOption = categoryList.find((item) => item.bbsId === selectedBbsId);
|
|
||||||
setSelectedBbsSeq(selectedOption.bbsSeq);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<style>
|
|
||||||
{`
|
|
||||||
.modal-dialog {
|
|
||||||
max-width: 50%;
|
|
||||||
}
|
|
||||||
`}
|
|
||||||
</style>
|
|
||||||
{/* <!-- 본문 --> */}
|
{/* <!-- 본문 --> */}
|
||||||
<Modal.Header closeButton>
|
<Modal.Header closeButton>
|
||||||
<Modal.Title>
|
<Modal.Title>
|
||||||
|
|
@ -164,13 +119,13 @@ function AdminPostMgtEdit({props, reloadFunction}) {
|
||||||
|
|
||||||
<Modal.Body>
|
<Modal.Body>
|
||||||
<div className="board_view2">
|
<div className="board_view2">
|
||||||
<Form onSubmit={(e) => {editPost(e)}} noValidate>
|
<Form onSubmit={(e) => {editPartnerSite(e)}} noValidate>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label htmlFor="siteTitle">상단고정</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="siteTitle">상단고정</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
id="fixedYnCheckbox"
|
id="siteTitleCheckbox"
|
||||||
label="상단고정"
|
label="상단고정"
|
||||||
checked={defaultFixedYn === 'Y'}
|
checked={defaultFixedYn === 'Y'}
|
||||||
onChange={(e) => setDefaultFixedYn(e.target.checked ? 'Y' : 'N')}
|
onChange={(e) => setDefaultFixedYn(e.target.checked ? 'Y' : 'N')}
|
||||||
|
|
@ -180,44 +135,29 @@ function AdminPostMgtEdit({props, reloadFunction}) {
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label htmlFor="siteTitle">비밀글</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="siteTitle">비밀글</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<Form.Check
|
<Form.Control className="f_input2 w_full" type="text" name="siteTitle" placeholder="비밀글" required
|
||||||
type="checkbox"
|
defaultValue={props?.siteTitle} readOnly={props!==undefined}/>
|
||||||
id="secretYnCheckbox"
|
|
||||||
label="비밀글"
|
|
||||||
checked={defaultSecretYn === 'Y'}
|
|
||||||
onChange={(e) => setDefaultSecretYn(e.target.checked ? 'Y' : 'N')}
|
|
||||||
/>
|
|
||||||
</dd>
|
|
||||||
</dl>
|
|
||||||
<dl>
|
|
||||||
<dt><label htmlFor="siteTitle">카테고리</label><span className="req">필수</span></dt>
|
|
||||||
<dd>
|
|
||||||
<Form.Select id="select1" name="bbsId" onChange={handleSelectChange}>
|
|
||||||
<option value="">선택</option>
|
|
||||||
{categoryList.map((item) => (
|
|
||||||
<option key={item.bbsSeq} value={item.bbsId} selected={props?.bbsId === item.bbsId}>{item.bbsTitle}</option>
|
|
||||||
))}
|
|
||||||
</Form.Select>
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label htmlFor="siteTitle">제목</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="siteTitle">제목</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<Form.Control className="f_input2 w_full" type="text" name="bbsContTitle" placeholder="제목" required
|
<Form.Control className="f_input2 w_full" type="text" name="siteTitle" placeholder="제목" required
|
||||||
defaultValue={props?.bbsContTitle}/>
|
defaultValue={props?.siteTitle} readOnly={props!==undefined}/>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label htmlFor="siteUrl">파일</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="siteUrl">파일</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<Form.Control className="f_input2 w_full" type="text" name="fileGrpId" placeholder="파일" required
|
<Form.Control className="f_input2 w_full" type="text" name="siteUrl" placeholder="파일" required
|
||||||
defaultValue={props?.fileGrpId}/>
|
defaultValue={props?.siteUrl}/>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label htmlFor="fileGrpId">내용</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="fileGrpId">내용</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<RichTextEditor item={text} setText={setText}/>
|
<Form.Control className="f_txtar w_full" type="text" name="fileGrpId" placeholder="내용" required
|
||||||
|
defaultValue={props?.fileGrpId}/>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
|
|
@ -227,7 +167,7 @@ function AdminPostMgtEdit({props, reloadFunction}) {
|
||||||
<button type="submit" className="btn btn_skyblue_h46 w_100">저장
|
<button type="submit" className="btn btn_skyblue_h46 w_100">저장
|
||||||
</button>
|
</button>
|
||||||
{modeInfo.mode === CODE.MODE_MODIFY &&
|
{modeInfo.mode === CODE.MODE_MODIFY &&
|
||||||
<button type={"button"} className="btn btn_skyblue_h46 w_100" onClick={()=>{deletePost(props)}}>삭제</button>
|
<button type={"button"} className="btn btn_skyblue_h46 w_100" onClick={()=>{deletePartnerSite(props)}}>삭제</button>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -12,7 +12,6 @@ import CODE from "../../../constants/code";
|
||||||
import AboutSiteModal from "../config/aboutSiteMgt/AboutSiteModal";
|
import AboutSiteModal from "../config/aboutSiteMgt/AboutSiteModal";
|
||||||
import AdminPostMgtEdit from "./AdminPostMgtEdit";
|
import AdminPostMgtEdit from "./AdminPostMgtEdit";
|
||||||
import Modal from "react-bootstrap/Modal";
|
import Modal from "react-bootstrap/Modal";
|
||||||
import {format} from "date-fns";
|
|
||||||
|
|
||||||
function AdminPostMgtList(props) {
|
function AdminPostMgtList(props) {
|
||||||
console.group("EgovAdminPostList");
|
console.group("EgovAdminPostList");
|
||||||
|
|
@ -37,7 +36,6 @@ function AdminPostMgtList(props) {
|
||||||
const handleShow = () => setShow(true);
|
const handleShow = () => setShow(true);
|
||||||
|
|
||||||
const retrieveList = useCallback(() => {
|
const retrieveList = useCallback(() => {
|
||||||
handleClose();
|
|
||||||
console.groupCollapsed("EgovAdminPostList.retrieveList()");
|
console.groupCollapsed("EgovAdminPostList.retrieveList()");
|
||||||
|
|
||||||
const retrieveListURL = '/admin/boards/post-list';
|
const retrieveListURL = '/admin/boards/post-list';
|
||||||
|
|
@ -62,18 +60,15 @@ function AdminPostMgtList(props) {
|
||||||
// 리스트 항목 구성
|
// 리스트 항목 구성
|
||||||
resp.result.postList.forEach(function (item, index) {
|
resp.result.postList.forEach(function (item, index) {
|
||||||
if (index === 0) mutListTag = []; // 목록 초기화
|
if (index === 0) mutListTag = []; // 목록 초기화
|
||||||
const finalModifiedDate = item.lastChgDt ? item.lastChgDt : item.frstCrtDt;
|
|
||||||
const formattedDate = finalModifiedDate ? format(finalModifiedDate, "yyyy-MM-dd HH:mm") : "";
|
|
||||||
|
|
||||||
mutListTag.push(
|
mutListTag.push(
|
||||||
<div className="list_item">
|
<div className="list_item">
|
||||||
<div></div>
|
<div>{item.bbsContSeq}</div>
|
||||||
|
<div>{item.bbsSeq}</div>
|
||||||
<div>{item.bbsContTitle}</div>
|
<div>{item.bbsContTitle}</div>
|
||||||
<div>{item.frstCrtId}</div>
|
<div>{item.bbsContents}</div>
|
||||||
<div>{formattedDate}</div>
|
|
||||||
<div>{item.bbsReadCnt}</div>
|
<div>{item.bbsReadCnt}</div>
|
||||||
<div>{item.fileGrpId}</div>
|
<div>{item.bbsContLevel}</div>
|
||||||
<div><button className={"btn btn_blue_h31 px-1"} onClick={()=>{editPost(item)}}>수정</button></div>
|
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
@ -158,6 +153,9 @@ function AdminPostMgtList(props) {
|
||||||
}}>조회</button>
|
}}>조회</button>
|
||||||
</span>
|
</span>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<Link to={URL.ADMIN_BOARD_CREATE} className="btn btn_blue_h46 pd35">등록</Link>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
{/* <!--// 검색조건 --> */}
|
{/* <!--// 검색조건 --> */}
|
||||||
|
|
@ -168,7 +166,7 @@ function AdminPostMgtList(props) {
|
||||||
<span></span>
|
<span></span>
|
||||||
<span>제목</span>
|
<span>제목</span>
|
||||||
<span>작성자</span>
|
<span>작성자</span>
|
||||||
<span>최종수정일</span>
|
<span>작성일</span>
|
||||||
<span>조회수</span>
|
<span>조회수</span>
|
||||||
<span>파일</span>
|
<span>파일</span>
|
||||||
<span><button className={"btn btn_blue_h31 px-1"} onClick={()=>{editPost(undefined)}}>추가</button></span>
|
<span><button className={"btn btn_blue_h31 px-1"} onClick={()=>{editPost(undefined)}}>추가</button></span>
|
||||||
|
|
|
||||||
|
|
@ -191,7 +191,7 @@ function EgovAdminBoardEdit({props, reloadFunction}) {
|
||||||
<dd>
|
<dd>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
id="bbsAnsYnCheckbox"
|
id="siteTitleCheckbox"
|
||||||
label="사용"
|
label="사용"
|
||||||
checked={bbsAnsYn === 'Y'}
|
checked={bbsAnsYn === 'Y'}
|
||||||
onChange={(e) => setBbsAnsYn(e.target.checked ? 'Y' : 'N')}
|
onChange={(e) => setBbsAnsYn(e.target.checked ? 'Y' : 'N')}
|
||||||
|
|
@ -203,7 +203,7 @@ function EgovAdminBoardEdit({props, reloadFunction}) {
|
||||||
<dd>
|
<dd>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
id="bbsReplYnCheckbox"
|
id="siteTitleCheckbox"
|
||||||
label="사용"
|
label="사용"
|
||||||
checked={bbsReplYn === 'Y'}
|
checked={bbsReplYn === 'Y'}
|
||||||
onChange={(e) => setBbsReplYn(e.target.checked ? 'Y' : 'N')}
|
onChange={(e) => setBbsReplYn(e.target.checked ? 'Y' : 'N')}
|
||||||
|
|
@ -215,7 +215,7 @@ function EgovAdminBoardEdit({props, reloadFunction}) {
|
||||||
<dd>
|
<dd>
|
||||||
<Form.Check
|
<Form.Check
|
||||||
type="checkbox"
|
type="checkbox"
|
||||||
id="useYnCheckbox"
|
id="siteTitleCheckbox"
|
||||||
label="사용"
|
label="사용"
|
||||||
checked={useYn === 'Y'}
|
checked={useYn === 'Y'}
|
||||||
onChange={(e) => setUseYn(e.target.checked ? 'Y' : 'N')}
|
onChange={(e) => setUseYn(e.target.checked ? 'Y' : 'N')}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,21 @@
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { Link, useLocation, useNavigate } from 'react-router-dom';
|
import { Link, useLocation, useNavigate } from 'react-router-dom';
|
||||||
import DatePicker from "react-datepicker";
|
import DatePicker from "react-datepicker";
|
||||||
import AttachFile from "components/file/AttachFile";
|
import AttachFileIcon from '@mui/icons-material/AttachFile';
|
||||||
|
|
||||||
|
|
||||||
|
import FileDragDrop from "components/file/FileDragDrop";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import * as EgovNet from 'api/egovFetch';
|
import * as EgovNet from 'api/egovFetch';
|
||||||
import URL from 'constants/url';
|
import URL from 'constants/url';
|
||||||
import CODE from 'constants/code';
|
import CODE from 'constants/code';
|
||||||
|
|
||||||
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
|
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
|
||||||
|
|
||||||
|
import 'react-datepicker/dist/react-datepicker.css';
|
||||||
|
|
||||||
import styled from "styled-components";
|
import styled from "styled-components";
|
||||||
import { makeStyles } from "@mui/styles";
|
import { makeStyles } from "@mui/styles";
|
||||||
|
|
||||||
|
|
@ -27,6 +35,15 @@ const useStyles = makeStyles(() => ({
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const StyledDiv = styled.div`
|
const StyledDiv = styled.div`
|
||||||
|
.org-under-id {
|
||||||
|
margin-left: 20px;
|
||||||
|
@media only screen and (max-width: 768px) {
|
||||||
|
display: block;
|
||||||
|
margin-left: 0px;
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.f_select.w_250 {
|
.f_select.w_250 {
|
||||||
@media only screen and (max-width: 768px) {
|
@media only screen and (max-width: 768px) {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
@ -38,17 +55,40 @@ const StyledDiv = styled.div`
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.org-group-id-1 {
|
|
||||||
margin: 0px 29px;
|
|
||||||
@media only screen and (max-width: 768px) {
|
|
||||||
margin: 0px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|
||||||
function ProgressStatusEdit(props) {
|
function AttachFile(props) {
|
||||||
|
|
||||||
|
const fileTypes = ["JPG", "PNG", "GIF", "PDF", "HWP", "HWPX", "ZIP", "JPEG", "MP4", "TXT"];
|
||||||
|
const onDrop = (e) => {
|
||||||
|
//alert('ddd');
|
||||||
|
};
|
||||||
|
|
||||||
|
const handleChange = (file) => {
|
||||||
|
props.setFile(file);
|
||||||
|
};
|
||||||
|
|
||||||
|
return (
|
||||||
|
<FileDragDrop
|
||||||
|
className="file-drag-drop"
|
||||||
|
multiple={false}
|
||||||
|
name={props.name}
|
||||||
|
fileTypes={fileTypes}
|
||||||
|
onDrop={onDrop}
|
||||||
|
handleChange={handleChange}
|
||||||
|
dropMessageStyle={{backgroundColor: '#cfe2ff'}}
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<AttachFileIcon />
|
||||||
|
{props.file ? props.file.name : props.fileName ? props.fileName : "파일을 마우스로 끌어놓으세요."}
|
||||||
|
</div>
|
||||||
|
</FileDragDrop>
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function SchedulesEdit(props) {
|
||||||
console.group("EgovAdminScheduleEdit");
|
console.group("EgovAdminScheduleEdit");
|
||||||
console.log("[Start] EgovAdminScheduleEdit ------------------------------");
|
console.log("[Start] EgovAdminScheduleEdit ------------------------------");
|
||||||
console.log("EgovAdminScheduleEdit [props] : ", props);
|
console.log("EgovAdminScheduleEdit [props] : ", props);
|
||||||
|
|
@ -77,16 +117,16 @@ function ProgressStatusEdit(props) {
|
||||||
const [requestItems, setRequestItems] = useState
|
const [requestItems, setRequestItems] = useState
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
orgGroupId: 1,
|
|
||||||
startDate: new Date(),
|
startDate: new Date(),
|
||||||
eventId : 0,
|
eventId : 0,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
const [drftDatetimeHH, setDrftDatetimeHH] = useState();
|
const [schdulBgndeHH, setSchdulBgndeHH] = useState();
|
||||||
const [drftDatetimeMM, setDrftDatetimeMM] = useState();
|
const [schdulBgndeMM, setSchdulBgndeMM] = useState();
|
||||||
|
|
||||||
const [scheduleInit, setScheduleInit] = useState({});
|
const [scheduleInit, setScheduleInit] = useState({});
|
||||||
|
const [scheduleApiOrgApiDepthList, setScheduleApiOrgApiDepthList] = useState({ });
|
||||||
|
|
||||||
|
|
||||||
const initMode = () => {
|
const initMode = () => {
|
||||||
|
|
@ -112,8 +152,7 @@ function ProgressStatusEdit(props) {
|
||||||
default:
|
default:
|
||||||
navigate({pathname: URL.ERROR}, {state: {msg : ""}});
|
navigate({pathname: URL.ERROR}, {state: {msg : ""}});
|
||||||
}
|
}
|
||||||
|
retrieveDetail();
|
||||||
getList(orgSearchCondition);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const convertDate = (str) => {
|
const convertDate = (str) => {
|
||||||
|
|
@ -132,106 +171,35 @@ function ProgressStatusEdit(props) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const retrieveDetail = () => {
|
||||||
|
|
||||||
const [orgSearchCondition, setOrgSearchCondition] = useState({ paramCodeGroup: null, paramCodeLevel: 'LV_01' });
|
EgovNet.requestFetch("/schedule/init",
|
||||||
const [orgArray, setOrgArray] = useState([]);
|
|
||||||
const [orgSelectedIndex, setOrgSelectedIndex] = useState([]);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
useEffect(function () {
|
|
||||||
getList(orgSearchCondition);
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [orgSearchCondition]);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
useEffect(function () {
|
|
||||||
if ( typeof orgArray[0] === 'undefined' || typeof orgSelectedIndex[0] === 'undefined' ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( orgSelectedIndex[0] === 0) {
|
|
||||||
orgArray[1] = undefined;
|
|
||||||
orgArray[2] = undefined;
|
|
||||||
let forChangeObject = [...orgArray];
|
|
||||||
setOrgArray(forChangeObject);
|
|
||||||
setOrgSelectedIndex([orgSelectedIndex[0], undefined, undefined]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( typeof orgArray[0][orgSelectedIndex[0]-1] === 'undefined' ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const paramCodeLevel = 'LV_02';
|
|
||||||
const paramCodeGroup = orgArray[0][orgSelectedIndex[0]-1].orgId;
|
|
||||||
setOrgSearchCondition({ paramCodeGroup, paramCodeLevel });
|
|
||||||
orgArray[1] = undefined;
|
|
||||||
orgArray[2] = undefined;
|
|
||||||
let forChangeObject = [...orgArray];
|
|
||||||
setOrgArray(forChangeObject);
|
|
||||||
setOrgSelectedIndex([orgSelectedIndex[0], undefined, undefined]);
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [orgSelectedIndex[0]]);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
useEffect(function () {
|
|
||||||
if ( typeof orgArray[1] === 'undefined' || typeof orgSelectedIndex[1] === 'undefined' ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( orgSelectedIndex[1] === 0) {
|
|
||||||
orgArray[2] = undefined;
|
|
||||||
let forChangeObject = [...orgArray];
|
|
||||||
setOrgArray(forChangeObject);
|
|
||||||
setOrgSelectedIndex([orgSelectedIndex[0], orgSelectedIndex[1], undefined]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( typeof orgArray[0][orgSelectedIndex[1]-1] === 'undefined' ) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const paramCodeLevel = 'LV_03';
|
|
||||||
const paramCodeGroup = orgArray[1][orgSelectedIndex[1]-1].orgId;
|
|
||||||
setOrgSearchCondition({ paramCodeGroup, paramCodeLevel });
|
|
||||||
|
|
||||||
orgArray[2] = undefined;
|
|
||||||
let forChangeObject = [...orgArray];
|
|
||||||
setOrgArray(forChangeObject);
|
|
||||||
setOrgSelectedIndex([orgSelectedIndex[0], orgSelectedIndex[1], undefined]);
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [orgSelectedIndex[1]]);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
useEffect(function () {
|
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [orgSelectedIndex[2]]);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const getList = (orgSearchCondition) => {
|
|
||||||
|
|
||||||
EgovNet.requestFetch(`/admin/config/committee-code-management?paramCodeGroup=${orgSearchCondition.paramCodeGroup}¶mCodeLevel=${orgSearchCondition.paramCodeLevel}`,
|
|
||||||
requestOptions,
|
requestOptions,
|
||||||
function (resp) {
|
function (resp) {
|
||||||
const myIndex = Number(String(orgSearchCondition.paramCodeLevel).replace('LV_','')) - 1;
|
setScheduleInit(
|
||||||
const forCopy = [...orgArray];
|
resp
|
||||||
forCopy[myIndex] = resp.result.list;
|
);
|
||||||
setOrgArray(forCopy);
|
|
||||||
|
if (modeInfo.mode === CODE.MODE_CREATE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const retrieveDetailURL = `/schedule/${location.state?.schdulId}`;
|
||||||
|
const requestOptions = {
|
||||||
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
'Content-type': 'application/json'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EgovNet.requestFetch(retrieveDetailURL,
|
||||||
|
requestOptions,
|
||||||
|
function (resp) {
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
const updateSchedule = () => {
|
const updateSchedule = () => {
|
||||||
const formData = new FormData();
|
const formData = new FormData();
|
||||||
|
|
@ -315,7 +283,46 @@ function ProgressStatusEdit(props) {
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
}, [requestItems]);
|
}, [requestItems]);
|
||||||
|
|
||||||
const fileTypes = ["JPG", "PNG", "GIF", "PDF", "HWP", "HWPX", "ZIP", "JPEG", "MP4", "TXT"];
|
useEffect(function () {
|
||||||
|
|
||||||
|
EgovNet.requestFetch(`/schedule/api/org-api/depth/list?paramCodeGroup=${requestItems.upCommittee}`,
|
||||||
|
requestOptions,
|
||||||
|
function (resp) {
|
||||||
|
setScheduleApiOrgApiDepthList(
|
||||||
|
resp
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
console.log("------------------------------EgovAdminScheduleEdit [%o]", requestItems);
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [requestItems && requestItems.upCommittee]);
|
||||||
|
|
||||||
|
|
||||||
|
const onClickDeleteSchedule = (schdulId) => {
|
||||||
|
const deleteBoardURL = `/schedule/${schdulId}`;
|
||||||
|
|
||||||
|
const requestOptions = {
|
||||||
|
method: "DELETE",
|
||||||
|
headers: {
|
||||||
|
'Content-type': 'application/json',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EgovNet.requestFetch(deleteBoardURL,
|
||||||
|
requestOptions,
|
||||||
|
(resp) => {
|
||||||
|
console.log("====>>> Schdule delete= ", resp);
|
||||||
|
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
|
||||||
|
alert("게시글이 삭제되었습니다.")
|
||||||
|
navigate(URL.ADMIN__COMMITTEE__SCHEDULES ,{ replace: true });
|
||||||
|
} else {
|
||||||
|
navigate({pathname: URL.ERROR}, {state: {msg : resp.resultMessage}});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
//사전검토자료
|
//사전검토자료
|
||||||
const [preDataFile, setPreDataFile] = useState(null);
|
const [preDataFile, setPreDataFile] = useState(null);
|
||||||
const [preDataFileName, setPreDataFileName] = useState(null);
|
const [preDataFileName, setPreDataFileName] = useState(null);
|
||||||
|
|
@ -326,11 +333,11 @@ function ProgressStatusEdit(props) {
|
||||||
const [partnerFile, setPartnerFile] = useState(null);
|
const [partnerFile, setPartnerFile] = useState(null);
|
||||||
const [partnerFileName, setPartnerFileName] = useState(null);
|
const [partnerFileName, setPartnerFileName] = useState(null);
|
||||||
//조치계획서
|
//조치계획서
|
||||||
const [actionPlanFile, setActionPlanFile] = useState(null);
|
//const [preDataFile, setPreDataFile] = useState(null);
|
||||||
const [actionPlanFileName, setActionPlanFileName] = useState(null);
|
//const [preDataFileName, setPreDataFileName] = useState(null);
|
||||||
//조치결과서
|
//조치결과서
|
||||||
const [actionResultReportFile, setActionResultReportFile] = useState(null);
|
//const [preDataFile, setPreDataFile] = useState(null);
|
||||||
const [actionResultReportFileName, setActionResultReportFileName] = useState(null);
|
//const [preDataFileName, setPreDataFileName] = useState(null);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -365,30 +372,30 @@ function ProgressStatusEdit(props) {
|
||||||
{/* <!-- 게시판 상세보기 --> */}
|
{/* <!-- 게시판 상세보기 --> */}
|
||||||
<StyledDiv className="board_view2">
|
<StyledDiv className="board_view2">
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label>안건</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="title">안건</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<input className="f_input2 w_full" type="text" name="title" title="안건" placeholder="안건을 입력하세요"
|
<input className="f_input2 w_full" type="text" name="title" title="안건" id="title" placeholder="안건을 입력하세요."
|
||||||
value={requestItems.title}
|
value={requestItems.title}
|
||||||
onChange={(e) => setRequestItems({ ...requestItems, title: e.target.value })}
|
onChange={(e) => setRequestItems({ ...requestItems, title: e.target.value })}
|
||||||
/>
|
/>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label>기준코드</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="title">기준코드</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<input className="f_input2 w_full" type="text" name="categoryId" title="기준코드" placeholder="여기를 눌러 기준코드를 선택하세요"
|
<input className="f_input2 w_full" type="text" name="title" title="제목" id="title" placeholder="제목을 입력하세요."
|
||||||
value={requestItems.categoryId}
|
value={requestItems.title}
|
||||||
onChange={(e) => setRequestItems({ ...requestItems, categoryId: e.target.value })}
|
onChange={(e) => setRequestItems({ ...requestItems, title: e.target.value })}
|
||||||
/>
|
/>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label>구분</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="title">구분</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<label className="f_select w_150" >
|
<label className="f_select w_150" htmlFor="div-meet">
|
||||||
<select name="div-meet" title="재정 개정 재개정 선택"
|
<select id="div-meet" name="div-meet" title="일정구분"
|
||||||
value={requestItems.drftTypeCode}
|
value={requestItems.divMeet}
|
||||||
onChange={(e) => setRequestItems({ ...requestItems, drftTypeCode: e.target.value })}>
|
onChange={(e) => setRequestItems({ ...requestItems, divMeet: e.target.value })}>
|
||||||
<option key={"none"} value="">선택</option>
|
<option key={"none"} value="">선택</option>
|
||||||
{scheduleInit && scheduleInit.result && scheduleInit.result.listCodes
|
{scheduleInit && scheduleInit.result && scheduleInit.result.listCodes
|
||||||
&& scheduleInit.result.listCodes.map((item) => (
|
&& scheduleInit.result.listCodes.map((item) => (
|
||||||
|
|
@ -399,70 +406,60 @@ function ProgressStatusEdit(props) {
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label>회의일자</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="title">회의일자</label><span className="req">필수</span></dt>
|
||||||
<dd className="datetime">
|
<dd className="datetime">
|
||||||
<span className="line_break">
|
<span className="line_break">
|
||||||
<DatePicker
|
<DatePicker
|
||||||
selected={requestItems.drftDatetime}
|
selected={requestItems.startDate}
|
||||||
name="drftDatetime"
|
name="schdulBgnde"
|
||||||
className="f_input"
|
className="f_input"
|
||||||
dateFormat="yyyy-MM-dd"
|
dateFormat="yyyy-MM-dd HH:mm"
|
||||||
|
showTimeInput
|
||||||
onChange={(date) => {
|
onChange={(date) => {
|
||||||
setRequestItems({ ...requestItems, schdulBgnde: getDateFourteenDigit(date), drftDatetimeYYYMMDD: getYYYYMMDD(date), drftDatetime: date });
|
console.log("setStartDate : ", date);
|
||||||
setDrftDatetimeHH(date.getHours());
|
setRequestItems({ ...requestItems, schdulBgnde: getDateFourteenDigit(date), schdulBgndeYYYMMDD: getYYYYMMDD(date), schdulBgndeHH: date.getHours(), schdulBgndeMM: date.getMinutes(), startDate: date });
|
||||||
setDrftDatetimeMM(date.getMinutes());
|
setSchdulBgndeHH(date.getHours());
|
||||||
|
setSchdulBgndeMM(date.getMinutes());
|
||||||
}} />
|
}} />
|
||||||
<input type="hidden" name="drftDatetimeMM" defaultValue={drftDatetimeMM} readOnly />
|
<input type="hidden" name="schdulBgndeHH" defaultValue={schdulBgndeHH} readOnly />
|
||||||
|
<input type="hidden" name="schdulBgndeMM" defaultValue={schdulBgndeMM} readOnly />
|
||||||
</span>
|
</span>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label>위원회</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="title">위원회</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
{/** top org */}
|
{/** top org */}
|
||||||
<label className="f_select w_250 org-group-id" htmlFor="org-group-id">
|
<label className="f_select w_250 org-group-id" htmlFor="org-group-id">
|
||||||
<select id="org-group-id" name="orgGroupId" title="중앙건설기술심의 선택"
|
<select id="org-group-id" name="orgGroupId" title="심의위원회-상위"
|
||||||
value={requestItems.orgGroupId}
|
value={requestItems.upCommittee}
|
||||||
onChange={(e) => {
|
onChange={(e) => setRequestItems({ ...requestItems, upCommittee: e.target.value })}>
|
||||||
setRequestItems({ ...requestItems, orgGroupId: e.target.value });
|
<option value="">선택</option>
|
||||||
orgSelectedIndex[0] = e.target.options.selectedIndex;
|
{scheduleInit && scheduleInit.result && scheduleInit.result.listTopOrg
|
||||||
let forChangeObject = [...orgSelectedIndex];
|
&& scheduleInit.result.listTopOrg.map((item) => (
|
||||||
setOrgSelectedIndex(forChangeObject);
|
<option key={item.id} value={item.id}>{item.name}</option>
|
||||||
}}>
|
|
||||||
<option value="">중앙건설기술심의 선택</option>
|
|
||||||
{orgArray && orgArray[0] && orgArray[0].map && orgArray[0].map((item, index) => (
|
|
||||||
<option key={item.orgId} value={item.orgId} data-index={index}>{item.orgNm}</option>
|
|
||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label className="f_select w_250 org-group-id-1" htmlFor="org-group-id-1">
|
<label className="f_select w_250 org-group-id-1" htmlFor="org-group-id-1">
|
||||||
<select id="org-group-id-1" name="orgGroupId1" title="총괄건설기준위원회 선택"
|
<select id="org-group-id-1" name="orgGroupId1" title="심의위원회-상위"
|
||||||
value={requestItems.orgGroupId1}
|
value={requestItems.upCommittee}
|
||||||
defaultValue='1'
|
onChange={(e) => setRequestItems({ ...requestItems, upCommittee: e.target.value })}>
|
||||||
onChange={(e) => {
|
<option value="">선택</option>
|
||||||
setRequestItems({ ...requestItems, orgGroupId1: e.target.value });
|
{scheduleInit && scheduleInit.result && scheduleInit.result.listTopOrg
|
||||||
orgSelectedIndex[1] = e.target.options.selectedIndex;
|
&& scheduleInit.result.listTopOrg.map((item) => (
|
||||||
let forChangeObject = [...orgSelectedIndex];
|
<option key={item.id} value={item.id}>{item.name}</option>
|
||||||
setOrgSelectedIndex(forChangeObject);
|
|
||||||
}}>
|
|
||||||
<option value="">총괄건설기준위원회 선택</option>
|
|
||||||
{orgArray && orgArray[1] && orgArray[1].map((item, index) => (
|
|
||||||
<option key={item.orgId} value={item.orgId} data-index={index}>{item.orgNm}</option>
|
|
||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label className="f_select w_250 org-group-id-2" htmlFor="org-group-id-2">
|
<label className="f_select w_250 org-group-id-2" htmlFor="org-group-id-2">
|
||||||
<select id="org-group-id-2" name="orgGroupId2" title="기준위원회 선택"
|
<select id="org-group-id-2" name="orgGroupId2" title="심의위원회-하위"
|
||||||
value={requestItems.orgGroupId2}
|
value={requestItems.committee}
|
||||||
onChange={(e) => {
|
onChange={(e) => setRequestItems({ ...requestItems, committee: e.target.value })}>
|
||||||
setRequestItems({ ...requestItems, orgGroupId2: e.target.value });
|
<option value="">선택</option>
|
||||||
orgSelectedIndex[2] = e.target.options.selectedIndex;
|
{scheduleApiOrgApiDepthList && scheduleApiOrgApiDepthList.result && scheduleApiOrgApiDepthList.result.list
|
||||||
let forChangeObject = [...orgSelectedIndex];
|
&& scheduleApiOrgApiDepthList.result.list.map((item) => (
|
||||||
setOrgSelectedIndex(forChangeObject);
|
<option key={item.id} value={item.id}>{item.name}</option>
|
||||||
}}>
|
|
||||||
<option value="">기준위원회 선택</option>
|
|
||||||
{orgArray && orgArray[2] && orgArray[2].map((item, index) => (
|
|
||||||
<option key={item.orgId} value={item.orgId} data-index={index}>{item.orgNm}</option>
|
|
||||||
))}
|
))}
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
|
|
@ -471,57 +468,81 @@ function ProgressStatusEdit(props) {
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label htmlFor="title">사전검토자료</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="title">사전검토자료</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<AttachFile name="preDataFile" file={preDataFile} setFile={setPreDataFile} fileName={preDataFileName} fileTypes={fileTypes} />
|
<AttachFile name="preDataFile" file={preDataFile} setFile={setPreDataFile} fileName={preDataFileName} />
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label htmlFor="title">사전검토양식</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="title">사전검토양식</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<AttachFile name="preFormFile" file={preFormFile} setFile={setPreFormFile} fileName={preFormFileName} fileTypes={fileTypes} />
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label htmlFor="title">관계기관의견</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="title">관계기관의견</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<AttachFile name="partnerFile" file={partnerFile} setFile={setPartnerFile} fileName={partnerFileName} fileTypes={fileTypes} />
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label htmlFor="title">조치계획서</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="title">조치계획서</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<AttachFile name="actionPlanFile" file={actionPlanFile} setFile={setActionPlanFile} fileName={actionPlanFileName} fileTypes={fileTypes} />
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label>조치결과서</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="title">조치결과서</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<AttachFile name="actionResultReportFile" file={actionResultReportFile} setFile={setActionResultReportFile} fileName={actionResultReportFileName} fileTypes={fileTypes} />
|
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label>회의담당자</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="title">회의담당자</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<input className="f_input2 w_full" type="text" name="drftConfeCharger" title="회의 담당자" placeholder="여기를 눌러 회의담당자를 선택하세요"
|
<input className="f_input2 w_full" type="text" name="title" title="제목" id="title" placeholder="제목을 입력하세요."
|
||||||
value={requestItems.drftConfeCharger}
|
value={requestItems.title}
|
||||||
onChange={(e) => setRequestItems({ ...requestItems, drftConfeCharger: e.target.value })}
|
onChange={(e) => setRequestItems({ ...requestItems, title: e.target.value })}
|
||||||
/>
|
/>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label>회의실 비밀번호</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="title">회의실 비밀번호</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<input className="f_input2 w_full" type="text" name="drftConfePw" title="제목" placeholder="회의실 비밀번호를 입력하세요"
|
<input className="f_input2 w_full" type="text" name="title" title="제목" id="title" placeholder="제목을 입력하세요."
|
||||||
value={requestItems.drftConfePw}
|
value={requestItems.title}
|
||||||
onChange={(e) => setRequestItems({ ...requestItems, drftConfePw: e.target.value })}
|
onChange={(e) => setRequestItems({ ...requestItems, title: e.target.value })}
|
||||||
/>
|
/>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
<dl>
|
<dl>
|
||||||
<dt><label>회의 안건</label><span className="req">필수</span></dt>
|
<dt><label htmlFor="title">회의 안건</label><span className="req">필수</span></dt>
|
||||||
<dd>
|
<dd>
|
||||||
<textarea className="f_txtar w_full h_100" name="drftSummery" cols="30" rows="10" placeholder="회의 안건 내용을 입력하세요."
|
<input className="f_input2 w_full" type="text" name="title" title="제목" id="title" placeholder="제목을 입력하세요."
|
||||||
defaultValue={requestItems.drftSummery}
|
value={requestItems.title}
|
||||||
onChange={(e) => setRequestItems({ ...requestItems, drftSummery: e.target.value })}
|
onChange={(e) => setRequestItems({ ...requestItems, title: e.target.value })}
|
||||||
|
/>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<dl>
|
||||||
|
<dt><label htmlFor="title">제목</label><span className="req">필수</span></dt>
|
||||||
|
<dd>
|
||||||
|
<input className="f_input2 w_full" type="text" name="title" title="제목" id="title" placeholder="제목을 입력하세요."
|
||||||
|
value={requestItems.title}
|
||||||
|
onChange={(e) => setRequestItems({ ...requestItems, title: e.target.value })}
|
||||||
|
/>
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<dl>
|
||||||
|
<dt><label htmlFor="location">장소</label><span className="req">필수</span></dt>
|
||||||
|
<dd>
|
||||||
|
<input className="f_input2 w_full" type="text" name="location" title="장소" id="location" placeholder="장소를 입력하세요."
|
||||||
|
defaultValue={requestItems.location}
|
||||||
|
onChange={(e) => setRequestItems({ ...requestItems, location: e.target.value })} />
|
||||||
|
</dd>
|
||||||
|
</dl>
|
||||||
|
<dl>
|
||||||
|
<dt><label htmlFor="contents">내용</label><span className="req">필수</span></dt>
|
||||||
|
<dd>
|
||||||
|
<textarea className="f_txtar w_full h_100" name="contents" id="contents" cols="30" rows="10" placeholder="일정 내용을 입력하세요."
|
||||||
|
defaultValue={requestItems.contents}
|
||||||
|
onChange={(e) => setRequestItems({ ...requestItems, contents: e.target.value })}
|
||||||
></textarea>
|
></textarea>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
@ -532,6 +553,12 @@ function ProgressStatusEdit(props) {
|
||||||
<button className="btn btn_skyblue_h46 w_100"
|
<button className="btn btn_skyblue_h46 w_100"
|
||||||
onClick={() => updateSchedule()}
|
onClick={() => updateSchedule()}
|
||||||
> 저장</button>
|
> 저장</button>
|
||||||
|
{modeInfo.mode === CODE.MODE_MODIFY &&
|
||||||
|
<button className="btn btn_skyblue_h46 w_100"
|
||||||
|
onClick={(e) => {
|
||||||
|
onClickDeleteSchedule(location.state?.schdulId);
|
||||||
|
}}>삭제</button>
|
||||||
|
}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -551,4 +578,4 @@ function ProgressStatusEdit(props) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
export default ProgressStatusEdit;
|
export default SchedulesEdit;
|
||||||
|
|
@ -29,7 +29,6 @@ function MenuAuthMgt(props) {
|
||||||
// 리스트 항목 구성
|
// 리스트 항목 구성
|
||||||
menuList.forEach(function (item, index) {
|
menuList.forEach(function (item, index) {
|
||||||
const checkboxs = [];
|
const checkboxs = [];
|
||||||
|
|
||||||
roleList.forEach(function (role) {
|
roleList.forEach(function (role) {
|
||||||
checkboxs.push(
|
checkboxs.push(
|
||||||
<div className={"checkboxDiv"}>
|
<div className={"checkboxDiv"}>
|
||||||
|
|
@ -45,19 +44,12 @@ function MenuAuthMgt(props) {
|
||||||
defaultChecked={item.menuAuth.includes(role.itemCd)}/>
|
defaultChecked={item.menuAuth.includes(role.itemCd)}/>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
/*if(item.menuGroup){
|
|
||||||
|
|
||||||
}else{
|
|
||||||
checkboxs.push(
|
|
||||||
<div className={"checkboxDiv"}></div>
|
|
||||||
)
|
|
||||||
}*/
|
|
||||||
});
|
});
|
||||||
|
|
||||||
mutListTag.push(
|
mutListTag.push(
|
||||||
<div className={"list_item"} key={"userListDiv_"+index}>
|
<div className={"list_item"} key={"userListDiv_"+index}>
|
||||||
<div>{item.menuGroup?'└ ':''}{item.menuId}</div>
|
<div>{item.menuId}</div>
|
||||||
<div>{item.menuTitle}</div>
|
<div>{item.menuTitle}</div>
|
||||||
|
<div>{item.menuGroup}</div>
|
||||||
{checkboxs}
|
{checkboxs}
|
||||||
<div className={"saveBtnDiv"}>
|
<div className={"saveBtnDiv"}>
|
||||||
<button className={"btn btn_blue_h31 px-1"} onClick={()=>{editMenu(item)}}>저장</button>
|
<button className={"btn btn_blue_h31 px-1"} onClick={()=>{editMenu(item)}}>저장</button>
|
||||||
|
|
@ -81,25 +73,27 @@ function MenuAuthMgt(props) {
|
||||||
},[]);
|
},[]);
|
||||||
|
|
||||||
function editMenu(menu){
|
function editMenu(menu){
|
||||||
EgovNet.requestFetch(
|
if(window.confirm("수정하시겠습니까?")) {
|
||||||
'/admin/config/menu-auth-mgt',
|
EgovNet.requestFetch(
|
||||||
{
|
'/admin/config/menu-auth-mgt',
|
||||||
method: "PUT",
|
{
|
||||||
headers: {
|
method: "PUT",
|
||||||
'Content-type': 'application/json'
|
headers: {
|
||||||
|
'Content-type': 'application/json'
|
||||||
|
},
|
||||||
|
body: JSON.stringify(menu)
|
||||||
},
|
},
|
||||||
body: JSON.stringify(menu)
|
(resp) => {
|
||||||
},
|
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
|
||||||
(resp) => {
|
alert("수정되었습니다.")
|
||||||
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
|
} else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) {
|
||||||
alert("수정되었습니다.")
|
console.log("토큰 갱신중.")
|
||||||
} else if (Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)) {
|
} else {
|
||||||
console.log("토큰 갱신중.")
|
alert(resp.result.resultMessage)
|
||||||
} else {
|
}
|
||||||
alert(resp.result.resultMessage)
|
|
||||||
}
|
}
|
||||||
}
|
)
|
||||||
)
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(()=>{
|
useEffect(()=>{
|
||||||
|
|
@ -132,6 +126,7 @@ function MenuAuthMgt(props) {
|
||||||
<div className="head">
|
<div className="head">
|
||||||
<span>메뉴 코드</span>
|
<span>메뉴 코드</span>
|
||||||
<span>메뉴 이름</span>
|
<span>메뉴 이름</span>
|
||||||
|
<span>부모 메뉴</span>
|
||||||
{roleHeader}
|
{roleHeader}
|
||||||
<span className={"saveBtnDiv"}></span>
|
<span className={"saveBtnDiv"}></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
import React, { useState, useEffect } from 'react';
|
import React, { useState, useEffect } from 'react';
|
||||||
import { Link, useLocation, useNavigate } from 'react-router-dom';
|
import { Link, useLocation, useNavigate } from 'react-router-dom';
|
||||||
import DatePicker from "react-datepicker";
|
import DatePicker from "react-datepicker";
|
||||||
import AttachFile from "../../../../components/file/AttachFile";
|
import FileDragDrop from "../../../../components/file/FileDragDrop";
|
||||||
|
import AttachFileIcon from '@mui/icons-material/AttachFile';
|
||||||
|
|
||||||
|
import EgovAttachFile from 'components/EgovAttachFile';
|
||||||
import RichTextEditor from "../../../../components/editor/RichTextEditor";
|
import RichTextEditor from "../../../../components/editor/RichTextEditor";
|
||||||
import AlertDialogSlide from "../../../../components/alert/AlertDialogSlide";
|
import AlertDialogSlide from "../../../../components/alert/AlertDialogSlide";
|
||||||
import CODE from 'constants/code';
|
import CODE from 'constants/code';
|
||||||
|
|
@ -56,7 +59,7 @@ function PopupEditor(props) {
|
||||||
const [schdulBgndeMM, setSchdulBgndeMM] = useState();
|
const [schdulBgndeMM, setSchdulBgndeMM] = useState();
|
||||||
const [schdulEnddeHH, setSchdulEnddeHH] = useState();
|
const [schdulEnddeHH, setSchdulEnddeHH] = useState();
|
||||||
const [schdulEnddeMM, setSchdulEnddeMM] = useState();
|
const [schdulEnddeMM, setSchdulEnddeMM] = useState();
|
||||||
|
const [fileName, setFileName] = useState();
|
||||||
|
|
||||||
const [confirm, setConfirm] = React.useState();
|
const [confirm, setConfirm] = React.useState();
|
||||||
|
|
||||||
|
|
@ -137,8 +140,8 @@ function PopupEditor(props) {
|
||||||
setText(rawDetail.contents);
|
setText(rawDetail.contents);
|
||||||
setTextOriginal(rawDetail.contents);
|
setTextOriginal(rawDetail.contents);
|
||||||
|
|
||||||
if( rawDetail.files ) {
|
if( rawDetail.fileName ) {
|
||||||
setServerFiles(rawDetail.files);
|
setFileName(rawDetail.fileName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
@ -164,14 +167,7 @@ function PopupEditor(props) {
|
||||||
formData.append("contents", text);
|
formData.append("contents", text);
|
||||||
|
|
||||||
//첨부파일
|
//첨부파일
|
||||||
//formData.append("files", files);
|
formData.append("file", file);
|
||||||
for(let i=0; i<files.length; i++) {
|
|
||||||
// seq 항목을 가지고 있다면 그건 server에 이미 upload된 file이므로 continue
|
|
||||||
if( files[i].seq ) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
formData.append("files", files[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (formValidator(formData)) {
|
if (formValidator(formData)) {
|
||||||
const requestOptions = {
|
const requestOptions = {
|
||||||
|
|
@ -268,15 +264,22 @@ function PopupEditor(props) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const fileTypes = ["JPG", "PNG", "GIF", "PDF", "HWP", "HWPX", "ZIP", "JPEG", "MP4", "TXT"];
|
const fileTypes = ["JPG", "PNG", "GIF", "PDF", "HWP", "HWPX", "ZIP", "JPEG", "MP4", "TXT"];
|
||||||
|
const onDrop = (e) => {
|
||||||
const [serverFiles, setServerFiles] = useState();
|
//alert('ddd');
|
||||||
const [files, setFiles] = useState();
|
|
||||||
/*
|
|
||||||
let files = null;
|
|
||||||
const setFiles = (myFiles) => {
|
|
||||||
files = myFiles;
|
|
||||||
};
|
};
|
||||||
*/
|
|
||||||
|
const [file, setFile] = useState(null);
|
||||||
|
const handleChange = (file) => {
|
||||||
|
setFile(file);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
useEffect(function () {
|
||||||
|
if( file ) {
|
||||||
|
console.log('%o', file);
|
||||||
|
}
|
||||||
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||||
|
}, [file]);
|
||||||
|
|
||||||
|
|
||||||
const Location = React.memo(function Location() {
|
const Location = React.memo(function Location() {
|
||||||
|
|
@ -364,7 +367,21 @@ function PopupEditor(props) {
|
||||||
<dl className="file-attach-wrapper">
|
<dl className="file-attach-wrapper">
|
||||||
<dt>첨부파일</dt>
|
<dt>첨부파일</dt>
|
||||||
<dd>
|
<dd>
|
||||||
<AttachFile name="preDataFile" multiple={true} files={files} setFiles={setFiles} serverFiles={serverFiles} fileTypes={fileTypes} />
|
<span className="file_attach">
|
||||||
|
<FileDragDrop
|
||||||
|
className="file-drag-drop"
|
||||||
|
multiple={false}
|
||||||
|
fileTypes={fileTypes}
|
||||||
|
onDrop={onDrop}
|
||||||
|
handleChange={handleChange}
|
||||||
|
dropMessageStyle={{backgroundColor: '#cfe2ff'}}
|
||||||
|
>
|
||||||
|
<div>
|
||||||
|
<AttachFileIcon />
|
||||||
|
{file ? file.name : fileName ? fileName : "파일을 마우스로 끌어놓으세요."}
|
||||||
|
</div>
|
||||||
|
</FileDragDrop>
|
||||||
|
</span>
|
||||||
</dd>
|
</dd>
|
||||||
</dl>
|
</dl>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
import React, {useCallback, useEffect, useState} from 'react';
|
import React, {useCallback, useEffect, useState} from 'react';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
|
||||||
import URL from 'constants/url';
|
import URL from 'constants/url';
|
||||||
|
|
||||||
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
|
import { default as EgovLeftNav } from 'components/leftmenu/EgovLeftNavAdmin';
|
||||||
import * as EgovNet from "api/egovFetch";
|
import * as EgovNet from "../../../api/egovFetch";
|
||||||
import Modal from "react-bootstrap/Modal";
|
import Modal from "react-bootstrap/Modal";
|
||||||
import Form from "react-bootstrap/Form";
|
|
||||||
import SurveyModal from "./survey/SurveyModal";
|
import SurveyModal from "./survey/SurveyModal";
|
||||||
import QuestionModal from "./survey/QuestionModal";
|
import QuestionModal from "./survey/QuestionModal";
|
||||||
import CODE from "../../../constants/code";
|
|
||||||
|
|
||||||
|
|
||||||
function Survey({}) {
|
function Survey({}) {
|
||||||
|
|
@ -38,12 +38,15 @@ function Survey({}) {
|
||||||
<div>{item.svyTitle}</div>
|
<div>{item.svyTitle}</div>
|
||||||
<div>{item.svyStartDt}~{item.svyEndDt}</div>
|
<div>{item.svyStartDt}~{item.svyEndDt}</div>
|
||||||
<div><button className={"btn btn_blue_h31 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></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_blue_h31 px-1"}>통계 보기</button></div>
|
<div><button className={"btn btn_blue_h31 px-1"}>통계 보기</button></div>
|
||||||
<div>
|
<div>
|
||||||
<button className={"btn btn_blue_h31 px-1"} onClick={()=>{editSurvey(item)}}>수정</button>
|
<button className={"btn btn_blue_h31 px-1"} onClick={()=>{editSurvey(item)}}>수정</button>
|
||||||
</div>
|
</div>
|
||||||
|
<div>
|
||||||
|
<button className={"btn btn_red_h31 px-1"} onClick={()=>{editSurvey(item)}}>삭제</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
@ -56,29 +59,6 @@ function Survey({}) {
|
||||||
);
|
);
|
||||||
},[]);
|
},[]);
|
||||||
|
|
||||||
function editUseYn(svySeq){
|
|
||||||
EgovNet.requestFetch(
|
|
||||||
'/admin/survey/info-use-yn',
|
|
||||||
{
|
|
||||||
method: "PUT",
|
|
||||||
headers: {
|
|
||||||
'Content-type': 'application/json'
|
|
||||||
},
|
|
||||||
body: JSON.stringify({svySeq:svySeq})
|
|
||||||
},
|
|
||||||
(resp) => {
|
|
||||||
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
|
|
||||||
alert("저장되었습니다.")
|
|
||||||
retrieveList();
|
|
||||||
}else{
|
|
||||||
alert(resp.resultMessage)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function editSurvey(item){
|
function editSurvey(item){
|
||||||
handleShow();
|
handleShow();
|
||||||
setModalSize("md")
|
setModalSize("md")
|
||||||
|
|
@ -123,6 +103,7 @@ function Survey({}) {
|
||||||
<span>사용여부</span>
|
<span>사용여부</span>
|
||||||
<span>설문지 보기</span>
|
<span>설문지 보기</span>
|
||||||
<span>통계 보기</span>
|
<span>통계 보기</span>
|
||||||
|
<span></span>
|
||||||
<span><button className={"btn btn_blue_h31 px-1"} onClick={()=>{editSurvey(undefined)}}>추가</button></span>
|
<span><button className={"btn btn_blue_h31 px-1"} onClick={()=>{editSurvey(undefined)}}>추가</button></span>
|
||||||
</div>
|
</div>
|
||||||
<div className="result">
|
<div className="result">
|
||||||
|
|
|
||||||
|
|
@ -5,17 +5,15 @@ import Col from "react-bootstrap/Col";
|
||||||
import Form from "react-bootstrap/Form";
|
import Form from "react-bootstrap/Form";
|
||||||
import Table from "react-bootstrap/Table";
|
import Table from "react-bootstrap/Table";
|
||||||
import * as EgovNet from "api/egovFetch";
|
import * as EgovNet from "api/egovFetch";
|
||||||
import CODE from "../../../../constants/code";
|
|
||||||
|
|
||||||
function QuestionModal({svySeq}){
|
function QuestionModal({svySeq}){
|
||||||
|
|
||||||
const [qtList, setQtList] = useState([]);
|
const [qtList, setQtList] = useState([]);
|
||||||
const [selectedQt, setSelectedQt] = useState(null);
|
const [selectedQt, setSelectedQt] = useState(null);
|
||||||
const [tempSeq, setTempSeq] = useState(1);
|
|
||||||
|
|
||||||
function getSurveyQt(){
|
function getSurveyQt(){
|
||||||
EgovNet.requestFetch(
|
EgovNet.requestFetch(
|
||||||
'/admin/survey/info-qt?svySeq='+svySeq,
|
'/admin/survey/edit-qt?svySeq='+svySeq,
|
||||||
{
|
{
|
||||||
method: "GET"
|
method: "GET"
|
||||||
},
|
},
|
||||||
|
|
@ -29,94 +27,21 @@ function QuestionModal({svySeq}){
|
||||||
}
|
}
|
||||||
|
|
||||||
function addQt(){
|
function addQt(){
|
||||||
const temp = [...qtList]
|
|
||||||
temp.push({
|
|
||||||
qtSeq: null,
|
|
||||||
tempSeq: tempSeq,
|
|
||||||
svySeq: svySeq,
|
|
||||||
qtTitle: '',
|
|
||||||
qtDesc: '',
|
|
||||||
qtType: '',
|
|
||||||
maxNo: '',
|
|
||||||
etcYn: '',
|
|
||||||
itemList:[]
|
|
||||||
})
|
|
||||||
setQtList(temp);
|
|
||||||
setTempSeq(tempSeq+1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function qtOptionChange(target, value){
|
|
||||||
const temp = {...selectedQt}
|
|
||||||
temp[target] = value;
|
|
||||||
setSelectedQt(temp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function addItem(){
|
function addItem(){
|
||||||
const temp = {...selectedQt}
|
|
||||||
temp.itemList.push({
|
|
||||||
qtItemSeq: null,
|
|
||||||
qtSeq:null,
|
|
||||||
itemNm: null,
|
|
||||||
questionYn:'Y'
|
|
||||||
})
|
|
||||||
setSelectedQt(temp);
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeQt(index){
|
|
||||||
const temp = [...qtList]
|
|
||||||
temp.splice(index, 1);
|
|
||||||
setQtList(temp);
|
|
||||||
setSelectedQt(null)
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeItem(index){
|
|
||||||
const temp = {...selectedQt}
|
|
||||||
temp.itemList.splice(index, 1)
|
|
||||||
setSelectedQt(temp)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function editSurveyQt(e){
|
function editSurveyQt(e){
|
||||||
EgovNet.requestFetch(
|
|
||||||
'/admin/survey/info-qt',
|
|
||||||
{
|
|
||||||
method: "PUT",
|
|
||||||
headers: {
|
|
||||||
'Content-type': 'application/json'
|
|
||||||
},
|
|
||||||
body: JSON.stringify(qtList)
|
|
||||||
},
|
|
||||||
(resp) => {
|
|
||||||
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
|
|
||||||
alert("저장되었습니다.")
|
|
||||||
}else{
|
|
||||||
alert(resp.resultMessage)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
getSurveyQt()
|
getSurveyQt()
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const tempQt = [...qtList];
|
|
||||||
tempQt.forEach(function (qt, index){
|
|
||||||
if(qt.qtSeq === null){
|
|
||||||
if(qt.tempSeq === selectedQt?.tempSeq){
|
|
||||||
tempQt[index] = selectedQt;
|
|
||||||
}
|
|
||||||
}else if(qt.qtSeq === selectedQt?.qtSeq){
|
|
||||||
tempQt[index] = selectedQt;
|
|
||||||
}
|
|
||||||
})
|
|
||||||
setQtList(tempQt);
|
|
||||||
}, [selectedQt]);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
|
|
||||||
}, [qtList]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Modal.Header closeButton>
|
<Modal.Header closeButton>
|
||||||
|
|
@ -126,29 +51,17 @@ function QuestionModal({svySeq}){
|
||||||
<Row>
|
<Row>
|
||||||
<Col xs={5}>
|
<Col xs={5}>
|
||||||
<Table>
|
<Table>
|
||||||
<colgroup>
|
|
||||||
<col/>
|
|
||||||
<col className={"w_100"}/>
|
|
||||||
</colgroup>
|
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>질문</th>
|
<th>질문</th>
|
||||||
<th>삭제</th>
|
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{qtList.map((qt, index)=>{
|
{qtList.map(qt=>{
|
||||||
return (
|
return (
|
||||||
<tr onClick={()=>setSelectedQt({...qt})}>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<Form.Control type={"text"} defaultValue={qt.qtTitle} value={qt.qtTitle}
|
<Form.Control type={"text"} defaultValue={qt.qtTitle} onClick={()=>{setSelectedQt(qt)}}/>
|
||||||
onChange={(e)=>{
|
|
||||||
qt.qtTitle = e.target.value
|
|
||||||
setSelectedQt({...qt})
|
|
||||||
}} />
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<button className={"btn btn_red_h31"} onClick={()=>removeQt(index)}>삭제</button>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
);
|
);
|
||||||
|
|
@ -156,51 +69,23 @@ function QuestionModal({svySeq}){
|
||||||
</tbody>
|
</tbody>
|
||||||
<tfoot>
|
<tfoot>
|
||||||
<tr>
|
<tr>
|
||||||
<td colSpan={2}>
|
<td>
|
||||||
<button className={"btn btn_blue_h31"} onClick={addQt}>추가</button>
|
<button className={"btn btn_blue_h31"} onClick={addQt}>추가</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</tfoot>
|
</tfoot>
|
||||||
</Table>
|
</Table>
|
||||||
</Col>
|
</Col>
|
||||||
<Col xs={7} className={selectedQt?"":"d-none"}>
|
<Col xs={7}>
|
||||||
<Form.Group as={Row} className="mb-3">
|
<Form.Group as={Row} className="mb-3">
|
||||||
<Form.Label column sm={3}>
|
<Form.Label column sm={3}>
|
||||||
질문유형
|
질문유형
|
||||||
</Form.Label>
|
</Form.Label>
|
||||||
<Col sm={9} key={`inline-radio`} className={'my-auto'}>
|
<Col sm={9} key={`inline-radio`} className={'my-auto'}>
|
||||||
<Form.Check inline label="체크박스" name="qtType" type={'radio'} value={1}
|
<Form.Check inline label="체크박스" name="qtType" type={'radio'} value={1} checked={selectedQt?.qtType === 1} onClick={()=>{setSelectedQt({...selectedQt, qtType:1})}}/>
|
||||||
checked={selectedQt?.qtType === 1} defaultChecked={selectedQt?.qtType === 1}
|
<Form.Check inline label="라디오버튼" name="qtType" type={'radio'} value={2} checked={selectedQt?.qtType === 2} onClick={()=>{setSelectedQt({...selectedQt, qtType:2})}}/>
|
||||||
onClick={(e)=>{
|
<Form.Check inline label="직접입력" name="qtType" type={'radio'} value={3} checked={selectedQt?.qtType === 3} onClick={()=>{setSelectedQt({...selectedQt, qtType:3})}}/>
|
||||||
qtOptionChange("qtType", Number(e.target.value));
|
<Form.Check inline label="이용자만족도" name="qtType" type={'radio'} value={4} checked={selectedQt?.qtType === 4} onClick={()=>{setSelectedQt({...selectedQt, qtType:4})}}/>
|
||||||
}}/>
|
|
||||||
<Form.Check inline label="라디오버튼" name="qtType" type={'radio'} value={2}
|
|
||||||
checked={selectedQt?.qtType === 2} defaultChecked={selectedQt?.qtType === 2}
|
|
||||||
onClick={(e)=>{
|
|
||||||
qtOptionChange("qtType", Number(e.target.value));
|
|
||||||
}}/>
|
|
||||||
<Form.Check inline label="직접입력" name="qtType" type={'radio'} value={3}
|
|
||||||
checked={selectedQt?.qtType === 3} defaultChecked={selectedQt?.qtType === 3}
|
|
||||||
onClick={(e)=>{
|
|
||||||
qtOptionChange("qtType", Number(e.target.value));
|
|
||||||
}}/>
|
|
||||||
<Form.Check inline label="이용자만족도" name="qtType" type={'radio'} value={4}
|
|
||||||
checked={selectedQt?.qtType === 4} defaultChecked={selectedQt?.qtType === 4}
|
|
||||||
onClick={(e)=>{
|
|
||||||
qtOptionChange("qtType", Number(e.target.value));
|
|
||||||
}}/>
|
|
||||||
</Col>
|
|
||||||
</Form.Group>
|
|
||||||
<Form.Group as={Row}>
|
|
||||||
<Form.Label column sm={3}>
|
|
||||||
설명
|
|
||||||
</Form.Label>
|
|
||||||
<Col sm={9}>
|
|
||||||
<Form.Control as={"textarea"} rows={3} name="qtDesc"
|
|
||||||
defaultValue={selectedQt?.qtDesc?selectedQt?.qtDesc:''} value={selectedQt?.qtDesc?selectedQt?.qtDesc:''}
|
|
||||||
onChange={(e)=>{
|
|
||||||
qtOptionChange("qtDesc", e.target.value);
|
|
||||||
}}/>
|
|
||||||
</Col>
|
</Col>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Form.Group as={Row} className={`mb-3 ${selectedQt?.qtType!==1?'d-none':''}`}>
|
<Form.Group as={Row} className={`mb-3 ${selectedQt?.qtType!==1?'d-none':''}`}>
|
||||||
|
|
@ -208,59 +93,27 @@ function QuestionModal({svySeq}){
|
||||||
최대 선택 개수
|
최대 선택 개수
|
||||||
</Form.Label>
|
</Form.Label>
|
||||||
<Col sm={3}>
|
<Col sm={3}>
|
||||||
<Form.Control type="text" name="maxNo"
|
<Form.Control type="text" name="maxNo" defaultValue={selectedQt?.maxNo}/>
|
||||||
defaultValue={selectedQt?.maxNo} value={selectedQt?.maxNo}
|
|
||||||
onChange={(e)=>{
|
|
||||||
qtOptionChange("maxNo", e.target.value);
|
|
||||||
}}/>
|
|
||||||
</Col>
|
</Col>
|
||||||
<Form.Label column sm={'auto'}>
|
<Form.Label column sm={'auto'}>
|
||||||
기타 여부
|
기타 여부
|
||||||
</Form.Label>
|
</Form.Label>
|
||||||
<Col sm={3} className={'my-auto'}>
|
<Col sm={3} className={'my-auto'}>
|
||||||
<Form.Check type="checkbox" name="etcYn"
|
<Form.Check type="checkbox" name="mandatoryYn" checked={selectedQt?.mandatoryYn==='Y'}/>
|
||||||
defaultChecked={selectedQt?.etcYn==='Y'} checked={selectedQt?.etcYn==='Y'}
|
|
||||||
onClick={(e)=>{
|
|
||||||
qtOptionChange("etcYn", e.target.checked?'Y':'N');
|
|
||||||
}}/>
|
|
||||||
</Col>
|
</Col>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Table className={`mb-3 ${selectedQt?.qtType===3?'d-none':''}`}>
|
<Table>
|
||||||
<colgroup>
|
|
||||||
<col/>
|
|
||||||
<col className={"w_50"}/>
|
|
||||||
<col className={"w_100"}/>
|
|
||||||
</colgroup>
|
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>보기</th>
|
<th>보기</th>
|
||||||
<th>응답</th>
|
|
||||||
<th>삭제</th>
|
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{selectedQt?.itemList.map((item, index)=>{
|
{selectedQt?.itemList.map(item=>{
|
||||||
return (
|
return (
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
<Form.Control type={"text"} defaultValue={item.itemNm} value={item.itemNm}
|
<Form.Control type={"text"} defaultValue={item.itemNm}/>
|
||||||
onChange={(e)=>{
|
|
||||||
const qt = {...selectedQt}
|
|
||||||
qt.itemList[index].itemNm = e.target.value
|
|
||||||
setSelectedQt(qt);
|
|
||||||
}}/>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<Form.Check type="checkbox" name="questionYn"
|
|
||||||
defaultChecked={item.questionYn==='Y'} checked={item.questionYn==='Y'}
|
|
||||||
onClick={(e)=>{
|
|
||||||
const qt = {...selectedQt}
|
|
||||||
qt.itemList[index].questionYn = e.target.checked?'Y':'N'
|
|
||||||
setSelectedQt(qt);
|
|
||||||
}}/>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<button className={"btn btn_red_h31"} onClick={()=>removeItem(index)}>삭제</button>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
);
|
);
|
||||||
|
|
@ -268,7 +121,7 @@ function QuestionModal({svySeq}){
|
||||||
</tbody>
|
</tbody>
|
||||||
<tfoot>
|
<tfoot>
|
||||||
<tr>
|
<tr>
|
||||||
<td colSpan={2}>
|
<td>
|
||||||
<button className={"btn btn_blue_h31"} onClick={addItem}>추가</button>
|
<button className={"btn btn_blue_h31"} onClick={addItem}>추가</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
@ -278,7 +131,7 @@ function QuestionModal({svySeq}){
|
||||||
</Row>
|
</Row>
|
||||||
</Modal.Body>
|
</Modal.Body>
|
||||||
<Modal.Footer>
|
<Modal.Footer>
|
||||||
<button type="button" className={"btn btn_blue_h31 px-3"} onClick={editSurveyQt}>저장</button>
|
<button type="button" className={"btn btn_blue_h31 px-3"}>저장</button>
|
||||||
</Modal.Footer>
|
</Modal.Footer>
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -1,61 +1,41 @@
|
||||||
import React, {useEffect, useState} from "react";
|
import React from "react";
|
||||||
import Modal from "react-bootstrap/Modal";
|
import Modal from "react-bootstrap/Modal";
|
||||||
import Form from "react-bootstrap/Form";
|
import Form from "react-bootstrap/Form";
|
||||||
import Row from "react-bootstrap/Row";
|
import Row from "react-bootstrap/Row";
|
||||||
import Col from "react-bootstrap/Col";
|
import Col from "react-bootstrap/Col";
|
||||||
import * as EgovNet from "api/egovFetch";
|
import * as EgovNet from "api/egovFetch";
|
||||||
import CODE from "constants/code";
|
import CODE from "constants/code";
|
||||||
import DatePicker from "react-datepicker";
|
|
||||||
|
|
||||||
function SurveyModal({savedInfo, reloadFunction}){
|
function SurveyModal({savedInfo, reloadFunction}){
|
||||||
|
|
||||||
const [survey, setSurvey] = useState({
|
|
||||||
svySeq: savedInfo?savedInfo.svySeq:null,
|
|
||||||
svyTitle: savedInfo?savedInfo.svyTitle:'',
|
|
||||||
svyDesc: savedInfo?savedInfo.svyDesc:'',
|
|
||||||
svyStartDt: savedInfo?new Date(savedInfo.svyStartDt):new Date(),
|
|
||||||
svyEndDt: savedInfo?new Date(savedInfo.svyEndDt):new Date(),
|
|
||||||
})
|
|
||||||
|
|
||||||
function editSurvey(e){
|
function editSurvey(e){
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
|
const form = e.target;
|
||||||
|
const info = {
|
||||||
|
menuId: form.menuId.value,
|
||||||
|
menuTitle: form.menuTitle.value,
|
||||||
|
menuGroup: form.menuGroup.value,
|
||||||
|
menuLevel: form.menuLevel.value,
|
||||||
|
menuSort: form.menuSort.value,
|
||||||
|
menuUrl: form.menuUrl.value,
|
||||||
|
menuTypeCd: form.menuTypeCd.value,
|
||||||
|
}
|
||||||
EgovNet.requestFetch(
|
EgovNet.requestFetch(
|
||||||
'/admin/survey/info',
|
'/admin/config/menu-mgt',
|
||||||
{
|
{
|
||||||
method: "PUT",
|
method: "PUT",
|
||||||
headers: {
|
headers: {
|
||||||
'Content-type': 'application/json'
|
'Content-type': 'application/json'
|
||||||
},
|
},
|
||||||
body: JSON.stringify(survey)
|
body: JSON.stringify(info)
|
||||||
},
|
},
|
||||||
(resp) => {
|
(resp) => {
|
||||||
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
|
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
|
||||||
alert("저장되었습니다.")
|
alert("저장되었습니다.")
|
||||||
reloadFunction();
|
reloadFunction();
|
||||||
}else{
|
}else if(Number(resp.resultCode) === Number(CODE.RCV_ERROR_AUTH)){
|
||||||
alert(resp.resultMessage)
|
console.log("토큰 갱신중.")
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
function deleteSurvey(e,svySeq){
|
|
||||||
e.preventDefault();
|
|
||||||
e.stopPropagation();
|
|
||||||
EgovNet.requestFetch(
|
|
||||||
'/admin/survey/info',
|
|
||||||
{
|
|
||||||
method: "DELETE",
|
|
||||||
headers: {
|
|
||||||
'Content-type': 'application/json'
|
|
||||||
},
|
|
||||||
body: JSON.stringify({svySeq:svySeq})
|
|
||||||
},
|
|
||||||
(resp) => {
|
|
||||||
if (Number(resp.resultCode) === Number(CODE.RCV_SUCCESS)) {
|
|
||||||
alert("삭제되었습니다.")
|
|
||||||
reloadFunction();
|
|
||||||
}else{
|
}else{
|
||||||
alert(resp.resultMessage)
|
alert(resp.resultMessage)
|
||||||
}
|
}
|
||||||
|
|
@ -77,8 +57,7 @@ function SurveyModal({savedInfo, reloadFunction}){
|
||||||
제목
|
제목
|
||||||
</Form.Label>
|
</Form.Label>
|
||||||
<Col sm={9}>
|
<Col sm={9}>
|
||||||
<Form.Control type="email" name="svyTitle" required defaultValue={survey.svyTitle}
|
<Form.Control type="email" name="svyTitle" required defaultValue={savedInfo?.svyTitle} />
|
||||||
onChange={(e)=>{setSurvey({...survey, svyTitle:e.target.value})}}/>
|
|
||||||
</Col>
|
</Col>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Form.Group as={Row} className="mb-3">
|
<Form.Group as={Row} className="mb-3">
|
||||||
|
|
@ -86,38 +65,37 @@ function SurveyModal({savedInfo, reloadFunction}){
|
||||||
설명
|
설명
|
||||||
</Form.Label>
|
</Form.Label>
|
||||||
<Col sm={9}>
|
<Col sm={9}>
|
||||||
<Form.Control as={"textarea"} name="svyDesc" rows={3} defaultValue={survey.svyDesc}
|
<Form.Control as={"textarea"} name="svyDesc" rows={3} defaultValue={savedInfo?.svyDesc}/>
|
||||||
onChange={(e)=>{setSurvey({...survey, svyDesc:e.target.value})}}/>
|
|
||||||
</Col>
|
</Col>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Form.Group as={Row} className="mb-3">
|
<Form.Group as={Row} className="mb-3">
|
||||||
<Form.Label column sm={3}>
|
<Form.Label column sm={3}>
|
||||||
설문기간
|
시작일
|
||||||
</Form.Label>
|
</Form.Label>
|
||||||
<Col sm={9}>
|
<Col sm={9}>
|
||||||
<DatePicker selectsRange inline format={"yyyy-MM-dd"}
|
<Form.Control type="text" name="svyStartDt" required defaultValue={savedInfo?.svyStartDt} />
|
||||||
selected={survey.svyEndDt} minDate={new Date()}
|
|
||||||
startDate={survey.svyStartDt} endDate={survey.svyEndDt}
|
|
||||||
onChange={(dates)=>{
|
|
||||||
const [start, end] = dates;
|
|
||||||
setSurvey({...survey, svyStartDt:start, svyEndDt: end})
|
|
||||||
}}/>
|
|
||||||
</Col>
|
</Col>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Form.Group as={Row} className="mb-3">
|
<Form.Group as={Row} className="mb-3">
|
||||||
<Form.Label column sm={12}>
|
<Form.Label column sm={3}>
|
||||||
* 목록에서 사용 여부를 변경해야 설문이 노출됩니다.
|
종료일
|
||||||
</Form.Label>
|
</Form.Label>
|
||||||
|
<Col sm={9}>
|
||||||
|
<Form.Control type="text" name="svyEndDt" required defaultValue={savedInfo?.svyEndDt} />
|
||||||
|
</Col>
|
||||||
|
</Form.Group>
|
||||||
|
<Form.Group as={Row} className="mb-3">
|
||||||
|
<Form.Label column sm={3}>
|
||||||
|
첨부파일
|
||||||
|
</Form.Label>
|
||||||
|
<Col sm={9}>
|
||||||
|
<Form.Control type="text" name="fileGrpId" selectedValue={savedInfo?.fileGrpId}/>
|
||||||
|
</Col>
|
||||||
</Form.Group>
|
</Form.Group>
|
||||||
<Row className="mb-3">
|
<Row className="mb-3">
|
||||||
{survey.svySeq?
|
<Col xs={10}></Col>
|
||||||
<Col xs={2}>
|
|
||||||
<button className={"btn btn_red_h31"} onClick={(e)=>{deleteSurvey(e, survey.svySeq)}}>삭제</button>
|
|
||||||
</Col>
|
|
||||||
:''}
|
|
||||||
<Col xs={survey.svySeq?8:10}></Col>
|
|
||||||
<Col xs={2}>
|
<Col xs={2}>
|
||||||
<button type="submit" className={"btn btn_blue_h31"}>저장</button>
|
<button type="submit" className={"btn btn_blue_h31 px-3"}>저장</button>
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
</Form>
|
</Form>
|
||||||
|
|
|
||||||
|
|
@ -1135,11 +1135,6 @@
|
||||||
resolved "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz"
|
resolved "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz"
|
||||||
integrity sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==
|
integrity sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==
|
||||||
|
|
||||||
"@base2/pretty-print-object@^1.0.2":
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@base2/pretty-print-object/-/pretty-print-object-1.0.2.tgz#e30192222fd13e3c1e97040163d6628a95f70844"
|
|
||||||
integrity sha512-rBha0UDfV7EmBRjWrGG7Cpwxg8WomPlo0q+R2so47ZFf9wy4YKJzLuHcVa0UGFjdcLZj/4F/1FNC46GIQhe7sA==
|
|
||||||
|
|
||||||
"@bcoe/v8-coverage@^0.2.3":
|
"@bcoe/v8-coverage@^0.2.3":
|
||||||
version "0.2.3"
|
version "0.2.3"
|
||||||
resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz"
|
resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz"
|
||||||
|
|
@ -8628,7 +8623,7 @@ react-drag-drop-files@^2.3.10:
|
||||||
|
|
||||||
react-element-to-jsx-string@^15.0.0:
|
react-element-to-jsx-string@^15.0.0:
|
||||||
version "15.0.0"
|
version "15.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz#1cafd5b6ad41946ffc8755e254da3fc752a01ac6"
|
resolved "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz"
|
||||||
integrity sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==
|
integrity sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@base2/pretty-print-object" "1.0.1"
|
"@base2/pretty-print-object" "1.0.1"
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,6 @@
|
||||||
package com.dbnt.kcscbackend.admin.boards;
|
package com.dbnt.kcscbackend.admin.boards;
|
||||||
|
|
||||||
import com.dbnt.kcscbackend.admin.boards.entity.TnBbs;
|
import com.dbnt.kcscbackend.admin.boards.entity.TnBbs;
|
||||||
import com.dbnt.kcscbackend.admin.boards.entity.TnBbsContents;
|
|
||||||
import com.dbnt.kcscbackend.admin.boards.service.AdminBoardsService;
|
import com.dbnt.kcscbackend.admin.boards.service.AdminBoardsService;
|
||||||
import com.dbnt.kcscbackend.admin.config.entity.TcMenu;
|
import com.dbnt.kcscbackend.admin.config.entity.TcMenu;
|
||||||
import com.dbnt.kcscbackend.auth.entity.LoginVO;
|
import com.dbnt.kcscbackend.auth.entity.LoginVO;
|
||||||
|
|
@ -10,7 +9,6 @@ import com.dbnt.kcscbackend.commonCode.service.CommonCodeService;
|
||||||
import com.dbnt.kcscbackend.config.common.BaseController;
|
import com.dbnt.kcscbackend.config.common.BaseController;
|
||||||
import com.dbnt.kcscbackend.config.common.ResponseCode;
|
import com.dbnt.kcscbackend.config.common.ResponseCode;
|
||||||
import com.dbnt.kcscbackend.config.common.ResultVO;
|
import com.dbnt.kcscbackend.config.common.ResultVO;
|
||||||
import com.dbnt.kcscbackend.config.util.ClientUtils;
|
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
import io.swagger.v3.oas.annotations.responses.ApiResponse;
|
||||||
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
import io.swagger.v3.oas.annotations.responses.ApiResponses;
|
||||||
|
|
@ -25,8 +23,6 @@ import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
@ -122,7 +118,7 @@ public class AdminBoardsController extends BaseController {
|
||||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
||||||
})
|
})
|
||||||
@RequestMapping(method = RequestMethod.DELETE, value = "/board-mgt")
|
@RequestMapping(method = RequestMethod.DELETE, value = "/board-mgt")
|
||||||
public ResultVO deleteBoardMgt(@RequestBody TnBbs bbs, @AuthenticationPrincipal LoginVO user) {
|
public ResultVO removeBoardMgt(@RequestBody TnBbs bbs, @AuthenticationPrincipal LoginVO user) {
|
||||||
ResultVO resultVO = new ResultVO();
|
ResultVO resultVO = new ResultVO();
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
|
resultVO.setResultCode(ResponseCode.TOKEN_EXPIRED.getCode());
|
||||||
|
|
@ -158,83 +154,4 @@ public class AdminBoardsController extends BaseController {
|
||||||
return resultVO;
|
return resultVO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Operation(
|
|
||||||
summary = "게시물 카테고리 셀렉트박스 옵션 조회",
|
|
||||||
description = "게시물 카테고리 셀렉트박스 옵션 조회",
|
|
||||||
tags = {"AdminBoardsController"}
|
|
||||||
)
|
|
||||||
@ApiResponses(value = {
|
|
||||||
@ApiResponse(responseCode = "200", description = "조회 성공"),
|
|
||||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
|
||||||
})
|
|
||||||
@RequestMapping(method = RequestMethod.GET, value = "/get-category-list", consumes = MediaType.APPLICATION_JSON_VALUE)
|
|
||||||
public ResultVO getCategoryList() throws Exception {
|
|
||||||
ResultVO resultVO = new ResultVO();
|
|
||||||
Map<String, Object> resultMap = new HashMap<>();
|
|
||||||
|
|
||||||
resultMap.put("categoryList", adminBoardsService.selectBoardList());
|
|
||||||
resultVO.setResult(resultMap);
|
|
||||||
return resultVO;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Operation(
|
|
||||||
summary = "게시물 저장",
|
|
||||||
description = "게시물 저장",
|
|
||||||
tags = {"AdminBoardsController"}
|
|
||||||
)
|
|
||||||
@ApiResponses(value = {
|
|
||||||
@ApiResponse(responseCode = "200", description = "저장 성공"),
|
|
||||||
@ApiResponse(responseCode = "403", description = "인가된 사용자가 아님")
|
|
||||||
})
|
|
||||||
@RequestMapping(method = RequestMethod.PUT, value = "/post-mgt")
|
|
||||||
public ResultVO savePostMgt(@RequestBody @Valid TnBbsContents contents, HttpServletRequest request, Errors errors, @AuthenticationPrincipal LoginVO user) {
|
|
||||||
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.getBbsContSeq());
|
|
||||||
contents.setIpAddress(ClientUtils.getRemoteIP(request));
|
|
||||||
adminBoardsService.savePost(contents, user.getId());
|
|
||||||
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 = "/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, user.getId());
|
|
||||||
if (result == null) {
|
|
||||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
|
||||||
} else if (result.equals("notFind")) {
|
|
||||||
resultVO.setResultCode(ResponseCode.SAVE_ERROR.getCode());
|
|
||||||
resultVO.setResultMessage("대상이 존재하지 않습니다.");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return resultVO;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -19,10 +19,10 @@ public class TnBbsContents {
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
@Column(name = "bbs_cont_seq")
|
@Column(name = "bbs_cont_seq")
|
||||||
private Long bbsContSeq;
|
private Integer bbsContSeq;
|
||||||
|
|
||||||
@Column(name = "bbs_seq", nullable = false)
|
@Column(name = "bbs_seq", nullable = false)
|
||||||
private Long bbsSeq;
|
private Integer bbsSeq;
|
||||||
|
|
||||||
@Column(name = "bbs_cont_title")
|
@Column(name = "bbs_cont_title")
|
||||||
private String bbsContTitle;
|
private String bbsContTitle;
|
||||||
|
|
@ -31,22 +31,22 @@ public class TnBbsContents {
|
||||||
private String bbsContents;
|
private String bbsContents;
|
||||||
|
|
||||||
@Column(name = "bbs_cont_seq_group")
|
@Column(name = "bbs_cont_seq_group")
|
||||||
private Long bbsContSeqGroup;
|
private Integer bbsContSeqGroup;
|
||||||
|
|
||||||
@Column(name = "bbs_cont_seq_parent")
|
@Column(name = "bbs_cont_seq_parent")
|
||||||
private Long bbsContSeqParent;
|
private Integer bbsContSeqParent;
|
||||||
|
|
||||||
@Column(name = "bbs_cont_level", nullable = false)
|
@Column(name = "bbs_cont_level", nullable = false)
|
||||||
private Long bbsContLevel;
|
private Integer bbsContLevel;
|
||||||
|
|
||||||
@Column(name = "bbs_cont_sort")
|
@Column(name = "bbs_cont_sort")
|
||||||
private Long bbsContSort;
|
private Integer bbsContSort;
|
||||||
|
|
||||||
@Column(name = "file_grp_id")
|
@Column(name = "file_grp_id")
|
||||||
private String fileGrpId;
|
private String fileGrpId;
|
||||||
|
|
||||||
@Column(name = "bbs_read_cnt", nullable = false)
|
@Column(name = "bbs_read_cnt", nullable = false)
|
||||||
private Long bbsReadCnt;
|
private Integer bbsReadCnt;
|
||||||
|
|
||||||
@Column(name = "fixed_yn", nullable = false)
|
@Column(name = "fixed_yn", nullable = false)
|
||||||
private String fixedYn;
|
private String fixedYn;
|
||||||
|
|
@ -58,7 +58,7 @@ public class TnBbsContents {
|
||||||
private String secretPwd;
|
private String secretPwd;
|
||||||
|
|
||||||
@Column(name = "doc_info_seq")
|
@Column(name = "doc_info_seq")
|
||||||
private Long docInfoSeq;
|
private Integer docInfoSeq;
|
||||||
|
|
||||||
@Column(name = "ip_address", nullable = false)
|
@Column(name = "ip_address", nullable = false)
|
||||||
private String ipAddress;
|
private String ipAddress;
|
||||||
|
|
@ -79,8 +79,5 @@ public class TnBbsContents {
|
||||||
private String useYn;
|
private String useYn;
|
||||||
|
|
||||||
@Column(name = "old_seq")
|
@Column(name = "old_seq")
|
||||||
private Long oldSeq;
|
private Integer oldSeq;
|
||||||
|
|
||||||
@Column(name = "bbs_id")
|
|
||||||
private String bbsId;
|
|
||||||
}
|
}
|
||||||
|
|
@ -2,17 +2,7 @@ package com.dbnt.kcscbackend.admin.boards.repository;
|
||||||
|
|
||||||
import com.dbnt.kcscbackend.admin.boards.entity.TnBbsContents;
|
import com.dbnt.kcscbackend.admin.boards.entity.TnBbsContents;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
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;
|
|
||||||
|
|
||||||
public interface TnBbsContentsRepository extends JpaRepository<TnBbsContents, Long> {
|
public interface TnBbsContentsRepository extends JpaRepository<TnBbsContents, Long> {
|
||||||
|
|
||||||
@Query(value = "SELECT entity FROM TnBbsContents entity " +
|
|
||||||
"WHERE entity.useYn = 'Y' " +
|
|
||||||
"AND entity.bbsId = :bbsId " +
|
|
||||||
"ORDER BY entity.bbsContSeq DESC")
|
|
||||||
List<TnBbsContents> findByBbsId(@Param("bbsId") String bbsId);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,11 +2,13 @@ package com.dbnt.kcscbackend.admin.boards.repository;
|
||||||
|
|
||||||
import com.dbnt.kcscbackend.admin.boards.entity.TnBbs;
|
import com.dbnt.kcscbackend.admin.boards.entity.TnBbs;
|
||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
import org.springframework.data.jpa.repository.Query;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface TnBbsRepository extends JpaRepository<TnBbs, Long> {
|
public interface TnBbsRepository extends JpaRepository<TnBbs, Long> {
|
||||||
|
|
||||||
|
@Query(value = "SELECT * FROM tn_bbs ORDER BY bbs_seq DESC", nativeQuery = true)
|
||||||
List<TnBbs> findAllByOrderByBbsSeqDesc();
|
List<TnBbs> findAllByOrderByBbsSeqDesc();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,10 @@ public class AdminBoardsService extends EgovAbstractServiceImpl {
|
||||||
return tnBbsRepository.findAllByOrderByBbsSeqDesc();
|
return tnBbsRepository.findAllByOrderByBbsSeqDesc();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Optional<TnBbs> selectBoard(Long bbsSeq) {
|
||||||
|
return tnBbsRepository.findById(bbsSeq);
|
||||||
|
}
|
||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public void saveBoard(TnBbs bbs, String userId) {
|
public void saveBoard(TnBbs bbs, String userId) {
|
||||||
if (bbs.getBbsSeq() == null) {
|
if (bbs.getBbsSeq() == null) {
|
||||||
|
|
@ -66,45 +70,4 @@ public class AdminBoardsService extends EgovAbstractServiceImpl {
|
||||||
return tnBbsContentsRepository.findAll();
|
return tnBbsContentsRepository.findAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
|
||||||
public void savePost(TnBbsContents contents, String userId) {
|
|
||||||
if (contents.getBbsContSeq() == null) {
|
|
||||||
// TODO 하드코딩
|
|
||||||
contents.setBbsContLevel(1L);
|
|
||||||
contents.setBbsReadCnt(0L);
|
|
||||||
contents.setUseYn("Y");
|
|
||||||
contents.setFrstCrtDt(LocalDateTime.now());
|
|
||||||
contents.setFrstCrtId(userId);
|
|
||||||
tnBbsContentsRepository.save(contents);
|
|
||||||
} else {
|
|
||||||
TnBbsContents savedPost = tnBbsContentsRepository.findById(contents.getBbsContSeq()).orElse(null);
|
|
||||||
savedPost.setFixedYn(contents.getFixedYn());
|
|
||||||
savedPost.setSecretYn(contents.getSecretYn());
|
|
||||||
savedPost.setBbsId(contents.getBbsId());
|
|
||||||
savedPost.setBbsContTitle(contents.getBbsContTitle());
|
|
||||||
savedPost.setFileGrpId(contents.getFileGrpId());
|
|
||||||
savedPost.setBbsContents(contents.getBbsContents());
|
|
||||||
savedPost.setIpAddress(contents.getIpAddress());
|
|
||||||
savedPost.setUseYn("Y");
|
|
||||||
savedPost.setLastChgId(userId);
|
|
||||||
savedPost.setLastChgDt(LocalDateTime.now());
|
|
||||||
tnBbsContentsRepository.save(savedPost);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
public String deletePost(TnBbsContents contents, String userId) {
|
|
||||||
TnBbsContents savedPost = tnBbsContentsRepository.findById(contents.getBbsContSeq()).orElse(null);
|
|
||||||
if (savedPost == null) {
|
|
||||||
return "notFind";
|
|
||||||
} else {
|
|
||||||
savedPost.setIpAddress(contents.getIpAddress());
|
|
||||||
savedPost.setUseYn("N");
|
|
||||||
savedPost.setLastChgDt(LocalDateTime.now());
|
|
||||||
savedPost.setLastChgId(userId);
|
|
||||||
tnBbsContentsRepository.save(savedPost);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -88,13 +88,13 @@ public class PopUpApiController {
|
||||||
@AuthenticationPrincipal LoginVO loginVO,
|
@AuthenticationPrincipal LoginVO loginVO,
|
||||||
final MultipartHttpServletRequest multiRequest,
|
final MultipartHttpServletRequest multiRequest,
|
||||||
CreatePopupVO createPopupVO,
|
CreatePopupVO createPopupVO,
|
||||||
@RequestParam(required = false) MultipartFile[] files
|
@RequestParam(required = false) MultipartFile file
|
||||||
) throws Exception {
|
) throws Exception {
|
||||||
|
|
||||||
ResultVO resultVO = new ResultVO();
|
ResultVO resultVO = new ResultVO();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
resultVO = popUpApiService.contentsApiPopUpManageCreate(resultVO, request, loginVO, multiRequest, createPopupVO, files);
|
resultVO = popUpApiService.contentsApiPopUpManageCreate(resultVO, request, loginVO, multiRequest, createPopupVO, file);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
resultVO.setResultCode(ResponseCode.FAILED.getCode());
|
resultVO.setResultCode(ResponseCode.FAILED.getCode());
|
||||||
resultVO.setResultMessage(e.getMessage());
|
resultVO.setResultMessage(e.getMessage());
|
||||||
|
|
@ -129,14 +129,14 @@ public class PopUpApiController {
|
||||||
HttpServletRequest request,
|
HttpServletRequest request,
|
||||||
@AuthenticationPrincipal LoginVO loginVO,
|
@AuthenticationPrincipal LoginVO loginVO,
|
||||||
UpdatePopupVO updatePopupVO,
|
UpdatePopupVO updatePopupVO,
|
||||||
@RequestParam(required = false) MultipartFile[] files,
|
@RequestParam(required = false) MultipartFile file,
|
||||||
@PathVariable("popupId") Long popupId
|
@PathVariable("popupId") Long popupId
|
||||||
) throws Exception {
|
) throws Exception {
|
||||||
|
|
||||||
ResultVO resultVO = new ResultVO();
|
ResultVO resultVO = new ResultVO();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
resultVO = popUpApiService.contentsApiPopUpManageUpdate(resultVO, request, loginVO, updatePopupVO, files, popupId);
|
resultVO = popUpApiService.contentsApiPopUpManageUpdate(resultVO, request, loginVO, updatePopupVO, file, popupId);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
resultVO.setResultCode(ResponseCode.FAILED.getCode());
|
resultVO.setResultCode(ResponseCode.FAILED.getCode());
|
||||||
resultVO.setResultMessage(e.getMessage());
|
resultVO.setResultMessage(e.getMessage());
|
||||||
|
|
|
||||||
|
|
@ -16,10 +16,10 @@ import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
public interface PopUpApiService {
|
public interface PopUpApiService {
|
||||||
public ResultVO contentsApiPopUpManageList(ResultVO resultVO, HttpServletRequest request, LoginVO user, Pageable pageable) throws Exception;
|
public ResultVO contentsApiPopUpManageList(ResultVO resultVO, HttpServletRequest request, LoginVO user, Pageable pageable) throws Exception;
|
||||||
public ResultVO contentsApiPopUpManageCreate(ResultVO resultVO, HttpServletRequest request, LoginVO user, final MultipartHttpServletRequest multiRequest, CreatePopupVO createPopupVO, MultipartFile[] files) throws Exception;
|
public ResultVO contentsApiPopUpManageCreate(ResultVO resultVO, HttpServletRequest request, LoginVO user, final MultipartHttpServletRequest multiRequest, CreatePopupVO createPopupVO, MultipartFile file) throws Exception;
|
||||||
public ResultVO contentsApiPopUpManageRead(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long popupSeq) throws Exception;
|
public ResultVO contentsApiPopUpManageRead(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long popupId) throws Exception;
|
||||||
public ResultVO contentsApiPopUpManageUpdate(ResultVO resultVO, HttpServletRequest request, LoginVO user, UpdatePopupVO updatePopupVO, MultipartFile[] files, Long popupSeq) throws Exception;
|
public ResultVO contentsApiPopUpManageUpdate(ResultVO resultVO, HttpServletRequest request, LoginVO user, UpdatePopupVO updatePopupVO, MultipartFile file, Long popupId) throws Exception;
|
||||||
public ResultVO contentsApiPopUpManageDelete(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long popupSeq) throws Exception;
|
public ResultVO contentsApiPopUpManageDelete(ResultVO resultVO, HttpServletRequest request, LoginVO user, Long popupId) throws Exception;
|
||||||
public ResultVO contentsApiPopUpManageUpdateActivationSwitch(ResultVO resultVO, HttpServletRequest request, LoginVO user, String checked, Long popupSeq) throws Exception;
|
public ResultVO contentsApiPopUpManageUpdateActivationSwitch(ResultVO resultVO, HttpServletRequest request, LoginVO user, String checked, Long popupId) throws Exception;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -103,7 +103,7 @@ public class PopUpApiServiceImpl extends EgovAbstractServiceImpl implements PopU
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResultVO contentsApiPopUpManageCreate(ResultVO resultVO, HttpServletRequest request, LoginVO user, final MultipartHttpServletRequest multiRequest, CreatePopupVO createPopupVO, MultipartFile[] files) throws Exception {
|
public ResultVO contentsApiPopUpManageCreate(ResultVO resultVO, HttpServletRequest request, LoginVO user, final MultipartHttpServletRequest multiRequest, CreatePopupVO createPopupVO, MultipartFile file) throws Exception {
|
||||||
|
|
||||||
System.out.println(
|
System.out.println(
|
||||||
"\n--------------------------------------------------------------\n" +
|
"\n--------------------------------------------------------------\n" +
|
||||||
|
|
@ -115,7 +115,7 @@ public class PopUpApiServiceImpl extends EgovAbstractServiceImpl implements PopU
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
String fileGrpId = fileService.addTnAttachFile(request, user, files, this.getMiddlePath());
|
String fileGrpId = fileService.addTnAttachFile(request, user, file, this.getMiddlePath());
|
||||||
|
|
||||||
Map<String, Object> response = tnPopupMngRepository.spAddTnPopupMng(
|
Map<String, Object> response = tnPopupMngRepository.spAddTnPopupMng(
|
||||||
createPopupVO.getTitle(),
|
createPopupVO.getTitle(),
|
||||||
|
|
@ -173,25 +173,14 @@ public class PopUpApiServiceImpl extends EgovAbstractServiceImpl implements PopU
|
||||||
dto.put("schdulEndde", tnPopupMng.getPopupEndDate().plusHours(9).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 날짜/시간의 종료 일시 - yyyyMMddHHmmss
|
dto.put("schdulEndde", tnPopupMng.getPopupEndDate().plusHours(9).format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 날짜/시간의 종료 일시 - yyyyMMddHHmmss
|
||||||
|
|
||||||
//첨부파일명을 가져온다.
|
//첨부파일명을 가져온다.
|
||||||
List<TnAttachFile> tnAttachFileList = tnAttachFileRepository.findByFileGrpId(tnPopupMng.getFileGrpId()).orElse(null);
|
TnAttachFile tnAttachFile = tnAttachFileRepository.findByFileGrpId(tnPopupMng.getFileGrpId()).orElse(null);
|
||||||
|
|
||||||
if( tnAttachFileList != null ) {
|
if( tnAttachFile != null ) {
|
||||||
List<Map<String, Object>> files = new ArrayList<Map<String, Object>>();
|
dto.put("fileName", tnAttachFile.getFileOldName());
|
||||||
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);
|
|
||||||
}
|
|
||||||
dto.put("files", files);
|
|
||||||
} else {
|
} else {
|
||||||
dto.put("files", null);
|
dto.put("fileName", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
resultVO.setResult(dto);
|
resultVO.setResult(dto);
|
||||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||||
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
|
resultVO.setResultMessage(ResponseCode.SUCCESS.getMessage());
|
||||||
|
|
@ -200,37 +189,33 @@ public class PopUpApiServiceImpl extends EgovAbstractServiceImpl implements PopU
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResultVO contentsApiPopUpManageUpdate(ResultVO resultVO, HttpServletRequest request, LoginVO user, UpdatePopupVO updatePopupVO, MultipartFile[] files, Long popupSeq) throws Exception {
|
public ResultVO contentsApiPopUpManageUpdate(ResultVO resultVO, HttpServletRequest request, LoginVO user, UpdatePopupVO updatePopupVO, MultipartFile file, Long popupId) throws Exception {
|
||||||
System.out.println(
|
System.out.println(
|
||||||
"\n--------------------------------------------------------------\n" +
|
"\n--------------------------------------------------------------\n" +
|
||||||
request.getRequestURI() + " IN:" +
|
request.getRequestURI() + " IN:" +
|
||||||
"\n--------------------------------------------------------------\n" +
|
"\n--------------------------------------------------------------\n" +
|
||||||
"updatePopupVO:" + "\n" +
|
"updatePopupVO:" + "\n" +
|
||||||
updatePopupVO.toString() + "\n" +
|
updatePopupVO.toString() + "\n" +
|
||||||
"popupSeq:" + "\n" +
|
"popupId:" + "\n" +
|
||||||
popupSeq + "\n" +
|
popupId + "\n" +
|
||||||
"\n--------------------------------------------------------------\n"
|
"\n--------------------------------------------------------------\n"
|
||||||
);
|
);
|
||||||
|
|
||||||
// 유효성 검사 실시
|
// 유효성 검사 실시
|
||||||
int isValid = tnPopupMngRepository.spIsValidTnPopupMngId( popupSeq.intValue() );
|
int isValid = tnPopupMngRepository.spIsValidTnPopupMngId( popupId.intValue() );
|
||||||
|
|
||||||
if( isValid == 0 ) {
|
if( isValid == 0 ) {
|
||||||
throw new Exception("대상이 존재하지 않습니다.");
|
throw new Exception("대상이 존재하지 않습니다.");
|
||||||
}
|
}
|
||||||
|
|
||||||
if( Long.parseLong(updatePopupVO.getStartDate()) > Long.parseLong(updatePopupVO.getEndDate()) ) {
|
if( Long.parseLong(updatePopupVO.getStartDate()) > Long.parseLong(updatePopupVO.getEndDate()) ) {
|
||||||
throw new Exception("종료일시는 시작일시보다 앞 설 수 없습니다.");
|
throw new Exception("종료일시는 시작일시보다 앞 설 수 없습니다.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 기존 첨부된 file이 있다면 기존 fileGrpId을 활용한다.
|
String fileGrpId = fileService.addTnAttachFile(request, user, file, this.getMiddlePath());
|
||||||
TnPopupMng tnPopupMng = tnPopupMngRepository.findByPopupSeq(popupSeq);
|
|
||||||
|
|
||||||
String fileGrpId = tnPopupMng.getFileGrpId();
|
|
||||||
fileGrpId = fileService.addTnAttachFile(request, user, files, this.getMiddlePath(), fileGrpId);
|
|
||||||
|
|
||||||
Map<String, Object> response = tnPopupMngRepository.spUpdateTnPopupMng(
|
Map<String, Object> response = tnPopupMngRepository.spUpdateTnPopupMng(
|
||||||
popupSeq.intValue(),
|
popupId.intValue(),
|
||||||
updatePopupVO.getTitle(),
|
updatePopupVO.getTitle(),
|
||||||
updatePopupVO.getStartDate(),
|
updatePopupVO.getStartDate(),
|
||||||
updatePopupVO.getEndDate(),
|
updatePopupVO.getEndDate(),
|
||||||
|
|
@ -245,7 +230,7 @@ public class PopUpApiServiceImpl extends EgovAbstractServiceImpl implements PopU
|
||||||
|
|
||||||
Map<String, Object> dto = new HashMap<String, Object>();
|
Map<String, Object> dto = new HashMap<String, Object>();
|
||||||
dto.put("errorMessage", response.get("_error_message") );
|
dto.put("errorMessage", response.get("_error_message") );
|
||||||
dto.put("popupId", popupSeq);
|
dto.put("popupId", popupId);
|
||||||
|
|
||||||
resultVO.setResult(dto);
|
resultVO.setResult(dto);
|
||||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
||||||
|
|
|
||||||
|
|
@ -1,25 +1,18 @@
|
||||||
package com.dbnt.kcscbackend.admin.contents.survey;
|
package com.dbnt.kcscbackend.admin.contents.survey;
|
||||||
|
|
||||||
import com.dbnt.kcscbackend.admin.contents.survey.entity.TnSurvey;
|
import com.dbnt.kcscbackend.admin.contents.survey.entity.TnSurvey;
|
||||||
import com.dbnt.kcscbackend.admin.contents.survey.entity.TnSurveyQt;
|
|
||||||
import com.dbnt.kcscbackend.admin.contents.survey.service.AdminSurveyService;
|
import com.dbnt.kcscbackend.admin.contents.survey.service.AdminSurveyService;
|
||||||
import com.dbnt.kcscbackend.auth.entity.LoginVO;
|
import com.dbnt.kcscbackend.auth.entity.LoginVO;
|
||||||
import com.dbnt.kcscbackend.config.common.ResponseCode;
|
|
||||||
import com.dbnt.kcscbackend.config.common.ResultVO;
|
import com.dbnt.kcscbackend.config.common.ResultVO;
|
||||||
|
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
||||||
import org.springframework.validation.Errors;
|
|
||||||
import org.springframework.validation.FieldError;
|
|
||||||
import org.springframework.web.bind.annotation.RequestBody;
|
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
import org.springframework.web.bind.annotation.RequestMethod;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.validation.Valid;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
|
@ -39,45 +32,18 @@ public class AdminSurveyController {
|
||||||
return resultVO;
|
return resultVO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping(method = RequestMethod.PUT, value = "/info")
|
@RequestMapping(method = RequestMethod.GET, value = "/edit")
|
||||||
public ResultVO surveyEdit(@RequestBody @Valid TnSurvey survey, Errors errors, @AuthenticationPrincipal LoginVO user) throws Exception{
|
public ResultVO surveyEdit(TnSurvey survey) throws Exception{
|
||||||
|
|
||||||
ResultVO resultVO = new ResultVO();
|
ResultVO resultVO = new ResultVO();
|
||||||
if(errors.hasErrors()){
|
Map<String, Object> resultMap = new HashMap<>();
|
||||||
StringBuilder msg = new StringBuilder();
|
resultMap.put("survey", adminSurveyService.selectSurvey(survey));
|
||||||
for(FieldError error: errors.getFieldErrors()){
|
resultVO.setResult(resultMap);
|
||||||
msg.append(error.getDefaultMessage());
|
|
||||||
msg.append("\n");
|
|
||||||
}
|
|
||||||
resultVO.setResultCode(ResponseCode.INPUT_CHECK_ERROR.getCode());
|
|
||||||
resultVO.setResultMessage(msg.toString());
|
|
||||||
}else {
|
|
||||||
adminSurveyService.insertSurvey(survey, user.getId());
|
|
||||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
|
||||||
resultVO.setResultMessage("저장 되었습니다.");
|
|
||||||
}
|
|
||||||
return resultVO;
|
return resultVO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping(method = RequestMethod.DELETE, value = "/info")
|
@RequestMapping(method = RequestMethod.GET, value = "/edit-qt")
|
||||||
public ResultVO surveyDelete(@RequestBody TnSurvey survey, @AuthenticationPrincipal LoginVO user) throws Exception{
|
public ResultVO surveyEditQt(TnSurvey survey) throws Exception{
|
||||||
ResultVO resultVO = new ResultVO();
|
|
||||||
adminSurveyService.deleteSurvey(survey.getSvySeq());
|
|
||||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
|
||||||
resultVO.setResultMessage("저장 되었습니다.");
|
|
||||||
return resultVO;
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping(method = RequestMethod.PUT, value = "/info-use-yn")
|
|
||||||
public ResultVO surveyUseYn(@RequestBody TnSurvey survey, @AuthenticationPrincipal LoginVO user) throws Exception{
|
|
||||||
ResultVO resultVO = new ResultVO();
|
|
||||||
adminSurveyService.updateSurveyUseYn(survey.getSvySeq(), user.getId());
|
|
||||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
|
||||||
resultVO.setResultMessage("저장 되었습니다.");
|
|
||||||
return resultVO;
|
|
||||||
}
|
|
||||||
|
|
||||||
@RequestMapping(method = RequestMethod.GET, value = "/info-qt")
|
|
||||||
public ResultVO surveyQt(TnSurvey survey) throws Exception{
|
|
||||||
|
|
||||||
ResultVO resultVO = new ResultVO();
|
ResultVO resultVO = new ResultVO();
|
||||||
Map<String, Object> resultMap = new HashMap<>();
|
Map<String, Object> resultMap = new HashMap<>();
|
||||||
|
|
@ -85,15 +51,4 @@ public class AdminSurveyController {
|
||||||
resultVO.setResult(resultMap);
|
resultVO.setResult(resultMap);
|
||||||
return resultVO;
|
return resultVO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequestMapping(method = RequestMethod.PUT, value = "/info-qt")
|
|
||||||
public ResultVO surveyQtEdit(@RequestBody List<TnSurveyQt> qtList, @AuthenticationPrincipal LoginVO user) throws Exception{
|
|
||||||
ResultVO resultVO = new ResultVO();
|
|
||||||
|
|
||||||
adminSurveyService.insertSurveyQt(qtList, user.getId());
|
|
||||||
resultVO.setResultCode(ResponseCode.SUCCESS.getCode());
|
|
||||||
resultVO.setResultMessage("저장 되었습니다.");
|
|
||||||
|
|
||||||
return resultVO;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,10 +5,11 @@ import lombok.NoArgsConstructor;
|
||||||
import lombok.Setter;
|
import lombok.Setter;
|
||||||
import org.hibernate.annotations.DynamicInsert;
|
import org.hibernate.annotations.DynamicInsert;
|
||||||
import org.hibernate.annotations.DynamicUpdate;
|
import org.hibernate.annotations.DynamicUpdate;
|
||||||
import org.springframework.format.annotation.DateTimeFormat;
|
|
||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.Column;
|
||||||
import javax.validation.constraints.NotBlank;
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
import java.time.LocalDate;
|
import java.time.LocalDate;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
|
@ -21,20 +22,16 @@ import java.time.LocalDateTime;
|
||||||
@Table(name = "tn_survey")
|
@Table(name = "tn_survey")
|
||||||
public class TnSurvey {
|
public class TnSurvey {
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
@Column(name = "svy_seq")
|
@Column(name = "svy_seq")
|
||||||
private Integer svySeq;
|
private Integer svySeq;
|
||||||
|
|
||||||
@Column(name = "svy_title")
|
@Column(name = "svy_title")
|
||||||
@NotBlank(message = "설문 제목을 입력해주세요.")
|
|
||||||
private String svyTitle;
|
private String svyTitle;
|
||||||
@Column(name = "svy_desc")
|
@Column(name = "svy_desc")
|
||||||
private String svyDesc;
|
private String svyDesc;
|
||||||
@Column(name = "svy_start_dt")
|
@Column(name = "svy_start_dt")
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
|
||||||
private LocalDate svyStartDt;
|
private LocalDate svyStartDt;
|
||||||
@Column(name = "svy_end_dt")
|
@Column(name = "svy_end_dt")
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
|
||||||
private LocalDate svyEndDt;
|
private LocalDate svyEndDt;
|
||||||
@Column(name = "file_grp_id")
|
@Column(name = "file_grp_id")
|
||||||
private String fileGrpId;
|
private String fileGrpId;
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,6 @@ import java.util.List;
|
||||||
@Table(name = "tn_survey_qt")
|
@Table(name = "tn_survey_qt")
|
||||||
public class TnSurveyQt {
|
public class TnSurveyQt {
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
@Column(name = "qt_seq")
|
@Column(name = "qt_seq")
|
||||||
private Integer qtSeq;
|
private Integer qtSeq;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,10 @@ import lombok.Setter;
|
||||||
import org.hibernate.annotations.DynamicInsert;
|
import org.hibernate.annotations.DynamicInsert;
|
||||||
import org.hibernate.annotations.DynamicUpdate;
|
import org.hibernate.annotations.DynamicUpdate;
|
||||||
|
|
||||||
import javax.persistence.*;
|
import javax.persistence.Column;
|
||||||
|
import javax.persistence.Entity;
|
||||||
|
import javax.persistence.Id;
|
||||||
|
import javax.persistence.Table;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
|
|
@ -17,7 +20,6 @@ import javax.persistence.*;
|
||||||
@Table(name = "tn_survey_qt_item")
|
@Table(name = "tn_survey_qt_item")
|
||||||
public class TnSurveyQtItem {
|
public class TnSurveyQtItem {
|
||||||
@Id
|
@Id
|
||||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
||||||
@Column(name = "qt_item_seq")
|
@Column(name = "qt_item_seq")
|
||||||
private Integer qtItemSeq;
|
private Integer qtItemSeq;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,5 +7,4 @@ import java.util.List;
|
||||||
|
|
||||||
public interface TnSurveyQtItemRepository extends JpaRepository<TnSurveyQtItem, Integer> {
|
public interface TnSurveyQtItemRepository extends JpaRepository<TnSurveyQtItem, Integer> {
|
||||||
List<TnSurveyQtItem> findByQtSeqInOrderByQtItemSeq(List<Integer> qtSeqList);
|
List<TnSurveyQtItem> findByQtSeqInOrderByQtItemSeq(List<Integer> qtSeqList);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,4 @@ import java.util.List;
|
||||||
|
|
||||||
public interface TnSurveyQtRepository extends JpaRepository<TnSurveyQt, Integer> {
|
public interface TnSurveyQtRepository extends JpaRepository<TnSurveyQt, Integer> {
|
||||||
List<TnSurveyQt> findBySvySeqOrderByQtSeq(Integer svySeq);
|
List<TnSurveyQt> findBySvySeqOrderByQtSeq(Integer svySeq);
|
||||||
|
|
||||||
void deleteBySvySeq(Integer svySeq);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,7 @@ import com.dbnt.kcscbackend.admin.contents.survey.repository.TnSurveyQtRepositor
|
||||||
import com.dbnt.kcscbackend.admin.contents.survey.repository.TnSurveyRepository;
|
import com.dbnt.kcscbackend.admin.contents.survey.repository.TnSurveyRepository;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|
@ -45,52 +43,4 @@ public class AdminSurveyService {
|
||||||
}
|
}
|
||||||
return qtList;
|
return qtList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Transactional
|
|
||||||
public void insertSurvey(TnSurvey survey, String insertUser) {
|
|
||||||
if(survey.getSvySeq()==null){
|
|
||||||
survey.setFrstCrtId(insertUser);
|
|
||||||
survey.setFrstCrtDt(LocalDateTime.now());
|
|
||||||
survey.setUseYn("N");
|
|
||||||
surveyRepository.save(survey);
|
|
||||||
}else{
|
|
||||||
TnSurvey savedInfo = surveyRepository.findById(survey.getSvySeq()).orElse(null);
|
|
||||||
savedInfo.setSvyTitle(survey.getSvyTitle());
|
|
||||||
savedInfo.setSvyDesc(survey.getSvyDesc());
|
|
||||||
savedInfo.setSvyStartDt(survey.getSvyStartDt());
|
|
||||||
savedInfo.setSvyEndDt(survey.getSvyEndDt());
|
|
||||||
savedInfo.setLastChgId(insertUser);
|
|
||||||
savedInfo.setLastChgDt(LocalDateTime.now());
|
|
||||||
surveyRepository.save(savedInfo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
public void updateSurveyUseYn(Integer svySeq, String updateUser) {
|
|
||||||
TnSurvey savedInfo = surveyRepository.findById(svySeq).orElse(null);
|
|
||||||
savedInfo.setUseYn(savedInfo.getUseYn().equals("Y")?"N":"Y");
|
|
||||||
savedInfo.setLastChgId(updateUser);
|
|
||||||
savedInfo.setLastChgDt(LocalDateTime.now());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
public void deleteSurvey(Integer svySeq) {
|
|
||||||
surveyRepository.deleteById(svySeq);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transactional
|
|
||||||
public void insertSurveyQt(List<TnSurveyQt> qtList, String id) {
|
|
||||||
qtRepository.deleteBySvySeq(qtList.get(0).getSvySeq());
|
|
||||||
for(TnSurveyQt qt: qtList){
|
|
||||||
qt.setQtSeq(null);
|
|
||||||
}
|
|
||||||
qtRepository.saveAll(qtList);
|
|
||||||
for(TnSurveyQt qt: qtList){
|
|
||||||
for(TnSurveyQtItem item: qt.getItemList()){
|
|
||||||
item.setQtSeq(qt.getQtSeq());
|
|
||||||
}
|
|
||||||
itemRepository.saveAll(qt.getItemList());
|
|
||||||
}
|
|
||||||
System.out.println();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -63,8 +63,6 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati
|
||||||
MediaType jsonMimeType = MediaType.APPLICATION_JSON;
|
MediaType jsonMimeType = MediaType.APPLICATION_JSON;
|
||||||
HashMap<String, Object> resultMap = new HashMap<>();
|
HashMap<String, Object> resultMap = new HashMap<>();
|
||||||
|
|
||||||
/*
|
|
||||||
// 관리자 계정 로그인 제한 if문
|
|
||||||
if(securityUser.getUserId().equals("admin") && !adminIpList.contains(accessIp)){
|
if(securityUser.getUserId().equals("admin") && !adminIpList.contains(accessIp)){
|
||||||
resultMap.put("resultCode", ResponseCode.FAILED.getCode());
|
resultMap.put("resultCode", ResponseCode.FAILED.getCode());
|
||||||
resultMap.put("resultMessage", "관리자 계정은 지정된 아이피에서만 접속할 수 있습니다.\n필요한 경우 관리자에게 요청하십시오.\n접속자 아이피: "+ClientUtils.getRemoteIP(request));
|
resultMap.put("resultMessage", "관리자 계정은 지정된 아이피에서만 접속할 수 있습니다.\n필요한 경우 관리자에게 요청하십시오.\n접속자 아이피: "+ClientUtils.getRemoteIP(request));
|
||||||
|
|
@ -76,16 +74,16 @@ public class CustomUrlAuthenticationSuccessHandler extends SimpleUrlAuthenticati
|
||||||
resultMap.put("refreshToken", refreshToken);
|
resultMap.put("refreshToken", refreshToken);
|
||||||
//로그인 로그 기록
|
//로그인 로그 기록
|
||||||
adminLogsService.insertLoginLog(securityUser.getUserId(), accessIp, accessToken, "Y", ClientUtils.getWebType(request));
|
adminLogsService.insertLoginLog(securityUser.getUserId(), accessIp, accessToken, "Y", ClientUtils.getWebType(request));
|
||||||
}*/
|
}
|
||||||
|
/*
|
||||||
// 관리자 로그인 제한 해제 위 if문 주석처리 할 것.
|
// 로그인 제한 해제시 주석 해제 및 위 if문 주석처리 할 것.
|
||||||
String accessToken = jwtTokenUtil.generateAccessToken(securityUser, request.getRemoteAddr());
|
String accessToken = jwtTokenUtil.generateAccessToken(securityUser, request.getRemoteAddr());
|
||||||
String refreshToken = jwtTokenUtil.generateRefreshTokenToken(securityUser, request.getRemoteAddr());
|
String refreshToken = jwtTokenUtil.generateRefreshTokenToken(securityUser, request.getRemoteAddr());
|
||||||
resultMap.put("resultCode", ResponseCode.SUCCESS.getCode());
|
resultMap.put("resultCode", ResponseCode.SUCCESS.getCode());
|
||||||
resultMap.put("accessToken", accessToken);
|
resultMap.put("accessToken", accessToken);
|
||||||
resultMap.put("refreshToken", refreshToken);
|
resultMap.put("refreshToken", refreshToken);
|
||||||
adminLogsService.insertLoginLog(securityUser.getUserId(), accessIp, accessToken, "Y", ClientUtils.getWebType(request));
|
adminLogsService.insertLoginLog(securityUser.getUserId(), accessIp, accessToken, "Y", ClientUtils.getWebType(request));
|
||||||
|
*/
|
||||||
|
|
||||||
if (jsonConverter.canWrite(resultMap.getClass(), jsonMimeType)) {
|
if (jsonConverter.canWrite(resultMap.getClass(), jsonMimeType)) {
|
||||||
jsonConverter.write(resultMap, jsonMimeType, new ServletServerHttpResponse(response));
|
jsonConverter.write(resultMap, jsonMimeType, new ServletServerHttpResponse(response));
|
||||||
|
|
|
||||||
|
|
@ -6,13 +6,12 @@ import org.springframework.data.jpa.repository.Query;
|
||||||
import org.springframework.data.jpa.repository.query.Procedure;
|
import org.springframework.data.jpa.repository.query.Procedure;
|
||||||
import org.springframework.data.repository.query.Param;
|
import org.springframework.data.repository.query.Param;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
public interface TnAttachFileRepository extends JpaRepository<TnAttachFile, Integer> {
|
public interface TnAttachFileRepository extends JpaRepository<TnAttachFile, Integer> {
|
||||||
|
|
||||||
Optional<List<TnAttachFile>> findByFileGrpId(String fileGrpId);
|
Optional<TnAttachFile> findByFileGrpId(String fileGrpId);
|
||||||
|
|
||||||
@Procedure("make_file_grp_id")
|
@Procedure("make_file_grp_id")
|
||||||
String makeFileGrpId( String modiId );
|
String makeFileGrpId( String modiId );
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,10 @@ import org.springframework.web.multipart.MultipartFile;
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.*;
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
|
|
@ -29,7 +32,7 @@ public class FileService {
|
||||||
if(tnAttachFile.getFileSeq()!=null){
|
if(tnAttachFile.getFileSeq()!=null){
|
||||||
tnAttachFile = tnAttachFileRepository.findById(tnAttachFile.getFileSeq()).orElse(null);
|
tnAttachFile = tnAttachFileRepository.findById(tnAttachFile.getFileSeq()).orElse(null);
|
||||||
}else{
|
}else{
|
||||||
tnAttachFile = Objects.requireNonNull(tnAttachFileRepository.findByFileGrpId(tnAttachFile.getFileGrpId()).orElse(null)).get(0);
|
tnAttachFile = tnAttachFileRepository.findByFileGrpId(tnAttachFile.getFileGrpId()).orElse(null);
|
||||||
}
|
}
|
||||||
int downCnt = tnAttachFile.getDownCnt()==null?0: tnAttachFile.getDownCnt();
|
int downCnt = tnAttachFile.getDownCnt()==null?0: tnAttachFile.getDownCnt();
|
||||||
tnAttachFile.setDownCnt(downCnt+1);
|
tnAttachFile.setDownCnt(downCnt+1);
|
||||||
|
|
@ -47,77 +50,50 @@ public class FileService {
|
||||||
* TN_ATTACH_FILE 참고.
|
* TN_ATTACH_FILE 참고.
|
||||||
* @param request
|
* @param request
|
||||||
* @param user
|
* @param user
|
||||||
* @param files
|
* @param file
|
||||||
* @param middlePath 파일이 저장될 중간 경로다.
|
* @param middlePath 파일이 저장될 중간 경로다.
|
||||||
* D:/kcscUploadFiles/XXXX/abc.jpg XXXX에 해당하는 경로다.
|
* D:/kcscUploadFiles/XXXX/abc.jpg XXXX에 해당하는 경로다.
|
||||||
* 참고로 D:/kcscUploadFiles 값은 application-xxx.properties에 있는 Globals.fileStorePath를 통해 얻는다.
|
* 참고로 D:/kcscUploadFiles 값은 application-xxx.properties에 있는 Globals.fileStorePath를 통해 얻는다.
|
||||||
* @return 파일 그룹 ID
|
* @return 파일 그룹 ID
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public String addTnAttachFile(HttpServletRequest request, LoginVO user, MultipartFile[] files, String middlePath) throws Exception {
|
|
||||||
return this.addTnAttachFile(request, user, files, middlePath, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
public String addTnAttachFile(HttpServletRequest request, LoginVO user, MultipartFile file, String middlePath) throws Exception {
|
public String addTnAttachFile(HttpServletRequest request, LoginVO user, MultipartFile file, String middlePath) throws Exception {
|
||||||
MultipartFile[] files = new MultipartFile[1];
|
|
||||||
return this.addTnAttachFile(request, user, files, middlePath);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TN_ATTACH_FILE table에 insert 후, 파일 그룹 ID를 return 한다.
|
|
||||||
* TN_ATTACH_FILE 참고.
|
|
||||||
* @param request
|
|
||||||
* @param user
|
|
||||||
* @param files
|
|
||||||
* @param middlePath 파일이 저장될 중간 경로다.
|
|
||||||
* D:/kcscUploadFiles/XXXX/abc.jpg XXXX에 해당하는 경로다.
|
|
||||||
* 참고로 D:/kcscUploadFiles 값은 application-xxx.properties에 있는 Globals.fileStorePath를 통해 얻는다.
|
|
||||||
* @return 파일 그룹 ID
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
public String addTnAttachFile(HttpServletRequest request, LoginVO user, MultipartFile[] files, String middlePath, String fileGrpId) throws Exception {
|
|
||||||
String ipAddress = NetworkUtil.getClientIpAddress(request);
|
String ipAddress = NetworkUtil.getClientIpAddress(request);
|
||||||
|
|
||||||
|
String fileGrpId = null;
|
||||||
if( fileGrpId == null || fileGrpId.trim().isEmpty()) {
|
if( file != null && !file.isEmpty()) {
|
||||||
//String fileGrpId = UUID.randomUUID().toString();
|
|
||||||
fileGrpId = tnAttachFileRepository.makeFileGrpId(user.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for (MultipartFile file : files) {if( file != null && !file.isEmpty()) {
|
|
||||||
|
|
||||||
Map<String, MultipartFile> filesMap = new HashMap<String, MultipartFile>();
|
Map<String, MultipartFile> filesMap = new HashMap<String, MultipartFile>();
|
||||||
filesMap.put("file", file);
|
filesMap.put("file", file);
|
||||||
|
|
||||||
List<FileVO> fileVoList = fileUtil.parseFileInf(filesMap, "", 0, middlePath, null);
|
//String fileGrpId = UUID.randomUUID().toString();
|
||||||
|
fileGrpId = tnAttachFileRepository.makeFileGrpId(user.getId());
|
||||||
|
|
||||||
|
List<FileVO> files = fileUtil.parseFileInf(filesMap, "", 0, middlePath, null);
|
||||||
|
|
||||||
int nCount = 1;
|
int nCount = 1;
|
||||||
// 업로드된 file을 tnAttachFile에 insert한다.
|
// 업로드된 file을 tnAttachFile에 insert한다.
|
||||||
for (Iterator<FileVO> iter = fileVoList.iterator(); iter.hasNext(); nCount++) {
|
for (Iterator<FileVO> iter = files.iterator(); iter.hasNext(); nCount++) {
|
||||||
|
|
||||||
FileVO item = iter.next();
|
FileVO item = iter.next();
|
||||||
|
|
||||||
tnAttachFileRepository.spAddTnAttachFile(
|
tnAttachFileRepository.spAddTnAttachFile(
|
||||||
fileGrpId,
|
fileGrpId,
|
||||||
nCount,
|
nCount,
|
||||||
item.getOrignlFileNm(),
|
item.getOrignlFileNm(),
|
||||||
item.getStreFileNm() + "." + item.getFileExtsn(),
|
item.getStreFileNm() + "." + item.getFileExtsn(),
|
||||||
(item.getFileStreCours() + File.separator + item.getAtchFileId()).replaceAll("\\\\", "/"),
|
(item.getFileStreCours() + File.separator + item.getAtchFileId()).replaceAll("\\\\", "/"),
|
||||||
Long.parseLong(item.getFileMg()),
|
Long.parseLong(item.getFileMg()),
|
||||||
item.getFileExtsn(),
|
item.getFileExtsn(),
|
||||||
ipAddress,
|
ipAddress,
|
||||||
user.getId(),
|
user.getId(),
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return fileGrpId;
|
return fileGrpId;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue