no message
parent
1d436263d9
commit
004861be9e
@ -1,80 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<form id="infoPrefix-form">
|
|
||||||
<div class="row g-3">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="id"
|
|
||||||
>아이디</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="id" type="text" required data-map="GRP_ID" maxlength="50" class="form-control" placeholder="prefixName 아이디" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="name"
|
|
||||||
>이름</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="name" type="text" required data-map="GRP_NM" maxlength="60" class="form-control" placeholder="prefixName 이름" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="description"
|
|
||||||
>설명</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="description" type="text" data-map="DSCRP" maxlength="200" class="form-control dob-picker" placeholder="prefixName 설명"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt-4 justify-content-end">
|
|
||||||
<div class="col-sm-12" style="text-align:right;">
|
|
||||||
<button onclick="saveinfoPrefix();" type="button" class="btn btn-primary">저장</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<script type="text/javascript">
|
|
||||||
|
|
||||||
var infoPrefixFields = new FormFields("#infoPrefix-form");
|
|
||||||
|
|
||||||
infoPrefixControl.groups.setInfo = obj => {
|
|
||||||
infoPrefixFields.set(obj);
|
|
||||||
let create = isEmpty(obj.data.GRP_ID);
|
|
||||||
$("input[name='id']").prop("readonly", !create);
|
|
||||||
$("#infoPrefix-form input")
|
|
||||||
.change(function() {
|
|
||||||
let input = $(this),
|
|
||||||
name = input.attr("data-map"),
|
|
||||||
val = input.val();
|
|
||||||
infoPrefixControl.groups.setValue(name, val);
|
|
||||||
})
|
|
||||||
.onEnterPress(saveinfoPrefix);
|
|
||||||
|
|
||||||
document.querySelector("input[name='" + (create ? "id" : "name") + "']").focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
infoPrefixControl.groups.onModify = (changed) => {
|
|
||||||
if (["GRP_NM"].filter(e => changed.includes(e)).length < 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
renderinfoPrefixList();
|
|
||||||
infoPrefixControl.groups.dataset.setState();
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveinfoPrefix() {
|
|
||||||
if (!$("#infoPrefix-form input").validInputs()) return;
|
|
||||||
|
|
||||||
dialog.alert({
|
|
||||||
content:"현재 prefixName 정보를 저장하시겠습니까?",
|
|
||||||
onOK:() => {
|
|
||||||
infoPrefixControl.groups.save(infoPrefixFields.get());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
//# sourceURL=actionGroup-info.jsp
|
|
||||||
</script>
|
|
@ -1,245 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Content wrapper -->
|
|
||||||
<div class="content-wrapper">
|
|
||||||
<!-- Content -->
|
|
||||||
|
|
||||||
<div class="container-xxl flex-grow-1 container-p-y">
|
|
||||||
<%--h4 id="pageTitle" class="fw-bold py-3 mb-4">페이지 제목</h4--%>
|
|
||||||
<c:set var="prefixName" scope="request">기능 그룹</c:set>
|
|
||||||
<!-- Page Body -->
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-datatable text-nowrap">
|
|
||||||
<div id="DataTables_Table_0_wrapper" class="dataTables_wrapper dt-bootstrap5 no-footer">
|
|
||||||
|
|
||||||
<div class="d-flex flex-row justify-content-evenly">
|
|
||||||
<div style="width:49%;">
|
|
||||||
<h5 class="mt-3">기능 그룹</h5>
|
|
||||||
<div class="d-flex flex-row justify-content-between p-3">
|
|
||||||
<div>
|
|
||||||
<div class="input-group" id="DataTables_Table_0_length">
|
|
||||||
<select id="by" onchange="document.getElementById('term').focus();" aria-controls="DataTables_Table_0" class="form-select">
|
|
||||||
<option value="${infoPrefix}Name">이름</option>
|
|
||||||
<option value="${infoPrefix}ID">아이디</option>
|
|
||||||
</select>
|
|
||||||
<input id="term" autofocus type="text" placeholder="조회 조건을 입력하십시오." class="form-control">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<button onclick="search${infoPrefix}s();" class="btn btn-primary">찾기</button>
|
|
||||||
<button onclick="${infoPrefix}Control.groups.newInfo();" class="btn btn-primary">+ 추가</button>
|
|
||||||
<button id="btnRemove${infoPrefix}s" onclick="remove${infoPrefix}s();" class="btn btn-primary">- 제거</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<table class="datatables-ajax table table-bordered dataTable no-footer" id="DataTables_Table_0" aria-describedby="DataTables_Table_0_info">
|
|
||||||
<thead>
|
|
||||||
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="text-align:center;"><input onchange="${infoPrefix}Control.groups.select(this.checked);" type="checkbox" class="form-check-input"></th>
|
|
||||||
<th class="sorting sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label="Full name: activate to sort column descending" style="">아이디</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Email: activate to sort column ascending" style="">이름</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Start date: activate to sort column ascending" style="">등록일자</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="${infoPrefix}List">
|
|
||||||
</tbody>
|
|
||||||
<template id="${infoPrefix}Row">
|
|
||||||
<tr data-key="{GRP_ID}">
|
|
||||||
<td style="text-align:center;"><input value="{GRP_ID}" onchange="${infoPrefix}Control.groups.select('{GRP_ID}', this.checked);" type="checkbox" class="form-check-input"></td>
|
|
||||||
<td onclick="${infoPrefix}Control.groups.setCurrent('{GRP_ID}')" ondblclick="${infoPrefix}Control.groups.getInfo({})">{GRP_ID}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.groups.setCurrent('{GRP_ID}')" ondblclick="${infoPrefix}Control.groups.getInfo({})">{GRP_NM}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.groups.setCurrent('{GRP_ID}')" ondblclick="${infoPrefix}Control.groups.getInfo({})">{REG_DT}</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
<template id="${infoPrefix}NotFound">
|
|
||||||
<tr class="odd">
|
|
||||||
<td valign="top" colspan="4" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
</table>
|
|
||||||
<div class="d-flex flex-row p-3 justify-content-between">
|
|
||||||
<label id="${infoPrefix}PagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
|
|
||||||
<ul id="${infoPrefix}Paging" class="pagination pagination-primary">
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div style="width:49%;">
|
|
||||||
<h5 class="mt-3">기능 URL</h5>
|
|
||||||
<div class="d-flex flex-row justify-content-end p-3">
|
|
||||||
<div>
|
|
||||||
<button id="btnAddActions" onclick="${infoPrefix}Control.addActions();" class="btn btn-primary">+ 추가</button>
|
|
||||||
<button id="btnRemoveActions" onclick="removeActions();" class="btn btn-primary">- 제거</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<table class="datatables-ajax table table-bordered dataTable no-footer" id="DataTables_Table_0" aria-describedby="DataTables_Table_0_info">
|
|
||||||
<thead>
|
|
||||||
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="text-align:center;"><input id="actionToggler" onchange="${infoPrefix}Control.actions.select(this.checked);" type="checkbox" class="form-check-input"></th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Email: activate to sort column ascending" style="">기능 URL</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Start date: activate to sort column ascending" style="">등록일자</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="actionList">
|
|
||||||
</tbody>
|
|
||||||
<template id="actionRow">
|
|
||||||
<tr data-key="{GRP_ID}-{ACTION}">
|
|
||||||
<td style="text-align:center;"><input value="{GRP_ID}-{ACTION}" onchange="${infoPrefix}Control.actions.select('{GRP_ID}-{ACTION}', this.checked);" type="checkbox" class="form-check-input"></td>
|
|
||||||
<td onclick="${infoPrefix}Control.actions.setCurrent('{GRP_ID}-{ACTION}')">{ACTION}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.actions.setCurrent('{GRP_ID}-{ACTION}">{REG_DT}</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
<template id="actionNotFound">
|
|
||||||
<tr class="odd">
|
|
||||||
<td valign="top" colspan="3" class="dataTables_empty text-center">기능 URL 정보를 찾지 못했습니다.</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
</table>
|
|
||||||
<div class="d-flex flex-row p-3 justify-content-between">
|
|
||||||
<label id="actionPagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
|
|
||||||
<ul id="actionPaging" class="pagination pagination-primary">
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!--/ Page Body -->
|
|
||||||
|
|
||||||
<hr class="my-5" />
|
|
||||||
</div>
|
|
||||||
<!-- / Content -->
|
|
||||||
|
|
||||||
<jsp:include page="/WEB-INF/jsp/include/bottom.jsp" />
|
|
||||||
|
|
||||||
<div class="content-backdrop fade"></div>
|
|
||||||
</div>
|
|
||||||
<!-- Content wrapper -->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script src="<c:url value="/resources/js/base/actionGroup.js"/>" type="text/javascript"></script>
|
|
||||||
<script>
|
|
||||||
let ${infoPrefix}Control = new ActionGroupControl();
|
|
||||||
|
|
||||||
function search${infoPrefix}s() {
|
|
||||||
${infoPrefix}Control.groups.query = {
|
|
||||||
by:$("#by").val(),
|
|
||||||
term:$("#term").val()
|
|
||||||
};
|
|
||||||
${infoPrefix}Control.groups.load(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function remove${infoPrefix}s() {
|
|
||||||
dialog.alert({
|
|
||||||
content:"선택한 ${prefixName} 정보를 제거하시겠습니까?",
|
|
||||||
onOK:() => {
|
|
||||||
${infoPrefix}Control.groups.remove();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeActions() {
|
|
||||||
dialog.alert({
|
|
||||||
content:"선택한 기능 URL을 삭제하시겠습니까?",
|
|
||||||
onOK:() => {
|
|
||||||
${infoPrefix}Control.removeActions();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function render${infoPrefix}List() {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.groups.dataset;
|
|
||||||
let empty = ${infoPrefix}List.empty;
|
|
||||||
|
|
||||||
let trs = empty ?
|
|
||||||
[document.getElementById("${infoPrefix}NotFound").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
|
|
||||||
${infoPrefix}List.inStrings(document.getElementById("${infoPrefix}Row").innerHTML); <%-- from template#${infoPrefix}Row --%>
|
|
||||||
$("#${infoPrefix}List").html(trs.join());
|
|
||||||
$("th input[type='checkbox']").prop("checked", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
${infoPrefix}Control.onGroupListChange = obj => {
|
|
||||||
render${infoPrefix}List();
|
|
||||||
|
|
||||||
$("#${infoPrefix}Paging").setPaging({
|
|
||||||
list:${infoPrefix}Control.groups.dataset,
|
|
||||||
prefix:${infoPrefix}Control.groups.prefix,
|
|
||||||
start:obj.${infoPrefix}Start,
|
|
||||||
totalSize:obj.${infoPrefix}Total,
|
|
||||||
fetchSize:obj.${infoPrefix}Fetch,
|
|
||||||
func:"${infoPrefix}Control.groups.load({index})"
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onCurrentGroupChange = item => {
|
|
||||||
$("#btnAddActions").prop("disabled", !item);
|
|
||||||
if (!item) return;
|
|
||||||
|
|
||||||
let key = item.data.GRP_ID;
|
|
||||||
$("#${infoPrefix}List").setCurrentRow(key);
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onGroupSelect = selected => {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.groups.dataset;
|
|
||||||
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
|
|
||||||
$("#${infoPrefix}List input[type='checkbox']").each(function() {
|
|
||||||
let checkbox = $(this);
|
|
||||||
checkbox.prop("checked", keys.includes(checkbox.val()));
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#btnRemove${infoPrefix}s").prop("disabled", keys.length < 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
${infoPrefix}Control.onActionListChange = obj => {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.actions.dataset;
|
|
||||||
let empty = ${infoPrefix}List.empty;
|
|
||||||
|
|
||||||
let trs = empty ?
|
|
||||||
[document.getElementById("actionNotFound").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
|
|
||||||
${infoPrefix}List.inStrings(document.getElementById("actionRow").innerHTML); <%-- from template#${infoPrefix}Row --%>
|
|
||||||
$("#actionList").html(trs.join());
|
|
||||||
$("#actionToggler").prop("checked", false);
|
|
||||||
|
|
||||||
$("#actionPaging").setPaging({
|
|
||||||
list:${infoPrefix}Control.actions.dataset,
|
|
||||||
prefix:${infoPrefix}Control.actions.prefix,
|
|
||||||
start:obj.actionStart,
|
|
||||||
totalSize:obj.actionTotal,
|
|
||||||
fetchSize:obj.actionFetch,
|
|
||||||
func:"${infoPrefix}Control.actions.load({index})"
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onCurrentActionChange = item => {
|
|
||||||
if (!item) return;
|
|
||||||
|
|
||||||
let data = item.data;
|
|
||||||
let key = data.GRP_ID + "-" + data.ACTION;
|
|
||||||
$("#actionList").setCurrentRow(key);
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onActionSelect = selected => {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.actions.dataset;
|
|
||||||
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
|
|
||||||
$("#actionList input[type='checkbox']").each(function() {
|
|
||||||
let checkbox = $(this);
|
|
||||||
checkbox.prop("checked", keys.includes(checkbox.val()));
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#btnRemoveActions").prop("disabled", keys.length < 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
$("#term").onEnterPress(search${infoPrefix}s);
|
|
||||||
|
|
||||||
$(function(){
|
|
||||||
${onload}
|
|
||||||
${infoPrefix}Control.groups.setData({
|
|
||||||
${infoPrefix}List:${groupList},
|
|
||||||
${infoPrefix}Start:${groupStart},
|
|
||||||
${infoPrefix}Fetch:${groupFetch},
|
|
||||||
${infoPrefix}Total:${groupTotal}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -1,121 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<c:set var="prefixName" scope="request">기능 그룹</c:set>
|
|
||||||
<!-- Page Body -->
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-datatable text-nowrap">
|
|
||||||
<div id="DataTables_Table_0_wrapper" class="dataTables_wrapper dt-bootstrap5 no-footer">
|
|
||||||
<div class="d-flex flex-row justify-content-between p-3">
|
|
||||||
<div>
|
|
||||||
<div class="input-group" id="DataTables_Table_0_length">
|
|
||||||
<select id="_groupBy" onchange="document.getElementById('_groupTerm').focus();" aria-controls="DataTables_Table_0" class="form-select">
|
|
||||||
<option value="${infoPrefix}Name">이름</option>
|
|
||||||
<option value="${infoPrefix}ID">아이디</option>
|
|
||||||
</select>
|
|
||||||
<input id="_groupTerm" autofocus type="text" placeholder="조회 조건을 입력하십시오." class="form-control">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<button onclick="search${infoPrefix}s();" class="btn btn-primary">찾기</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<table class="datatables-ajax table table-bordered dataTable no-footer" id="DataTables_Table_0" aria-describedby="DataTables_Table_0_info">
|
|
||||||
<thead>
|
|
||||||
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="text-align:center;"><input onchange="${infoPrefix}Control.groups.select(this.checked);" type="checkbox" class="form-check-input"></th>
|
|
||||||
<th class="sorting sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label="Full name: activate to sort column descending" style="">아이디</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Email: activate to sort column ascending" style="">이름</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Start date: activate to sort column ascending" style="">등록일자</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="${infoPrefix}List">
|
|
||||||
</tbody>
|
|
||||||
<template id="${infoPrefix}Row">
|
|
||||||
<tr data-key="{GRP_ID}">
|
|
||||||
<td style="text-align:center;"><input value="{GRP_ID}" onchange="${infoPrefix}Control.groups.select('{GRP_ID}', this.checked);" type="checkbox" class="form-check-input"></td>
|
|
||||||
<td onclick="${infoPrefix}Control.groups.setCurrent('{GRP_ID}')" ondblclick="${infoPrefix}Control.groups.getInfo({})">{GRP_ID}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.groups.setCurrent('{GRP_ID}')" ondblclick="${infoPrefix}Control.groups.getInfo({})">{GRP_NM}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.groups.setCurrent('{GRP_ID}')" ondblclick="${infoPrefix}Control.groups.getInfo({})">{REG_DT}</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
<template id="${infoPrefix}NotFound">
|
|
||||||
<tr class="odd">
|
|
||||||
<td valign="top" colspan="4" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
</table>
|
|
||||||
<div class="d-flex flex-row p-3 justify-content-between">
|
|
||||||
<label id="${infoPrefix}PagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
|
|
||||||
<ul id="${infoPrefix}Paging" class="pagination pagination-primary">
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!--/ Page Body -->
|
|
||||||
<script >
|
|
||||||
var ${infoPrefix}Control = new ActionGroupControl(false);
|
|
||||||
|
|
||||||
function getSelectedActionGroup() {
|
|
||||||
let selected = ${infoPrefix}Control.groups.dataset.getKeys("selected");
|
|
||||||
if (selected.length < 1)
|
|
||||||
return dialog.alert("기능그룹을 선택하십시오.");
|
|
||||||
else
|
|
||||||
return selected;
|
|
||||||
}
|
|
||||||
|
|
||||||
function search${infoPrefix}s() {
|
|
||||||
${infoPrefix}Control.groups.query = {
|
|
||||||
by:$("#_groupBy").val(),
|
|
||||||
term:$("#_groupTerm").val()
|
|
||||||
};
|
|
||||||
${infoPrefix}Control.groups.load(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
${infoPrefix}Control.onGroupListChange = obj => {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.groups.dataset;
|
|
||||||
let empty = ${infoPrefix}List.empty;
|
|
||||||
|
|
||||||
let trs = empty ?
|
|
||||||
[document.getElementById("${infoPrefix}NotFound").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
|
|
||||||
${infoPrefix}List.inStrings(document.getElementById("${infoPrefix}Row").innerHTML); <%-- from template#${infoPrefix}Row --%>
|
|
||||||
$("#${infoPrefix}List").html(trs.join());
|
|
||||||
$("th input[type='checkbox']").prop("checked", false);
|
|
||||||
|
|
||||||
$("#${infoPrefix}Paging").setPaging({
|
|
||||||
list:${infoPrefix}Control.groups.dataset,
|
|
||||||
prefix:${infoPrefix}Control.groups.prefix,
|
|
||||||
start:obj.${infoPrefix}Start,
|
|
||||||
totalSize:obj.${infoPrefix}Total,
|
|
||||||
fetchSize:obj.${infoPrefix}Fetch,
|
|
||||||
func:"${infoPrefix}Control.groups.load({index})"
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onCurrentGroupChange = item => {
|
|
||||||
if (!item) return;
|
|
||||||
|
|
||||||
let key = item.data.GRP_ID;
|
|
||||||
$("#${infoPrefix}List").setCurrentRow(key);
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onGroupSelect = selected => {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.groups.dataset;
|
|
||||||
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
|
|
||||||
$("#${infoPrefix}List input[type='checkbox']").each(function() {
|
|
||||||
let checkbox = $(this);
|
|
||||||
checkbox.prop("checked", keys.includes(checkbox.val()));
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
$("#_groupTerm").onEnterPress(search${infoPrefix}s);
|
|
||||||
|
|
||||||
$(function(){
|
|
||||||
${onload}
|
|
||||||
${infoPrefix}Control.groups.setData({
|
|
||||||
${infoPrefix}List:${groupList},
|
|
||||||
${infoPrefix}Start:${groupStart},
|
|
||||||
${infoPrefix}Fetch:${groupFetch},
|
|
||||||
${infoPrefix}Total:${groupTotal}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -1,91 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<div class="d-flex flex-row justify-content-end p-3">
|
|
||||||
<div>
|
|
||||||
<button id="btnAddActions" onclick="${infoPrefix}Control.addActions();" class="btn btn-primary">+ 추가</button>
|
|
||||||
<button id="btnRemoveActions" onclick="removeActions();" class="btn btn-primary">- 제거</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<table class="datatables-ajax table table-bordered dataTable no-footer" id="DataTables_Table_0" aria-describedby="DataTables_Table_0_info">
|
|
||||||
<thead>
|
|
||||||
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="text-align:center;"><input id="actionToggler" onchange="${infoPrefix}Control.actions.select(this.checked);" type="checkbox" class="form-check-input"></th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Email: activate to sort column ascending" style="">기능 그룹</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Start date: activate to sort column ascending" style="">등록일자</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="actionList">
|
|
||||||
</tbody>
|
|
||||||
<template id="actionRow">
|
|
||||||
<tr data-key="{AUTH_ID}-{GRP_ID}">
|
|
||||||
<td style="text-align:center;"><input value="{AUTH_ID}-{GRP_ID}" onchange="${infoPrefix}Control.actions.select('{AUTH_ID}-{GRP_ID}', this.checked);" type="checkbox" class="form-check-input"></td>
|
|
||||||
<td onclick="${infoPrefix}Control.actions.setCurrent('{AUTH_ID}-{GRP_ID}')">{GRP_ID}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.actions.setCurrent('{AUTH_ID}-{GRP_ID}">{REG_DT}</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
<template id="actionNotFound">
|
|
||||||
<tr class="odd">
|
|
||||||
<td valign="top" colspan="3" class="dataTables_empty text-center">기능 그룹 정보를 찾지 못했습니다.</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
<template id="adminActions">
|
|
||||||
<tr class="odd">
|
|
||||||
<td valign="top" colspan="3" class="dataTables_empty text-center">{authority}는 모든 기능을 사용할 수 있습니다.</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
</table>
|
|
||||||
<div class="d-flex flex-row p-3 justify-content-between">
|
|
||||||
<label id="actionPagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
|
|
||||||
<ul id="actionPaging" class="pagination pagination-primary">
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<c:set var="actionGroupFunc" scope="request">function removeActions() {
|
|
||||||
dialog.alert({
|
|
||||||
content:"선택한 기능그룹을 삭제하시겠습니까?",
|
|
||||||
onOK:() => {
|
|
||||||
${infoPrefix}Control.removeActions();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
${infoPrefix}Control.onActionListChange = obj => {
|
|
||||||
let authority = ${infoPrefix}Control.authorities.getCurrent();
|
|
||||||
authority = authority ? authority.AUTH_NM : "";
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.actions.dataset;
|
|
||||||
let empty = ${infoPrefix}List.empty;
|
|
||||||
|
|
||||||
let trs =
|
|
||||||
${infoPrefix}Control.authorities.isAdmin() ? [document.getElementById("adminActions").innerHTML.replace(/{authority}/, authority)] :
|
|
||||||
empty ?
|
|
||||||
[document.getElementById("actionNotFound").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
|
|
||||||
${infoPrefix}List.inStrings(document.getElementById("actionRow").innerHTML); <%-- from template#${infoPrefix}Row --%>
|
|
||||||
$("#actionList").html(trs.join());
|
|
||||||
$("#actionToggler").prop("checked", false);
|
|
||||||
|
|
||||||
$("#actionPaging").setPaging({
|
|
||||||
list:${infoPrefix}Control.actions.dataset,
|
|
||||||
prefix:${infoPrefix}Control.actions.prefix,
|
|
||||||
start:obj.actionStart,
|
|
||||||
totalSize:obj.actionTotal,
|
|
||||||
fetchSize:obj.actionFetch,
|
|
||||||
func:"${infoPrefix}Control.actions.load({index})"
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onCurrentActionChange = item => {
|
|
||||||
if (!item) return;
|
|
||||||
|
|
||||||
let data = item.data;
|
|
||||||
let key = data.AUTH_ID + "-" + data.GRP_ID;
|
|
||||||
$("#actionList").setCurrentRow(key);
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onActionSelect = selected => {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.actions.dataset;
|
|
||||||
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
|
|
||||||
$("#actionList input[type='checkbox']").each(function() {
|
|
||||||
let checkbox = $(this);
|
|
||||||
checkbox.prop("checked", keys.includes(checkbox.val()));
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#btnRemoveActions").prop("disabled", keys.length < 1);
|
|
||||||
};</c:set>
|
|
@ -1,82 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<form id="infoPrefix-form">
|
|
||||||
<div class="row g-3">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="id"
|
|
||||||
>아이디</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="id" type="text" required data-map="AUTH_ID" maxlength="50" class="form-control" placeholder="prefixName 아이디" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="name"
|
|
||||||
>이름</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="name" type="text" required data-map="AUTH_NM" maxlength="60" class="form-control" placeholder="prefixName 이름" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="description"
|
|
||||||
>설명</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="description" type="text" data-map="DSCRP" maxlength="200" class="form-control dob-picker" placeholder="prefixName 설명"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt-4 justify-content-end">
|
|
||||||
<div class="col-sm-12" style="text-align:right;">
|
|
||||||
<button id="btnSaveAuth" onclick="saveinfoPrefix();" type="button" class="btn btn-primary">저장</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<script type="text/javascript">
|
|
||||||
|
|
||||||
var infoPrefixFields = new FormFields("#infoPrefix-form");
|
|
||||||
|
|
||||||
infoPrefixControl.authorities.setInfo = obj => {
|
|
||||||
infoPrefixFields.set(obj);
|
|
||||||
let info = obj.data;
|
|
||||||
let create = isEmpty(info.AUTH_ID);
|
|
||||||
$("input[name='id']").prop("readonly", !create);
|
|
||||||
$("#infoPrefix-form input")
|
|
||||||
.change(function() {
|
|
||||||
let input = $(this),
|
|
||||||
name = input.attr("data-map"),
|
|
||||||
val = input.val();
|
|
||||||
infoPrefixControl.authorities.setValue(name, val);
|
|
||||||
})
|
|
||||||
.onEnterPress(saveinfoPrefix);
|
|
||||||
|
|
||||||
$("input[name='" + (create ? "id" : "name") + "']").focus();
|
|
||||||
$("#btnSaveAuth").prop("disabled", infoPrefixControl.authorities.isBuiltIn(info));
|
|
||||||
}
|
|
||||||
|
|
||||||
infoPrefixControl.authorities.onModify = (changed) => {
|
|
||||||
if (["AUTH_NM"].filter(e => changed.includes(e)).length < 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
renderinfoPrefixList();
|
|
||||||
infoPrefixControl.authorities.dataset.setState();
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveinfoPrefix() {
|
|
||||||
if (!$("#infoPrefix-form input").validInputs()) return;
|
|
||||||
|
|
||||||
dialog.alert({
|
|
||||||
content:"현재 prefixName 정보를 저장하시겠습니까?",
|
|
||||||
onOK:() => {
|
|
||||||
infoPrefixControl.authorities.save(infoPrefixFields.get());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
//# sourceURL=actionGroup-info.jsp
|
|
||||||
</script>
|
|
@ -1,187 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Content wrapper -->
|
|
||||||
<div class="content-wrapper">
|
|
||||||
<!-- Content -->
|
|
||||||
|
|
||||||
<div class="container-xxl flex-grow-1 container-p-y">
|
|
||||||
<%--h4 id="pageTitle" class="fw-bold py-3 mb-4">페이지 제목</h4--%>
|
|
||||||
<c:set var="prefixName" scope="request">권한</c:set>
|
|
||||||
<!-- Page Body -->
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-datatable text-nowrap">
|
|
||||||
<div id="DataTables_Table_0_wrapper" class="dataTables_wrapper dt-bootstrap5 no-footer">
|
|
||||||
|
|
||||||
<div class="d-flex flex-row justify-content-evenly">
|
|
||||||
<div style="width:49%;">
|
|
||||||
<h5 class="mt-3">권한</h5>
|
|
||||||
<div class="d-flex flex-row justify-content-between p-3">
|
|
||||||
<div>
|
|
||||||
<div class="input-group" id="DataTables_Table_0_length">
|
|
||||||
<select id="by" onchange="document.getElementById('term').focus();" aria-controls="DataTables_Table_0" class="form-select">
|
|
||||||
<option value="authName">이름</option>
|
|
||||||
<option value="authID">아이디</option>
|
|
||||||
</select>
|
|
||||||
<input id="term" autofocus type="text" placeholder="조회 조건을 입력하십시오." class="form-control">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<button onclick="search${infoPrefix}s();" class="btn btn-primary">찾기</button>
|
|
||||||
<button onclick="${infoPrefix}Control.authorities.newInfo();" class="btn btn-primary">+ 추가</button>
|
|
||||||
<button id="btnRemove${infoPrefix}s" onclick="remove${infoPrefix}s();" class="btn btn-primary">- 제거</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<table class="datatables-ajax table table-bordered dataTable no-footer" id="DataTables_Table_0" aria-describedby="DataTables_Table_0_info">
|
|
||||||
<thead>
|
|
||||||
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="text-align:center;"><input onchange="${infoPrefix}Control.authorities.select(this.checked);" type="checkbox" class="form-check-input"></th>
|
|
||||||
<th class="sorting sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label="Full name: activate to sort column descending" style="">아이디</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Email: activate to sort column ascending" style="">이름</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Start date: activate to sort column ascending" style="">등록일자</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="${infoPrefix}List">
|
|
||||||
</tbody>
|
|
||||||
<template id="${infoPrefix}Row">
|
|
||||||
<tr data-key="{AUTH_ID}">
|
|
||||||
<td style="text-align:center;"><input value="{AUTH_ID}" onchange="${infoPrefix}Control.authorities.select('{AUTH_ID}', this.checked);" type="checkbox" class="form-check-input"></td>
|
|
||||||
<td onclick="${infoPrefix}Control.authorities.setCurrent('{AUTH_ID}')" ondblclick="${infoPrefix}Control.authorities.getInfo({})">{AUTH_ID}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.authorities.setCurrent('{AUTH_ID}')" ondblclick="${infoPrefix}Control.authorities.getInfo({})">{AUTH_NM}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.authorities.setCurrent('{AUTH_ID}')" ondblclick="${infoPrefix}Control.authorities.getInfo({})">{REG_DT}</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
<template id="${infoPrefix}NotFound">
|
|
||||||
<tr class="odd">
|
|
||||||
<td valign="top" colspan="4" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
</table>
|
|
||||||
<div class="d-flex flex-row p-3 justify-content-between">
|
|
||||||
<label id="${infoPrefix}PagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
|
|
||||||
<ul id="${infoPrefix}Paging" class="pagination pagination-primary">
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div style="width:49%; padding-top:.25em;">
|
|
||||||
<div class="nav-align-top">
|
|
||||||
<ul class="nav nav-tabs" role="tablist">
|
|
||||||
<li class="nav-item">
|
|
||||||
<button type="button" onClick="${infoPrefix}Control.getLinkedList('users');" class="nav-link active" role="tab" data-bs-toggle="tab" data-bs-target="#navs-top-users" aria-controls="navs-top-users" aria-selected="true">사용자</button>
|
|
||||||
</li>
|
|
||||||
<li class="nav-item">
|
|
||||||
<button type="button" onClick="${infoPrefix}Control.getLinkedList('actions');" class="nav-link" role="tab" data-bs-toggle="tab" data-bs-target="#navs-top-actions" aria-controls="navs-top-actions" aria-selected="false">기능그룹</button>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<div class="tab-content" style="padding:.6em 0;">
|
|
||||||
<div class="tab-pane fade show active" id="navs-top-users" role="tabpanel">
|
|
||||||
<jsp:include page="user-list.jsp" />
|
|
||||||
</div>
|
|
||||||
<div class="tab-pane fade" id="navs-top-actions" role="tabpanel">
|
|
||||||
<jsp:include page="actionGroup-list.jsp" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!--/ Page Body -->
|
|
||||||
|
|
||||||
<hr class="my-5" />
|
|
||||||
</div>
|
|
||||||
<!-- / Content -->
|
|
||||||
|
|
||||||
<jsp:include page="/WEB-INF/jsp/include/bottom.jsp" />
|
|
||||||
|
|
||||||
<div class="content-backdrop fade"></div>
|
|
||||||
</div>
|
|
||||||
<!-- Content wrapper -->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script src="<c:url value="/resources/js/base/user.js?${ver}"/>"></script>
|
|
||||||
<script src="<c:url value="/resources/js/base/actionGroup.js?${ver}"/>"></script>
|
|
||||||
<script src="<c:url value="/resources/js/base/authority.js?${ver}"/>"></script>
|
|
||||||
<script>
|
|
||||||
let ${infoPrefix}Control = new AuthorityControl();
|
|
||||||
|
|
||||||
function search${infoPrefix}s() {
|
|
||||||
${infoPrefix}Control.authorities.query = {
|
|
||||||
by:$("#by").val(),
|
|
||||||
term:$("#term").val()
|
|
||||||
};
|
|
||||||
${infoPrefix}Control.authorities.load(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function remove${infoPrefix}s() {
|
|
||||||
dialog.alert({
|
|
||||||
content:"선택한 ${prefixName} 정보를 제거하시겠습니까?",
|
|
||||||
onOK:() => {
|
|
||||||
${infoPrefix}Control.removeAuthorities();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function render${infoPrefix}List() {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.authorities.dataset;
|
|
||||||
let empty = ${infoPrefix}List.empty;
|
|
||||||
|
|
||||||
let trs = empty ?
|
|
||||||
[document.getElementById("${infoPrefix}NotFound").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
|
|
||||||
${infoPrefix}List.inStrings(document.getElementById("${infoPrefix}Row").innerHTML); <%-- from template#${infoPrefix}Row --%>
|
|
||||||
$("#${infoPrefix}List").html(trs.join());
|
|
||||||
$("th input[type='checkbox']").prop("checked", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
${infoPrefix}Control.onAuthorityListChange = obj => {
|
|
||||||
render${infoPrefix}List();
|
|
||||||
|
|
||||||
$("#${infoPrefix}Paging").setPaging({
|
|
||||||
list:${infoPrefix}Control.authorities.dataset,
|
|
||||||
prefix:${infoPrefix}Control.authorities.prefix,
|
|
||||||
start:obj.${infoPrefix}Start,
|
|
||||||
totalSize:obj.${infoPrefix}Total,
|
|
||||||
fetchSize:obj.${infoPrefix}Fetch,
|
|
||||||
func:"${infoPrefix}Control.authorities.load({index})"
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onCurrentAuthorityChange = item => {
|
|
||||||
$("#btnAddActions").prop("disabled", !item || ${infoPrefix}Control.authorities.isAdmin(item.data));
|
|
||||||
$("#btnAddUsers").prop("disabled", !item || ${infoPrefix}Control.authorities.isImplicit(item.data));
|
|
||||||
if (!item) return;
|
|
||||||
|
|
||||||
let key = item.data.AUTH_ID;
|
|
||||||
$("#${infoPrefix}List").setCurrentRow(key);
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onAuthoritySelect = selected => {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.authorities.dataset;
|
|
||||||
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
|
|
||||||
$("#${infoPrefix}List input[type='checkbox']").each(function() {
|
|
||||||
let checkbox = $(this);
|
|
||||||
checkbox.prop("checked", keys.includes(checkbox.val()));
|
|
||||||
});
|
|
||||||
|
|
||||||
let builtIn = selected.filter(info => ${infoPrefix}Control.authorities.isBuiltIn(info)).length > 0;
|
|
||||||
|
|
||||||
$("#btnRemove${infoPrefix}s").prop("disabled", keys.length < 1 || builtIn);
|
|
||||||
};
|
|
||||||
|
|
||||||
${userFunc}
|
|
||||||
${actionGroupFunc}
|
|
||||||
|
|
||||||
$("#term").onEnterPress(search${infoPrefix}s);
|
|
||||||
|
|
||||||
$(function(){
|
|
||||||
${onload}
|
|
||||||
${infoPrefix}Control.authorities.setData({
|
|
||||||
${infoPrefix}List:${authorityList},
|
|
||||||
${infoPrefix}Start:${authorityStart},
|
|
||||||
${infoPrefix}Fetch:${authorityFetch},
|
|
||||||
${infoPrefix}Total:${authorityTotal}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -1,91 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<div class="d-flex flex-row justify-content-end p-3">
|
|
||||||
<div>
|
|
||||||
<button id="btnAddUsers" onclick="${infoPrefix}Control.addUsers();" class="btn btn-primary">+ 추가</button>
|
|
||||||
<button id="btnRemoveUsers" onclick="removeUsers();" class="btn btn-primary">- 제거</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<table class="datatables-ajax table table-bordered dataTable no-footer" id="DataTables_Table_0" aria-describedby="DataTables_Table_0_info">
|
|
||||||
<thead>
|
|
||||||
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="text-align:center;"><input id="userToggler" onchange="${infoPrefix}Control.users.select(this.checked);" type="checkbox" class="form-check-input"></th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Email: activate to sort column ascending" style="">사용자</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Start date: activate to sort column ascending" style="">등록일자</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="userList">
|
|
||||||
</tbody>
|
|
||||||
<template id="userRow">
|
|
||||||
<tr data-key="{AUTH_ID}-{USER_ID}">
|
|
||||||
<td style="text-align:center;"><input value="{AUTH_ID}-{USER_ID}" onchange="${infoPrefix}Control.users.select('{AUTH_ID}-{USER_ID}', this.checked);" type="checkbox" class="form-check-input"></td>
|
|
||||||
<td onclick="${infoPrefix}Control.users.setCurrent('{AUTH_ID}-{USER_ID}')">{USER_ACNT}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.users.setCurrent('{AUTH_ID}-{USER_ID}">{REG_DT}</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
<template id="userNotFound">
|
|
||||||
<tr class="odd">
|
|
||||||
<td valign="top" colspan="3" class="dataTables_empty text-center">사용자 정보를 찾지 못했습니다.</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
<template id="implicitActions">
|
|
||||||
<tr class="odd">
|
|
||||||
<td valign="top" colspan="3" class="dataTables_empty text-center">{authority}는 사용자를 지정하지 않습니다.</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
</table>
|
|
||||||
<div class="d-flex flex-row p-3 justify-content-between">
|
|
||||||
<label id="userPagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
|
|
||||||
<ul id="userPaging" class="pagination pagination-primary">
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<c:set var="userFunc" scope="request">
|
|
||||||
function removeUsers() {
|
|
||||||
dialog.alert({
|
|
||||||
content:"선택한 사용자를 삭제하시겠습니까?",
|
|
||||||
onOK:() => {
|
|
||||||
${infoPrefix}Control.removeUsers();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
${infoPrefix}Control.onUserListChange = obj => {
|
|
||||||
let authority = ${infoPrefix}Control.authorities.getCurrent();
|
|
||||||
authority = authority ? authority.AUTH_NM : "";
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.users.dataset;
|
|
||||||
let empty = ${infoPrefix}List.empty;
|
|
||||||
|
|
||||||
let trs =
|
|
||||||
${infoPrefix}Control.authorities.isImplicit() ? [document.getElementById("implicitActions").innerHTML.replace(/{authority}/, authority)] :
|
|
||||||
empty ? [document.getElementById("userNotFound").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
|
|
||||||
${infoPrefix}List.inStrings(document.getElementById("userRow").innerHTML); <%-- from template#${infoPrefix}Row --%>
|
|
||||||
$("#userList").html(trs.join());
|
|
||||||
$("#userToggler").prop("checked", false);
|
|
||||||
|
|
||||||
$("#userPaging").setPaging({
|
|
||||||
list:${infoPrefix}Control.users.dataset,
|
|
||||||
prefix:${infoPrefix}Control.users.prefix,
|
|
||||||
start:obj.userStart,
|
|
||||||
totalSize:obj.userTotal,
|
|
||||||
fetchSize:obj.userFetch,
|
|
||||||
func:"${infoPrefix}Control.users.load({index})"
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onCurrentUserChange = item => {
|
|
||||||
if (!item) return;
|
|
||||||
|
|
||||||
let data = item.data;
|
|
||||||
let key = data.AUTH_ID + "-" + data.USER_ID;
|
|
||||||
$("#userList").setCurrentRow(key);
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onUserSelect = selected => {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.users.dataset;
|
|
||||||
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
|
|
||||||
$("#userList input[type='checkbox']").each(function() {
|
|
||||||
let checkbox = $(this);
|
|
||||||
checkbox.prop("checked", keys.includes(checkbox.val()));
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#btnRemoveUsers").prop("disabled", keys.length < 1);
|
|
||||||
};</c:set>
|
|
@ -1,142 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<form id="code-form">
|
|
||||||
<div class="row g-3">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="code"
|
|
||||||
>코드</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="code" type="text" required data-map="CODE" maxlength="15" class="form-control" placeholder="코드" />
|
|
||||||
<input name="groupID" type="hidden" data-map="GRP_ID" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="value"
|
|
||||||
>코드값</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="value" type="text" required data-map="CODE_VAL" maxlength="60" class="form-control" placeholder="코드값" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="description"
|
|
||||||
>설명</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="description" type="text" data-map="DSCRP" maxlength="200" class="form-control" placeholder="코드 설명"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="etc1"
|
|
||||||
>기타값 1</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="etc1" type="text" data-map="ETC1" maxlength="200" class="form-control" placeholder="기타값 1"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="etc2"
|
|
||||||
>기타값2</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="etc2" type="text" data-map="ETC2" maxlength="200" class="form-control" placeholder="기타값 2"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="etc3"
|
|
||||||
>기타값3</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="etc3" type="text" data-map="ET3" maxlength="200" class="form-control" placeholder="기타값 3"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="createdBy"
|
|
||||||
>등록자</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input type="text" data-map="RGTR" readonly class="form-control" placeholder="등록자"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="description"
|
|
||||||
>등록일자</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input type="text" data-map="REG_DT" readonly class="form-control" placeholder="등록일자"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="description"
|
|
||||||
>사용여부</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10" style="padding:.5em .7em;">
|
|
||||||
<span id="codeInUse"></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt-4 justify-content-end">
|
|
||||||
<div class="col-sm-12" style="text-align:right;">
|
|
||||||
<button onclick="saveCode();" type="button" class="btn btn-primary">저장</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<script type="text/javascript">
|
|
||||||
|
|
||||||
var codeFields = new FormFields("#code-form");
|
|
||||||
|
|
||||||
codeControl.codes.setInfo = obj => {
|
|
||||||
let info = obj.data;
|
|
||||||
codeFields.set(obj);
|
|
||||||
let create = isEmpty(info.CODE);
|
|
||||||
$("input[name='code']").prop("readonly", !create);
|
|
||||||
$("#code-form input")
|
|
||||||
.change(function() {
|
|
||||||
let input = $(this),
|
|
||||||
name = input.attr("data-map"),
|
|
||||||
val = input.val();
|
|
||||||
codeControl.codes.setValue(name, val);
|
|
||||||
})
|
|
||||||
.onEnterPress(saveCode);
|
|
||||||
$("#codeInUse").html("Y" == info.USE_YN ? "사용 중" : "사용하지 않음");
|
|
||||||
document.querySelector("input[name='" + (create ? "code" : "value") + "']").focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
codeControl.codes.onModify = (changed) => {
|
|
||||||
if (["CODE", "CODE_VAL"].filter(e => changed.includes(e)).length < 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
renderCodeList();
|
|
||||||
codeControl.codes.dataset.setState();
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveCode() {
|
|
||||||
if (!$("#code-form input").validInputs()) return;
|
|
||||||
|
|
||||||
dialog.alert({
|
|
||||||
content:"현재 코드 정보를 저장하시겠습니까?",
|
|
||||||
onOK:() => {
|
|
||||||
codeControl.codes.save(codeFields.get());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
//# sourceURL=code-info.jsp
|
|
||||||
</script>
|
|
@ -1,249 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Content wrapper -->
|
|
||||||
<div class="content-wrapper">
|
|
||||||
<!-- Content -->
|
|
||||||
|
|
||||||
<div class="container-xxl flex-grow-1 container-p-y">
|
|
||||||
<%--h4 id="pageTitle" class="fw-bold py-3 mb-4">페이지 제목</h4--%>
|
|
||||||
<c:set var="prefixName" scope="request">코드 그룹</c:set>
|
|
||||||
<!-- Page Body -->
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-datatable text-nowrap">
|
|
||||||
<div id="DataTables_Table_0_wrapper" class="dataTables_wrapper dt-bootstrap5 no-footer">
|
|
||||||
|
|
||||||
<div class="d-flex flex-row justify-content-evenly">
|
|
||||||
<div style="width:49%;">
|
|
||||||
<h5 class="mt-3">${prefixName}</h5>
|
|
||||||
<div class="d-flex flex-row justify-content-between p-3">
|
|
||||||
<%--div>
|
|
||||||
<div class="input-group" id="DataTables_Table_0_length">
|
|
||||||
<select id="by" onchange="document.getElementById('term').focus();" aria-controls="DataTables_Table_0" class="form-select">
|
|
||||||
<option value="groupName">이름</option>
|
|
||||||
<option value="groupID">아이디</option>
|
|
||||||
</select>
|
|
||||||
<input id="term" autofocus type="text" placeholder="조회 조건을 입력하십시오." class="form-control">
|
|
||||||
</div>
|
|
||||||
</div--%>
|
|
||||||
<div>
|
|
||||||
<%--button onclick="searchGroups();" class="btn btn-primary">찾기</button--%>
|
|
||||||
<button onclick="codeControl.groups.newInfo();" class="btn btn-primary">+ 추가</button>
|
|
||||||
<button id="btnRemoveGroups" onclick="removeGroups();" class="btn btn-primary">- 제거</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<table class="datatables-ajax table table-bordered dataTable no-footer" id="DataTables_Table_0" aria-describedby="DataTables_Table_0_info">
|
|
||||||
<thead>
|
|
||||||
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="text-align:center;"><input onchange="codeControl.groups.select(this.checked);" type="checkbox" class="form-check-input"></th>
|
|
||||||
<th class="sorting sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label="Full name: activate to sort column descending">아이디</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Email: activate to sort column ascending">이름</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Start date: activate to sort column ascending">등록일자</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="groupList">
|
|
||||||
</tbody>
|
|
||||||
<template id="groupRow">
|
|
||||||
<tr data-key="{GRP_ID}">
|
|
||||||
<td style="text-align:center;"><input value="{GRP_ID}" onchange="codeControl.groups.select('{GRP_ID}', this.checked);" type="checkbox" class="form-check-input"></td>
|
|
||||||
<td onclick="codeControl.groups.setCurrent('{GRP_ID}')" ondblclick="codeControl.groups.getInfo({})">{GRP_ID}</td>
|
|
||||||
<td onclick="codeControl.groups.setCurrent('{GRP_ID}')" ondblclick="codeControl.groups.getInfo({})">{GRP_NM}</td>
|
|
||||||
<td onclick="codeControl.groups.setCurrent('{GRP_ID}')" ondblclick="codeControl.groups.getInfo({})">{REG_DT}</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
<template id="groupNotFound">
|
|
||||||
<tr class="odd">
|
|
||||||
<td valign="top" colspan="4" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
</table>
|
|
||||||
<div class="d-flex flex-row p-3 justify-content-between">
|
|
||||||
<label id="groupPagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
|
|
||||||
<ul id="groupPaging" class="pagination pagination-primary">
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div style="width:49%;">
|
|
||||||
<h5 class="mt-3">공통 코드</h5>
|
|
||||||
<div class="d-flex flex-row justify-content-end p-3">
|
|
||||||
<div>
|
|
||||||
<button id="btnAddCode" onclick="codeControl.newCode();" class="btn btn-primary">+ 추가</button>
|
|
||||||
<button id="btnRemoveCodes" onclick="removeCodes();" class="btn btn-primary">- 제거</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<table class="datatables-ajax table table-bordered dataTable no-footer" id="DataTables_Table_0" aria-describedby="DataTables_Table_0_info">
|
|
||||||
<thead>
|
|
||||||
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="text-align:center;"><input id="codeToggler" onchange="codeControl.codes.select(this.checked);" type="checkbox" class="form-check-input"></th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Email: activate to sort column ascending">코드</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Email: activate to sort column ascending">코드값</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Start date: activate to sort column ascending">등록일자</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="codeList">
|
|
||||||
</tbody>
|
|
||||||
<template id="codeRow">
|
|
||||||
<tr data-key="{CODE}">
|
|
||||||
<td style="text-align:center;"><input value="{CODE}" onchange="codeControl.codes.select('{CODE}', this.checked);" type="checkbox" class="form-check-input"></td>
|
|
||||||
<td onclick="codeControl.codes.setCurrent('{CODE}')" ondblclick="codeControl.codes.getInfo({})">{CODE}</td>
|
|
||||||
<td onclick="codeControl.codes.setCurrent('{CODE}')" ondblclick="codeControl.codes.getInfo({})">{CODE_VAL}</td>
|
|
||||||
<td onclick="codeControl.codes.setCurrent('{CODE}')" ondblclick="codeControl.codes.getInfo({})">{REG_DT}</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
<template id="codeNotFound">
|
|
||||||
<tr class="odd">
|
|
||||||
<td valign="top" colspan="4" class="dataTables_empty text-center">코드 정보를 찾지 못했습니다.</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
</table>
|
|
||||||
<div class="d-flex flex-row p-3 justify-content-between">
|
|
||||||
<label id="codePagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
|
|
||||||
<ul id="codePaging" class="pagination pagination-primary">
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!--/ Page Body -->
|
|
||||||
|
|
||||||
<hr class="my-5" />
|
|
||||||
</div>
|
|
||||||
<!-- / Content -->
|
|
||||||
|
|
||||||
<jsp:include page="/WEB-INF/jsp/include/bottom.jsp" />
|
|
||||||
|
|
||||||
<div class="content-backdrop fade"></div>
|
|
||||||
</div>
|
|
||||||
<!-- Content wrapper -->
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script src="<c:url value="/resources/js/base/code.js"/>?${ver}"></script>
|
|
||||||
<script>
|
|
||||||
let codeControl = new CodeControl();
|
|
||||||
|
|
||||||
function searchGroups() {
|
|
||||||
codeControl.groups.query = {
|
|
||||||
by:$("#by").val(),
|
|
||||||
term:$("#term").val()
|
|
||||||
};
|
|
||||||
codeControl.groups.load(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeGroups() {
|
|
||||||
dialog.alert({
|
|
||||||
content:"선택한 ${prefixName} 정보를 제거하시겠습니까?",
|
|
||||||
onOK:() => {
|
|
||||||
codeControl.groups.remove();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeCodes() {
|
|
||||||
dialog.alert({
|
|
||||||
content:"선택한 코드를 삭제하시겠습니까?",
|
|
||||||
onOK:() => {
|
|
||||||
codeControl.removeCodes();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function renderGroupList() {
|
|
||||||
let groupList = codeControl.groups.dataset;
|
|
||||||
let empty = groupList.empty;
|
|
||||||
|
|
||||||
let trs = empty ?
|
|
||||||
[document.getElementById("groupNotFound").innerHTML] : <%-- from template#groupNotFound --%>
|
|
||||||
groupList.inStrings(document.getElementById("groupRow").innerHTML); <%-- from template#groupRow --%>
|
|
||||||
$("#groupList").html(trs.join());
|
|
||||||
$("th input[type='checkbox']").prop("checked", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
codeControl.onGroupListChange = obj => {
|
|
||||||
renderGroupList();
|
|
||||||
|
|
||||||
$("#groupPaging").setPaging({
|
|
||||||
list:codeControl.groups.dataset,
|
|
||||||
prefix:codeControl.groups.prefix,
|
|
||||||
start:obj.groupStart,
|
|
||||||
totalSize:obj.groupTotal,
|
|
||||||
fetchSize:obj.groupFetch,
|
|
||||||
func:"codeControl.groups.load({index})"
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
codeControl.onCurrentGroupChange = item => {
|
|
||||||
$("#btnAddCode").prop("disabled", !item);
|
|
||||||
if (!item) return;
|
|
||||||
|
|
||||||
let key = item.data.GRP_ID;
|
|
||||||
$("#groupList").setCurrentRow(key);
|
|
||||||
};
|
|
||||||
|
|
||||||
codeControl.onGroupSelect = selected => {
|
|
||||||
let groupList = codeControl.groups.dataset;
|
|
||||||
let keys = selected.map(e => groupList.getKey(e));
|
|
||||||
$("#groupList input[type='checkbox']").each(function() {
|
|
||||||
let checkbox = $(this);
|
|
||||||
checkbox.prop("checked", keys.includes(checkbox.val()));
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#btnRemoveGroups").prop("disabled", keys.length < 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
function renderCodeList() {
|
|
||||||
let codeList = codeControl.codes.dataset;
|
|
||||||
let empty = codeList.empty;
|
|
||||||
|
|
||||||
let trs = empty ?
|
|
||||||
[document.getElementById("codeNotFound").innerHTML] : <%-- from template#groupNotFound --%>
|
|
||||||
codeList.inStrings(document.getElementById("codeRow").innerHTML); <%-- from template#groupRow --%>
|
|
||||||
$("#codeList").html(trs.join());
|
|
||||||
$("#codeToggler").prop("checked", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
codeControl.onCodeListChange = obj => {
|
|
||||||
renderCodeList();
|
|
||||||
|
|
||||||
$("#codePaging").setPaging({
|
|
||||||
list:codeControl.codes.dataset,
|
|
||||||
prefix:codeControl.codes.prefix,
|
|
||||||
start:obj.codeStart,
|
|
||||||
totalSize:obj.codeTotal,
|
|
||||||
fetchSize:obj.codeFetch,
|
|
||||||
func:"codeControl.codes.load({index})"
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
codeControl.onCurrentCodeChange = item => {
|
|
||||||
if (!item) return;
|
|
||||||
|
|
||||||
let data = item.data;
|
|
||||||
let key = data.CODE;
|
|
||||||
$("#codeList").setCurrentRow(key);
|
|
||||||
};
|
|
||||||
|
|
||||||
codeControl.onCodeSelect = selected => {
|
|
||||||
let codeList = codeControl.codes.dataset;
|
|
||||||
let keys = selected.map(e => codeList.getKey(e));
|
|
||||||
$("#codeList input[type='checkbox']").each(function() {
|
|
||||||
let checkbox = $(this);
|
|
||||||
checkbox.prop("checked", keys.includes(checkbox.val()));
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#btnRemoveCodes").prop("disabled", selected.length < 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
$("#term").onEnterPress(searchGroups);
|
|
||||||
|
|
||||||
$(function(){
|
|
||||||
${onload}
|
|
||||||
codeControl.groups.setData({
|
|
||||||
groupList:${groupList},
|
|
||||||
groupStart:${groupStart},
|
|
||||||
groupFetch:${groupFetch},
|
|
||||||
groupTotal:${groupTotal}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -1,112 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<form id="group-form">
|
|
||||||
<div class="row g-3">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="id"
|
|
||||||
>아이디</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="id" type="text" required data-map="GRP_ID" maxlength="50" class="form-control" placeholder="그룹 아이디" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="name"
|
|
||||||
>이름</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="name" type="text" required data-map="GRP_NM" maxlength="60" class="form-control" placeholder="그룹 이름" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="description"
|
|
||||||
>설명</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="description" type="text" data-map="DSCRP" maxlength="200" class="form-control" placeholder="그룹 설명"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="createdBy"
|
|
||||||
>등록자</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input type="text" data-map="RGTR" readonly class="form-control" placeholder="등록자"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="description"
|
|
||||||
>등록일자</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input type="text" data-map="REG_DT" readonly class="form-control" placeholder="등록일자"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="description"
|
|
||||||
>사용여부</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10" style="padding:.5em .7em;">
|
|
||||||
<span id="groupInUse"></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt-4 justify-content-end">
|
|
||||||
<div class="col-sm-12" style="text-align:right;">
|
|
||||||
<button onclick="saveGroup();" type="button" class="btn btn-primary">저장</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<script type="text/javascript">
|
|
||||||
|
|
||||||
var groupFields = new FormFields("#group-form");
|
|
||||||
|
|
||||||
codeControl.groups.setInfo = obj => {
|
|
||||||
let info = obj.data;
|
|
||||||
groupFields.set(obj);
|
|
||||||
let create = isEmpty(info.GRP_ID);
|
|
||||||
$("input[name='id']").prop("readonly", !create);
|
|
||||||
$("#group-form input")
|
|
||||||
.change(function() {
|
|
||||||
let input = $(this),
|
|
||||||
name = input.attr("data-map"),
|
|
||||||
val = input.val();
|
|
||||||
codeControl.groups.setValue(name, val);
|
|
||||||
})
|
|
||||||
.onEnterPress(saveGroup);
|
|
||||||
$("#groupInUse").html(create ? "" : info.USE_YN == "Y" ? "사용 중" : "사용하지 않음");
|
|
||||||
|
|
||||||
document.querySelector("input[name='" + (create ? "id" : "name") + "']").focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
codeControl.groups.onModify = (changed) => {
|
|
||||||
if (["GRP_NM"].filter(e => changed.includes(e)).length < 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
renderGroupList();
|
|
||||||
codeControl.groups.dataset.setState();
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveGroup() {
|
|
||||||
if (!$("#group-form input").validInputs()) return;
|
|
||||||
|
|
||||||
dialog.alert({
|
|
||||||
content:"현재 그룹 정보를 저장하시겠습니까?",
|
|
||||||
onOK:() => {
|
|
||||||
codeControl.groups.save(groupFields.get());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
//# sourceURL=group-info.jsp
|
|
||||||
</script>
|
|
@ -1,108 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<form id="menu-form">
|
|
||||||
<div class="row g-3">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="id"
|
|
||||||
>아이디</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="id" type="text" readonly maxlength="50" class="form-control" placeholder="저장하시면 시스템이 부여합니다." />
|
|
||||||
<input name="parentID" type="hidden" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="name"
|
|
||||||
>이름</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="name" type="text" required maxlength="60" class="form-control" placeholder="메뉴 이름" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="action"
|
|
||||||
>URL</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10 input-group" style="width:83.3%;">
|
|
||||||
<span id="btnSelectURL" onClick="setURL();" class="input-group-text"><i class="bx bx-search"></i></span>
|
|
||||||
<input name="action" type="text" maxlength="60" class="form-control" placeholder="URL" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="description"
|
|
||||||
>설명</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="description" type="text" maxlength="200" class="form-control" placeholder="메뉴 설명"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="imageName"
|
|
||||||
>이미지 이름</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="imageName" type="text" maxlength="200" class="form-control" placeholder="이미지 이름"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-2 col-form-label text-sm-end" for="imageConf"
|
|
||||||
>이미지 설정</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input name="imageConf" type="text" maxlength="200" class="form-control" placeholder="이미지 설정"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt-4 justify-content-end">
|
|
||||||
<div class="col-sm-12" style="text-align:right;">
|
|
||||||
<button id="btnSaveAuth" onclick="saveMenu();" type="button" class="btn btn-primary">저장</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<c:set var="menuFunc" scope="request">
|
|
||||||
var menuFields = new FormFields("#menu-form");
|
|
||||||
|
|
||||||
menuControl.setInfo = obj => {
|
|
||||||
menuFields.set(obj);
|
|
||||||
$("input[name='name']").focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
menuControl.onModify = (changed) => {
|
|
||||||
if (["name", "url"].filter(e => changed.includes(e)).length < 1)
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function setURL() {
|
|
||||||
let url = await selectURL(false);
|
|
||||||
$("input[name='action']").val(url).change();
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveMenu() {
|
|
||||||
if (!$("#menu-form input").validInputs()) return;
|
|
||||||
|
|
||||||
dialog.alert({
|
|
||||||
content:"현재 메뉴 정보를 저장하시겠습니까?",
|
|
||||||
onOK:() => menuControl.save(menuFields.get())
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
$("#menu-form input")
|
|
||||||
.change(function() {
|
|
||||||
let input = $(this),
|
|
||||||
name = input.attr("name"),
|
|
||||||
val = input.val();
|
|
||||||
menuControl.setValue(name, val);
|
|
||||||
})
|
|
||||||
.onEnterPress(() => saveMenu());
|
|
||||||
</c:set>
|
|
@ -1,157 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<!-- inner page css -->
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/3rd-party/sneat/libs/jstree/jstree.css"/>" />
|
|
||||||
<!-- inner page html -->
|
|
||||||
<div class="content-wrapper">
|
|
||||||
<!-- Content -->
|
|
||||||
|
|
||||||
<div class="container-xxl flex-grow-1 container-p-y">
|
|
||||||
<%--h4 id="pageTitle" class="fw-bold py-3 mb-4">페이지 제목</h4--%>
|
|
||||||
<c:set var="prefixName" scope="request">메뉴</c:set>
|
|
||||||
<!-- Page Body -->
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-datatable text-nowrap">
|
|
||||||
<div id="DataTables_Table_0_wrapper" class="dataTables_wrapper dt-bootstrap5 no-footer">
|
|
||||||
|
|
||||||
<div class="d-flex flex-row justify-content-evenly">
|
|
||||||
|
|
||||||
<div style="width:49%;">
|
|
||||||
<h5 class="mt-3">레이아웃</h5>
|
|
||||||
<div id="menu-tree" class="main-left d-flex flex-column flex-grow-1">
|
|
||||||
<div class="d-flex justify-content-between" style="padding-top:.5em; padding-bottom:.5em; border-top:1px solid #dfdfdf; border-bottom:1px solid #dfdfdf;">
|
|
||||||
<span>
|
|
||||||
<button id="menuToggler" onclick="toggleMenus();" class="btn btn-primary"></button>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div id="menuTree" style="padding-top:1em; min-height:26em; overflow:auto;">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div style="width:49%;">
|
|
||||||
<h5 class="mt-3">등록 정보</h5>
|
|
||||||
<div class="d-flex flex-row justify-content-end p-3">
|
|
||||||
<div>
|
|
||||||
<button id="btnRemoveMenus" onclick="removeMenus();" class="btn btn-primary">- 제거</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<jsp:include page="menu-info.jsp" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- Page Body -->
|
|
||||||
|
|
||||||
<hr class="my-5" />
|
|
||||||
</div>
|
|
||||||
<!-- / Content -->
|
|
||||||
|
|
||||||
<jsp:include page="/WEB-INF/jsp/include/bottom.jsp" />
|
|
||||||
|
|
||||||
<div class="content-backdrop fade"></div>
|
|
||||||
</div>
|
|
||||||
<!-- inner page js -->
|
|
||||||
<script src="<c:url value="/resources/3rd-party/sneat/libs/jstree/jstree.js"/>"></script>
|
|
||||||
<script src="<c:url value="/resources/3rd-party/jstree/jstree-support.js"/>"></script>
|
|
||||||
<script src="<c:url value="/resources/js/base/menu.js"/>?${ver}"></script>
|
|
||||||
<script>
|
|
||||||
var menuBranches = treeSupport({
|
|
||||||
selector:"#menuTree",
|
|
||||||
trace:wctx.trace,
|
|
||||||
plugins: ["checkbox", "contextmenu", "dnd"] ,
|
|
||||||
core:{check_callback:true,
|
|
||||||
multiple:false
|
|
||||||
},
|
|
||||||
checkbox:{
|
|
||||||
whole_node:false,
|
|
||||||
tie_selection:false
|
|
||||||
},
|
|
||||||
contextmenu:{items:{
|
|
||||||
newMenu:{label:"메뉴 추가", action:function(obj){
|
|
||||||
var current = menuControl.getCurrent(),
|
|
||||||
parentID = current.parentID;
|
|
||||||
menuControl.newInfo({parentID:parentID});
|
|
||||||
$("input[name='parentID']").val(parentID);
|
|
||||||
}},
|
|
||||||
newChildMenu:{label:"하위메뉴 추가", action:function(obj){
|
|
||||||
var current = menuControl.getCurrent(),
|
|
||||||
parentID = current.id;
|
|
||||||
menuControl.newInfo({parentID:parentID});
|
|
||||||
$("input[name='parentID']").val(parentID);
|
|
||||||
log("current", menuControl.getCurrent());
|
|
||||||
}},
|
|
||||||
}},
|
|
||||||
onNodeSelect:function(obj) {
|
|
||||||
var key = obj[0];
|
|
||||||
menuControl.setCurrent(key);
|
|
||||||
},
|
|
||||||
onNodeMove:function(obj) {
|
|
||||||
var parentID = obj.parent,
|
|
||||||
menuID = obj.node.id;
|
|
||||||
if (parentID == "#")
|
|
||||||
parentID = null;
|
|
||||||
menuControl.move(parentID, menuID);
|
|
||||||
},
|
|
||||||
onNodeReorder:function(obj) {
|
|
||||||
var parentID = obj.parent,
|
|
||||||
menuID = obj.node.id,
|
|
||||||
menuIDs = menuBranches.getChildIDs(parentID);
|
|
||||||
menuControl.reorder(menuIDs);
|
|
||||||
},
|
|
||||||
onNodeCheck:function(obj) {
|
|
||||||
var checked = obj.checked,
|
|
||||||
menuID = obj.node.id;
|
|
||||||
menuControl.select(menuID, checked);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function toggleMenus() {
|
|
||||||
$("#menuToggler").text(menuBranches.toggleFolding() == "collapsed" ? "+ 펼치기" : "- 닫기");
|
|
||||||
}
|
|
||||||
|
|
||||||
let menuControl = new MenuControl();
|
|
||||||
|
|
||||||
menuControl.onDatasetChange = obj => {
|
|
||||||
menuBranches.setData(treeHtml(menuControl.menus, {
|
|
||||||
id:function(e){return e.id;},
|
|
||||||
text:function(e){
|
|
||||||
return e.name == e.url ? e.name : e.name + (e.url ? " (" + e.url + ")" : "");
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
$("#btnSelectURL").prop("disabled", menuControl.dataset.empty);
|
|
||||||
}
|
|
||||||
|
|
||||||
menuControl.onCurrentChange = item => {
|
|
||||||
menuControl.setInfo(item.data);
|
|
||||||
menuBranches.selectNode(item.data.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
menuControl.onSelectionChange = selected => {
|
|
||||||
$("#btnRemoveMenus").prop("disabled", selected.length < 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
menuControl.onMenusChanged = () => loadUserMenus();
|
|
||||||
|
|
||||||
${menuFunc}
|
|
||||||
|
|
||||||
async function loadUserMenus() {
|
|
||||||
let userMenus = await menuControl.getUserMenus();
|
|
||||||
setUserMenus(userMenus);
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeMenus() {
|
|
||||||
dialog.alert({
|
|
||||||
content:"선택한 메뉴 정보를 삭제하시겠습니까?",
|
|
||||||
onOK:() => menuControl.remove()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
$(function(){
|
|
||||||
${onload}
|
|
||||||
$("#menuToggler").text(menuBranches._folding == "collapsed" ? "+ 펼치기" : "- 닫기");
|
|
||||||
menuControl.setData(${menus});
|
|
||||||
menuBranches.open();
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -1,122 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<c:set var="prefixName" scope="request">사용자</c:set>
|
|
||||||
<!-- Page Body -->
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-datatable text-nowrap">
|
|
||||||
<div id="DataTables_Table_0_wrapper" class="dataTables_wrapper dt-bootstrap5 no-footer">
|
|
||||||
<div class="d-flex flex-row justify-content-between p-3">
|
|
||||||
<div>
|
|
||||||
<div class="input-group" id="DataTables_Table_0_length">
|
|
||||||
<select id="_userBy" onchange="document.getElementById('_userTerm').focus();" aria-controls="DataTables_Table_0" class="form-select">
|
|
||||||
<option value="${infoPrefix}Name">이름</option>
|
|
||||||
<option value="${infoPrefix}ID">아이디</option>
|
|
||||||
</select>
|
|
||||||
<input id="_userTerm" autofocus type="text" placeholder="조회 조건을 입력하십시오." class="form-control">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<button onclick="search${infoPrefix}s();" class="btn btn-primary">찾기</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<table class="datatables-ajax table table-bordered dataTable no-footer" id="DataTables_Table_0" aria-describedby="DataTables_Table_0_info">
|
|
||||||
<thead>
|
|
||||||
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="text-align:center;"><input onchange="${infoPrefix}Control.dataset.select(this.checked);" type="checkbox" class="form-check-input"></th>
|
|
||||||
<th class="sorting sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label="Full name: activate to sort column descending" style="">아이디</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Email: activate to sort column ascending" style="">이름</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Start date: activate to sort column ascending" style="">등록일자</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="_${infoPrefix}List">
|
|
||||||
</tbody>
|
|
||||||
<template id="_${infoPrefix}Row">
|
|
||||||
<tr data-key="{USER_ID}">
|
|
||||||
<td style="text-align:center;"><input value="{USER_ID}" onchange="${infoPrefix}Control.dataset.select('{USER_ID}', this.checked);" type="checkbox" class="form-check-input"></td>
|
|
||||||
<td onclick="${infoPrefix}Control.setCurrent('{USER_ID}')" ondblclick="${infoPrefix}Control.getInfo({})">{USER_ID}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.setCurrent('{USER_ID}')" ondblclick="${infoPrefix}Control.getInfo({})">{USER_NM}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.setCurrent('{USER_ID}')" ondblclick="${infoPrefix}Control.getInfo({})">{REG_DT}</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
<template id="_${infoPrefix}NotFound">
|
|
||||||
<tr class="odd">
|
|
||||||
<td valign="top" colspan="4" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
</table>
|
|
||||||
<div class="d-flex flex-row p-3 justify-content-between">
|
|
||||||
<label id="_${infoPrefix}PagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
|
|
||||||
<ul id="_${infoPrefix}Paging" class="pagination pagination-primary">
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!--/ Page Body -->
|
|
||||||
<script >
|
|
||||||
var ${infoPrefix}Control = new UserControl();
|
|
||||||
|
|
||||||
function getSelectedUser() {
|
|
||||||
let selected = ${infoPrefix}Control.dataset.getKeys("selected");
|
|
||||||
if (selected.length < 1)
|
|
||||||
return dialog.alert("사용자를 선택하십시오.");
|
|
||||||
else
|
|
||||||
return selected;
|
|
||||||
}
|
|
||||||
|
|
||||||
function search${infoPrefix}s() {
|
|
||||||
${infoPrefix}Control.query = {
|
|
||||||
by:$("#_userBy").val(),
|
|
||||||
term:$("#_userTerm").val()
|
|
||||||
};
|
|
||||||
${infoPrefix}Control.load(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
${infoPrefix}Control.onDatasetChange = obj => {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.dataset;
|
|
||||||
let empty = ${infoPrefix}List.empty;
|
|
||||||
|
|
||||||
let trs = empty ?
|
|
||||||
[document.getElementById("_${infoPrefix}NotFound").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
|
|
||||||
${infoPrefix}List.inStrings(document.getElementById("_${infoPrefix}Row").innerHTML); <%-- from template#${infoPrefix}Row --%>
|
|
||||||
$("#_${infoPrefix}List").html(trs.join());
|
|
||||||
$("th input[type='checkbox']").prop("checked", false);
|
|
||||||
|
|
||||||
$("#_${infoPrefix}Paging").setPaging({
|
|
||||||
list:${infoPrefix}Control.dataset,
|
|
||||||
prefix:${infoPrefix}Control.prefix,
|
|
||||||
start:obj.${infoPrefix}Start,
|
|
||||||
totalSize:obj.${infoPrefix}Total,
|
|
||||||
fetchSize:obj.${infoPrefix}Fetch,
|
|
||||||
func:"${infoPrefix}Control.load({index})"
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onCurrentChange = item => {
|
|
||||||
if (!item) return;
|
|
||||||
|
|
||||||
let key = item.data.USER_ID;
|
|
||||||
$("#_${infoPrefix}List").setCurrentRow(key);
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onSelectionChange = selected => {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.dataset;
|
|
||||||
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
|
|
||||||
$("#_${infoPrefix}List input[type='checkbox']").each(function() {
|
|
||||||
let checkbox = $(this);
|
|
||||||
checkbox.prop("checked", keys.includes(checkbox.val()));
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
$("#_userTerm").onEnterPress(search${infoPrefix}s);
|
|
||||||
|
|
||||||
$(function(){
|
|
||||||
${onload}
|
|
||||||
${infoPrefix}Control.setData({
|
|
||||||
${infoPrefix}List:${userList},
|
|
||||||
${infoPrefix}Start:${userStart},
|
|
||||||
${infoPrefix}Fetch:${userFetch},
|
|
||||||
${infoPrefix}Total:${userTotal}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
//# sourceURL=select-user.jsp
|
|
||||||
</script>
|
|
@ -1,200 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<form id="infoPrefix-form">
|
|
||||||
<div class="row g-3">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-3 col-form-label text-sm-end" for="account"
|
|
||||||
>계정</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<input name="id" type="hidden" data-map="USER_ID" />
|
|
||||||
<input name="institute" type="hidden" data-map="NSTT_CD" />
|
|
||||||
<input name="account" type="text" required data-map="USER_ACNT" class="form-control" placeholder="prefixName 계정" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-3 col-form-label text-sm-end" for="name"
|
|
||||||
>이름</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<input name="name" type="text" required data-map="USER_NM" class="form-control" placeholder="prefixName 이름" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-3 col-form-label text-sm-end" for="password"
|
|
||||||
>비밀번호</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<input name="password" type="password" required class="form-control" placeholder="비밀번호" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6 hidden">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-3 col-form-label text-sm-end" for="confirmPassword"
|
|
||||||
>비밀번호 확인</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<input name="confirmPassword" type="password" required class="form-control" placeholder="비밀번호 확인" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-3 col-form-label text-sm-end" for="birthday"
|
|
||||||
>생년월일</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<input name="birthday" type="text" data-map="BRDT" class="form-control dob-picker" placeholder="YYYY-MM-DD"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-3 col-form-label text-sm-end" for="gender"
|
|
||||||
>성별</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<div class="form-check form-check-inline mt-3">
|
|
||||||
<input name="gender" value="M" type="radio" data-map="GENDER" class="form-check-input"/>
|
|
||||||
<label class="form-check-label" for="male">남자</label>
|
|
||||||
</div>
|
|
||||||
<div class="form-check form-check-inline">
|
|
||||||
<input name="gender" value="F" type="radio" data-map="GENDER" class="form-check-input"/>
|
|
||||||
<label class="form-check-label" for="female">여자</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-3 col-form-label text-sm-end" for="emailAddress"
|
|
||||||
>이메일 주소</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<input name="emailAddress" type="email" required data-map="EML_ADRS" class="form-control" placeholder="이메일 주소" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6 select2-primary">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-3 col-form-label text-sm-end" for="mobilePhoneNo"
|
|
||||||
>전화번호(무선)</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<input name="mobilePhoneNo" type="text" data-map="MBL_TELNO" class="form-control phone-mask" placeholder="010-0000-0000" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6 select2-primary">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-3 col-form-label text-sm-end" for="phoneNo"
|
|
||||||
>전화번호(유선)</label
|
|
||||||
>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<input name="phoneNo" type="text" data-map="TELNO" class="form-control phone-mask" placeholder="000-0000-0000" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-3 col-form-label text-sm-end" for="faxNo">팩스</label>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<input name="faxNo" type="text" data-map="FXNO" class="form-control phone-mask" placeholder="000-0000-0000"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-3 col-form-label text-sm-end" for=positionName>직위</label>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<input name="positionName" type="text" data-map="POS_NM" class="form-control" placeholder="직위"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="row">
|
|
||||||
<label class="col-sm-3 col-form-label text-sm-end" for="status">상태</label>
|
|
||||||
<div class="col-sm-9">
|
|
||||||
<input name="status" type="text" data-map="STTS" class="form-control" placeholder="상태"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mt-4 justify-content-end">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="row justify-content-end">
|
|
||||||
<div class="col-sm-3">
|
|
||||||
<button onclick="saveinfoPrefix();" type="button" class="btn btn-primary">저장</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
<script type="text/javascript">
|
|
||||||
|
|
||||||
var infoPrefixFields = new FormFields("#infoPrefix-form");
|
|
||||||
|
|
||||||
infoPrefixControl.setInfo = obj => {
|
|
||||||
infoPrefixFields.set(obj);
|
|
||||||
let create = isEmpty(obj.data.USER_ACNT);
|
|
||||||
$("input[name='account']").prop("readonly", !create);
|
|
||||||
$("input[type='password']").each(function(){
|
|
||||||
let password = $(this).prop("required", create);
|
|
||||||
let div = password.parent().parent().parent();
|
|
||||||
if (create) {
|
|
||||||
$("input[name='institute']").val("default");
|
|
||||||
div.show();
|
|
||||||
} else
|
|
||||||
div.hide();
|
|
||||||
});
|
|
||||||
$("#infoPrefix-form input")
|
|
||||||
.change(function() {
|
|
||||||
let input = $(this),
|
|
||||||
name = input.attr("data-map"),
|
|
||||||
val = input.val();
|
|
||||||
infoPrefixControl.setValue(name, val);
|
|
||||||
})
|
|
||||||
.onEnterPress(saveinfoPrefix);
|
|
||||||
|
|
||||||
document.querySelector("input[name='" + (create ? "account" : "name") + "']").focus();
|
|
||||||
}
|
|
||||||
|
|
||||||
infoPrefixControl.onModify = (changed) => {
|
|
||||||
if (["USER_NM", "EML_ADRS", "MBL_TELNO"].filter(e => changed.includes(e)).length < 1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
renderinfoPrefixList();
|
|
||||||
infoPrefixControl.dataset.setState();
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveinfoPrefix() {
|
|
||||||
if (!$("#infoPrefix-form input").validInputs()) return;
|
|
||||||
|
|
||||||
let match = Array.from(document.querySelectorAll("input[type='password']"))
|
|
||||||
.map(input => input.value)
|
|
||||||
.reduce((total, current) => total == current);
|
|
||||||
if (!match) {
|
|
||||||
dialog.alert({
|
|
||||||
content:"비밀번호와 비밀번호 확인이 다릅니다.",
|
|
||||||
onClose:function(){
|
|
||||||
document.querySelector("input[name='confirmPassword']").focus();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
dialog.alert({
|
|
||||||
content:"현재 prefixName 정보를 저장하시겠습니까?",
|
|
||||||
onOK:() => {
|
|
||||||
infoPrefixControl.save(infoPrefixFields.get());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
//# sourceURL=user-info.jsp
|
|
||||||
</script>
|
|
@ -1,159 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Content wrapper -->
|
|
||||||
<div class="content-wrapper">
|
|
||||||
<!-- Content -->
|
|
||||||
|
|
||||||
<div class="container-xxl flex-grow-1 container-p-y">
|
|
||||||
<%--h4 id="pageTitle" class="fw-bold py-3 mb-4">페이지 제목</h4--%>
|
|
||||||
<c:set var="prefixName" scope="request">사용자</c:set>
|
|
||||||
<!-- Page Body -->
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-datatable text-nowrap">
|
|
||||||
<div id="DataTables_Table_0_wrapper" class="dataTables_wrapper dt-bootstrap5 no-footer">
|
|
||||||
|
|
||||||
<div class="d-flex flex-row justify-content-between p-3">
|
|
||||||
<div>
|
|
||||||
<div class="input-group" id="DataTables_Table_0_length">
|
|
||||||
<select id="by" onchange="document.getElementById('term').focus();" aria-controls="DataTables_Table_0" class="form-select">
|
|
||||||
<option value="${infoPrefix}Name">이름</option>
|
|
||||||
<option value="${infoPrefix}Account">계정</option>
|
|
||||||
</select>
|
|
||||||
<input id="term" autofocus type="text" placeholder="조회 조건을 입력하십시오." class="form-control">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div>
|
|
||||||
<button onclick="search${infoPrefix}s();" class="btn btn-primary">찾기</button>
|
|
||||||
<button onclick="${infoPrefix}Control.newInfo();" class="btn btn-primary">+ 추가</button>
|
|
||||||
<button id="btnRemove${infoPrefix}s" onclick="remove${infoPrefix}s();" class="btn btn-primary">- 제거</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="table-responsive">
|
|
||||||
<table class="datatables-ajax table table-bordered dataTable no-footer" id="DataTables_Table_0" aria-describedby="DataTables_Table_0_info">
|
|
||||||
<thead>
|
|
||||||
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="width: 158.828px; text-align:center;"><input onchange="${infoPrefix}Control.select(this.checked);" type="checkbox" class="form-check-input"></th>
|
|
||||||
<th class="sorting sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-sort="ascending" aria-label="Full name: activate to sort column descending" style="width: 223.719px;">계정</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Email: activate to sort column ascending" style="width: 146.156px;">이름</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Position: activate to sort column ascending" style="width: 195.688px;">이메일</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Office: activate to sort column ascending" style="width: 160.141px;">전화번호(무선)</th>
|
|
||||||
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" aria-label="Start date: activate to sort column ascending" style="width: 230.469px;">등록일자</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="${infoPrefix}List">
|
|
||||||
</tbody>
|
|
||||||
<template id="${infoPrefix}Row">
|
|
||||||
<tr data-key="{USER_ID}">
|
|
||||||
<td style="text-align:center;"><input value="{USER_ID}" onchange="${infoPrefix}Control.select('{USER_ID}', this.checked);" type="checkbox" class="form-check-input"></td>
|
|
||||||
<td onclick="${infoPrefix}Control.setCurrent('{USER_ID}')" ondblclick="${infoPrefix}Control.getInfo({})">{USER_ACNT}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.setCurrent('{USER_ID}')" ondblclick="${infoPrefix}Control.getInfo({})">{USER_NM}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.setCurrent('{USER_ID}')" ondblclick="${infoPrefix}Control.getInfo({})">{EML_ADRS}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.setCurrent('{USER_ID}')" ondblclick="${infoPrefix}Control.getInfo({})">{MBL_TELNO}</td>
|
|
||||||
<td onclick="${infoPrefix}Control.setCurrent('{USER_ID}')" ondblclick="${infoPrefix}Control.getInfo({})">{REG_DT}</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
<template id="${infoPrefix}NotFound">
|
|
||||||
<tr class="odd">
|
|
||||||
<td valign="top" colspan="6" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
|
|
||||||
</tr>
|
|
||||||
</template>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex flex-row p-3 justify-content-between">
|
|
||||||
<label id="${infoPrefix}PagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
|
|
||||||
<ul id="${infoPrefix}Paging" class="pagination pagination-primary">
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!--/ Page Body -->
|
|
||||||
|
|
||||||
<hr class="my-5" />
|
|
||||||
</div>
|
|
||||||
<!-- / Content -->
|
|
||||||
|
|
||||||
<jsp:include page="/WEB-INF/jsp/include/bottom.jsp" />
|
|
||||||
|
|
||||||
<div class="content-backdrop fade"></div>
|
|
||||||
</div>
|
|
||||||
<!-- Content wrapper -->
|
|
||||||
|
|
||||||
|
|
||||||
<script src="<c:url value="/resources/js/base/user.js?${ver}"/>"></script>
|
|
||||||
<script>
|
|
||||||
let ${infoPrefix}Control = new UserControl();
|
|
||||||
|
|
||||||
function search${infoPrefix}s() {
|
|
||||||
${infoPrefix}Control.query = {
|
|
||||||
by:$("#by").val(),
|
|
||||||
term:$("#term").val()
|
|
||||||
};
|
|
||||||
${infoPrefix}Control.load(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
function remove${infoPrefix}s() {
|
|
||||||
dialog.alert({
|
|
||||||
content:"선택한 ${prefixName} 정보를 제거하시겠습니까?",
|
|
||||||
onOK:() => {
|
|
||||||
${infoPrefix}Control.remove();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function render${infoPrefix}List() {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.dataset;
|
|
||||||
let empty = ${infoPrefix}List.empty;
|
|
||||||
|
|
||||||
let trs = empty ?
|
|
||||||
[document.getElementById("${infoPrefix}NotFound").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
|
|
||||||
${infoPrefix}List.inStrings(document.getElementById("${infoPrefix}Row").innerHTML); <%-- from template#${infoPrefix}Row --%>
|
|
||||||
$("#${infoPrefix}List").html(trs.join());
|
|
||||||
$("th input[type='checkbox']").prop("checked", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
${infoPrefix}Control.onDatasetChange = obj => {
|
|
||||||
render${infoPrefix}List();
|
|
||||||
|
|
||||||
$("#${infoPrefix}Paging").setPaging({
|
|
||||||
list:${infoPrefix}Control.dataset,
|
|
||||||
prefix:${infoPrefix}Control.prefix,
|
|
||||||
start:obj.${infoPrefix}Start,
|
|
||||||
totalSize:obj.${infoPrefix}Total,
|
|
||||||
fetchSize:obj.${infoPrefix}Fetch,
|
|
||||||
func:"${infoPrefix}Control.load({index})"
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onCurrentChange = item => {
|
|
||||||
if (!item) return;
|
|
||||||
|
|
||||||
let key = item.data.USER_ID;
|
|
||||||
$("#${infoPrefix}List").setCurrentRow(key);
|
|
||||||
};
|
|
||||||
|
|
||||||
${infoPrefix}Control.onSelectionChange = selected => {
|
|
||||||
let ${infoPrefix}List = ${infoPrefix}Control.dataset;
|
|
||||||
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
|
|
||||||
$("#${infoPrefix}List input[type='checkbox']").each(function() {
|
|
||||||
let checkbox = $(this);
|
|
||||||
checkbox.prop("checked", keys.includes(checkbox.val()));
|
|
||||||
});
|
|
||||||
|
|
||||||
$("#btnRemove${infoPrefix}s").prop("disabled", keys.length < 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
$("#term").onEnterPress(search${infoPrefix}s);
|
|
||||||
|
|
||||||
$(function(){
|
|
||||||
${onload}
|
|
||||||
${infoPrefix}Control.setData({
|
|
||||||
${infoPrefix}List:${userList},
|
|
||||||
${infoPrefix}Start:${userStart},
|
|
||||||
${infoPrefix}Fetch:${userFetch},
|
|
||||||
${infoPrefix}Total:${userTotal}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
@ -1,31 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<jsp:include page="/WEB-INF/jsp/include/head.jsp" />
|
|
||||||
<body>
|
|
||||||
<div class="layout-wrapper layout-content-navbar">
|
|
||||||
<div class="layout-container">
|
|
||||||
<jsp:include page="/WEB-INF/jsp/include/userMenus.jsp" />
|
|
||||||
<div class="layout-page">
|
|
||||||
<jsp:include page="/WEB-INF/jsp/include/top.jsp" />
|
|
||||||
|
|
||||||
<div id="tabsForInnerPage" class="nav-align-top mt-3">
|
|
||||||
<ul class="nav nav-tabs nav-tabs-ifr"></ul>
|
|
||||||
</div>
|
|
||||||
<div id="innerPageTabContents" class="tab-content"></div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
<jsp:include page="/WEB-INF/jsp/include/tail.jsp" />
|
|
||||||
<script >
|
|
||||||
${functions}
|
|
||||||
${userMenus}
|
|
||||||
|
|
||||||
$(function(){
|
|
||||||
${onload}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,152 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html
|
|
||||||
lang="kr"
|
|
||||||
class="light-style layout-navbar-fixed layout-menu-fixed "
|
|
||||||
dir="ltr"
|
|
||||||
data-theme="theme-default"
|
|
||||||
data-assets-path="<c:url value="/resources/"/>"
|
|
||||||
data-template="vertical-menu-template-starter">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>과태료통합관리시스템</title>
|
|
||||||
|
|
||||||
<!-- Favicon -->
|
|
||||||
<link rel="icon" type="image/x-icon" href="<c:url value="/resources/image/favicon.ico"/>" />
|
|
||||||
|
|
||||||
<!-- Fonts -->
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
||||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap" >
|
|
||||||
|
|
||||||
<!-- Icons. Uncomment required icon fonts -->
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/3rd-party/sneat/fonts/boxicons.css"/>" />
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/3rd-party/sneat/fonts/fontawesome.css"/>" />
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/3rd-party/sneat/fonts/flag-icons.css"/>" />
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/css/fims/framework/common/xit-icon.css"/>" />
|
|
||||||
<!-- Core CSS -->
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/css/fims/framework/common/xit-core.css"/>" />
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/3rd-party/sneat/css/theme-default.css"/>" />
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/3rd-party/sneat/css/docs.css"/>" />
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/css/fims/framework/common/xit-core-extend.css"/>" />
|
|
||||||
|
|
||||||
<!-- Vendors CSS -->
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/3rd-party/sneat/libs/perfect-scrollbar/perfect-scrollbar.css"/>" />
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/css/styles.css"/>" />
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/css/fims/framework/common/common.css"/>"/>
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/3rd-party/jquery-ui/1.13.2/themes/redmond/jquery-ui.css"/>" />
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/lib/fims/framework/datepicker/datepicker.css"/>" />
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/3rd-party/tui/grid/4.21.5/tui-grid/tui-grid.css"/>" />
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/css/fims/framework/common/xit-tui-grid.css"/>" />
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/3rd-party/tui/grid/4.21.5/tui-pagination/tui-pagination.css"/>" />
|
|
||||||
|
|
||||||
|
|
||||||
<link href="<c:url value='/'/>resources/css/fims/framework/oldcommon.css" rel="stylesheet" type="text/css" >
|
|
||||||
<link href="<c:url value='/'/>resources/css/fims/framework/login.css" rel="stylesheet" type="text/css" >
|
|
||||||
|
|
||||||
</head>
|
|
||||||
|
|
||||||
|
|
||||||
<body>
|
|
||||||
<div class="login_bg">
|
|
||||||
<div class="header_wrap">
|
|
||||||
<h1 class="logo"><img src="<c:url value='/'/>resources/image/fims/framework/login/mainLogo_02.png" alt="Logo Image"></img></h1>
|
|
||||||
</div>
|
|
||||||
<div class="login_text">
|
|
||||||
<p class="main_img"><img src="<c:url value='/'/>resources/image/fims/framework/login/loginDeco_02.png" alt=""></img></p>
|
|
||||||
<form id="formAuthentication" method="post">
|
|
||||||
<div class="input_wrap">
|
|
||||||
<div class="input-group">
|
|
||||||
<input type="text" id="userId" value="${cookie['account']}"
|
|
||||||
required title="계정 입력" class="typeText required form-control inp-long" placeholder="계정" autofocus/>
|
|
||||||
</div>
|
|
||||||
<div class="input-group input-group-merge mt-2">
|
|
||||||
<input type="password" id="password"
|
|
||||||
required title="비밀번호 입력" class="typePassword required form-control inp-long" placeholder="비밀번호" />
|
|
||||||
<span class="input-group-text cursor-pointer"><i class="bx bxs-lock"></i></span>
|
|
||||||
</div>
|
|
||||||
<div class="input_wrap2">
|
|
||||||
<a href="#" onclick="javascript:fn_FindId(); return false;">아이디 찾기</a>
|
|
||||||
<a href="#" onclick="javascript:fn_FindPw(); return false;" class="line">비밀번호 찾기</a>
|
|
||||||
<a href="#" onclick="javascript:fnReg(); return false;" class="line">회원가입</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<input type="hidden" name="message" value="${message}" />
|
|
||||||
<input type="hidden" name="userSe" value="USR"/>
|
|
||||||
<input name="j_username" type="hidden"/>
|
|
||||||
</form>
|
|
||||||
<div class="btn_wrap">
|
|
||||||
<input type="button" onclick="login()" class="typeButton" title="로그인" value="로그인" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<jsp:include page="/WEB-INF/jsp/include/tail.jsp" />
|
|
||||||
|
|
||||||
<script type="text/javascript">
|
|
||||||
${functions}
|
|
||||||
function login() {
|
|
||||||
if (!$("#formAuthentication input").validInputs()) return;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
var params = {
|
|
||||||
account:$("#userId").val(),
|
|
||||||
password:$("#password").val(),
|
|
||||||
institute:"default"
|
|
||||||
<%--, rememberCredentials:true--%>
|
|
||||||
};
|
|
||||||
json.post({
|
|
||||||
url:wctx.url("/login.do"),
|
|
||||||
data:params,
|
|
||||||
success:function(resp) {
|
|
||||||
if (resp.authenticated) {
|
|
||||||
if (resp.message)
|
|
||||||
dialog.alert(resp.message);
|
|
||||||
|
|
||||||
wctx.home();
|
|
||||||
} else {
|
|
||||||
dialog.alert({
|
|
||||||
content:resp.reason,
|
|
||||||
onClose:() => $("#userId").focus()
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
$(function(){
|
|
||||||
$("#formAuthentication input").onEnterPress(login);
|
|
||||||
if ($("#userId").val())
|
|
||||||
$("#password").focus();
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 회원가입 팝업
|
|
||||||
*/
|
|
||||||
function fnReg(){
|
|
||||||
CmmPopup.open("<c:url value='/framework/biz/mng/usr/addUserPopup.do'/>", {}, {width: 1100, height:570}, '사용자 등록');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 아이디 찾기 팝업
|
|
||||||
*/
|
|
||||||
function fn_FindId(){
|
|
||||||
CmmPopup.open("<c:url value='/login/findIdPopup/input.do'/>", {}, {width: 500, height:300}, '아이디 찾기');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 비밀번호 찾기 팝업
|
|
||||||
*/
|
|
||||||
function fn_FindPw(){
|
|
||||||
CmmPopup.open("<c:url value='/login/findPwdPopup/input.do'/>", {}, {width: 500, height:330}, '비밀번호 찾기');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@ -1,56 +0,0 @@
|
|||||||
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
|
|
||||||
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
|
|
||||||
<link rel="stylesheet" href="<c:url value="/resources/3rd-party/sneat/libs/jstree/jstree.css"/>" /--%>
|
|
||||||
<div id="_url-tree" class="main-left d-flex flex-column flex-grow-1">
|
|
||||||
<div class="d-flex justify-content-between" style="padding-top:.5em; padding-bottom:.5em; border-top:1px solid #dfdfdf; border-bottom:1px solid #dfdfdf;">
|
|
||||||
<span>
|
|
||||||
<button id="_urlToggler" onclick="_toggleURLs();" class="btn btn-primary"></button>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<div id="_urlTree" style="padding-top:1em; height:37em; overflow:auto;">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script src="<c:url value="/resources/3rd-party/sneat/libs/jstree/jstree.js"/>"></script>
|
|
||||||
<script src="<c:url value="/resources/3rd-party/jstree/jstree-support.js"/>"></script>
|
|
||||||
<script type="text/javascript">
|
|
||||||
var _multiple = ${multiple},
|
|
||||||
_urlSupport = treeSupport({
|
|
||||||
selector:"#_urlTree",
|
|
||||||
trace:wctx.trace,
|
|
||||||
plugins: _multiple ? ["checkbox"] : [],
|
|
||||||
core:{check_callback:true,
|
|
||||||
multiple:_multiple
|
|
||||||
// themes:{name:"proton"}
|
|
||||||
},
|
|
||||||
checkbox:{
|
|
||||||
whole_node:false,
|
|
||||||
tie_selection:false
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function getSelectedURL() {
|
|
||||||
var selected = _multiple ? _urlSupport.checkedNodes() : _urlSupport.selectedNodes();
|
|
||||||
if (selected.length < 1)
|
|
||||||
return dialog.alert("URL을 선택하십시오.");
|
|
||||||
|
|
||||||
if (_multiple)
|
|
||||||
return selected;
|
|
||||||
else
|
|
||||||
return selected[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
function _toggleURLs() {
|
|
||||||
$("#_urlToggler").text(_urlSupport.toggleFolding() == "collapsed" ? "+ 펼치기" : "- 닫기");
|
|
||||||
}
|
|
||||||
|
|
||||||
var urls = ${urls};
|
|
||||||
|
|
||||||
_urlSupport.setData(treeHtml(urls, {
|
|
||||||
id:function(e){return e.url;},
|
|
||||||
text:function(e){
|
|
||||||
return e.name == e.url ? e.name : e.name + " (" + e.url + ")";
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
$("#_urlToggler").text(_urlSupport._folding == "collapsed" ? "+ 펼치기" : "- 닫기");
|
|
||||||
</script>
|
|
Loading…
Reference in New Issue