코드관리 디자인, 오류 수정. 정렬기능 추가.

관서설정 디자인 수정
메뉴관리 디자인 수정, 정렬기능 추가.
외사경찰관리 시스템 권한설정 기능 수정.
강석 최 2022-11-30 18:02:02 +09:00
parent 819955e441
commit f98ce35af1
16 changed files with 432 additions and 55 deletions

View File

@ -1,6 +1,7 @@
package com.dbnt.faisp.main.codeMgt;
import com.dbnt.faisp.main.codeMgt.model.CodeCatg;
import com.dbnt.faisp.main.codeMgt.model.CodeFormData;
import com.dbnt.faisp.main.codeMgt.service.CodeMgtService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
@ -17,7 +18,9 @@ public class CodeMgtController {
@GetMapping("/codeMgtPage")
public ModelAndView codeMgtPage() {
ModelAndView mav = new ModelAndView("adminPage/codeMgt/codeMgt");
ModelAndView mav = new ModelAndView("adminPage/codeMgt/codeMgt2");
mav.addObject("catgList", codeMgtService.selectAllCategoryList());
mav.addObject("codeList", codeMgtService.selectAllCodeList());
return mav;
}
@ -27,6 +30,10 @@ public class CodeMgtController {
codeMgtService.saveCode(codeCategoryList);
return "";
}
@PostMapping("/saveCode2")
public void saveCode2(CodeFormData formData){
codeMgtService.saveCode2(formData.getCategoryList(), formData.getCodeList());
}
@GetMapping("/selectCodeCatgList")
public List<CodeCatg> selectCodeCatgList(){

View File

@ -0,0 +1,13 @@
package com.dbnt.faisp.main.codeMgt.model;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@Getter
@Setter
public class CodeFormData {
List<CodeCatg> categoryList;
List<CodeMgt> codeList;
}

View File

@ -27,6 +27,8 @@ public class CodeMgt {
private String itemValue;
@Column(name = "use_chk")
private String useChk;
@Column(name = "order_num")
private Integer orderNum;
@Transient
private String status;

View File

@ -10,8 +10,8 @@ import java.util.Optional;
public interface CodeMgtRepository extends JpaRepository<CodeMgt, CodeMgt.CodeMgtId> {
List<CodeMgt> findByCategoryCdOrderByItemCdAsc(String categoryCd);
List<CodeMgt> findByCategoryCdAndUseChkOrderByItemCdAsc(String categoryCd, String useChk);
List<CodeMgt> findByCategoryCdAndUseChkOrderByOrderNumAsc(String categoryCd, String useChk);
Optional<CodeMgt> findByCategoryCdAndItemValue(String categoryCd, String itemValue);
List<CodeMgt> findByUseChkOrderByItemCdAsc(String useChk);
List<CodeMgt> findByOrderByItemCdAsc();
List<CodeMgt> findByOrderByOrderNumAsc();
}

View File

@ -1,6 +1,7 @@
package com.dbnt.faisp.main.codeMgt.service;
import com.dbnt.faisp.main.codeMgt.model.CodeCatg;
import com.dbnt.faisp.main.codeMgt.model.CodeFormData;
import com.dbnt.faisp.main.codeMgt.model.CodeMgt;
import com.dbnt.faisp.main.codeMgt.repository.CodeCatgRepository;
import com.dbnt.faisp.main.codeMgt.repository.CodeMgtRepository;
@ -8,10 +9,7 @@ import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
@Service
@RequiredArgsConstructor
@ -31,6 +29,31 @@ public class CodeMgtService{
return "";
}
@Transactional
public void saveCode2(List<CodeCatg> categoryList, List<CodeMgt> codeList) {
if(categoryList!=null){
codeCatgRepository.saveAll(categoryList);
}
if(codeList!=null){
HashMap<String, Integer> map = new HashMap<>();
for(CodeMgt code: codeList){
if(code.getItemCd().isEmpty()){
map.put(code.getCategoryCd(), 1);
}
}
for(CodeMgt code: codeList){
if(code.getItemCd().isEmpty()) {
Integer categorySeq = map.get(code.getCategoryCd());
String tempItemCd = "000" + categorySeq++;
code.setItemCd(code.getCategoryCd() + (tempItemCd.substring(tempItemCd.length() - 3)));
map.put(code.getCategoryCd(), categorySeq);
}
}
codeMgtRepository.saveAll(codeList);
}
}
private void codeItemSave(List<CodeMgt> itemList){
codeMgtRepository.saveAll(itemList);
}
@ -45,7 +68,7 @@ public class CodeMgtService{
public Map<String, List<CodeMgt>> getCommonCode() {
List<CodeCatg> categoryList = codeCatgRepository.findAll();
List<CodeMgt> codeList = codeMgtRepository.findByOrderByItemCdAsc();
List<CodeMgt> codeList = codeMgtRepository.findByOrderByOrderNumAsc();
Map<String, List<CodeMgt>> categoryMap = new HashMap<>();
for(CodeCatg category: categoryList){
List<CodeMgt> childList = new ArrayList<>();
@ -60,7 +83,7 @@ public class CodeMgtService{
}
public List<CodeMgt> selectCodeMgtList(String categoryCd) {
return codeMgtRepository.findByCategoryCdAndUseChkOrderByItemCdAsc(categoryCd, "T");
return codeMgtRepository.findByCategoryCdAndUseChkOrderByOrderNumAsc(categoryCd, "T");
}
public List<CodeMgt> selectCodeMgtListOrderByDesc(String categoryCd){
List<CodeMgt> codeList = selectCodeMgtList(categoryCd);
@ -71,4 +94,12 @@ public class CodeMgtService{
CodeMgt code = codeMgtRepository.findByCategoryCdAndItemValue(categoryCd, value).orElse(null);
return code==null?null:code.getItemCd();
}
public List<CodeCatg> selectAllCategoryList() {
return codeCatgRepository.findAll();
}
public List<CodeMgt> selectAllCodeList() {
return codeMgtRepository.findByOrderByOrderNumAsc();
}
}

View File

@ -36,6 +36,8 @@ public class MenuMgt extends BaseModel {
private String deadlineChk;
@Column(name = "use_chk")
private String useChk;
@Column(name = "order_str")
private String orderStr;
@Transient
private List<MenuMgt> childList;

View File

@ -126,6 +126,10 @@ public class MenuMgtService {
if(accessMenu.getCat1Cd().equals(cat1Cd)
&& accessMenu.getCat2Cd().equals(secondMenu.getCat2Cd())
&& accessMenu.getCat3Cd().equals(thirdMenu.getCat3Cd())){
String orderStr = accessMenu.getOrderStr();
firstMenu.setOrderStr(orderStr.substring(0,1));
secondMenu.setOrderStr(orderStr.substring(1,2));
thirdMenu.setOrderStr(orderStr.substring(2,3));
thirdMenu.setMenuUrl(accessMenu.getMenuUrl());
break;
}
@ -135,15 +139,18 @@ public class MenuMgtService {
}
if(thirdMenuList.size()>0){
thirdMenuList.sort((o1, o2) -> {
String cat3_1 = o1.getCat3Cd();
String cat3_2 = o2.getCat3Cd();
return cat3_1.compareTo(cat3_2);
String orderStr_1 = o1.getOrderStr();
String orderStr_2 = o2.getOrderStr();
return orderStr_1.compareTo(orderStr_2);
});
secondMenu.setChildList(thirdMenuList);
}else{
for(MenuMgt accessMenu: accessMenuList){
if(accessMenu.getCat1Cd().equals(cat1Cd)
&& accessMenu.getCat2Cd().equals(secondMenu.getCat2Cd())){
String orderStr = accessMenu.getOrderStr();
firstMenu.setOrderStr(orderStr.substring(0,1));
secondMenu.setOrderStr(orderStr.substring(1,2));
secondMenu.setMenuUrl(accessMenu.getMenuUrl());
break;
}
@ -153,17 +160,17 @@ public class MenuMgtService {
}
}
secondMenuList.sort((o1, o2) -> {
String cat2_1 = o1.getCat2Cd();
String cat2_2 = o2.getCat2Cd();
return cat2_1.compareTo(cat2_2);
String orderStr_1 = o1.getOrderStr();
String orderStr_2 = o2.getOrderStr();
return orderStr_1.compareTo(orderStr_2);
});
firstMenu.setChildList(secondMenuList);
firstMenuList.add(firstMenu);
}
firstMenuList.sort((o1, o2) -> {
String cat1_1 = o1.getCat1Cd();
String cat1_2 = o2.getCat1Cd();
return cat1_1.compareTo(cat1_2);
String orderStr_1 = o1.getOrderStr();
String orderStr_2 = o2.getOrderStr();
return orderStr_1.compareTo(orderStr_2);
});
return firstMenuList;
}

View File

@ -5,63 +5,63 @@
<mapper namespace="com.dbnt.faisp.main.menuMgt.mapper.MenuMgtMapper">
<sql id="selectMenuMgtListWhere">
<if test='useChk == "T"'>
and use_chk = 'T'
</if>
<if test='useChk == "F"'>
and (use_chk is null or use_chk = '')
</if>
<if test='cat1Cd != null and cat1Cd != ""'>
and cat1_cd = #{cat1Cd}
</if>
<if test='cat1Cd != null and cat1Cd != ""'>
and cat1_cd = #{cat1Cd}
</if>
<if test='cat2Cd != null and cat2Cd != ""'>
and cat2_cd = #{cat2Cd}
</if>
<if test='cat3Cd != null and cat3Cd != ""'>
and cat3_cd = #{cat3Cd}
</if>
<if test='menuUrl != null and menuUrl != ""'>
and menu_url like '%'||#{menuUrl}||'%'
</if>
<where>
<if test='useChk == "T"'>
and use_chk = 'T'
</if>
<if test='useChk == "F"'>
and (use_chk is null or use_chk = '')
</if>
<if test='cat1Cd != null and cat1Cd != ""'>
and cat1_cd = #{cat1Cd}
</if>
<if test='cat1Cd != null and cat1Cd != ""'>
and cat1_cd = #{cat1Cd}
</if>
<if test='cat2Cd != null and cat2Cd != ""'>
and cat2_cd = #{cat2Cd}
</if>
<if test='cat3Cd != null and cat3Cd != ""'>
and cat3_cd = #{cat3Cd}
</if>
<if test='menuUrl != null and menuUrl != ""'>
and menu_url like '%'||#{menuUrl}||'%'
</if>
</where>
</sql>
<select id="selectMenuMgtList" resultType="MenuMgt" parameterType="MenuMgt">
select menu_key as menuKey,
cat1_cd as cat1Cd,
cat2_cd as cat2Cd,
cat3_cd as cat3Cd,
order_str as orderStr,
menu_url as menuUrl,
approval_chk as approvalChk,
deadline_chk as deadlineChk,
use_chk as useChk
from menu_mgt
<where>
<include refid="selectMenuMgtListWhere"></include>
</where>
order by cat1_cd, cat2_cd, cat3_cd
<include refid="selectMenuMgtListWhere"></include>
order by order_str, cat1_cd, cat2_cd, cat3_cd
limit #{rowCnt} offset #{firstIndex}
</select>
<select id="selectMenuMgtListCnt" resultType="int" parameterType="MenuMgt">
select count(*)
from menu_mgt
<where>
<include refid="selectMenuMgtListWhere"></include>
</where>
<include refid="selectMenuMgtListWhere"></include>
</select>
<select id="selectAccessMenuListWhereUserSeq" resultType="MenuMgt" parameterType="int">
select ab.cat1_cd,
ab.cat2_cd,
ab.cat3_cd,
ab.order_str,
ab.menu_url
from access_config aa
inner join menu_mgt ab on aa.menu_key = ab.menu_key
where aa.user_seq = #{userSeq}
and aa.access_auth is not null
and aa.access_auth &lt;> ''
order by cat1_cd, cat2_cd, cat3_cd
order by order_str, cat1_cd, cat2_cd, cat3_cd
</select>
<select id="selectMenuMgtListToAccessAuth" resultType="MenuMgt" parameterType="MenuMgt">
@ -76,7 +76,7 @@
and aa.access_auth is not null
and aa.access_auth &lt;> ''
<include refid="selectMenuMgtListWhere"></include>
order by cat1_cd, cat2_cd, cat3_cd
order by order_str, cat1_cd, cat2_cd, cat3_cd
limit #{rowCnt} offset #{firstIndex}
</select>

View File

@ -101,6 +101,9 @@
.w-35{
width:35%!important;
}
.w-100p{
width: 100px;
}
#subModalBody{
white-space: nowrap;
}

View File

@ -0,0 +1,197 @@
$(document).on('click', '#categoryAddBtn', function (){
const categoryTbody = $("#categoryTbody");
const tr = categoryTbody[0].insertRow(0);
tr.className = "categoryTr"
$(tr).append("<input type='hidden' class='status' value='add'>");
$(tr.insertCell(0)).append("<input type='text' class='form-control form-control-sm categoryCd' value=''>")
$(tr.insertCell(1)).append("<input type='text' class='form-control form-control-sm categoryValue' value=''>")
$(tr.insertCell(2)).append(
" <div class='input-group'>\n" +
" <input type='text' class='form-control form-control-sm description' value=''>\n" +
" <button class='btn btn-sm btn-outline-danger rowDeleteBtn'><i class='bi bi-x'></i></button>\n" +
" </div>\n"
)
})
$(document).on('click', '#codeAddBtn', function (){
const categoryCd = $(".activeTr").find(".categoryCd").val();
if(categoryCd!== undefined && categoryCd!==""){
appendNewCode(categoryCd)
}else{
alert("분류코드를 입력해주세요.")
}
})
$(document).on('change', '.categoryCd', function (){
this.value = this.value.toUpperCase();
if($("#categoryTbody").find("[value='"+this.value+"']").length>0){
alert("분류코드를 중복되지 않게 입력해주세요.")
this.value = "";
}else{
$(this).parents("tr").attr("data-categorycd", this.value);
}
})
$(document).on('click', '.rowDeleteBtn', function (){
$(this).parents('tr').remove();
})
$(document).on('click', '.categoryTr', function (){
activeTrChange(this);
const categoryCd = $(this).attr("data-categorycd");
codeTrShow(categoryCd)
$("#emptyTr").hide();
})
$(document).on('change', '.description', function (){
trStatusChange(this);
})
$(document).on('change', '.orderNum', function (){
trStatusChange(this);
})
$(document).on('change', '.useChk', function (){
trStatusChange(this);
})
function trStatusChange(target){
const status = $(target).parents('tr').find(".status");
if(status.val()==="saved"){
status.val("update");
}
}
function activeTrChange(target){
const activeTr = $(".activeTr")[0];
if(activeTr !== undefined){
activeTr.className = activeTr.className.replace(" activeTr", "")
}
target.className = target.className + " activeTr";
}
function appendNewCode(categoryCd){
const codeTbody = $("#codeTbody");
let childCnt = ("00"+(codeTbody.find("."+categoryCd).length+1)).slice(-3);
const tr = codeTbody[0].insertRow(0);
tr.className = "codeTr "+categoryCd;
const jtr = $(tr);
jtr.append("<input type='hidden' class='status' value='add'>");
jtr.append("<input type='hidden' class='categoryCd' value='"+categoryCd+"'>");
jtr.append("<input type='hidden' class='itemCd' value=''>");
$(tr.insertCell(0)).append("자동생성");
$(tr.insertCell(1)).append("<input type='text' class='form-control form-control-sm itemValue'>")
$(tr.insertCell(2)).append("<input type='number' class='form-control form-control-sm orderNum' min='0'>")
$(tr.insertCell(3)).append("<button class='btn btn-sm btn-outline-danger rowDeleteBtn'><i class='bi bi-x'></i></button>")
}
function codeTrShow(categoryCd){
$(".codeTr").hide();
if(categoryCd !== undefined && categoryCd !== ""){
$("."+categoryCd).show();
}
}
$(document).on('click', '#codeSaveBtn', function (){
const categoryTbody = $("#categoryTbody");
const codeTbody = $("#codeTbody");
if(emptyValueCheck(categoryTbody, codeTbody)){
contentFade("in");
const formData = new FormData();
let i=0;
$.each(categoryTbody.find("tr"), function (idx, tr){
const jtr = $(tr)
if(jtr.find(".status").val()!=="saved"){
formData.append("categoryList["+i+"].categoryCd", jtr.find(".categoryCd").val())
formData.append("categoryList["+i+"].categoryValue", jtr.find(".categoryValue").val())
formData.append("categoryList["+i+"].description", jtr.find(".description").val())
i++;
}
})
i=0;
$.each(codeTbody.find("tr"), function (idx, tr){
const jtr = $(tr)
const status = jtr.find(".status").val();
if(status!=="saved"){
formData.append("codeList["+i+"].categoryCd", jtr.find(".categoryCd").val())
formData.append("codeList["+i+"].itemCd", jtr.find(".itemCd").val())
formData.append("codeList["+i+"].itemValue", jtr.find(".itemValue").val())
const useChk = status==="add"?'T':(jtr.find(".useChk")[0].checked?'T':'F')
formData.append("codeList["+i+"].useChk", useChk);
formData.append("codeList["+i+"].orderNum", jtr.find(".orderNum").val())
i++;
}
})
$.ajax({
type : 'POST',
data : formData,
url : "/codeMgt/saveCode2",
processData: false,
contentType: false,
beforeSend: function (xhr){
xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val());
},
success : function(result) {
alert("저장되었습니다.");
contentFade("out");
location.reload();
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.")
contentFade("out");
}
})
}else{
alert("분류코드, 분류명, 코드값을 확인해주세요.")
}
/*contentFade("in");
$.ajax({
type : 'POST',
url : "/codeMgt/saveCode",
data : JSON.stringify(codeCategoryList),
contentType: 'application/json',
beforeSend: function (xhr){
xhr.setRequestHeader($("[name='_csrf_header']").val(), $("[name='_csrf']").val());
},
success : function(data) {
alert("저장되었습니다.");
contentFade("out");
location.reload();
},
error : function(xhr, status) {
alert("저장에 실패하였습니다.")
contentFade("out");
}
})*/
})
function emptyValueCheck(categoryTbody, codeTbody){
let flag = true;
let saveContentCnt = 0;
$.each($(".status"), function (idx, input){
if(input.value === "add" || input.value === "update"){
saveContentCnt++;
}
})
if(saveContentCnt===0){
flag=false;
alert("저장대상이 없습니다.");
}else{
$.each(categoryTbody.find(".categoryCd"), function (idx, input){
if(input.value === ""){
flag = false;
}
})
if(!flag){
alert("분류코드를 확인해주세요")
}
$.each(categoryTbody.find(".categoryValue"), function (idx, input){
if(input.value === ""){
flag = false;
}
})
if(!flag){
alert("분류명을 확인해주세요")
}
$.each(codeTbody.find(".itemValue"), function (idx, input){
if(input.value === ""){
flag = false;
}
})
if(!flag){
alert("코드값을 확인해주세요")
}
}
return flag;
}

View File

@ -13,6 +13,7 @@ $(document).on('click', '.menuTr', function (event){
cat1Cd: row.find(".cat1Cd").val(),
cat2Cd: row.find(".cat2Cd").val(),
cat3Cd: row.find(".cat3Cd").val(),
orderStr: row.find(".orderStr").val(),
menuUrl: row.find(".menuUrl").val(),
approvalChk: row.find(".approvalChk").val(),
useChk: row.find(".useChk").val()

View File

@ -0,0 +1,102 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org"
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/codeMgt/codeMgt2.js}"></script>
</th:block>
<div layout:fragment="content">
<main>
<h4>코드 관리</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 bg-light text-center">
<div class="card-body">
<div class="row">
<div class="col-10">
<div class="row justify-content-end my-1">
<div class="col-auto">
<button class="col-auto btn btn-success" id="codeSaveBtn">저장</button>
</div>
</div>
</div>
</div>
<div class="row justify-content-start">
<div class="col-6">
<div class="card">
<div class="card-body">
<div class="row justify-content-end pb-1">
<div class="col-auto">
<button class="btn btn-sm btn-outline-primary" id="categoryAddBtn"><i class="bi bi-plus-lg"></i></button>
</div>
</div>
<table class="table table-sm table-hover table-bordered">
<thead>
<tr class="table-secondary">
<th>분류코드</th>
<th>분류명</th>
<th>설명</th>
</tr>
</thead>
<tbody class="table-group-divider" id="categoryTbody">
<th:block th:each="category:${catgList}">
<tr class="categoryTr" th:data-categorycd="${category.categoryCd}">
<input type="hidden" class="categoryCd" th:value="${category.categoryCd}">
<input type="hidden" class="categoryValue" th:value="${category.categoryValue}">
<input type="hidden" class="status" value="saved">
<td th:text="${category.categoryCd}"></td>
<td th:text="${category.categoryValue}"></td>
<td><input type="text" class="form-control form-control-sm description" th:value="${category.description}"></td>
</tr>
</th:block>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-4" id="valueDiv">
<div class="card">
<div class="card-body">
<div class="row justify-content-end pb-1">
<div class="col-auto">
<button class="btn btn-sm btn-outline-primary" id="codeAddBtn"><i class="bi bi-plus-lg"></i></button>
</div>
</div>
<table class="table table-sm table-hover table-bordered">
<thead>
<tr class="table-secondary">
<th>하위코드</th>
<th>코드값</th>
<th class="w-100p">정렬순번</th>
<th>사용</th>
</tr>
</thead>
<tbody class="table-group-divider" id="codeTbody">
<th:block th:each="code:${codeList}">
<tr class="codeTr" th:classappend="${code.categoryCd}" style="display: none">
<input type="hidden" class="categoryCd" th:value="${code.categoryCd}">
<input type="hidden" class="itemCd" th:value="${code.itemCd}">
<input type="hidden" class="itemValue" th:value="${code.itemValue}">
<input type="hidden" class="status" value="saved">
<td th:text="${code.itemCd}"></td>
<td th:text="${code.itemValue}"></td>
<td class="w-100p"><input type="number" class="form-control form-control-sm codeInfo orderNum" min="0" th:value="${code.orderNum}"></td>
<td><input type="checkbox" class="codeInfo useChk" th:checked="${code.useChk eq 'T'}"></td>
</tr>
</th:block>
</tbody>
<tfoot>
<tr id="emptyTr"><td colspan="4">분류를 선택해주세요.</td></tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</main>
</div>
</html>

View File

@ -43,6 +43,12 @@
</select>
</div>
</div>
<div class="row mb-3">
<label for="orderStr" class="col-sm-4 col-form-label col-form-label-sm text-center">정렬번호</label>
<div class="col-sm-6">
<input type="text" class="form-control form-control-sm" id="orderStr" name="orderStr" th:value="${menuMgt.orderStr}" placeholder="">
</div>
</div>
<div class="row mb-3">
<label for="menuUrl" class="col-sm-4 col-form-label col-form-label-sm text-center">URL</label>
<div class="col-sm-6">

View File

@ -78,6 +78,7 @@
<th>대분류</th>
<th>중분류</th>
<th>소분류</th>
<th>정렬번호</th>
<th>url</th>
<th>사용여부</th>
</tr>
@ -88,6 +89,7 @@
<input type="hidden" class="cat1Cd" th:value="${menuMgt.cat1Cd}">
<input type="hidden" class="cat2Cd" th:value="${menuMgt.cat2Cd}">
<input type="hidden" class="cat3Cd" th:value="${menuMgt.cat3Cd}">
<input type="hidden" class="orderStr" th:value="${menuMgt.orderStr}">
<input type="hidden" class="menuUrl" th:value="${menuMgt.menuUrl}">
<input type="hidden" class="approvalChk" th:value="${menuMgt.approvalChk}">
<input type="hidden" class="useChk" th:value="${menuMgt.useChk}">
@ -112,6 +114,7 @@
<th:block th:if="${#strings.isEmpty(menuMgt.cat3Cd)}">
<td></td>
</th:block>
<td th:text="${menuMgt.orderStr}"></td>
<td th:text="${menuMgt.menuUrl}"></td>
<td th:text="${menuMgt.useChk eq 'T'?'O':''}"></td>
</tr>

View File

@ -14,14 +14,16 @@
<div class="col-12 card bg-light text-center">
<div class="card-body">
<div class="row">
<div class="col-6">
<div class="row justify-content-end">
<button class="col-auto btn btn-success mx-3 my-2" id="organSaveBtn">저장</button>
<div class="col-4">
<div class="row justify-content-end my-2">
<div class="col-auto">
<button class="btn btn-success" id="organSaveBtn">저장</button>
</div>
</div>
</div>
</div>
<div class="row justify-content-start">
<div class="col-3">
<div class="col-2">
<div class="card">
<div class="card-body">
<div class="row">
@ -43,7 +45,7 @@
</div>
</div>
</div>
<div class="col-3">
<div class="col-2">
<div class="card">
<div class="card-body">
<div class="row">

View File

@ -1,5 +1,6 @@
<!DOCTYPE html>
<html lang="ko" xmlns:th="http://www.thymeleaf.org">
<html lang="ko" xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity5">
<div class="modal-header">
<h5 class="modal-title" id="menuEditModalLabel">외사경찰 수정</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
@ -13,7 +14,7 @@
<div class="mb-3 mt-3 row">
<label for="userRole" class="col-sm-2 col-form-label col-form-label-sm text-center ">시스템권한</label>
<div class="col-sm-4" id="userRole">
<label style="font-size: 12px">
<label style="font-size: 12px" sec:authorize="hasRole('ROLE_ADMIN')">
<input type="radio" name="userRole" value="ROLE_ADMIN,ROLE_SUB_ADMIN,ROLE_USER"
th:checked="${userInfo.userRole eq 'ROLE_ADMIN,ROLE_SUB_ADMIN,ROLE_USER'}">관리자</label>
<label style="font-size: 12px">