공통게시판

Hyung Geun 2022-09-23 16:48:55 +09:00
parent f627a03d83
commit 3eb76f75df
5 changed files with 325 additions and 114 deletions

View File

@ -4,10 +4,6 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import javax.persistence.Column;
import javax.persistence.Transient;
import java.util.List;
@Getter
@Setter
@NoArgsConstructor
@ -22,4 +18,4 @@ public class FileInfo {
public String getFullName(){
return getOrigNm()+"."+getFileExtn();
}
}
}

View File

@ -26,7 +26,7 @@ public class PublicBoardController {
ModelAndView mav = new ModelAndView("publicBoard/notice/noticePage");
publicBoard.setQueryInfo();
publicBoard.setPublicType("PLB001");
if(loginUser.getUserRole().contains(Role.SUB_ADMIN.getValue())){
if (loginUser.getUserRole().contains(Role.SUB_ADMIN.getValue())) {
publicBoard.setDownOrganCdList(loginUser.getDownOrganCdList());
mav.addObject("mgtOrganList", loginUser.getDownOrganCdList());
}
@ -38,79 +38,149 @@ public class PublicBoardController {
return mav;
}
@GetMapping("/boardPage")
public ModelAndView boardPage(@AuthenticationPrincipal UserInfo loginUser, PublicBoard publicBoard) {
ModelAndView mav = new ModelAndView("publicBoard/board/boardPage");
publicBoard.setQueryInfo();
publicBoard.setPublicType("PLB002");
if (loginUser.getUserRole().contains(Role.SUB_ADMIN.getValue())) {
publicBoard.setDownOrganCdList(loginUser.getDownOrganCdList());
mav.addObject("mgtOrganList", loginUser.getDownOrganCdList());
}
publicBoard.setUpOrganCdList(loginUser.getUpOrganCdList());
mav.addObject("boardList", publicBoardService.selectContentList(publicBoard));
publicBoard.setContentCnt(publicBoardService.selectContentListCnt(publicBoard));
publicBoard.setPaginationInfo();
mav.addObject("searchParams", publicBoard);
return mav;
}
@GetMapping("/referencePage")
public ModelAndView referencePage(@AuthenticationPrincipal UserInfo loginUser, PublicBoard publicBoard) {
ModelAndView mav = new ModelAndView("publicBoard/reference/referencePage");
publicBoard.setQueryInfo();
publicBoard.setPublicType("PLB003");
if (loginUser.getUserRole().contains(Role.SUB_ADMIN.getValue())) {
publicBoard.setDownOrganCdList(loginUser.getDownOrganCdList());
mav.addObject("mgtOrganList", loginUser.getDownOrganCdList());
}
publicBoard.setUpOrganCdList(loginUser.getUpOrganCdList());
mav.addObject("referenceList", publicBoardService.selectContentList(publicBoard));
publicBoard.setContentCnt(publicBoardService.selectContentListCnt(publicBoard));
publicBoard.setPaginationInfo();
mav.addObject("searchParams", publicBoard);
return mav;
}
@GetMapping("/qnaPage")
public ModelAndView qnaPage(@AuthenticationPrincipal UserInfo loginUser, PublicBoard publicBoard) {
ModelAndView mav = new ModelAndView("publicBoard/qna/qnaPage");
publicBoard.setQueryInfo();
publicBoard.setPublicType("PLB004");
if (loginUser.getUserRole().contains(Role.SUB_ADMIN.getValue())) {
publicBoard.setDownOrganCdList(loginUser.getDownOrganCdList());
mav.addObject("mgtOrganList", loginUser.getDownOrganCdList());
}
publicBoard.setUpOrganCdList(loginUser.getUpOrganCdList());
mav.addObject("qnaList", publicBoardService.selectContentList(publicBoard));
publicBoard.setContentCnt(publicBoardService.selectContentListCnt(publicBoard));
publicBoard.setPaginationInfo();
mav.addObject("searchParams", publicBoard);
return mav;
}
@GetMapping("/editModal")
public ModelAndView editModal(@AuthenticationPrincipal UserInfo loginUser, PublicBoard publicBoard){
public ModelAndView editModal(@AuthenticationPrincipal UserInfo loginUser, PublicBoard publicBoard) {
ModelAndView mav = null;
switch (publicBoard.getPublicType()){
switch (publicBoard.getPublicType()) {
case "PLB001": // 공지사항
mav = new ModelAndView("publicBoard/notice/noticeEditModal");
if(publicBoard.getPublicKey()!=null){
if (publicBoard.getPublicKey() != null) {
publicBoard = publicBoardService.selectPublicBoard(publicBoard.getPublicKey());
}
break;
case "PLB002": // 공용게시판
mav = new ModelAndView("publicBoard/board/boardEditModal");
if (publicBoard.getPublicKey() != null) {
publicBoard = publicBoardService.selectPublicBoard(publicBoard.getPublicKey());
}
break;
case "PLB003": // 자료실
mav = new ModelAndView("publicBoard/reference/referenceEditModal");
if (publicBoard.getPublicKey() != null) {
publicBoard = publicBoardService.selectPublicBoard(publicBoard.getPublicKey());
}
break;
case "PLB004": // Q&A
break;
mav = new ModelAndView("publicBoard/qna/qnaEditModal");
if (publicBoard.getPublicKey() != null) {
publicBoard = publicBoardService.selectPublicBoard(publicBoard.getPublicKey());
break;
}
}
if(publicBoard.getPublicKey()==null){
publicBoard.setWrtOrgan(loginUser.getOgCd());
publicBoard.setWrtPart(loginUser.getOfcCd());
publicBoard.setWrtUserSeq(loginUser.getUserSeq());
publicBoard.setWrtUserNm(loginUser.getUserNm());
publicBoard.setWrtDt(LocalDateTime.now());
if (publicBoard.getPublicKey() == null) {
publicBoard.setWrtOrgan(loginUser.getOgCd());
publicBoard.setWrtPart(loginUser.getOfcCd());
publicBoard.setWrtUserSeq(loginUser.getUserSeq());
publicBoard.setWrtUserNm(loginUser.getUserNm());
publicBoard.setWrtDt(LocalDateTime.now());
}
mav.addObject("info", publicBoard);
return mav;
}
mav.addObject("info", publicBoard);
return mav;
}
@GetMapping("/viewModal")
public ModelAndView viewModal(@AuthenticationPrincipal UserInfo loginUser, PublicBoard publicBoard){
ModelAndView mav = null;
switch (publicBoard.getPublicType()){
case "PLB001": // 공지사항
mav = new ModelAndView("publicBoard/notice/noticeViewModal");
break;
case "PLB002": // 공용게시판
break;
case "PLB003": // 자료실
break;
case "PLB004": // Q&A
break;
@GetMapping("/viewModal")
public ModelAndView viewModal (@AuthenticationPrincipal UserInfo loginUser, PublicBoard publicBoard){
ModelAndView mav = null;
switch (publicBoard.getPublicType()) {
case "PLB001": // 공지사항
mav = new ModelAndView("publicBoard/notice/noticeViewModal");
break;
case "PLB002": // 공용게시판
mav = new ModelAndView("publicBoard/board/boardViewModal");
break;
case "PLB003": // 자료실
mav = new ModelAndView("publicBoard/reference/referenceViewModal");
break;
case "PLB004": // Q&A
mav = new ModelAndView("publicBoard/qna/qnaViewModal");
break;
}
publicBoard = publicBoardService.selectPublicBoard(publicBoard.getPublicKey());
mav.addObject("userSeq", loginUser.getUserSeq());
mav.addObject("info", publicBoard);
return mav;
}
publicBoard = publicBoardService.selectPublicBoard(publicBoard.getPublicKey());
mav.addObject("userSeq", loginUser.getUserSeq());
mav.addObject("info", publicBoard);
return mav;
}
@PostMapping("/saveContent")
public Integer saveContent(PublicBoard publicBoard,
MultipartHttpServletRequest request,
@RequestParam(value = "fileSeq", required = false) List<Integer> deleteFileSeq){
publicBoard.setMultipartFileList(request.getMultiFileMap().get("uploadFiles"));
return publicBoardService.saveContent(publicBoard, deleteFileSeq);
}
@PostMapping("/saveComment")
public ModelAndView saveComment(@AuthenticationPrincipal UserInfo loginUser, PublicComment comment){
comment.setWrtOrgan(loginUser.getOgCd());
comment.setWrtPart(loginUser.getOfcCd());
comment.setWrtUserSeq(loginUser.getUserSeq());
comment.setWrtUserNm(loginUser.getUserNm());
comment.setWrtDt(LocalDateTime.now());
publicBoardService.saveComment(comment);
ModelAndView mav = new ModelAndView("publicBoard/commentDiv");
mav.addObject("comment", comment);
mav.addObject("userSeq", loginUser.getUserSeq());
return mav;
}
@PostMapping("/saveContent")
public Integer saveContent (PublicBoard publicBoard,
MultipartHttpServletRequest request,
@RequestParam(value = "fileSeq", required = false) List < Integer > deleteFileSeq){
publicBoard.setMultipartFileList(request.getMultiFileMap().get("uploadFiles"));
return publicBoardService.saveContent(publicBoard, deleteFileSeq);
}
@PostMapping("/saveComment")
public ModelAndView saveComment (@AuthenticationPrincipal UserInfo loginUser, PublicComment comment){
comment.setWrtOrgan(loginUser.getOgCd());
comment.setWrtPart(loginUser.getOfcCd());
comment.setWrtUserSeq(loginUser.getUserSeq());
comment.setWrtUserNm(loginUser.getUserNm());
comment.setWrtDt(LocalDateTime.now());
publicBoardService.saveComment(comment);
ModelAndView mav = new ModelAndView("publicBoard/commentDiv");
mav.addObject("comment", comment);
mav.addObject("userSeq", loginUser.getUserSeq());
return mav;
}
@PostMapping("/deleteComment")
@ResponseBody
public void deleteComment(@RequestBody PublicComment comment){
publicBoardService.deleteComment(comment.getPublicKey(), comment.getCommentKey());
@PostMapping("/deleteComment")
@ResponseBody
public void deleteComment (@RequestBody PublicComment comment){
publicBoardService.deleteComment(comment.getPublicKey(), comment.getCommentKey());
}
}
}

View File

@ -6,8 +6,8 @@ import com.dbnt.faisp.publicBoard.mapper.PublicBoardMapper;
import com.dbnt.faisp.publicBoard.model.PublicBoard;
import com.dbnt.faisp.publicBoard.model.PublicComment;
import com.dbnt.faisp.publicBoard.model.PublicFile;
import com.dbnt.faisp.publicBoard.repository.PublicCommentRepository;
import com.dbnt.faisp.publicBoard.repository.PublicBoardRepository;
import com.dbnt.faisp.publicBoard.repository.PublicCommentRepository;
import com.dbnt.faisp.publicBoard.repository.PublicFileRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@ -107,4 +107,4 @@ public class PublicBoardService extends BaseService {
public FileInfo selectPublicFile(Integer publicKey, Integer fileSeq){
return publicFileRepository.findById(new PublicFile.PublicFileId(publicKey, fileSeq)).orElse(null);
}
}
}

View File

@ -28,10 +28,10 @@
<ul class="nav nav-pills">
<li class="nav-item"><a href="#" class="nav-link p-1 link-dark"><i class="bi bi-bell-fill"></i></a></li>
<li class="nav-item"><a href="/publicBoard/noticePage" class="nav-link p-1 link-dark">공지사항</a></li>
<li class="nav-item"><a href="#" class="nav-link p-1 link-dark">게시판</a></li>
<li class="nav-item"><a href="#" class="nav-link p-1 link-dark">자료실</a></li>
<li class="nav-item"><a href="#" class="nav-link p-1 link-dark">Q&A</a></li>
<li class="nav-item"><a href="#" class="nav-link p-1 link-dark">마이페이지</a></li>
<li class="nav-item"><a href="/publicBoard/boardPage" class="nav-link p-1 link-dark">게시판</a></li>
<li class="nav-item"><a href="/publicBoard/referencePage" class="nav-link p-1 link-dark">자료실</a></li>
<li class="nav-item"><a href="/publicBoard/qnaPage" class="nav-link p-1 link-dark">Q&A</a></li>
<li class="nav-item"><a href="/user/myInfo" class="nav-link p-1 link-dark">마이페이지</a></li>
<li class="nav-item"><a href="/logout" class="nav-link p-1 link-dark">로그아웃</a></li>
</ul>
</div>

View File

@ -4,11 +4,12 @@
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
layout:decorate="~{layout/layout}">
<th:block layout:fragment="script">
<!--<script type="text/javascript" th:src="@{/js/igActivities/fpiMgt/plan.js}"></script>-->
<script type="text/javascript" th:src="@{/js/publicBoard/publicBoard.js}"></script>
<script type="text/javascript" th:src="@{/js/publicBoard/qna.js}"></script>
</th:block>
<div layout:fragment="content">
<main class="pt-3">
<h4>Q&A</h4>
<h4>QnA</h4>
<input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>
<div class="row mx-0">
@ -25,8 +26,8 @@
</select>
</div>
<div class="col-auto">
<!--<div class="row justify-content-end">
<div class="col-auto" th:if="${accessAuth eq 'ACC003'}">
<div class="row justify-content-end">
<div class="col-auto" sec:authorize="hasRole('ROLE_SUB_ADMIN')">
<select class="form-select form-select-sm" name="wrtOrgan">
<option value="">관서 선택</option>
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
@ -37,32 +38,16 @@
</select>
</div>
<div class="col-auto">
<input type="text" class="form-control form-control-sm" placeholder="제목" name="contentTitle" th:value="${searchParams.contentTitle}">
</div>
<div class="col-auto" th:if="${accessAuth eq 'ACC003'}">
<input type="text" class="form-control form-control-sm" placeholder="작성자" name="wrtUserNm" th:value="${searchParams.wrtUserNm}">
</div>
<div class="col-auto">
<select class="form-select form-select-sm" name="planState">
<option value="">상태 선택</option>
<th:block th:each="commonCode:${session.commonCode.get('DST')}">
<option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}" th:selected="${commonCode.itemCd eq searchParams.planState}"></option>
</th:block>
</select>
<input type="text" class="form-control form-control-sm" placeholder="제목" name="contentTitle" th:value="${searchParams.title}">
</div>
<div class="col-4">
<div class="input-group w-auto input-daterange" id="dateSelectorDiv">
<select class="form-select form-select-sm" name="dateSelector">
<option value="">조건선택</option>
<option value="planDt" th:selected="${searchParams.dateSelector eq 'planDt'}">시행일</option>
<option value="wrtDt" th:selected="${searchParams.dateSelector eq 'wrtDt'}">작성일</option>
</select>
<input type="text" class="form-control form-control-sm" id="startDate" name="startDate" placeholder="시작일" autocomplete="off" readonly th:value="${searchParams.startDate}">
<input type="text" class="form-control form-control-sm" id="endDate" name="endDate" placeholder="종료일" autocomplete="off" readonly th:value="${searchParams.endDate}">
</div>
</div>
<input type="submit" class="btn btn-sm btn-primary col-auto" id="searchBtn" value="검색">
</div>-->
</div>
</div>
</div>
</form>
@ -76,37 +61,30 @@
<tr>
<th></th>
<th>제목</th>
<th>시행일자</th>
<th>관서</th>
<th>부서</th>
<th>작성자</th>
<th>작성일시</th>
<th>첨부파일</th>
<th>상태</th>
<th>댓글</th>
</tr>
</thead>
<tbody>
<!--<tr class="planTr" th:each="plan:${planList}">
<input type="hidden" class="planKey" th:value="${plan.planKey}">
<tr class="planTr" th:each="qna:${qnaList}">
<input type="hidden" class="planKey" th:value="${qna.publicKey}">
<td><input type="checkbox" class="trChkBox"></td>
<td th:text="${plan.contentTitle}"></td>
<td th:text="${#temporals.format(plan.planDt, 'yyyy-MM-dd')}"></td>
<td th:text="${qna.title}"></td>
<th:block th:each="commonCode:${session.commonCode.get('OG')}">
<td th:if="${plan.wrtOrgan eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
<td th:if="${qna.wrtOrgan eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>
<th:block th:each="commonCode:${session.commonCode.get('OFC')}">
<td th:if="${plan.wrtPart eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
<td th:if="${qna.wrtPart eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>
</th:block>
<td th:text="${plan.wrtUserNm}"></td>
<td th:text="${#temporals.format(plan.wrtDt, 'yyyy-MM-dd HH:mm')}"></td>
<td th:text="${plan.fileCnt eq null?'파일 없음':#strings.concat(plan.fileCnt,' 건')}"></td>
<td th:if="${plan.planState eq 'DST001'}">임시저장</td>
<td th:if="${plan.planState eq 'DST002'}">결재대기</td>
<td th:if="${plan.planState eq 'DST003'}">계장반려</td>
<td th:if="${plan.planState eq 'DST004'}">계장결재</td>
<td th:if="${plan.planState eq 'DST005'}">부장반려</td>
<td th:if="${plan.planState eq 'DST006'}">부장결재</td>
</tr>-->
<td th:text="${qna.wrtUserNm}"></td>
<td th:text="${#temporals.format(qna.wrtDt, 'yyyy-MM-dd HH:mm')}"></td>
<td th:text="${qna.fileCnt eq null?'파일 없음':#strings.concat(qna.fileCnt,' 건')}"></td>
<td th:text="${qna.commentCnt eq null?'0':qna.commentCnt}"></td>
</tr>
</tbody>
</table>
</div>
@ -138,7 +116,7 @@
</nav>
</div>
<div class="col-auto">
<input type="button" class="btn btn-success" value="등록" id="addNoticeBtn" sec:authorize="hasRole('ROLE_SUB_ADMIN')">
<input type="button" class="btn btn-success" value="등록" id="addQnaBtn" sec:authorize="hasRole('ROLE_SUB_ADMIN')">
</div>
</div>
</div>
@ -150,19 +128,186 @@
</div>
</main>
<div class="modal fade" id="noticeEditModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="noticeEditModalLabel" aria-hidden="true">
<div class="modal fade" id="editModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="editModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content" id="noticeEditContent">
<div class="modal-content" id="editContent">
</div>
</div>
</div>
<div class="modal fade" id="noticeViewModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="noticeViewModalLabel" aria-hidden="true">
<div class="modal fade" id="viewModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="viewModalLabel" aria-hidden="true">
<div class="modal-dialog modal-xl modal-dialog-scrollable">
<div class="modal-content" id="noticeViewContent">
<div class="modal-content" id="viewContent">
</div>
</div>
</div>
</div>
</html>
</html>
<!--<!DOCTYPE html>-->
<!--<html lang="ko" xmlns:th="http://www.thymeleaf.org"-->
<!-- xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5"-->
<!-- xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"-->
<!-- layout:decorate="~{layout/layout}">-->
<!--<th:block layout:fragment="script">-->
<!-- &lt;!&ndash;<script type="text/javascript" th:src="@{/js/igActivities/fpiMgt/affairPlan.js}"></script>&ndash;&gt;-->
<!--</th:block>-->
<!--<div layout:fragment="content">-->
<!-- <main class="pt-3">-->
<!-- <h4>Q&A</h4>-->
<!-- <input type="hidden" name="_csrf_header" th:value="${_csrf.headerName}"/>-->
<!-- <input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}"/>-->
<!-- <div class="row mx-0">-->
<!-- <div class="col-12 card text-center">-->
<!-- <div class="card-body">-->
<!-- <form method="get" th:action="@{/fpiMgt/monthPlanPage}">-->
<!-- <input type="hidden" name="pageIndex" id="pageIndex" th:value="${searchParams.pageIndex}">-->
<!-- <div class="row justify-content-between pe-3 py-1">-->
<!-- <div class="col-auto">-->
<!-- <select class="form-select" name="rowCnt" id="rowCnt">-->
<!-- <th:block th:each="num : ${#numbers.sequence(1,5)}">-->
<!-- <option th:value="${num*10}" th:text="${num*10}" th:selected="${searchParams.rowCnt eq num*10}"></option>-->
<!-- </th:block>-->
<!-- </select>-->
<!-- </div>-->
<!-- <div class="col-auto">-->
<!-- &lt;!&ndash;<div class="row justify-content-end">-->
<!-- <div class="col-auto" th:if="${accessAuth eq 'ACC003'}">-->
<!-- <select class="form-select form-select-sm" name="wrtOrgan">-->
<!-- <option value="">관서 선택</option>-->
<!-- <th:block th:each="commonCode:${session.commonCode.get('OG')}">-->
<!-- <th:block th:if="${#lists.contains(mgtOrganList, commonCode.itemCd)}">-->
<!-- <option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}" th:selected="${commonCode.itemCd eq searchParams.wrtOrgan}"></option>-->
<!-- </th:block>-->
<!-- </th:block>-->
<!-- </select>-->
<!-- </div>-->
<!-- <div class="col-auto">-->
<!-- <input type="text" class="form-control form-control-sm" placeholder="제목" name="contentTitle" th:value="${searchParams.contentTitle}">-->
<!-- </div>-->
<!-- <div class="col-auto" th:if="${accessAuth eq 'ACC003'}">-->
<!-- <input type="text" class="form-control form-control-sm" placeholder="작성자" name="wrtUserNm" th:value="${searchParams.wrtUserNm}">-->
<!-- </div>-->
<!-- <div class="col-auto">-->
<!-- <select class="form-select form-select-sm" name="planState">-->
<!-- <option value="">상태 선택</option>-->
<!-- <th:block th:each="commonCode:${session.commonCode.get('DST')}">-->
<!-- <option th:value="${commonCode.itemCd}" th:text="${commonCode.itemValue}" th:selected="${commonCode.itemCd eq searchParams.planState}"></option>-->
<!-- </th:block>-->
<!-- </select>-->
<!-- </div>-->
<!-- <div class="col-4">-->
<!-- <div class="input-group w-auto input-daterange" id="dateSelectorDiv">-->
<!-- <select class="form-select form-select-sm" name="dateSelector">-->
<!-- <option value="">조건선택</option>-->
<!-- <option value="planDt" th:selected="${searchParams.dateSelector eq 'planDt'}">시행일</option>-->
<!-- <option value="wrtDt" th:selected="${searchParams.dateSelector eq 'wrtDt'}">작성일</option>-->
<!-- </select>-->
<!-- <input type="text" class="form-control form-control-sm" id="startDate" name="startDate" placeholder="시작일" autocomplete="off" readonly th:value="${searchParams.startDate}">-->
<!-- <input type="text" class="form-control form-control-sm" id="endDate" name="endDate" placeholder="종료일" autocomplete="off" readonly th:value="${searchParams.endDate}">-->
<!-- </div>-->
<!-- </div>-->
<!-- <input type="submit" class="btn btn-sm btn-primary col-auto" id="searchBtn" value="검색">-->
<!-- </div>&ndash;&gt;-->
<!-- </div>-->
<!-- </div>-->
<!-- </form>-->
<!-- <div class="row justify-content-start">-->
<!-- <div class="col-12">-->
<!-- <div class="card">-->
<!-- <div class="card-body">-->
<!-- <div class="row">-->
<!-- <table class="table table-hover">-->
<!-- <thead>-->
<!-- <tr>-->
<!-- <th></th>-->
<!-- <th>제목</th>-->
<!-- <th>관서</th>-->
<!-- <th>부서</th>-->
<!-- <th>작성자</th>-->
<!-- <th>작성일시</th>-->
<!-- <th>첨부파일</th>-->
<!-- <th>댓글</th>-->
<!-- </tr>-->
<!-- </thead>-->
<!-- <tbody>-->
<!-- &lt;!&ndash;<tr class="planTr" th:each="plan:${planList}">-->
<!-- <input type="hidden" class="planKey" th:value="${plan.planKey}">-->
<!-- <td><input type="checkbox" class="trChkBox"></td>-->
<!-- <td th:text="${plan.contentTitle}"></td>-->
<!-- <td th:text="${#temporals.format(plan.planDt, 'yyyy-MM-dd')}"></td>-->
<!-- <th:block th:each="commonCode:${session.commonCode.get('OG')}">-->
<!-- <td th:if="${plan.wrtOrgan eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>-->
<!-- </th:block>-->
<!-- <th:block th:each="commonCode:${session.commonCode.get('OFC')}">-->
<!-- <td th:if="${plan.wrtPart eq commonCode.itemCd}" th:text="${commonCode.itemValue}"></td>-->
<!-- </th:block>-->
<!-- <td th:text="${plan.wrtUserNm}"></td>-->
<!-- <td th:text="${#temporals.format(plan.wrtDt, 'yyyy-MM-dd HH:mm')}"></td>-->
<!-- <td th:text="${plan.fileCnt eq null?'파일 없음':#strings.concat(plan.fileCnt,' 건')}"></td>-->
<!-- <td th:if="${plan.planState eq 'DST001'}">임시저장</td>-->
<!-- <td th:if="${plan.planState eq 'DST002'}">결재대기</td>-->
<!-- <td th:if="${plan.planState eq 'DST003'}">계장반려</td>-->
<!-- <td th:if="${plan.planState eq 'DST004'}">계장결재</td>-->
<!-- <td th:if="${plan.planState eq 'DST005'}">부장반려</td>-->
<!-- <td th:if="${plan.planState eq 'DST006'}">부장결재</td>-->
<!-- </tr>&ndash;&gt;-->
<!-- </tbody>-->
<!-- </table>-->
<!-- </div>-->
<!-- <div class="row justify-content-between">-->
<!-- <div class="col-auto"></div>-->
<!-- <div class="col-auto">-->
<!-- <nav aria-label="Page navigation">-->
<!-- <ul class="pagination">-->
<!-- <th:block th:if="${searchParams.pageIndex>3}">-->
<!-- <li class="page-item" th:data-pageindex="${(searchParams.pageIndex)-3}">-->
<!-- <a class="page-link" href="#" aria-label="Previous">-->
<!-- <span aria-hidden="true">&laquo;</span>-->
<!-- </a>-->
<!-- </li>-->
<!-- </th:block>-->
<!-- <th:block th:each="num : ${#numbers.sequence(searchParams.startNum, searchParams.endNum)}">-->
<!-- <li class="page-item" th:data-pageindex="${num}" th:classappend="${searchParams.pageIndex eq num?'active':''}">-->
<!-- <a class="page-link" href="#" th:text="${num}"></a>-->
<!-- </li>-->
<!-- </th:block>-->
<!-- <th:block th:if="${searchParams.maxNum>searchParams.endNum+2}">-->
<!-- <li class="page-item" th:data-pageindex="${(searchParams.pageIndex)+3}">-->
<!-- <a class="page-link" href="#" aria-label="Next">-->
<!-- <span aria-hidden="true">&raquo;</span>-->
<!-- </a>-->
<!-- </li>-->
<!-- </th:block>-->
<!-- </ul>-->
<!-- </nav>-->
<!-- </div>-->
<!-- <div class="col-auto">-->
<!-- <input type="button" class="btn btn-success" value="등록" id="addqnaBtn" sec:authorize="hasRole('ROLE_SUB_ADMIN')">-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- </main>-->
<!-- <div class="modal fade" id="qnaEditModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="noticeEditModalLabel" aria-hidden="true">-->
<!-- <div class="modal-dialog modal-xl modal-dialog-scrollable">-->
<!-- <div class="modal-content" id="noticeEditContent">-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!-- <div class="modal fade" id="noticeViewModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="noticeViewModalLabel" aria-hidden="true">-->
<!-- <div class="modal-dialog modal-xl modal-dialog-scrollable">-->
<!-- <div class="modal-content" id="noticeViewContent">-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<!--</div>-->
<!--</html>-->