결재권한 설정방식 변경.

견문평가 변경된 결재권한 적용.
master
강석 최 2023-02-10 14:09:03 +09:00
parent 9f810d14bb
commit 684848e43e
10 changed files with 251 additions and 172 deletions

View File

@ -43,9 +43,8 @@ public class AuthMgtController {
} }
@PostMapping("/saveAuth") @PostMapping("/saveAuth")
public String saveAuth(@RequestBody AuthMgt authMgt){ public void saveAuth(@RequestBody AuthMgt authMgt){
authMgtService.saveAuth(authMgt); authMgtService.saveAuth(authMgt);
return "";
} }
} }

View File

@ -57,6 +57,10 @@ public class AffairController { // 첩보수집활동 > 외사경찰 견문관
}else { }else {
affairBoard.setRatingOrgan(loginUser.getOgCd()); affairBoard.setRatingOrgan(loginUser.getOgCd());
switch (apprvAuth) { switch (apprvAuth) {
case "APC004APC001": // 계장대행+부장
case "APC003APC002": // 계장+부장대행
affairBoard.setQueryType("normalStayList");
break;
case "APC004": // 계장대행 case "APC004": // 계장대행
case "APC003": // 계장 // 결재대기 문서 조회 case "APC003": // 계장 // 결재대기 문서 조회
affairBoard.setAffairStatus("DST002"); affairBoard.setAffairStatus("DST002");
@ -75,6 +79,10 @@ public class AffairController { // 첩보수집활동 > 외사경찰 견문관
}else{ }else{
affairBoard.setRatingOrgan(loginUser.getOgCd()); affairBoard.setRatingOrgan(loginUser.getOgCd());
switch (apprvAuth) { switch (apprvAuth) {
case "APC004APC001": // 계장대행+부장
case "APC003APC002": // 계장+부장대행
affairBoard.setQueryType("normalCommitList");
break;
case "APC004": // 계장대행 case "APC004": // 계장대행
case "APC003": // 계장 // 계장반려, 계장승인 문서 조회 case "APC003": // 계장 // 계장반려, 계장승인 문서 조회
affairBoard.setQueryType("sectionCommitList"); affairBoard.setQueryType("sectionCommitList");

View File

@ -50,6 +50,8 @@ public class MonitoringReport extends FileInfo {
@Transient @Transient
private MultipartFile file; private MultipartFile file;
@Transient
private Boolean saveFlag;
@Embeddable @Embeddable

View File

@ -38,11 +38,13 @@ import com.dbnt.faisp.main.fpiMgt.monitoring.repository.MonitoringResultInfoRepo
import com.dbnt.faisp.main.fpiMgt.monitoring.repository.MonitoringResultRepository; import com.dbnt.faisp.main.fpiMgt.monitoring.repository.MonitoringResultRepository;
import com.dbnt.faisp.main.userInfo.model.UserAlarm; import com.dbnt.faisp.main.userInfo.model.UserAlarm;
import com.dbnt.faisp.main.userInfo.service.UserAlarmService; import com.dbnt.faisp.main.userInfo.service.UserAlarmService;
import com.dbnt.faisp.util.Utils;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItem; import org.apache.commons.fileupload.disk.DiskFileItem;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -240,32 +242,44 @@ public class MonitoringService extends BaseService {
private void saveReportList(Integer mrKey, List<MonitoringReport> reportList){ private void saveReportList(Integer mrKey, List<MonitoringReport> reportList){
//파일삭제 //파일삭제
List<MonitoringReport> fileList = monitoringReportRepository.findByMrKey(mrKey); List<MonitoringReport> fileList = monitoringReportRepository.findByMrKey(mrKey);
if(fileList != null) { for(MonitoringReport savedReport : fileList){
for(MonitoringReport file: fileList){ for(MonitoringReport editReport: reportList){
if(file.getOrigNm() != null) { if(!Utils.isEmpty(editReport.getConvNm()) && editReport.getConvNm().equals(savedReport.getConvNm())){
deleteStoredFile(new File(file.getSavePath(), file.getConvNm())); savedReport.setSaveFlag(false);
int temp = editReport.getInfoSeq();
BeanUtils.copyProperties(savedReport, editReport);
editReport.setInfoSeq(temp);
break;
}else{
savedReport.setSaveFlag(true);
} }
} }
} }
for(MonitoringReport savedReport: fileList){
monitoringReportRepository.deleteByMrKey(mrKey); if(savedReport.getOrigNm() != null && savedReport.getSaveFlag()) {
for(MonitoringReport info: reportList){ deleteStoredFile(new File(savedReport.getSavePath(), savedReport.getConvNm()));
if(info.getFile() != null) { }
MultipartFile file = info.getFile(); if(savedReport.getSaveFlag()){
String saveName = UUID.randomUUID().toString(); monitoringReportRepository.deleteById(new MonitoringReportId(savedReport.getMrKey(), savedReport.getInfoSeq()));
}
}
String path = locationPath+monitoringPath; String path = locationPath+monitoringPath;
for(MonitoringReport report: reportList){
if(report.getFile() != null && report.getMrKey()==null) {
MultipartFile file = report.getFile();
String saveName = UUID.randomUUID().toString();
saveFile(file, new File(path+File.separator+saveName)); saveFile(file, new File(path+File.separator+saveName));
report.setConvNm(saveName);
String originalFilename = file.getOriginalFilename(); String originalFilename = file.getOriginalFilename();
int extnIdx = originalFilename.lastIndexOf("."); int extnIdx = originalFilename.lastIndexOf(".");
info.setOrigNm(originalFilename.substring(0, extnIdx)); report.setOrigNm(originalFilename.substring(0, extnIdx));
info.setFileExtn(originalFilename.substring(extnIdx+1)); report.setFileExtn(originalFilename.substring(extnIdx+1));
info.setConvNm(saveName); report.setFileSize(calculationSize(file.getSize()));
info.setFileSize(calculationSize(file.getSize())); report.setSavePath(path);
info.setSavePath(path);
} }
info.setMrKey(mrKey); report.setMrKey(mrKey);
monitoringReportRepository.save(info);
} }
monitoringReportRepository.saveAll(reportList);
} }
public List<MonitoringResult> selectResultList(MonitoringResult mr) { public List<MonitoringResult> selectResultList(MonitoringResult mr) {

View File

@ -2,11 +2,14 @@
$(document).on('click', '.userInfoTr', function (){ $(document).on('click', '.userInfoTr', function (){
$.ajax({ $.ajax({
url: '/authMgt/authEditModal', url: '/authMgt/authEditModal',
data: {userSeq: Number($(this).find(".userSeq").val())}, data: {
userSeq: Number($(this).find(".userSeq").val()),
userNm: $(this).find(".userNm").val()
},
type: 'GET', type: 'GET',
dataType:"html", dataType:"html",
success: function(html){ success: function(html){
$("#configInfo").empty().append(html) $("#authEditModalContent").empty().append(html)
$("#accessTab").click(); $("#accessTab").click();
$("#authEditModal").modal('show'); $("#authEditModal").modal('show');
}, },
@ -16,42 +19,104 @@ $(document).on('click', '.userInfoTr', function (){
}); });
}) })
$(document).on('click', '.radioTd', function (){
$(this).find('input').prop('checked', true);
})
$(document).on('click', '.selectTh', function (){ $(document).on('click', '.selectTh', function (){
const type = $(this).attr("data-type"); const type = $(this).attr("data-type");
const target = $(this).attr("data-target"); const target = $(this).attr("data-target");
if(target){ if(target){
$("."+type+"RadioEmpty").prop("checked", false)
$("."+type+"Radio"+target).prop("checked", true) $("."+type+"Radio"+target).prop("checked", true)
switch (target) {
case "APC004":
$(".approvalRadioAPC003").prop("checked", false);
$(".approvalRadioAPC002").prop("checked", false);
break;
case "APC003":
$(".approvalRadioAPC004").prop("checked", false);
$(".approvalRadioAPC001").prop("checked", false);
break;
case "APC002":
$(".approvalRadioAPC004").prop("checked", false);
$(".approvalRadioAPC001").prop("checked", false);
break;
case "APC001":
$(".approvalRadioAPC003").prop("checked", false);
$(".approvalRadioAPC002").prop("checked", false);
break;
}
}else{ }else{
$(".approvalRadio").prop("checked", false)
$("."+type+"RadioEmpty").prop("checked", true) $("."+type+"RadioEmpty").prop("checked", true)
} }
}) })
$(document).on('click', '.radioTd', function (event){
const chkbox = $(this).find('input');
if(event.target.type !== "checkbox"){
chkbox.prop('checked', !chkbox[0].checked);
}
apprvChkboxControl(chkbox[0]);
})
$(document).on('change', '.approvalRadioEmpty', function (){
apprvChkboxControl(this);
})
$(document).on('change', '.approvalRadio', function (){
apprvChkboxControl(this);
})
function apprvChkboxControl(target){
if(target.className === "approvalRadioEmpty"){
if(target.checked){
$(target).parents('tr').find('.approvalRadio').prop("checked", false);
}
}else{
if(target.checked){
const tr = $(target).parents('tr');
tr.find('.approvalRadioEmpty').prop("checked", false);
switch ($(target).val()) {
case "APC004":
tr.find(".approvalRadioAPC003").prop("checked", false);
tr.find(".approvalRadioAPC002").prop("checked", false);
break;
case "APC003":
tr.find(".approvalRadioAPC004").prop("checked", false);
tr.find(".approvalRadioAPC001").prop("checked", false);
break;
case "APC002":
tr.find(".approvalRadioAPC004").prop("checked", false);
tr.find(".approvalRadioAPC001").prop("checked", false);
break;
case "APC001":
tr.find(".approvalRadioAPC003").prop("checked", false);
tr.find(".approvalRadioAPC002").prop("checked", false);
break;
}
}
}
}
$(document).on('click', '#saveAuthBtn', function (){ $(document).on('click', '#saveAuthBtn', function (){
if(confirm("저장하시겠습니까?")){ if(confirm("저장하시겠습니까?")){
contentFade("in"); contentFade("in");
const userSeq = Number($("#userSeq").val()); const userSeq = Number($("#userSeq").val());
const accessConfigList = [] const accessConfigList = []
$("#accessEditTable").find('tbody').children().each(function (idx, tr){ $("#accessEditTable").find('tbody').children().each(function (idx, tr){
accessConfigList.push( accessConfigList.push({
{
userSeq: userSeq, userSeq: userSeq,
menuKey: Number($(this).find('.menuKey').val()), menuKey: Number($(this).find('.menuKey').val()),
accessAuth: $(this).find('input:checked').val() accessAuth: $(this).find('input:checked').val()
} })
)
}) })
const approvalConfigList = [] const approvalConfigList = []
$("#approvalEditTable").find('input:checked').each(function (idx, tr){ $("#approvalEditTable").find('tbody').children().each(function (idx, tr){
approvalConfigList.push( let apprvAuth = "";
{ $.each($(this).find("input:checked"), function (idx, input){
apprvAuth+=input.value;
})
approvalConfigList.push({
userSeq: userSeq, userSeq: userSeq,
menuKey: Number($(this).parents('tr').find('.menuKey').val()), menuKey: Number($(this).find('.menuKey').val()),
approvalAuth: $(this).val() approvalAuth: apprvAuth
} })
)
}) })
const authList = {}; const authList = {};
authList.accessConfigList = accessConfigList; authList.accessConfigList = accessConfigList;

View File

@ -227,6 +227,7 @@ function saveResult(mrState){
formData.append('reportList['+(idx)+'].contactDate', $(div).find(".contactDate").val()); formData.append('reportList['+(idx)+'].contactDate', $(div).find(".contactDate").val());
formData.append('reportList['+(idx)+'].writeDate', $(div).find(".writeDate").val()); formData.append('reportList['+(idx)+'].writeDate', $(div).find(".writeDate").val());
formData.append('reportList['+(idx)+'].reportTitle', $(div).find(".reportTitle").val()); formData.append('reportList['+(idx)+'].reportTitle', $(div).find(".reportTitle").val());
formData.append('reportList['+(idx)+'].convNm', $(div).find(".convNm").val());
if($(div).find(".file").val() != ""){ if($(div).find(".file").val() != ""){
formData.append('reportList['+(idx)+'].file', $(div).find(".file")[0].files[0]); formData.append('reportList['+(idx)+'].file', $(div).find(".file")[0].files[0]);
} }

View File

@ -1,7 +1,21 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"> <html lang="ko" xmlns:th="http://www.thymeleaf.org">
<input type="hidden" id="userSeq" th:value="${userInfo.userSeq}"> <div class="modal-header bg-dark">
<div class="tab-pane fade p-2 show active" id="accessTabPanel" role="tabpanel" aria-labelledby="accessTab" tabindex="0"> <h5 class="modal-title text-white" id="menuEditModalLabel" th:text="|${userInfo.userNm} 권한 편집|"></h5>
<button type="button" class="btn-close f-invert" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<input type="hidden" id="userSeq" th:value="${userInfo.userSeq}">
<ul class="nav nav-tabs" id="userTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="accessTab" data-bs-toggle="tab" data-bs-target="#accessTabPanel" type="button" role="tab" aria-controls="accessTabPanel" aria-selected="true">메뉴</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="approvalTab" data-bs-toggle="tab" data-bs-target="#approvalTabPanel" type="button" role="tab" aria-controls="approvalTabPanel" aria-selected="false">결재</button>
</li>
</ul>
<div class="tab-content bg-white border border-top-0" id="configInfo">
<div class="tab-pane fade p-2 show active" id="accessTabPanel" role="tabpanel" aria-labelledby="accessTab" tabindex="0">
<table class="table table-sm table-hover text-center" id="accessEditTable"> <table class="table table-sm table-hover text-center" id="accessEditTable">
<thead> <thead>
<tr class="table-secondary"> <tr class="table-secondary">
@ -46,8 +60,8 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div> </div>
<div class="tab-pane fade p-2" id="approvalTabPanel" role="tabpanel" aria-labelledby="approvalTab" tabindex="0"> <div class="tab-pane fade p-2" id="approvalTabPanel" role="tabpanel" aria-labelledby="approvalTab" tabindex="0">
<table class="table table-sm table-hover text-center" id="approvalEditTable"> <table class="table table-sm table-hover text-center" id="approvalEditTable">
<thead> <thead>
<tr class="table-secondary"> <tr class="table-secondary">
@ -56,41 +70,41 @@
<th>소분류</th> <th>소분류</th>
<th class="selectTh mouse-hover-clickable" data-type="approval">해제</th> <th class="selectTh mouse-hover-clickable" data-type="approval">해제</th>
<th:block th:each="code:${session.commonCode.get('APC')}"> <th:block th:each="code:${session.commonCode.get('APC')}">
<th class="selectTh mouse-hover-clickable" data-type="approval" th:data-target="${code.itemCd}" th:text="${code.itemValue}"></th> <th class="selectTh mouse-hover-clickable" data-type="approval" th:data-target="${code.itemCd}" th:utext="${#strings.replace(code.itemValue, '+', ',<br>')}"></th>
</th:block> </th:block>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr th:each="approvalConfig:${userInfo.approvalConfigList}"> <tr th:each="approvalConfig:${userInfo.approvalConfigList}">
<input type="hidden" class="menuKey" th:value="${approvalConfig.menuKey}"> <input type="hidden" class="menuKey" th:value="${approvalConfig.menuKey}">
<td>
<th:block th:each="commonCode:${session.commonCode.get('CAT1')}"> <th:block th:each="commonCode:${session.commonCode.get('CAT1')}">
<th:block th:if="${commonCode.itemCd eq approvalConfig.cat1Cd}"> <th:block th:if="${commonCode.itemCd eq approvalConfig.cat1Cd}" th:text="${commonCode.itemValue}"></th:block>
<td th:text="${commonCode.itemValue}">.</td>
</th:block>
</th:block> </th:block>
</td>
<td>
<th:block th:each="commonCode:${session.commonCode.get('CAT2')}"> <th:block th:each="commonCode:${session.commonCode.get('CAT2')}">
<th:block th:if="${commonCode.itemCd eq approvalConfig.cat2Cd}"> <th:block th:if="${commonCode.itemCd eq approvalConfig.cat2Cd}" th:text="${commonCode.itemValue}"></th:block>
<td th:text="${commonCode.itemValue}">.</td>
</th:block>
</th:block>
<th:block th:if="${#strings.isEmpty(approvalConfig.cat3Cd)}">
<td></td>
</th:block> </th:block>
</td>
<td>
<th:block th:unless="${#strings.isEmpty(approvalConfig.cat3Cd)}" th:each="commonCode:${session.commonCode.get('CAT3')}"> <th:block th:unless="${#strings.isEmpty(approvalConfig.cat3Cd)}" th:each="commonCode:${session.commonCode.get('CAT3')}">
<th:block th:if="${commonCode.itemCd eq approvalConfig.cat3Cd}"> <th:block th:if="${commonCode.itemCd eq approvalConfig.cat3Cd}" th:text="${commonCode.itemValue}"></th:block>
<td th:text="${commonCode.itemValue}"></td>
</th:block> </th:block>
</th:block>
<td class="radioTd">
<input type="radio" class="approvalRadioEmpty" th:name="${#strings.concat('approvalAuth',approvalConfig.menuKey)}" value="">
</td> </td>
<th:block th:each="code:${session.commonCode.get('APC')}">
<td class="radioTd"> <td class="radioTd">
<input type="radio" th:class="${#strings.concat('approvalRadio', code.itemCd)}" th:name="${#strings.concat('approvalAuth',approvalConfig.menuKey)}" th:value="${code.itemCd}" th:checked="${code.itemCd eq approvalConfig.approvalAuth}"> <input type="checkbox" class="approvalRadioEmpty" th:name="${#strings.concat('approvalAuth',approvalConfig.menuKey)}" value="">
</td>
<td class="radioTd" th:each="code:${session.commonCode.get('APC')}">
<input type="checkbox" class="approvalRadio" th:classappend="${#strings.concat('approvalRadio', code.itemCd)}" th:name="${#strings.concat('approvalAuth',approvalConfig.menuKey)}" th:value="${code.itemCd}" th:checked="${approvalConfig.approvalAuth ne null && #strings.contains(approvalConfig.approvalAuth, code.itemCd)}">
</td> </td>
</th:block>
</tr> </tr>
</tbody> </tbody>
</table> </table>
</div>
</div>
</div>
<div class="modal-footer bg-light">
<button type="button" class="btn btn-primary" id="saveAuthBtn">저장</button>
</div> </div>
</html> </html>

View File

@ -67,7 +67,6 @@
<table class="table table-sm table-hover table-bordered"> <table class="table table-sm table-hover table-bordered">
<thead> <thead>
<tr class="table-secondary"> <tr class="table-secondary">
<th></th>
<th>소속</th> <th>소속</th>
<th>부서</th> <th>부서</th>
<th>계급</th> <th>계급</th>
@ -79,9 +78,7 @@
<tbody class="table-group-divider"> <tbody class="table-group-divider">
<tr class="userInfoTr" th:each="userInfo:${userInfoList}"> <tr class="userInfoTr" th:each="userInfo:${userInfoList}">
<input type="hidden" class="userSeq" th:value="${userInfo.userSeq}"> <input type="hidden" class="userSeq" th:value="${userInfo.userSeq}">
<td> <input type="hidden" class="userNm" th:value="${userInfo.userNm}">
<input type="checkbox" class="userInfoCheckBox" th:value="${userInfo.userSeq}">
</td>
<td> <td>
<th:block th:each="commonCode:${session.commonCode.get('OG')}"> <th:block th:each="commonCode:${session.commonCode.get('OG')}">
<th:block th:if="${commonCode.itemCd == userInfo.ogCd}" th:text="${commonCode.itemValue}"></th:block> <th:block th:if="${commonCode.itemCd == userInfo.ogCd}" th:text="${commonCode.itemValue}"></th:block>
@ -139,29 +136,9 @@
<div class="modal fade" id="authEditModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="authEditModalLabel" aria-hidden="true"> <div class="modal fade" id="authEditModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="authEditModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-scrollable"> <div class="modal-dialog modal-lg modal-dialog-scrollable">
<div class="modal-content" id="authEditModalContent"> <div class="modal-content" id="authEditModalContent">
<div class="modal-header bg-dark">
<h5 class="modal-title text-white" id="menuEditModalLabel">권한 편집</h5>
<button type="button" class="btn-close f-invert" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<ul class="nav nav-tabs" id="userTab" role="tablist">
<li class="nav-item" role="presentation">
<button class="nav-link active" id="accessTab" data-bs-toggle="tab" data-bs-target="#accessTabPanel" type="button" role="tab" aria-controls="accessTabPanel" aria-selected="true">메뉴</button>
</li>
<li class="nav-item" role="presentation">
<button class="nav-link" id="approvalTab" data-bs-toggle="tab" data-bs-target="#approvalTabPanel" type="button" role="tab" aria-controls="approvalTabPanel" aria-selected="false">결재</button>
</li>
</ul>
<div class="tab-content bg-white border border-top-0" id="configInfo">
</div> </div>
</div> </div>
<div class="modal-footer bg-light">
<!-- <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">닫기</button>-->
<button type="button" class="btn btn-primary" id="saveAuthBtn">저장</button>
</div>
</div>
</div>
</div> </div>
</div> </div>
</html> </html>

View File

@ -221,8 +221,7 @@
<div class="px-2"> <div class="px-2">
<form action="#" method="post" id="apprvForm"> <form action="#" method="post" id="apprvForm">
<input type="hidden" name="affairKey" th:value="${affair.affairKey}"> <input type="hidden" name="affairKey" th:value="${affair.affairKey}">
<th:block <th:block th:if="${(#strings.contains(apprvAuth, 'APC003') or #strings.contains(apprvAuth, 'APC004')) and affair.affairStatus eq 'DST002' and affair.rateList.get(0).ratingOrgan eq userOrgan}">
th:if="${(apprvAuth eq 'APC003' or apprvAuth eq 'APC004') and affair.affairStatus eq 'DST002' and affair.rateList.get(0).ratingOrgan eq userOrgan}">
<input type="hidden" name="sectionApprv" id="sectionApprv"> <input type="hidden" name="sectionApprv" id="sectionApprv">
<div class="row border-top-0 border-secondary"> <div class="row border-top-0 border-secondary">
<div class="col-10"> <div class="col-10">
@ -241,12 +240,11 @@
</div> </div>
</th:block> </th:block>
<th:block <th:block
th:if="${(apprvAuth eq 'APC001' or apprvAuth eq 'APC002') and affair.affairStatus eq 'DST004' and affair.rateList.get(0).ratingOrgan eq userOrgan}"> th:if="${(#strings.contains(apprvAuth, 'APC001') or #strings.contains(apprvAuth, 'APC002')) and affair.affairStatus eq 'DST004' and affair.rateList.get(0).ratingOrgan eq userOrgan}">
<input type="hidden" name="headApprv" id="headApprv"> <input type="hidden" name="headApprv" id="headApprv">
<div class="row border-top-0 border-secondary"> <div class="row border-top-0 border-secondary">
<div class="col-8"> <div class="col-8">
<input type="text" class="form-control form-control-sm etc" name="headEtc" <input type="text" class="form-control form-control-sm etc" name="headEtc" placeholder="추가의견, 반려사유 기입">
placeholder="추가의견, 반려사유 기입">
<input type="text" class="d-none" id="submitPrevention"> <input type="text" class="d-none" id="submitPrevention">
</div> </div>
<div class="col-auto"> <div class="col-auto">

View File

@ -320,10 +320,10 @@
<div class="col-3"> <div class="col-3">
<input type="text" class="form-control form-control-sm reportTitle" th:value="${info.reportTitle}"> <input type="text" class="form-control form-control-sm reportTitle" th:value="${info.reportTitle}">
</div> </div>
<th:block th:unless="${#strings.isEmpty(info.origNm)}">
<th:block th:if="${not #strings.isEmpty(info.origNm)}">
<div class="col-3" id="deleteFile"> <div class="col-3" id="deleteFile">
<div class="input-group" id="fileDelete"> <div class="input-group" id="fileDelete">
<input type="hidden" class="convNm" th:value="${info.convNm}">
<input type="text" class="form-control form-control-sm" th:value="|${info.origNm}.${info.fileExtn}|" readonly> <input type="text" class="form-control form-control-sm" th:value="|${info.origNm}.${info.fileExtn}|" readonly>
<button type="button" class="btn btn-sm btn-danger" id="deleteFileBtn"> <button type="button" class="btn btn-sm btn-danger" id="deleteFileBtn">
<i class="bi bi-x"></i> <i class="bi bi-x"></i>
@ -332,9 +332,10 @@
<input class="file d-none" id="updateFile" type="file"> <input class="file d-none" id="updateFile" type="file">
</div> </div>
</th:block> </th:block>
<th:block th:unless="${not #strings.isEmpty(info.origNm)}"> <th:block th:if="${#strings.isEmpty(info.origNm)}">
<div class="col-3" id="addFile"> <div class="col-3" id="addFile">
<div class="input-group" id="fileAdd"> <div class="input-group" id="fileAdd">
<input type="hidden" class="origNm" value="">
<input type="text" class="form-control form-control-sm" value="등록된 파일이 없습니다." readonly> <input type="text" class="form-control form-control-sm" value="등록된 파일이 없습니다." readonly>
<button type="button" class="btn btn-sm btn-primary" id="addFileBtn"> <button type="button" class="btn btn-sm btn-primary" id="addFileBtn">
<i class="bi bi-plus"></i> <i class="bi bi-plus"></i>