커밋 테스트

main
이범준 1 year ago
parent 14536865b4
commit 2094ee47e4

@ -10,12 +10,12 @@
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>xit-app</groupId>
<artifactId>fims</artifactId>
<groupId>cokr.xit.app</groupId>
<artifactId>fims-1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>fims</name>
<description>과태료통합관리시스템</description>
<packaging>war</packaging>
<name>fims-1</name>
<description>과태료통합관리시스템java</description>
<packaging>jar</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@ -218,19 +218,127 @@
</dependencies>
<build>
<plugins>
<defaultGoal>install</defaultGoal>
<directory>${basedir}/target</directory>
<finalName>${project.artifactId}-${project.version}</finalName>
<resources>
<resource>
<directory>${basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource><directory>${basedir}/src/test/resources</directory></testResource>
<testResource><directory>${basedir}/src/main/resources</directory></testResource>
</testResources>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.3.1</version>
<configuration>
<includeEmptyDirs>true</includeEmptyDirs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<!-- EMMA -->
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>emma-maven-plugin</artifactId>
<version>1.0-alpha-3</version>
</plugin>
<!-- PMD manven plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.1</version>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
<includes>
<include>**/*.class</include>
</includes>
</configuration>
</plugin>
<!-- EMMA -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<skipTests>true</skipTests>
<reportFormat>xml</reportFormat>
<excludes>
<exclude>**/Abstract*.java</exclude>
<exclude>**/*Suite.java</exclude>
</excludes>
<includes>
<include>**/*Test.java</include>
</includes>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>emma-maven-plugin</artifactId>
<inherited>true</inherited>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Javadoc -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
</plugin>
</plugins>
</build>
<!-- Nexus deploy -->
<distributionManagement>
<snapshotRepository>
<id>maven-snapshot</id>
<url>https://nas.xit.co.kr:8888/repository/maven-snapshots/</url>
</snapshotRepository>
<repository>
<id>maven-release</id>
<url>https://nas.xit.co.kr:8888/repository/maven-releases/</url>
</repository>
</distributionManagement>
<!-- Nexus deploy -->
<!--
<build>
<plugins>
<plugin>
<groupId>cokr.xit.app.plugin.maven</groupId>
<artifactId>sgg-maven-plugin</artifactId>
@ -257,5 +365,5 @@
</plugin>
</plugins>
</build>
-->
</project>

@ -1,29 +0,0 @@
package cokr.xit.fims;
import org.springframework.boot.Banner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportResource;
import cokr.xit.base.ServletCustomizer;
import cokr.xit.base.boot.XitBaseApplication;
import cokr.xit.fims.task.TaskMvcConfig;
@ImportAutoConfiguration({ServletCustomizer.class, TaskMvcConfig.class})
@ImportResource("classpath:spring/context-*.xml")
@ComponentScan(basePackageClasses = cokr.xit.applib.HttpStatusCodeExceptionControllerAdvice.class)
public class FimsApplication extends XitBaseApplication {
public static void main(String[] args) {
final SpringApplicationBuilder applicationBuilder = new SpringApplicationBuilder(FimsApplication.class);
final SpringApplication application = applicationBuilder.build();
application.setBannerMode(Banner.Mode.OFF);
application.setLogStartupInfo(false);
application.run(args);
}
}

@ -1,14 +0,0 @@
package cokr.xit.fims;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(FimsApplication.class);
}
}

@ -62,7 +62,8 @@ public class MainController extends cokr.xit.base.web.MainController {
@Override
public ModelAndView loginPage() {
ModelAndView mav = new ModelAndView("login");
System.out.println("시군구....");
System.out.println(sggCd);
List<DataObject> sggs = sggDeptService.getSigunguList(new SigunguQuery());
if (sggs.isEmpty()) {
throw new RuntimeException("No sigungu info found.");

@ -1,73 +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="actioninfoPrefix-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 text-end">
<button onclick="saveinfoPrefix();" type="button" class="btn btn-primary">저장</button>
</div>
</div>
</form>
<script type="text/javascript">
var actioninfoPrefixFields = new FormFields("#actioninfoPrefix-form");
actioninfoPrefixControl.groups.setInfo = obj => {
actioninfoPrefixFields.set(actioninfoPrefixControl, obj);
let create = isEmpty(obj.data.GRP_ID);
$("input[name='id']").prop("readonly", !create);
$("#actioninfoPrefix-form input").onEnterPress(saveinfoPrefix);
document.querySelector("input[name='" + (create ? "id" : "name") + "']").focus();
}
actioninfoPrefixControl.groups.onModify = (changed) => {
if (["GRP_NM"].filter(e => changed.includes(e)).length < 1)
return;
renderactioninfoPrefixList();
actioninfoPrefixControl.groups.dataset.setState();
}
function saveinfoPrefix() {
if (!$("#actioninfoPrefix-form input").validInputs()) return;
dialog.alert({
content:"현재 prefixName 정보를 저장하시겠습니까?",
onOK:() => {
actioninfoPrefixControl.groups.save(actioninfoPrefixFields.get());
}
});
}
//# sourceURL=actionGroup-info.jsp
</script>

@ -1,229 +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"%>
<style id="actionGroupMainCss">
#actionGroupMainCss+div tr[data-key='userAction'] > td:nth-child(n+2):nth-child(-n+3),
#actionGroupMainCss+div tr[data-key='anonymousAction'] > td:nth-child(n+2):nth-child(-n+3) {
color: red;
}
</style>
<c:set var="prefixName" scope="request">기능 그룹</c:set>
<!-- Page Body -->
<div class="d-flex flex-column flex-grow-1">
<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="${infoPrefix}-query">
<select id="${infoPrefix}by" onchange="document.getElementById('${infoPrefix}term').focus();" aria-controls="DataTables_Table_0" class="form-select">
<option value="${infoPrefix}Name">이름</option>
<option value="${infoPrefix}ID">아이디</option>
</select>
<input id="${infoPrefix}term" autofocus type="text" placeholder="조회 조건을 입력하십시오." class="form-control">
</div>
</div>
<div>
<button onclick="searchaction${infoPrefix}s();" class="btn btn-primary">찾기</button>
<button onclick="action${infoPrefix}Control.groups.newInfo();" class="btn btn-primary">+ 추가</button>
<button id="btnRemoveaction${infoPrefix}s" onclick="removeaction${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 id="action${infoPrefix}Thead">
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="text-align:center;"><input onchange="action${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="action${infoPrefix}List">
</tbody>
<template id="action${infoPrefix}Row">
<tr data-key="{GRP_ID}">
<td style="text-align:center;"><input value="{GRP_ID}" onchange="action${infoPrefix}Control.groups.select('{GRP_ID}', this.checked);" type="checkbox" class="form-check-input"></td>
<td onclick="action${infoPrefix}Control.groups.setCurrent('{GRP_ID}')" ondblclick="action${infoPrefix}Control.groups.getInfo({})">{GRP_ID}</td>
<td onclick="action${infoPrefix}Control.groups.setCurrent('{GRP_ID}')" ondblclick="action${infoPrefix}Control.groups.getInfo({})">{GRP_NM}</td>
<td onclick="action${infoPrefix}Control.groups.setCurrent('{GRP_ID}')" ondblclick="action${infoPrefix}Control.groups.getInfo({})">{REG_DT}</td>
</tr>
</template>
<template id="action${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="action${infoPrefix}PagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
<ul id="action${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="action${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 id="actionThead">
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="text-align:center;"><input id="actionToggler" onchange="action${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="action${infoPrefix}Control.actions.select('{GRP_ID}-{ACTION}', this.checked);" type="checkbox" class="form-check-input"></td>
<td onclick="action${infoPrefix}Control.actions.setCurrent('{GRP_ID}-{ACTION}')">{ACTION}</td>
<td onclick="action${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>
<!--/ Page Body -->
<script >
var action${infoPrefix}Control = new ActionGroupControl();
function searchaction${infoPrefix}s() {
action${infoPrefix}Control.groups.query = {
by:$("#${infoPrefix}-query [name='by']").val(),
term:$("#${infoPrefix}-query [name='term']").val()
};
action${infoPrefix}Control.groups.query.fetchAll = true;
action${infoPrefix}Control.groups.load(1);
}
function removeaction${infoPrefix}s() {
dialog.alert({
content:"선택한 ${prefixName} 정보를 제거하시겠습니까?",
onOK:() => {
action${infoPrefix}Control.groups.remove();
}
});
}
function removeActions() {
dialog.alert({
content:"선택한 기능 URL을 삭제하시겠습니까?",
onOK:() => {
action${infoPrefix}Control.removeActions();
}
});
}
function renderaction${infoPrefix}List() {
let ${infoPrefix}List = action${infoPrefix}Control.groups.dataset;
let empty = action${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("action${infoPrefix}NotFound").innerHTML] : <%-- from template#action${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(document.getElementById("action${infoPrefix}Row").innerHTML); <%-- from template#action${infoPrefix}Row --%>
$("#action${infoPrefix}List").html(trs.join());
$("#action${infoPrefix}Thead").find("th input[type='checkbox']").prop("checked", false);
$("#actionThead").find("th input[type='checkbox']").prop("checked", false);
}
action${infoPrefix}Control.onGroupListChange = obj => {
renderaction${infoPrefix}List();
$("#action${infoPrefix}Paging").setPaging({
list:action${infoPrefix}Control.groups.dataset,
prefix:action${infoPrefix}Control.groups.prefix,
start:obj.${infoPrefix}Start,
totalSize:obj.${infoPrefix}Total,
fetchSize:obj.${infoPrefix}Fetch,
func:"action${infoPrefix}Control.groups.load({index})"
});
};
action${infoPrefix}Control.onCurrentGroupChange = item => {
$("#btnAddActions").prop("disabled", !item);
if (!item) return;
let key = item.data.GRP_ID;
$("#action${infoPrefix}List").setCurrentRow(key);
};
action${infoPrefix}Control.onGroupSelect = selected => {
let ${infoPrefix}List = action${infoPrefix}Control.groups.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#action${infoPrefix}List input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
$("#btnRemoveaction${infoPrefix}s").prop("disabled", keys.length < 1);
};
action${infoPrefix}Control.onActionListChange = obj => {
let ${infoPrefix}List = action${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:action${infoPrefix}Control.actions.dataset,
prefix:action${infoPrefix}Control.actions.prefix,
start:obj.actionStart,
totalSize:obj.actionTotal,
fetchSize:obj.actionFetch,
func:"action${infoPrefix}Control.actions.load({index})"
});
};
action${infoPrefix}Control.onCurrentActionChange = item => {
if (!item) return;
let data = item.data;
let key = data.GRP_ID + "-" + data.ACTION;
$("#actionList").setCurrentRow(key);
};
action${infoPrefix}Control.onActionSelect = selected => {
let ${infoPrefix}List = action${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);
};
$("#${infoPrefix}term").onEnterPress(searchaction${infoPrefix}s);
$(function(){
${onload}
action${infoPrefix}Control.groups.setData({
${infoPrefix}List:${groupList},
${infoPrefix}Start:${groupStart},
${infoPrefix}Fetch:${groupFetch},
${infoPrefix}Total:${groupTotal}
});
});
//# sourceURL=actionGroup-main.jsp
</script>

@ -1,127 +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"%>
<style id="selectActionGroupCss">
#selectActionGroupCss+div tr[data-key='userAction'] > td:nth-child(n+2):nth-child(-n+3),
#selectActionGroupCss+div tr[data-key='anonymousAction'] > td:nth-child(n+2):nth-child(-n+3) {
color: red;
}
</style>
<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="_actionGroupBy" onchange="document.getElementById('_actionGroupTerm').focus();" aria-controls="DataTables_Table_0" class="form-select">
<option value="${infoPrefix}Name">이름</option>
<option value="${infoPrefix}ID">아이디</option>
</select>
<input id="_actionGroupTerm" 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 id="_action${infoPrefix}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="_action${infoPrefix}List">
</tbody>
<template id="_action${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="_action${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="_action${infoPrefix}PagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
<ul id="_action${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:$("#_actionGroupBy").val(),
term:$("#_actionGroupTerm").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("_action${infoPrefix}NotFound").innerHTML] : <%-- from template#_action${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(document.getElementById("_action${infoPrefix}Row").innerHTML); <%-- from template#_action${infoPrefix}Row --%>
$("#_action${infoPrefix}List").html(trs.join());
$("#_action${infoPrefix}Thead").find("th input[type='checkbox']").prop("checked", false);
$("#_action${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;
$("#_action${infoPrefix}List").setCurrentRow(key);
};
${infoPrefix}Control.onGroupSelect = selected => {
let ${infoPrefix}List = ${infoPrefix}Control.groups.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#_action${infoPrefix}List input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
};
$("#_actionGroupTerm").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="btnAddAuthActions" onclick="${infoPrefix}Control.addActions();" class="btn btn-primary">+ 추가</button>
<button id="btnRemoveAuthActions" onclick="removeAuthActions();" 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="authActionToggler" 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="authActionList">
</tbody>
<template id="authActionRow">
<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="authActionNotFound">
<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="authActionPagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
<ul id="authActionPaging" class="pagination pagination-primary">
</ul>
</div>
<c:set var="actionGroupFunc" scope="request">function removeAuthActions() {
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("authActionNotFound").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(document.getElementById("authActionRow").innerHTML); <%-- from template#${infoPrefix}Row --%>
$("#authActionList").html(trs.join());
$("#authActionToggler").prop("checked", false);
$("#authActionPaging").setPaging({
list:${infoPrefix}Control.actions.dataset,
prefix:${infoPrefix}Control.actions.prefix,
start:obj.actionStart,
totalSize:obj.actionTotal,
fetchSize:obj.actionFetch,
func:"${infoPrefix}Control.getActions({index})"
});
};
${infoPrefix}Control.onCurrentActionChange = item => {
if (!item) return;
let data = item.data;
let key = data.AUTH_ID + "-" + data.GRP_ID;
$("#authActionList").setCurrentRow(key);
};
${infoPrefix}Control.onActionSelect = selected => {
let ${infoPrefix}List = ${infoPrefix}Control.actions.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#authActionList input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
$("#btnRemoveAuthActions").prop("disabled", keys.length < 1);
};</c:set>

@ -1,75 +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 text-end">
<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(infoPrefixControl, obj);
let info = obj.data;
let create = isEmpty(info.AUTH_ID);
$("input[name='id']").prop("readonly", !create);
$("#infoPrefix-form input").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"%>
<style id="authorityMainCss">
#authorityMainCss+div tr[data-key='ROLE_ADMIN'] > td:nth-child(n+2):nth-child(-n+3),
#authorityMainCss+div tr[data-key='ROLE_USER'] > td:nth-child(n+2):nth-child(-n+3),
#authorityMainCss+div tr[data-key='ROLE_ANONYMOUS'] > td:nth-child(n+2):nth-child(-n+3) {
color: red;
}
</style>
<c:set var="prefixName" scope="request">권한</c:set>
<!-- Page Body -->
<div class="d-flex flex-column flex-grow-1">
<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="${infoPrefix}-query">
<select id="${infoPrefix}by" name="by" onchange="document.getElementById('${infoPrefix}term').focus();" aria-controls="DataTables_Table_0" class="form-select">
<option value="authName">이름</option>
<option value="authID">아이디</option>
</select>
<input id="${infoPrefix}term" name="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 id="${infoPrefix}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;" id="${infoPrefix}RightInclude">
<div class="tab-pane fade show active" id="navs-top-users" role="tabpanel">
<div class="ox-scroll">
<jsp:include page="user-list.jsp" />
</div>
</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>
<!--/ Page Body -->
<script >
var ${infoPrefix}Control = new AuthorityControl();
${infoPrefix}Control.authorities.onSave = (resp) => {
if (resp.saved) {
dialog.alert("저장됐습니다.");
dialog.close(${infoPrefix}Control.authorities.prefixed("dialog"));
${infoPrefix}Control.authorities.query.fetchAll = true;
${infoPrefix}Control.authorities.load(1);
}
}
${infoPrefix}Control.authorities.onRemove = (selected, resp) => {
if (resp.saved){
${infoPrefix}Control.authorities.query.fetchAll = true;
${infoPrefix}Control.authorities.load(1);
}
}
function search${infoPrefix}s() {
${infoPrefix}Control.authorities.query = {
by:$("#${infoPrefix}-query [name='by']").val(),
term:$("#${infoPrefix}-query [name='term']").val()
};
${infoPrefix}Control.authorities.query.fetchAll = true;
${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());
$("#${infoPrefix}Thead").find("th input[type='checkbox']").prop("checked", false);
$("#${infoPrefix}RightInclude").find("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}
$("#${infoPrefix}term").onEnterPress(search${infoPrefix}s);
$(function(){
${onload}
${infoPrefix}Control.authorities.setData({
${infoPrefix}List:${authorityList},
${infoPrefix}Start:${authorityStart},
${infoPrefix}Fetch:${authorityFetch},
${infoPrefix}Total:${authorityTotal}
});
});
//# sourceURL=authority-main.jsp
</script>

@ -1,100 +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="btnAddAuthUsers" onclick="${infoPrefix}Control.addUsers();" class="btn btn-primary">+ 추가</button>
<button id="btnRemoveAuthUsers" onclick="removeAuthUsers();" 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="authUserToggler" 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">시군구명</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="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="authUserList">
</tbody>
<template id="authUserRow">
<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}')">{SGG_NM}</td>
<td onclick="${infoPrefix}Control.users.setCurrent('{AUTH_ID}-{USER_ID}')">{INST_NM}</td>
<td onclick="${infoPrefix}Control.users.setCurrent('{AUTH_ID}-{USER_ID}')">{DEPT_NM}</td>
<td onclick="${infoPrefix}Control.users.setCurrent('{AUTH_ID}-{USER_ID}')">{USER_ACNT}</td>
<td onclick="${infoPrefix}Control.users.setCurrent('{AUTH_ID}-{USER_ID}')">{USER_NM}</td>
<td onclick="${infoPrefix}Control.users.setCurrent('{AUTH_ID}-{USER_ID}">{REG_DT}</td>
</tr>
</template>
<template id="authUserNotFound">
<tr class="odd">
<td valign="top" colspan="7" class="dataTables_empty text-center">사용자 정보를 찾지 못했습니다.</td>
</tr>
</template>
<template id="implicitActions">
<tr class="odd">
<td valign="top" colspan="7" class="dataTables_empty text-center">{authority}는 사용자를 지정하지 않습니다.</td>
</tr>
</template>
</table>
<div class="d-flex flex-row p-3 justify-content-between">
<label id="authUserPagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
<ul id="authUserPaging" class="pagination pagination-primary">
</ul>
</div>
<c:set var="userFunc" scope="request">
function removeAuthUsers() {
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("authUserNotFound").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(document.getElementById("authUserRow").innerHTML); <%-- from template#${infoPrefix}Row --%>
$("#authUserList").html(trs.join());
$("#authUserToggler").prop("checked", false);
$("#authUserPaging").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;
$("#authUserList").setCurrentRow(key);
};
${infoPrefix}Control.onUserSelect = selected => {
let ${infoPrefix}List = ${infoPrefix}Control.users.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#authUserList input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
$("#btnRemoveAuthUsers").prop("disabled", keys.length < 1);
};</c:set>

@ -1,135 +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 p-2">
<span id="codeInUse"></span>
</div>
</div>
</div>
<div class="row mt-4 justify-content-end">
<div class="col-sm-12 text-end">
<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(codeControl, obj);
let create = isEmpty(info.CODE);
$("input[name='code']").prop("readonly", !create);
$("#code-form input").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,233 +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="d-flex flex-column flex-grow-1">
<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="${infoPrefix}-query">
<select id="${infoPrefix}by" name="by" onchange="document.getElementById('${infoPrefix}term').focus();" aria-controls="DataTables_Table_0" class="form-select">
<option value="groupName">이름</option>
<option value="groupID">아이디</option>
</select>
<input id="${infoPrefix}term" name="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 id="groupThead">
<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}"{notUsed}>
<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 id="codeThead">
<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}"{notUsed}>
<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>
<!--/ Page Body -->
<script >
var codeControl = new CodeControl();
function searchGroups() {
codeControl.groups.query = {
by:$("#${infoPrefix}-query [name='by']").val(),
term:$("#${infoPrefix}-query [name='term']").val()
};
codeControl.groups.load(1);
}
function removeGroups() {
dialog.alert({
content:"선택한 ${prefixName} 정보를 제거하시겠습니까?",
onOK:() => {
codeControl.groups.remove();
}
});
}
function removeCodes() {
dialog.alert({
content:"선택한 코드를 삭제하시겠습니까?",
onOK:() => {
codeControl.codes.remove();
}
});
}
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,
(tmpl, item) => tmpl.replace(/{notUsed}/gi, item.getValue("USE_YN") == "N" ? "class=\"not-used\"" : "")
); <%-- from template#groupRow --%>
$("#groupList").html(trs.join());
$("#groupThead").find("input[type='checkbox']").prop("checked", false);
$("#codeThead").find("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,
(tmpl, item) => tmpl.replace(/{notUsed}/gi, item.getValue("USE_YN") == "N" ? "class=\"not-used\"" : "")
); <%-- 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 ? obj.codeStart : -1,
totalSize:obj ? obj.codeTotal : 0,
fetchSize:obj ? obj.codeFetch : 10,
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);
};
$("#${infoPrefix}term").onEnterPress(searchGroups);
$(function(){
${onload}
codeControl.groups.setData({
groupList:${groupList},
groupStart:${groupStart},
groupFetch:${groupFetch},
groupTotal:${groupTotal}
});
});
//# sourceURL=code-main.jsp
</script>

@ -1,105 +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 p-2">
<span id="groupInUse"></span>
</div>
</div>
</div>
<div class="row mt-4 justify-content-end">
<div class="col-sm-12 text-end">
<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(codeControl, obj);
let create = isEmpty(info.GRP_ID);
$("input[name='id']").prop("readonly", !create);
$("#group-form input").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,102 +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 w-80">
<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 text-end">
<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(menuControl, 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")
.onEnterPress(() => saveMenu());
</c:set>

@ -1,134 +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="d-flex flex-column flex-grow-1">
<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>
<!--/ Page Body -->
<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" ? "+ 펼치기" : "- 닫기");
}
var 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();
});
//# sourceURL=menu-main.jsp
</script>

@ -1,155 +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="d-flex flex-column flex-grow-1">
<div class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="${infoPrefix}-query" class="d-flex flex-row justify-content-between p-3">
<div class="d-flex flex-row">
<div class="input-group">
<select id="${infoPrefix}logType" name="logType" class="form-select">
<option value="">로그유형</option>
<option value="log-inout">로그인/아웃</option>
<option value="download">다운로드</option>
<option value="web">웹</option>
</select>
</div>
<div class="input-group" style="margin: 0 1rem 0 1rem">
<select id="${infoPrefix}by" name="by" onchange="document.getElementById('${infoPrefix}term').focus();" class="form-select">
<option value="userName">사용자 이름</option>
<option value="userAccount">사용자 계정</option>
<option value="userID">사용자 아이디</option>
</select>
<input id="${infoPrefix}term" name="term" type="text" placeholder="조회 조건을 입력하십시오." class="form-control">
</div>
<div class="input-group">
<input id="${infoPrefix}fromDate" name="fromDate" type="text" value="${fromDate}" required placeholder="시작일자" class="form-control">
<span style="margin: 0 .5rem 0 .5rem"> ~ </span>
<input id="${infoPrefix}toDate" name="toDate" type="text" value="${toDate}" required placeholder="종료일자" class="form-control">
</div>
</div>
<div>
<button onclick="search${infoPrefix}s();" class="btn btn-primary">찾기</button>
<button onclick="${infoPrefix}Control.download();" class="btn btn-primary not-empty">다운로드</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 style="width: auto;">계정</th>
<th style="width: auto;">사용자이름</th>
<th style="width: auto;">IP 주소</th>
<th style="width: max-content;">로그유형</th>
<th style="width: max-content;">접속일시</th>
<th style="width: auto;">URL</th>
<th style="width: auto;">설명</th>
<th style="width: auto;">파일이름</th>
<th style="width: auto;">민감정보</th>
</tr>
</thead>
<tbody id="${infoPrefix}List">
</tbody>
<template id="${infoPrefix}Row">
<tr data-key="{LOG_ID}" {onclick}>
<td>{USER_ACNT}</td>
<td>{USER_NM}</td>
<td>{IP_ADDR}</td>
<td>{LOG_TYPE_NM}</td>
<td>{REG_DT}</td>
<td>{URL}</td>
<td>{DSCRP}</td>
<td>{FILE_NM}</td>
<td>{PSNL_INFO}</td>
</tr>
</template>
<template id="${infoPrefix}NotFound">
<tr class="odd">
<td valign="top" colspan="8" 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>
<!--/ Page Body -->
<script >
var ${infoPrefix}Control = new DatasetControl({
prefix: "${infoPrefix}",
prefixName: "${prefixName}",
keymapper: row => row.LOG_ID,
dataGetter: obj => obj.${infoPrefix}List,
query: {}
});
function search${infoPrefix}s() {
let logType = $("#${infoPrefix}logType").val(),
params = {
logTypes: logType ? [logType] : [],
fromDate: $("#${infoPrefix}fromDate").val().replace(/-/gi, ""),
toDate: $("#${infoPrefix}toDate").val().replace(/-/gi, "")
},
terms = $("#${infoPrefix}-query [name='term']").val();
if (terms) {
switch ($("#${infoPrefix}-query [name='by']").val()) {
case "userName": params.userName = terms; break;
case "userAccount": params.userAccounts = [terms.toUpperCase()]; break;
case "userID": params.userIDs = [terms]; break;
default: break;
}
}
${infoPrefix}Control.query = params;
${infoPrefix}Control.load(1);
}
${infoPrefix}Control.onDatasetChange = obj => {
let ${infoPrefix}List = ${infoPrefix}Control.dataset,
empty = ${infoPrefix}List.empty,
trs = empty ?
[document.getElementById("${infoPrefix}NotFound").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}=""/gi, 'onclick="syslogControl.setCurrent(\'' + dataItem.getValue("LOG_ID") + '\');"')
);
$("#${infoPrefix}List").html(trs.join());
$("#${infoPrefix}-query button.not-empty").prop("disabled", empty);
$("#${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.LOG_ID;
$("#${infoPrefix}List").setCurrentRow(key);
};
$("#${infoPrefix}term").onEnterPress(search${infoPrefix}s);
$(function(){
${onload}
${infoPrefix}Control.setData({
${infoPrefix}List:${syslogList},
${infoPrefix}Start:${syslogStart},
${infoPrefix}Fetch:${syslogFetch},
${infoPrefix}Total:${syslogTotal}
});
$("#${infoPrefix}-query #${infoPrefix}fromDate, #${infoPrefix}-query #${infoPrefix}toDate").datePicker();
});
//# sourceURL=${infoPrefix}-main.jsp
</script>

@ -1,101 +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="dept-form">
<div class="row g-3">
<div class="col-md-12">
<div class="row">
<label class="col-sm-3 col-form-label text-sm-end" for="deptID">부서코드</label>
<div class="col-sm-9">
<input name="deptID" type="text" required data-map="DEPT_CD" maxlength="7" class="form-control" placeholder="부서코드" />
<input name="sggID" type="hidden" data-map="SGG_CD" />
<input name="instCode" type="hidden" data-map="INST_CD" />
</div>
</div>
</div>
<div class="col-md-12">
<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="DEPT_NM" maxlength="100" class="form-control" placeholder="부서이름" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row">
<label class="col-sm-3 col-form-label text-sm-end" for="telno">전화번호</label>
<div class="col-sm-9">
<input name="telno" type="text" data-map="DEPT_TELNO" maxlength="20" class="form-control" placeholder="전화번호"/>
</div>
</div>
</div>
<div class="col-md-12">
<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="DEPT_FXNO" maxlength="20" class="form-control" placeholder="팩스번호"/>
</div>
</div>
</div>
<div class="col-md-12">
<div class="row">
<label class="col-sm-3 col-form-label text-sm-end" for="createdBy">등록자</label>
<div class="col-sm-9">
<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-3 col-form-label text-sm-end" for="description">등록일자</label>
<div class="col-sm-9">
<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-3 col-form-label text-sm-end" for="description">사용여부</label>
<div class="col-sm-9" style="padding:.5em .7em;">
<input name="useYN" type="hidden" data-map="USE_YN" />
<span id="deptInUse"></span>
</div>
</div>
</div>
<div class="row mt-4 justify-content-end">
<div class="col-sm-12" style="text-align:right;">
<button onclick="saveDept();" type="button" class="btn btn-primary">저장</button>
</div>
</div>
</form>
<script type="text/javascript">
var deptFields = new FormFields("#dept-form");
sggDeptControl.depts.setInfo = obj => {
let info = obj.data;
deptFields.set(sggDeptControl.depts, obj);
let create = isEmpty(info.DEPT_CD);
$("input[name='deptID']").prop("readonly", !create);
$("#dept-form input").onEnterPress(saveDept);
$("#deptInUse").html("Y" == info.USE_YN ? "사용 중" : "사용하지 않음");
document.querySelector("input[name='" + (create ? "deptID" : "name") + "']").focus();
}
sggDeptControl.depts.onModify = (changed) => {
if (["DEPT_NM"].filter(e => changed.includes(e)).length < 1)
return;
renderDeptList();
sggDeptControl.depts.dataset.setState();
}
function saveDept() {
if (!$("#dept-form input").validInputs()) return;
dialog.alert({
content:"현재 부서 정보를 저장하시겠습니까?",
onOK:() => sggDeptControl.depts.save(deptFields.get())
});
}
//# sourceURL=dept-info.jsp
</script>

@ -1,98 +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="password-form">
<div class="row g-3">
<div class="col-md-12">
<div class="row">
<label class="col-sm-4 col-form-label text-sm-end required" for="currentPassword">
현재 비밀번호
</label>
<div class="col-sm-8">
<input name="currentPassword" type="password" required class="form-control" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row">
<label class="col-sm-4 col-form-label text-sm-end required" for="password">
새 비밀번호
</label>
<div class="col-sm-8">
<input name="password" type="password" required class="form-control" />
</div>
</div>
</div>
<div class="col-md-12">
<div class="row">
<label class="col-sm-4 col-form-label text-sm-end required" for="confirmPassword">
새 비밀번호 확인
</label>
<div class="col-sm-8">
<input name="confirmPassword" type="password" required class="form-control" />
</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 type="button" onclick="validPassword();" class="btn btn-primary">저장</button>
</div>
</div>
</div>
</div>
</form>
<script>
function validPassword(){
if($("#password-form input[name='currentPassword']").val() == ""){
dialog.alert("현재 비밀번호를 입력하세요.");
return;
}
if($("#password-form input[name='password']").val() == ""){
dialog.alert("새 비밀번호를 입력하세요.");
return;
}
if($("#password-form input[name='confirmPassword']").val() == ""){
dialog.alert("새 비밀번호 확인을 입력하세요.");
return;
}
let match = Array.from(document.querySelectorAll("input[name='password'],input[name='confirmPassword']"))
.map(input => input.value)
.reduce((total, current) => total == current);
if (!match) {
dialog.alert({
content:"새 비밀번호와 새 비밀번호 확인이 다릅니다.",
onClose:function(){
document.querySelector("input[name='confirmPassword']").focus();
}
});
return;
}
savePassword();
}
function savePassword(){
ajax.post({
url : wctx.url("/user/changePassword.do"),
data : {
userIDs : MY_INFO.id,
password : $("#password-form input[name='password']").val(),
currentPassword : $("#password-form input[name='currentPassword']").val(),
init : false
},
success : (resp) => {
if(resp.saved){
dialog.alert("비밀번호 변경에 성공하였습니다.");
dialog.close("changePasswordDialog");
} else {
dialog.alert("비밀번호 변경에 실패하였습니다.");
}
}
});
}
</script>

@ -1,57 +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"%>
<!-- Page Body -->
<div id="DataTables_Table_0_wrapper" class="dataTables_wrapper dt-bootstrap5 no-footer">
<table class="datatables-ajax table table-bordered dataTable no-footer" id="DataTables_Table_0">
<thead>
<tr><th class="sorting sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="2" aria-sort="ascending" style="">시군구</th>
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="2" style="">기관</th>
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="2" style="">부서</th>
</tr>
</thead>
<tbody id="sggDeptList">
</tbody>
<template id="sggDeptRow">
<tr data-key="{dataKey}">
<td onclick="sggDepts.setCurrent('{dataKey}')">{SGG_CD}</td>
<td onclick="sggDepts.setCurrent('{dataKey}')">{SGG_NM}</td>
<td onclick="sggDepts.setCurrent('{dataKey}')">{INST_CD}</td>
<td onclick="sggDepts.setCurrent('{dataKey}')">{INST_NM}</td>
<td onclick="sggDepts.setCurrent('{dataKey}')">{DEPT_CD}</td>
<td onclick="sggDepts.setCurrent('{dataKey}')">{DEPT_NM}</td>
</tr>
</template>
<template id="sggDeptNotFound">
<tr class="odd">
<td valign="top" colspan="4" class="dataTables_empty text-center">부서정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
<!--/ Page Body -->
<script >
var sggDepts = new Dataset({
keymapper: info => info.dataKey,
onDatasetChange: obj => {
let empty = sggDepts.empty;
let trs = empty ?
[document.getElementById("sggDeptNotFound").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
sggDepts.inStrings(document.getElementById("sggDeptRow").innerHTML); <%-- from template#${infoPrefix}Row --%>
$("#sggDeptList").html(trs.join());
},
onCurrentChange: item => {
if (!item) return;
let key = item.data.dataKey;
$("#sggDeptList").setCurrentRow(key);
}
});
function getSelectedDept() {
return sggDepts.getCurrent();
}
sggDepts.setData(${sggDepts});
//# sourceURL=select-sggDepts.jsp
</script>

@ -1,128 +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}Account">계정</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 id="_${infoPrefix}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" 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="Email: activate to sort column ascending" >부서명</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="_${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({})">{SGG_NM}</td>
<td onclick="${infoPrefix}Control.setCurrent('{USER_ID}')" ondblclick="${infoPrefix}Control.getInfo({})">{INST_NM}</td>
<td onclick="${infoPrefix}Control.setCurrent('{USER_ID}')" ondblclick="${infoPrefix}Control.getInfo({})">{DEPT_NM}</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({})">{REG_DT}</td>
</tr>
</template>
<template id="_${infoPrefix}NotFound">
<tr class="odd">
<td valign="top" colspan="7" 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());
$("#_${infoPrefix}Thead").find("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,246 +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="d-flex flex-column flex-grow-1">
<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="${infoPrefix}-query">
<select id="${infoPrefix}by" name="by" onchange="document.getElementById('${infoPrefix}term').focus();" aria-controls="DataTables_Table_0" class="form-select">
<option value="sggName">이름</option>
<option value="sggID">아이디</option>
</select>
<input id="${infoPrefix}term" name="term" autofocus type="text" placeholder="조회 조건을 입력하십시오." class="form-control">
</div>
</div--%>
<div>
<%--button onclick="searchSggs();" class="btn btn-primary">찾기</button--%>
<button onclick="sggDeptControl.newSgg();" class="btn btn-primary">+ 추가</button>
<button id="btnRemoveSggs" onclick="removeSggs();" 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 id="sggThead">
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="text-align:center;"><input onchange="sggDeptControl.sggs.select(this.checked);" type="checkbox" class="form-check-input"></th>
<th class="text-center sorting sorting_asc" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="2" aria-sort="ascending">시군구</th>
<th class="text-center sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="2">기관</th>
</tr>
</thead>
<tbody id="sggList">
</tbody>
<template id="sggRow">
<tr data-key="{SGG_CD}"{notUsed}>
<td style="text-align:center;"><input value="{SGG_CD}" onchange="sggDeptControl.sggs.select('{SGG_CD}', this.checked);" type="checkbox" class="form-check-input"></td>
<td onclick="sggDeptControl.sggs.setCurrent('{SGG_CD}')" ondblclick="sggDeptControl.sggs.getInfo({})">{SGG_CD}</td>
<td onclick="sggDeptControl.sggs.setCurrent('{SGG_CD}')" ondblclick="sggDeptControl.sggs.getInfo({})">{SGG_NM}</td>
<td onclick="sggDeptControl.sggs.setCurrent('{SGG_CD}')" ondblclick="sggDeptControl.sggs.getInfo({})">{INST_CD}</td>
<td onclick="sggDeptControl.sggs.setCurrent('{SGG_CD}')" ondblclick="sggDeptControl.sggs.getInfo({})">{INST_NM}</td>
</tr>
</template>
<template id="sggNotFound">
<tr class="odd">
<td valign="top" colspan="5" class="dataTables_empty text-center">${prefixName}를 찾지 못했습니다.</td>
</tr>
</template>
</table>
<div class="d-flex flex-row p-3 justify-content-between">
<label id="sggPagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
<ul id="sggPaging" 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="btnAddDept" onclick="sggDeptControl.newDept();" class="btn btn-primary">+ 추가</button>
<button id="btnRemoveDepts" onclick="removeDepts();" 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 id="deptThead">
<tr><th tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1" style="text-align:center;"><input id="deptToggler" onchange="sggDeptControl.depts.select(this.checked);" type="checkbox" class="form-check-input"></th>
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1">부서코드</th>
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1">부서이름</th>
<th class="sorting" tabindex="0" aria-controls="DataTables_Table_0" rowspan="1" colspan="1">전화번호</th>
</tr>
</thead>
<tbody id="deptList">
</tbody>
<template id="deptRow">
<tr data-key="{DEPT_CD}"{notUsed}>
<td style="text-align:center;"><input value="{DEPT_CD}" onchange="sggDeptControl.depts.select('{DEPT_CD}', this.checked);" type="checkbox" class="form-check-input"></td>
<td onclick="sggDeptControl.depts.setCurrent('{DEPT_CD}')" ondblclick="sggDeptControl.depts.getInfo({})">{DEPT_CD}</td>
<td onclick="sggDeptControl.depts.setCurrent('{DEPT_CD}')" ondblclick="sggDeptControl.depts.getInfo({})">{DEPT_NM}</td>
<td onclick="sggDeptControl.depts.setCurrent('{DEPT_CD}')" ondblclick="sggDeptControl.depts.getInfo({})">{DEPT_TELNO}</td>
</tr>
</template>
<template id="deptNotFound">
<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="deptPagingInfo" class="dataTables_info" role="status" aria-live="polite"></label>
<ul id="deptPaging" class="pagination pagination-primary">
</ul>
</div>
</div>
</div>
</div>
</div>
<!--/ Page Body -->
<script >
var sggDeptControl = new SggDeptControl();
sggDeptControl.sggs.query = {includeAll: true};
<%--
function searchSggs() {
sggDeptControl.sggs.query = {
by:$("#${infoPrefix}-query [name='by']").val(),
term:$("#${infoPrefix}-query [name='term']").val()
includeAll: true
};
sggDeptControl.sggs.load(1);
}--%>
function removeSggs() {
dialog.alert({
content:"선택한 ${prefixName} 정보를 제거하시겠습니까?",
onOK:() => {
sggDeptControl.sggs.remove();
}
});
}
function removeDepts() {
dialog.alert({
content:"선택한 코드를 삭제하시겠습니까?",
onOK:() => {
sggDeptControl.depts.remove();
}
});
}
function renderSggList() {
let sggList = sggDeptControl.sggs.dataset;
let empty = sggList.empty;
let trs = empty ?
[document.getElementById("sggNotFound").innerHTML] : <%-- from template#sggNotFound --%>
sggList.inStrings(
document.getElementById("sggRow").innerHTML,
(tmpl, item) => tmpl.replace(/{notUsed}/gi, item.getValue("USE_YN") == "N" ? "class=\"not-used\"" : "")
); <%-- from template#sggRow --%>
$("#sggList").html(trs.join());
$("#sggThead").find("th input[type='checkbox']").prop("checked", false);
$("#deptThead").find("th input[type='checkbox']").prop("checked", false);
}
sggDeptControl.sggs.onDatasetChange = obj => {
renderSggList();
$("#sggPaging").setPaging({
list:sggDeptControl.sggs.dataset,
prefix:sggDeptControl.sggs.prefix,
start:obj.sggStart,
totalSize:obj.sggTotal,
fetchSize:obj.sggFetch,
func:"sggDeptControl.sggs.load({index})"
});
};
sggDeptControl.sggs.onCurrentChange = item => {
$("#btnAddDept").prop("disabled", !item);
if (!item) return;
let key = item.data.SGG_CD;
$("#sggList").setCurrentRow(key);
sggDeptControl.getDepts({includeAll: true});
};
sggDeptControl.sggs.onSelectionChange = selected => {
let sggList = sggDeptControl.sggs.dataset;
let keys = selected.map(e => sggList.getKey(e));
$("#sggList input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
$("#btnRemoveSggs").prop("disabled", keys.length < 1);
};
function renderDeptList() {
let deptList = sggDeptControl.depts.dataset;
let empty = deptList.empty;
let trs = empty ?
[document.getElementById("deptNotFound").innerHTML] : <%-- from template#sggNotFound --%>
deptList.inStrings(
document.getElementById("deptRow").innerHTML,
(tmpl, item) => tmpl.replace(/{notUsed}/gi, item.getValue("USE_YN") == "N" ? "class=\"not-used\"" : "")
); <%-- from template#sggRow --%>
$("#deptList").html(trs.join());
$("#deptToggler").prop("checked", false);
}
sggDeptControl.depts.onDatasetChange = obj => {
renderDeptList();
$("#deptPaging").setPaging({
list:sggDeptControl.depts.dataset,
prefix:sggDeptControl.depts.prefix,
start:obj ? obj.deptStart : -1,
totalSize:obj ? obj.deptTotal : 0,
fetchSize:obj ? obj.deptFetch : 10,
func:"sggDeptControl.depts.load({index})"
});
};
sggDeptControl.depts.onCurrentChange = item => {
if (!item) return;
let data = item.data;
let key = data.DEPT_CD;
$("#deptList").setCurrentRow(key);
};
sggDeptControl.depts.onSelectionChange = selected => {
let deptList = sggDeptControl.depts.dataset;
let keys = selected.map(e => deptList.getKey(e));
$("#deptList input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
let sgg = sggDeptControl.sggs.getCurrent();
sgg = sgg ? sgg.USE_YN : "N";
$("#btnAddDept").prop("disabled", "N" == sgg);
$("#btnRemoveDepts").prop("disabled", selected.length < 1);
};
$(function(){
${onload}
sggDeptControl.sggs.setData({
sggList:${sggList},
sggStart:${sggStart},
sggFetch:${sggFetch},
sggTotal:${sggTotal}
});
sggDeptControl.depts.setData({
deptList:${deptList},
deptStart:${deptStart},
deptFetch:${deptFetch},
deptTotal:${deptTotal}
});
<%-- $("#${infoPrefix}term").onEnterPress(searchSggs); --%>
});
//# sourceURL=sgg-dept.jsp
</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"%>
<form id="sgg-form">
<div class="row g-3">
<div class="col-md-12">
<div class="row">
<label class="col-sm-3 col-form-label text-sm-end">시군구</label>
<div class="col-sm-9">
<div class="row justify-content-between" style="padding: 0 .75rem;">
<input name="sggID" type="text" required data-map="SGG_CD" maxlength="5" class="form-control" style="width: 28%;" placeholder="시군구 코드" />
<input name="sggName" type="text" required data-map="SGG_NM" maxlength="60" class="form-control" style="width: 70%;" placeholder="시군구 이름" />
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="row">
<label class="col-sm-3 col-form-label text-sm-end">기관</label>
<div class="col-sm-9">
<div class="row justify-content-between" style="padding: 0 .75rem;">
<select name="instType" data-map="INST_SE_CD" class="form-control" style="width: 24%;">
<option value="">구분</option>
<option value="01">시청</option>
<option value="02">구청</option>
<option value="03">군청</option>
<option value="04">도청</option>
<option value="05">출장소</option>
<option value="06">사무소</option>
</select>
<input name="instCode" type="text" data-map="INST_CD" maxlength="7" class="form-control" style="width: 25%;" placeholder="기관 코드"/>
<input name="instName" type="text" data-map="INST_NM" maxlength="100" class="form-control" style="width: 48%;" placeholder="기관 이름"/>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="row">
<label class="col-sm-3 col-form-label text-sm-end">주소</label>
<div class="col-sm-9">
<div class="row justify-content-between" style="padding: 0 .75rem;">
<input name="instAddress" type="text" data-map="INST_ADDR" maxlength="200" class="form-control" placeholder="주소"/>
<input name="instDetailAddress" type="text" data-map="INST_DADDR" maxlength="200" class="form-control" style="margin: .5rem 0;" placeholder="상세주소"/>
<input name="instZipCode" type="text" data-map="INST_ZIP" maxlength="6" class="form-control" style="width: 32%;" placeholder="기관 우편번호"/>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="row">
<label class="col-sm-3 col-form-label text-sm-end">직인 파일</label>
<div class="col-sm-9">
<div class="row justify-content-between" style="padding: 0 .75rem;">
<input name="officialSealFilepath" type="text" data-map="OFFCS_FILE_PATH" maxlength="200" class="form-control" placeholder="직인 파일경로"/>
<input name="officialSealFilename" type="text" data-map="OFFCS_FILE_NM" maxlength="100" class="form-control" style="margin: .5rem 0;" placeholder="직인 파일이름"/>
</div>
</div>
</div>
</div>
<div class="col-md-12">
<div class="row">
<label class="col-sm-3 col-form-label text-sm-end" for="createdBy">등록자</label>
<div class="col-sm-9">
<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-3 col-form-label text-sm-end">등록일자</label>
<div class="col-sm-9">
<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-3 col-form-label text-sm-end">사용여부</label>
<div class="col-sm-9" style="padding:.5em .7em;">
<input name="useYN" type="hidden" data-map="USE_YN" />
<span id="sggInUse"></span>
</div>
</div>
</div>
<div class="row mt-4 justify-content-end">
<div class="col-sm-12" style="text-align:right;">
<button onclick="saveSgg();" type="button" class="btn btn-primary">저장</button>
</div>
</div>
</form>
<script type="text/javascript">
var sggFields = new FormFields("#sgg-form");
sggDeptControl.sggs.setInfo = obj => {
let info = obj.data;
sggFields.set(sggDeptControl.sggs, obj);
let create = isEmpty(info.SGG_CD);
$("input[name='sggID']").prop("readonly", !create);
$("#sgg-form input").onEnterPress(saveSgg);
$("#sggInUse").html(info.USE_YN == "Y" ? "사용 중" : "사용하지 않음");
document.querySelector("input[name='" + (create ? "sggID" : "sggName") + "']").focus();
}
sggDeptControl.sggs.onModify = (changed) => {
if (["SGG_NM"].filter(e => changed.includes(e)).length < 1)
return;
renderSggList();
sggDeptControl.sggs.dataset.setState();
}
function saveSgg() {
if (!$("#sgg-form input").validInputs()) return;
dialog.alert({
content:"현재 시군구 정보를 저장하시겠습니까?",
onOK:() => sggDeptControl.sggs.save(sggFields.get())
});
}
//# sourceURL=sgg-info.jsp
</script>

@ -1,309 +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">
<input type="hidden" name="cntnSeCd" data-map="CNTN_SE_CD" />
<div class="row g-3">
<div class="col-md-6">
<div class="row">
<label class="col-sm-3 text-sm-end col-form-label required">
사용자구분
</label>
<div class="col-sm-9">
<select name="userSeCd" class="form-select" data-map="USER_SE_CD"
required title="사용자구분">
</select>
</div>
</div>
</div>
<div class="col-md-6">
</div>
<div class="col-md-12">
<label class="col-form-label required">
시군구/기관 및 부서
</label>
<select name="institute" class="form-select no-bgi" data-map="NSTT_CD"
required title="시군구/기관 및 부서" disabled>
<option value=""></option>
<c:forEach items="${allOgdpList}" var="item">
<option value="${item.INST_CD}">${item.SGG_NM} / ${item.INST_NM}</option>
</c:forEach>
</select>
<select name="deptCode" class="form-select no-bgi" data-map="DEPT_CD"
required title="시군구/기관 및 부서" disabled>
<option value=""></option>
<c:forEach items="${allOgdpList}" var="item">
<option value="${item.DEPT_CD}">${item.DEPT_NM}</option>
</c:forEach>
</select>
<input type="hidden" name="orgID" data-map="ORG_ID" />
<div class="dropdown d-inline-flex">
<button type="button"
id="btnSelectOgdp"
class="btn btn-md btn-secondary dropdown-toggle"
data-bs-toggle="dropdown"
>선택</button>
<ul class="dropdown-menu oy-auto mh-px-300">
<c:forEach items="${ableOgdpList}" var="item">
<li>
<a class="dropdown-item"
onclick="setOgdpCodeValues('${item.INST_CD}','${item.DEPT_CD}','${item.SGG_CD}')">
${item.OGDP_NM}
</a>
</li>
</c:forEach>
</ul>
</div>
</div>
<div class="col-md-6">
<div class="row">
<label class="col-sm-3 col-form-label text-sm-end required" for="account"
>계정</label>
<div class="col-sm-9">
<input name="id" type="hidden" data-map="USER_ID" />
<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 required" 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 required" 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">
<div class="row">
<label class="col-sm-3 col-form-label text-sm-end required" 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 required" 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="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="mobilePhoneNo">휴대전화</label>
<div class="col-sm-9">
<input name="mobilePhoneNo" type="text" data-map="MBL_TELNO" 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">
<c:if test='${currentUser.hasAuthorities("ROLE_ADMIN")}'>
<div class="form-check form-check-inline mt-3">
<input name="status" value="P" type="radio" data-map="STTS" class="form-check-input"/>
<label class="form-check-label" for="approved">승인</label>
</div>
<div class="form-check form-check-inline">
<input name="status" value="A" type="radio" data-map="STTS" class="form-check-input"/>
<label class="form-check-label" for="applied">신청</label>
</div>
<div class="form-check form-check-inline">
<input name="status" value="D" type="radio" data-map="STTS" class="form-check-input"/>
<label class="form-check-label" for="removed">삭제</label>
</div>
</c:if>
<c:if test='${!currentUser.hasAuthorities("ROLE_ADMIN")}'>
<input name="status" type="hidden" data-map="STTS" class="form-control" placeholder="상태"/>
<label class="col-form-label" for=STTS></label>
</c:if>
</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>
<datalist id="allOgdpList">
<c:forEach items="${allOgdpList}" var="item">
<option value="${item.OGDP_CD}">${item.OGDP_NM}</option>
</c:forEach>
</datalist>
<datalist id="userSeCdList">
<c:forEach items="${CMN008List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</datalist>
<script type="text/javascript">
var infoPrefixFields = new FimsFormFields("#infoPrefix-form");
infoPrefixControl.setInfo = (obj) => {
let create = isEmpty(obj.data.USER_ACNT);
if(create){
obj.data.CNTN_SE_CD = "01";
}
let isInnerUser = (obj.data.CNTN_SE_CD == "01");
if(!isInnerUser){
$("#infoPrefix-form select[name='userSeCd']").html($("#userSeCdList option[value='21']").clone());
$("#btnSelectOgdp").attr("hidden","hidden");
} else {
$("#infoPrefix-form select[name='userSeCd']").html($("#userSeCdList option[value!='21']").clone());
$("#btnSelectOgdp").removeAttr("hidden");
}
infoPrefixFields.set(infoPrefixControl,obj);
$("#infoPrefix-form input[name='account']").prop("readonly", !create);
$("#infoPrefix-form input[name='name']").prop("readonly", !create);
if(create){
$("#infoPrefix-form :radio[name='status'][value='D']").attr("hidden","hidden");
$("#infoPrefix-form label[for='removed']").attr("hidden","hidden");
} else {
$("#infoPrefix-form :radio[name='status'][value='D']").removeAttr("hidden");
$("#infoPrefix-form label[for='removed']").removeAttr("hidden");
}
$("#infoPrefix-form input[type='password']").each(function(){
let password = $(this).prop("required", create);
let div = password.parent().parent().parent();
if (create) {
div.removeAttr("hidden");
} else {
div.attr("hidden","hidden");
}
});
let positionNameDiv = $("#infoPrefix-form input[name='positionName']").parent().parent().parent();
if (isInnerUser) {
positionNameDiv.removeAttr("hidden");
} else {
positionNameDiv.attr("hidden","hidden");
}
let mobilePhoneNoDiv = $("#infoPrefix-form input[name='mobilePhoneNo']").parent().parent().parent();
if (!isInnerUser) {
mobilePhoneNoDiv.removeAttr("hidden");
} else {
mobilePhoneNoDiv.attr("hidden","hidden");
}
let stts = "";
if(obj.data.STTS == "D"){
stts = "삭제";
} else if(obj.data.STTS == "P"){
stts = "승인";
} else {
stts = "신청";
}
$("#infoPrefix-form label[for='STTS']").html(stts);
$("#infoPrefix-form").find("input,select")
.change(function() {
let input = $(this),
name = input.attr("data-map"),
val = input.val();
infoPrefixControl.setValue(name, val);
})
.onEnterPress(saveinfoPrefix);
document.querySelector("#infoPrefix-form 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").find("input,select").validInputs()) return;
let match = Array.from(document.querySelectorAll("#infoPrefix-form input[type='password']"))
.map(input => input.value)
.reduce((total, current) => total == current);
if (!match) {
dialog.alert({
content:"비밀번호와 비밀번호 확인이 다릅니다.",
onClose:function(){
document.querySelector("#infoPrefix-form input[name='confirmPassword']").focus();
}
});
return;
}
dialog.alert({
content:"현재 prefixName 정보를 저장하시겠습니까?",
onOK:() => {
infoPrefixControl.save(infoPrefixFields.get());
}
});
}
function setOgdpCodeValues(institute, deptCode, sggCd){
$("#infoPrefix-form [name='institute']").val(institute).trigger("change");
$("#infoPrefix-form [name='deptCode']").val(deptCode).trigger("change");
$("#infoPrefix-form [name='orgID']").val(sggCd).trigger("change");
}
//# sourceURL=user-info.jsp
</script>

@ -1,180 +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="d-flex flex-column flex-grow-1">
<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 class="d-flex flex-grow-1 me-5" id="${infoPrefix}-query">
<div class="input-group me-3 w-px-400">
<select id="${infoPrefix}by" name="by" onchange="document.getElementById('${infoPrefix}term').focus();" aria-controls="DataTables_Table_0" class="form-select">
<option value="${infoPrefix}Name">이름</option>
<option value="${infoPrefix}Account">계정</option>
</select>
<input id="${infoPrefix}term" name="term" autofocus type="text" placeholder="조회 조건을 입력하십시오." class="form-control">
</div>
<label for="${infoPrefix}status" class="form-label fw-bold px-3 d-flex flex-wrap align-content-center justify-content-center">상태</label>
<select id="${infoPrefix}status" name="status" class="form-select">
<option value="">전체</option>
<option value="A">신청</option>
<option value="P">승인</option>
<option value="D">삭제</option>
</select>
<label for="${infoPrefix}type" class="form-label fw-bold px-3 d-flex flex-wrap align-content-center justify-content-center">접속구분</label>
<select id="${infoPrefix}type" name="type" class="form-select">
<option value="">전체</option>
<c:forEach items="${CMN009List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</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 id="${infoPrefix}Thead">
<tr>
<th tabindex="0" style="width: 158.828px; text-align:center;"><input onchange="${infoPrefix}Control.select(this.checked);" type="checkbox" class="form-check-input"></th>
<th class="sorting" style="width: 146.156px;">상태</th>
<th class="sorting" style="width: 146.156px;">사용자구분</th>
<th class="sorting" style="width: 146.156px;">기관</th>
<th class="sorting sorting_asc" aria-sort="ascending" style="width: 223.719px;">계정</th>
<th class="sorting" style="width: 146.156px;">이름</th>
<th class="sorting" style="width: 146.156px;">부서</th>
<th class="sorting" style="width: 195.688px;">이메일</th>
<th class="sorting" style="width: 160.141px;">전화번호(유선)</th>
<th class="sorting" 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} {ondblclick}>{STTS_NM}</td>
<td {onclick} {ondblclick}>{USER_SE_NM}</td>
<td {onclick} {ondblclick}>{INST_NM}</td>
<td {onclick} {ondblclick}>{USER_ACNT}</td>
<td {onclick} {ondblclick}>{USER_NM}</td>
<td {onclick} {ondblclick}>{DEPT_NM}</td>
<td {onclick} {ondblclick}>{EML_ADRS}</td>
<td {onclick} {ondblclick}>{TELNO}</td>
<td {onclick} {ondblclick}>{REG_DT}</td>
</tr>
</template>
<template id="${infoPrefix}NotFound">
<tr class="odd">
<td valign="top" colspan="10" 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>
<!--/ Page Body -->
<script >
var ${infoPrefix}Control = new UserControl();
function search${infoPrefix}s() {
${infoPrefix}Control.query = {
by: $("#${infoPrefix}-query [name='by']").val(),
term: $("#${infoPrefix}-query [name='term']").val(),
status: $("#${infoPrefix}-query [name='status']").val(),
type: $("#${infoPrefix}-query [name='type']").val(),
};
if(${infoPrefix}Control.query.by == "userAccount"){
${infoPrefix}Control.query.term = ${infoPrefix}Control.query.term.toUpperCase();
}
${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 --%>
(str, dataItem) => str
.replace(/{onclick}=""/gi, 'onclick="userControl.setCurrent(\'' + dataItem.getValue("USER_ID") + '\');"')
.replace(/{ondblclick}=""/gi, 'ondblclick="userControl.getInfo(\'' + dataItem.getValue("USER_ID") + '\')"')
<%-- OR
(str, dataItem) => {
let userID = dataItem.getValue("USER_ID");
return str
.replace(/{onclick}=""/gi, 'onclick="userControl.setCurrent(\'' + userID + '\');"')
.replace(/{ondblclick}=""/gi, 'ondblclick="userControl.getInfo(\'' + userID + '\')"')
}
--%>
);
$("#${infoPrefix}List").html(trs.join());
$("#${infoPrefix}Thead").find("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);
};
$("#${infoPrefix}term").onEnterPress(search${infoPrefix}s);
$(function(){
${onload}
${infoPrefix}Control.setData({
${infoPrefix}List:${userList},
${infoPrefix}Start:${userStart},
${infoPrefix}Fetch:${userFetch},
${infoPrefix}Total:${userTotal}
});
});
//# sourceURL=user-main.jsp
</script>

@ -1,838 +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="wrapper-dashboard">
<div id="card1" class="card dashboard-total">
<div class="card-body row">
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card1-1">
<span class="skeleton">?/?</span>
</p>
<i class="svg-cctv-fixed w-px-30 d-block" title="고정형CCTV"></i>
</div>
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card1-2">
<span class="skeleton">?/?</span>
</p>
<i class="svg-crackdown-road w-px-30 d-block" title="도보"></i>
</div>
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card1-3">
<span class="skeleton">?/?</span>
</p>
<i class="svg-cctv-drive w-px-30 d-block" title="주행형CCTV"></i>
</div>
<div class="col px-4 d-flex flex-column align-items-center">
<p class="mb-1" id="card1-4">
<span class="skeleton">?/?</span>
</p>
<i class="svg-crackdown-minwon w-px-30 d-block" title="민원"></i>
</div>
</div>
<div class="card-footer ms-auto">
<a href="#" id="btnGoToCrdn">단속관리 바로가기 ></a>
</div>
</div>
<div id="card2" class="card dashboard-total">
<div class="card-body row">
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card2-1">
<span class="skeleton">?/?</span>
</p>
<i class="svg-target-lvy w-px-30 d-block" title="등록대상"></i>
</div>
<div class="col px-4 d-flex flex-column align-items-center">
<p class="mb-1" id="card2-2">
<span class="skeleton">?/?</span>
</p>
<i class="svg-target-transfer w-px-30 d-block" title="이첩대상"></i>
</div>
</div>
<div class="card-footer ms-auto">
</div>
</div>
<div id="card3" class="card dashboard-total">
<div class="card-body row">
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card3-1">
<span class="skeleton">?/?</span>
</p>
<i class="svg-sendstat-guide w-px-30 d-block" title="계도장 발송현황"></i>
</div>
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card3-2">
<span class="skeleton">?/?</span>
</p>
<i class="svg-sendstat-before w-px-30 d-block" title="사전통보 발송현황"></i>
</div>
<div class="col px-4 d-flex flex-column align-items-center">
<p class="mb-1" id="card3-3">
<span class="skeleton">?/?</span>
</p>
<i class="svg-sendstat-nop w-px-30 d-block" title="고지서 발송현황"></i>
</div>
</div>
<div class="card-footer ms-auto">
</div>
</div>
<div id="card4" class="card dashboard-total">
<div class="card-body row">
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card4-1">
<span class="skeleton">?/?</span>
</p>
<i class="svg-opn-rcp w-px-30 d-block" title="접수"></i>
</div>
<div class="col px-4 card-separator d-flex flex-column align-items-center">
<p class="mb-1" id="card4-2">
<span class="skeleton">?/?</span>
</p>
<i class="svg-opn-decision w-px-30 d-block" title="수용/미수용"></i>
</div>
<div class="col px-4 d-flex flex-column align-items-center">
<p class="mb-1" id="card4-3">
<span class="skeleton">?/?</span>
</p>
<i class="svg-opn-selfdrop w-px-30 d-block" title="자진취하"></i>
</div>
</div>
<div class="card-footer ms-auto">
<a href="#" id="btnGoToOpnn">의견진술관리 바로가기 ></a>
</div>
</div>
</div>
<div class="wrapper-dashboard">
<div class="card dashboard-chart">
<div class="card-header d-flex align-items-center justify-content-between">
<h5 class="card-title m-0 me-2">단속 자료 통계(유형별)</h5>
<div>건수(최근 15일)</div>
</div>
<div class="card-body d-flex justify-content-center" id="lineChartCardBody">
<canvas id="lineChart" class="chartjs mh-px-300" data-height="500"></canvas>
</div>
<div class="card-footer ms-auto">
통계현황 바로가기 >
</div>
</div>
<div class="card dashboard-chart">
<div class="card-header d-flex align-items-center justify-content-between">
<h5 class="card-title m-0 me-2">단속통계</h5>
<div>처리유형별(일별)</div>
</div>
<div class="card-body d-flex justify-content-center" id="doughnutChart1CardBody">
<canvas id="doughnutChart1" class="chartjs mh-px-300" data-height="350"></canvas>
</div>
<div class="card-footer ms-auto">
통계현황 바로가기 >
</div>
</div>
<div class="card dashboard-chart">
<div class="card-header d-flex align-items-center justify-content-between">
<h5 class="card-title m-0 me-2">발송통계</h5>
<div>발송유형별(일별)</div>
</div>
<div class="card-body d-flex justify-content-center" id="doughnutChart2CardBody">
<canvas id="doughnutChart2" class="chartjs mh-px-300" data-height="350"></canvas>
</div>
<div class="card-footer ms-auto">
통계현황 바로가기 >
</div>
</div>
<div class="card dashboard-chart">
<div class="card-header d-flex align-items-center justify-content-between">
<h5 class="card-title m-0 me-2">의견진술통계</h5>
<div>처리유형별(일별)</div>
</div>
<div class="card-body d-flex justify-content-center" id="doughnutChart3CardBody">
<canvas id="doughnutChart3" class="chartjs mh-px-300" data-height="350"></canvas>
</div>
<div class="card-footer ms-auto">
통계현황 바로가기 >
</div>
</div>
</div>
<c:set var="dashboardScript" scope="request">
LoadScript("chartScript","/webjars/3rd-party/sneat/libs/chartjs/chartjs.js");
var falseLineChart = `<svg xmlns="http://www.w3.org/2000/svg" class="skeleton"
height="250" viewBox="0 0 24 24">
<path class="skeleton" d="M3 3v17a1 1 0 0 0 1 1h17v-2H5V3H3z"></path>
<path class="skeleton" d="M15.293 14.707a.999.999 0 0 0 1.414 0l5-5-1.414-1.414L16 12.586l-2.293-2.293a.999.999 0 0 0-1.414 0l-5 5 1.414 1.414L13 12.414l2.293 2.293z"></path>
</svg>`;
var falseDoughnutChart = `<svg xmlns="http://www.w3.org/2000/svg" class="skeleton"
height="250" viewBox="0 0 24 24">
<path class="skeleton" d="M13 6c2.507.423 4.577 2.493 5 5h4c-.471-4.717-4.283-8.529-9-9v4z"></path>
<path class="skeleton" d="M18 13c-.478 2.833-2.982 4.949-5.949 4.949-3.309 0-6-2.691-6-6C6.051 8.982 8.167 6.478 11 6V2c-5.046.504-8.949 4.773-8.949 9.949 0 5.514 4.486 10 10 10 5.176 0 9.445-3.903 9.949-8.949h-4z"></path>
</svg>`;
var statReqArr = [];
fnMakeSkeleton();
sleep(3000).then(() => fnMakeStatReq($("#layout-navbar input[name='taskSeCd']:checked").val()));
//데이터 로딩 전 이미지 표시
function fnMakeSkeleton(){
$("#lineChart").hide();
$("#doughnutChart1").hide();
$("#doughnutChart2").hide();
$("#doughnutChart3").hide();
$("#lineChartCardBody").append(falseLineChart);
$("#doughnutChart1CardBody").append(falseDoughnutChart);
$("#doughnutChart2CardBody").append(falseDoughnutChart);
$("#doughnutChart3CardBody").append(falseDoughnutChart);
}
//통계 요청 데이터 생성(여러 건)
function fnMakeStatReq(taskSeCd){
var lastDay = DateUtil.getDate().date.replace("-","");
var firstDay = DateUtil.getDateDay(-14).date.replaceAll("-","");
var defaultQuery = {};
//단속구분별 전체/완료 건수
defaultQuery = {
structureType : "dummy",
statDomain : "crdn",
groupInfoList : [
{
refCol : "CRDN_SE_CD",
ctgrType : "code",
dtlCtgr : "FIM002"
}
],
codeSubsetInfoList : [
{
sourceGroup : "FIM002",
sourceCodes : ["08","09","10","11"],
targetCode : "minwon",
targetCodeVal : "민원"
},
{
sourceGroup : "FIM002",
sourceCodes : ["06","13"],
targetCode : "dobo",
targetCodeVal : "도보"
}
],
fixedItemId : ["01","02","minwon","dobo"],
namedNumberValueSeperator : "completeAndTotal",
globalAggregate : "count",
taskSeCd : taskSeCd,
dayColumn : "REG_DT",
firstDay : firstDay,
lastDay : lastDay
};
defaultQuery = fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "card1",
statType : "progressAndTotal"
});
//초기자료처리별 전체/완료건수
defaultQuery = {
structureType : "dummy",
statDomain : "crdn",
groupInfoList : [
{
refCol : "등록대상이첩대상구분",
ctgrType : "code",
dtlCtgr : "FIM999"
}
],
fixedItemId : ["등록대상","이첩대상"],
namedNumberValueSeperator : "completeAndTotal",
globalAggregate : "count",
taskSeCd : taskSeCd,
dayColumn : "REG_DT",
firstDay : firstDay,
lastDay : lastDay
};
defaultQuery = fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "card2",
statType : "progressAndTotal"
});
//발송문서별 전체/완료 건수
defaultQuery = {
structureType : "dummy",
statDomain : "sndb",
groupInfoList : [
{
refCol : "SNDNG_SE_CD",
ctgrType : "code",
dtlCtgr : "FIM047"
}
],
codeSubsetInfoList : [
{
sourceGroup : "FIM047",
sourceCodes : ["01","02"],
targetCode : "satong",
targetCodeVal : "사전통지서"
}
],
fixedItemId : ["satong", "03", "11"],
namedNumberValueSeperator : "completeAndTotal",
globalAggregate : "count",
taskSeCd : taskSeCd,
dayColumn : "REG_DT",
firstDay : firstDay,
lastDay : lastDay
};
defaultQuery = fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "card3",
statType : "progressAndTotal"
});
//의견진술자료상태
defaultQuery = {
structureType : "dummy",
statDomain : "excl",
groupInfoList : [
{
refCol : "OPNN_SBMSN_STTS_CD",
ctgrType : "code",
dtlCtgr : "FIM031"
}
],
codeSubsetInfoList : [
{
sourceGroup : "FIM031",
sourceCodes : ["01","02"],
targetCode : "acceptOrNonAccept",
targetCodeVal : "수용/미수용"
}
],
fixedItemId : ["00", "acceptOrNonAccept", "03"],
namedNumberValueSeperator : "completeAndTotal",
globalAggregate : "count",
taskSeCd : taskSeCd,
dayColumn : "REG_DT",
firstDay : firstDay,
lastDay : lastDay
};
defaultQuery = fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "card4",
statType : "progressAndTotal"
});
//단속구분별 최근n일 건수
defaultQuery = {
structureType : "aggregate",
statDomain : "crdn",
groupInfoList : [
{
refCol : "CRDN_SE_CD",
ctgrType : "code",
dtlCtgr : "FIM002"
}
],
codeSubsetInfoList : [
{
sourceGroup : "FIM002",
sourceCodes : ["08","09","10","11"],
targetCode : "minwon",
targetCodeVal : "민원"
},
{
sourceGroup : "FIM002",
sourceCodes : ["06","13"],
targetCode : "dobo",
targetCodeVal : "도보"
}
],
fixedItemId : ["01","02","dobo","minwon"],
namedNumberValueSeperator : "lastFewDays",
globalAggregate : "count",
taskSeCd : taskSeCd,
dayColumn : "CRDN_YMD",
dayRange : 15
};
defaultQuery = fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "lineChart",
statType : "line"
});
//초기자료처리별 건수 차트
defaultQuery = {
structureType : "aggregate",
statDomain : "crdnSttsHstry",
groupInfoList : [
{
refCol : "CRDN_STTS_CD",
ctgrType : "code",
dtlCtgr : "FIM010"
}
],
numberValueInfoList : [
{
aggregateType : "count"
}
],
codeSubsetInfoList : [
{
sourceGroup : "FIM010",
sourceCodes : ["21"],
targetCode : "dansokProcess",
targetCodeVal : "단속"
}
],
fixedItemId : ["dansokProcess","81","83"],
taskSeCd : taskSeCd,
dayColumn : "REG_DT",
firstDay : firstDay,
lastDay : firstDay
};
defaultQuery = fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "doughnutChart1",
statType : "doughnut"
});
//발송문서종류별 건수 차트
defaultQuery = {
structureType : "aggregate",
statDomain : "sndb",
groupInfoList : [
{
refCol : "SNDNG_SE_CD",
ctgrType : "code",
dtlCtgr : "FIM047"
}
],
numberValueInfoList : [
{
aggregateType : "count"
}
],
codeSubsetInfoList : [
{
sourceGroup : "FIM047",
sourceCodes : ["01","02"],
targetCode : "satong",
targetCodeVal : "사전통지서"
}
],
fixedItemId : ["satong", "03", "11"],
taskSeCd : taskSeCd,
dayColumn : "SNDNG_YMD",
firstDay : firstDay,
lastDay : firstDay
};
defaultQuery = fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "doughnutChart2",
statType : "doughnut"
});
//의견진술결과별 건수 차트
defaultQuery = {
structureType : "aggregate",
statDomain : "excl",
groupInfoList : [
{
refCol : "OPNN_SBMSN_STTS_CD",
ctgrType : "code",
dtlCtgr : "FIM031"
}
],
numberValueInfoList : [
{
aggregateType : "count"
}
],
fixedItemId : ["01", "02", "03"],
taskSeCd : taskSeCd,
dayColumn : "REG_DT",
firstDay : firstDay,
lastDay : firstDay
};
defaultQuery = fnJsonToFormData(defaultQuery, "groupInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "numberValueInfoList");
defaultQuery = fnJsonToFormData(defaultQuery, "codeSubsetInfoList");
statReqArr.push({
query : defaultQuery,
cursor : "doughnutChart3",
statType : "doughnut"
});
fnLoadStatisticsData();
}
//통계 데이터 조회
function fnLoadStatisticsData(){
var statArr = statReqArr.pop();
ajax.get({
url : wctx.url("/stat/stat01/010/info.do"),
data : statArr.query,
success : (resp) => {
var statData = resp.stat;
if(statData != null && statData.statItems != null){
fnRenderDashboardContents(statData, statArr.cursor , statArr.statType);
}
if(statReqArr.length != 0){
fnLoadStatisticsData();
}
}
});
}
//대시보드 콘텐츠 표시
function fnRenderDashboardContents(returnData, cursor, statType){
if(statType == "progressAndTotal"){
fnRenderProgressAndTotal(returnData, cursor);
return;
}
if(statType == "line"){
fnRenderLine(returnData, cursor);
return;
}
if(statType == "doughnut"){
fnRenderDoughnut(returnData, cursor);
return;
}
}
//진행건수,전체건수 표시
function fnRenderProgressAndTotal(returnData, cursor){
for(var i=0; i < returnData.statItems.length; i++){
var icon = $("#"+cursor).find("i[title='" + returnData.statItems[i].itemName[0] + "']");
var p = icon.prev("p");
p.html(returnData.statItems[i].numberValue[0] + "/" + returnData.statItems[i].numberValue[1]);
}
if(cursor == "card1"){
mappingButtonAndMenu("btnGoToCrdn","단속 관리");
return;
}
if(cursor == "card2"){
mappingButtonAndMenu("btnGoToOpnn","의견제출 관리");
return;
}
}
//라인차트 표시
function fnRenderLine(returnData, cursor){
var yellowColor = '#ffe800';
var cyanColor = '#28dac6';
var orangeLightColor = '#FDAC34';
var redColor = '#FF3E1D';
var indigoColor = '#696CFF';
var ctgrColorSet = [yellowColor,cyanColor,orangeLightColor,redColor,indigoColor];
var borderColor = '#f0f0f0';
var gridColor = '#f0f0f0';
var tickColor = 'rgba(0, 0, 0, 0.75)'; // x & y axis tick color
$("#"+cursor).siblings("svg").remove();
$("#"+cursor).show();
var maxOfStat = 0;
var minOfStat = 0;
var datasets = [];
for(var i=0; i < returnData.statItems.length; i++){
var defaultObject = {
tension: 0.5,
pointStyle: 'circle',
fill: false,
pointRadius: 1,
pointHoverRadius: 5,
pointHoverBorderWidth: 5,
pointBorderColor: 'transparent',
pointHoverBorderColor: config.colors.cardColor
};
defaultObject.label = returnData.statItems[i].itemName[0];
defaultObject.data = returnData.statItems[i].numberValue;
var maxOfStatItem = Math.max(defaultObject.data);
var minOfStatItem = Math.min(defaultObject.data);
if(maxOfStatItem > maxOfStat){
maxOfStat = maxOfStatItem;
}
if(minOfStatItem < minOfStat){
minOfStat = minOfStatItem;
}
defaultObject.backgroundColor = ctgrColorSet[i % ctgrColorSet.length];
defaultObject.pointHoverBackgroundColor = ctgrColorSet[i % ctgrColorSet.length];
defaultObject.borderColor = ctgrColorSet[i % ctgrColorSet.length];
datasets.push(defaultObject);
}
var xAxisLabels = returnData.numberValueLabel;
var yAxisConf = initYAxis(maxOfStat, minOfStat);
var lineChart = document.getElementById(cursor);
if (lineChart) {
var lineChartVar = new Chart(lineChart, {
type: 'line',
data: {
labels: xAxisLabels,
datasets: datasets
},
options: {
lineTension : 0,
responsive: true,
maintainAspectRatio: false,
scales: {
x: {
grid: {
color: borderColor,
drawBorder: false,
borderColor: borderColor
},
ticks: {
color: "black"
}
},
y: {
scaleLabel: {
display: true
},
min: yAxisConf.yAxisMin,
max: yAxisConf.yAxisMax,
ticks: {
color: "black",
stepSize: yAxisConf.yAxisStep
},
grid: {
color: borderColor,
drawBorder: false,
borderColor: borderColor
}
}
},
plugins: {
tooltip: {
rtl: true,
backgroundColor: config.colors.cardColor,
titleColor: config.colors.headingColor,
bodyColor: config.colors.bodyColor,
borderWidth: 1,
borderColor: borderColor
},
legend: {
position: 'left',
align: 'stretch',
rtl: true,
labels: {
usePointStyle: true,
padding: 6,
boxWidth: 12,
boxHeight: 30,
color: "black"
}
}
}
}
});
}
return;
}
//도넛차트 표시
function fnRenderDoughnut(returnData, cursor){
var yellowColor = '#ffe800';
var cyanColor = '#28dac6';
var orangeLightColor = '#FDAC34';
var redColor = '#FF3E1D';
var indigoColor = '#696CFF';
var ctgrColorSet = [yellowColor,cyanColor,orangeLightColor,redColor,indigoColor];
var borderColor = '#f0f0f0';
var gridColor = '#f0f0f0';
var tickColor = 'rgba(0, 0, 0, 0.75)'; // x & y axis tick color
var cardColor = config.colors.cardColor;
var headingColor = config.colors.headingColor;
var labelColor = config.colors.textMuted;
var legendColor = config.colors.bodyColor;
$("#"+cursor).siblings("svg").remove();
$("#"+cursor).show();
var lebels = [];
var datas = [];
var colors = [];
for(var i=0; i < returnData.statItems.length; i++){
lebels.push(returnData.statItems[i].itemName[0]);
datas.push(returnData.statItems[i].numberValue[0]);
colors.push(ctgrColorSet[i % ctgrColorSet.length]);
}
var doughnutChart = document.getElementById(cursor);
if (doughnutChart) {
var doughnutChartVar = new Chart(doughnutChart, {
type: 'doughnut',
data: {
labels: lebels,
datasets: [
{
data: datas,
backgroundColor: colors,
borderWidth: 1,
pointStyle: 'rectRounded'
}
]
},
options: {
responsive: true,
animation: {
duration: 500
},
cutout: '68%',
plugins: {
legend: {
display: true,
position : 'left'
},
tooltip: {
callbacks: {
label: function (context) {
const label = context.label || '';
const value = context.parsed;
const output = ' ' + label + ' : ' + value + ' 건';
return output;
}
},
// Updated default tooltip UI
rtl: true,
backgroundColor: cardColor,
titleColor: headingColor,
bodyColor: legendColor,
borderWidth: 1,
borderColor: borderColor
}
}
}
});
}
return;
}
//차트y축 표시최대값,표시최소값,간격 설정
function initYAxis(max, min){
if(max <= 10){
var yAxisConf = {
yAxisMax : 10,
yAxisMin : 0,
yAxisStep : 2
};
return yAxisConf;
}
if(max <= 100){
var yAxisConf = {
yAxisMax : 100,
yAxisMin : 0,
yAxisStep : 20
};
return yAxisConf;
}
var yAxisMax = Math.ceil(max / 100) * 100
var yAxisMin = Math.floor(min / 100) * 100;
if(yAxisMax - yAxisMin <= 100){
yAxisMin = yAxisMax - 100;
}
var yAxisStep = (yAxisMax - yAxisMin)/5;
var yAxisConf = {
yAxisMax : yAxisMax,
yAxisMin : yAxisMin,
yAxisStep : yAxisStep
};
return yAxisConf;
}
</c:set>

@ -1,82 +0,0 @@
<%@ page language="java" pageEncoding="UTF-8" isELIgnored="false" session="false"%>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
<%@ page import="java.util.HashMap, javax.servlet.http.HttpServletRequest, cokr.xit.foundation.data.Convert" %>
<%! private static final HashMap<String, String> titles = new HashMap<>();
static {
titles.put("404", "Page Not Found");
titles.put("sessionExpired", "Session Expired");
titles.put("invalidSession", "Invalid Session");
titles.put("accessDenied", "Access Denied");
titles.put("500", "Server Error");
}
private static void setTitle(HttpServletRequest hreq) {
String status = Convert.toString(hreq.getAttribute("status"));
if (status == "")
status = "500";
String title = titles.get(status);
if (title == null)
title = titles.get("500");
hreq.setAttribute("title", title);
}
%>
<% setTitle(request); %>
<c:if test="${json}"><%
response.setContentType("application/json; charset=UTF-8");
String stacktrace = (String)request.getAttribute("stacktrace");
request.setAttribute("stacktrace", Convert.rntq(stacktrace));
%>{
"path": "${path}",
"failed": true,
"status": "${status}",
"title": "${title}",
"message": "${message}",
"description": "${description}",
"stacktrace": "${stacktrace}"
}</c:if>
<c:if test="${!json}"><%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
<jsp:include page="/WEB-INF/jsp/include/head.jsp" />
<style>
.misc-wrapper {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
min-height: calc(100vh - (1.625rem * 2));
text-align: center;
}
</style>
<body>
<!-- Content -->
<!-- Error -->
<div class="container-xxl container-p-y">
<div class="misc-wrapper">
<h2 class="mb-2 mx-2">${title} :(</h2>
<p class="mb-4 mx-2">죄송합니다. 😖</p>
<p class="mb-4 mx-2">${message}</p>
<a onclick="wctx.home();" class="btn btn-primary" href="javascript:void(0);">처음으로 돌아가기</a>
<a onclick="history.back();" class="btn btn-primary mt-2" href="javascript:void(0);" autofocus>이전으로 돌아가기</a>
<div class="mt-3">
<img
src="<c:url value="/webjars/img/illustrations/page-misc-error-light.png"/>"
alt="page-misc-error-light"
width="500"
class="img-fluid"
data-app-dark-img="illustrations/page-misc-error-dark.png"
data-app-light-img="illustrations/page-misc-error-light.png"
/>
</div>
</div>
</div>
<!-- /Error -->
<!-- / Content -->
<jsp:include page="/WEB-INF/jsp/include/tail.jsp" />
<script>
${functions}
</script>
</body>
</html></c:if>

@ -1,64 +0,0 @@
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ include file="/WEB-INF/jsp/include/taglib.jsp"%>
<form id="frmEdit--${pageName}">
<div class="d-flex flex-row justify-content-evenly">
<div class="card" style="width:1000px;min-height:200px;">
<div class="row">
<div class="col-4">
<label class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">업무</label>
<select id="taskSeCd--${pageName}" name="taskSeCd" class="form-select">
<c:forEach items="${taskSeCdList}" var="item">
<option value="${item.CODE}">${item.CODE_VAL}</option>
</c:forEach>
</select>
</div>
<div class="col-4">
<label class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">소스 시군구</label>
<select id="srcSgg--${pageName}" name="srcSgg" class="form-select">
<c:forEach items="${sggList}" var="item">
<option value="${item.SGG_CD}">${item.SGG_NM}</option>
</c:forEach>
</select>
</div>
<div class="col-4">
<label class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">타겟 시군구</label>
<select id="trgtSgg--${pageName}" name="trgtSgg" class="form-select">
<c:forEach items="${sggList}" var="item">
<option value="${item.SGG_CD}">${item.SGG_NM}</option>
</c:forEach>
</select>
</div>
<div class="col-12">
<span class="float-end p-4">
<button type="button" id="btnCopyStng--${pageName}" class="btn btn-primary">업무,위반 설정 복사</button>
</span>
</div>
</div>
</div>
</div>
</form>
<script>
$("#btnCopyStng--${pageName}").on("click", function(){
if($("#srcSgg--${pageName}").val() == $("#trgtSgg--${pageName}").val()){
alert("동일한 시군구 선택 불가");
return;
}
ajax.get({
url : wctx.url("admin/copySggStng.do"),
data : {
taskSeCd : $("#taskSeCd--${pageName}").val(),
srcSgg : $("#srcSgg--${pageName}").val(),
trgtSgg : $("#trgtSgg--${pageName}").val()
},
success : (resp) => {
if(resp.saved){
alert('완료');
}
}
});
});
</script>

@ -1,299 +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 html -->
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<c:set var="pageKorName" scope="request">최고관리자 메뉴</c:set>
<div class="card">
<div class="wrapper-list">
<div class="fieldset-legend mt-4">
<div class="fieldset-legend-content fs-big" data-label="배치 수동 실행">
<button type="button" class="btn btn-primary" onclick="executeBatch('smgReceive');">국민신문고 수신</button>
<button type="button" class="btn btn-primary" onclick="executeBatch('smgSend');">국민신문고 답변 송신</button>
<button type="button" class="btn btn-primary" onclick="executeBatch('epostSend');">전자우편 송신</button>
<button type="button" class="btn btn-primary" onclick="executeBatch('epostReceive');">전자우편결과 수신</button>
</div>
</div>
<div class="fieldset-legend mt-4">
<div class="fieldset-legend-content fs-big" data-label="업무시스템 수동 통보">
<button type="button" class="btn btn-primary" onclick="exceuteAlert('smgReceive');">국민신문고 수신</button>
</div>
</div>
<div class="fieldset-legend mt-4">
<div class="fieldset-legend-content fs-big" data-label="파일 현황">
<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 mh-px-400">
<div class="w-50 mx-2 oy-auto">
<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 py-2 border-separator-y">
<button type="button" class="btn btn-primary"
onclick="getFileTree();">갱신</button>
</div>
<div id="fileTree" class="ox-auto oy-auto pt-3 h-px-300">
</div>
</div>
</div>
<div class="w-50 mx-2">
<h5 class="mt-3">파일내용</h5>
<div class="d-flex flex-row justify-content-start p-3">
<textarea id="viewCn" rows="14" cols="100%" readonly="readonly"></textarea>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="fieldset-legend mt-4">
<div class="fieldset-legend-content fs-big" data-label="시군구 정보 백업 & 복제">
<button type="button" class="btn btn-primary" id="btnOpenSggAddDel">시군구 추가/삭제</button>
<button type="button" class="btn btn-primary" id="btnOpenCopySggStng">시군구 설정 복사</button>
</div>
</div>
</div>
</div>
</div>
<input type="file" id="serverFile" name="serverFile" hidden onchange="fnImportFile(this);" />
<div class="content-backdrop fade"></div>
</div>
<script>
/**
* 수동 배치 실행
*/
function executeBatch(batch){
ajax.get({
url : wctx.url("/admin/executeBatch.do"),
data : { batch : batch},
success : (resp) => {
dialog.alert("실행되었습니다.");
}
});
}
function exceuteAlert(alertName){
if(alertName != "smgReceive"){
return;
}
var interfaceKey = prompt("인터페이스키를 입력하세요.");
if(interfaceKey == null || interfaceKey == ""){
return;
}
ajax.post({
url : wctx.url("/admin/executeAlert.do"),
data : {
alertName : alertName,
interfaceKey : interfaceKey
},
success : (resp) => {
dialog.alert("실행되었습니다.");
}
});
}
var tempPathArray = [];
/**
* 파일트리 컨텍스트 메뉴
*/
function customContextMenu(node){
var items = {
newDirectory : {
label:"디렉토리 추가",
action:function(data){
var inst = $.jstree.reference(data.reference);
var obj = inst.get_node(data.reference);
var pathArray = $("#fileTree").jstree("get_path", obj.id);
var directoryName = prompt("디렉토리명을 입력하세요");
if(directoryName != null && directoryName != ""){
pathArray.push(directoryName);
ajax.post({
url : wctx.url("/admin/createDirectory.do"),
data : {
directories : pathArray
},
success : (resp) => {
if(resp.saved){
getFileTree();
} else {
alert("폴더 생성에 실패하였습니다.");
}
}
});
}
}
},
newFile : {
label:"파일 추가",
action:function(data){
var inst = $.jstree.reference(data.reference);
var obj = inst.get_node(data.reference);
var pathArray = $("#fileTree").jstree("get_path", obj.id);
tempPathArray = pathArray;
$("#serverFile").click();
}
},
viewCn : {
label : "내용 보기",
action:function(data){
var inst = $.jstree.reference(data.reference);
var obj = inst.get_node(data.reference);
var pathArray = $("#fileTree").jstree("get_path", obj.id);
ajax.post({
url : wctx.url("/admin/getFileText.do"),
data : {
directories : pathArray
},
success : (resp) => {
$("#viewCn").val(resp.fileCn);
}
});
}
}
};
if(node.type == "file") {
delete items.newDirectory;
delete items.newFile;
}
if(node.type == "directory"){
delete items.viewCn;
} else if(!node.text.endsWith(".txt") && !node.text.endsWith(".xml")
&& !node.text.endsWith(".TXT") && !node.text.endsWith(".XML")){
delete items.viewCn;
}
return items;
}
$('#fileTree').jstree({
"core" : {
"data": {}
},
"plugins": ["types","contextmenu"],
"types" : {
"directory" : { "icon" : "fa fa-folder" },
"file" : { "icon" : "fa fa-file" }
},
trace: true,
core : {
check_callback:true,
multiple:false
},
contextmenu : {
items : customContextMenu
}
});
$("#fileTree").bind("refresh.jstree", function(){
$(this).jstree("open_all");
});
/**
* 파일트리 조회
*/
function getFileTree(){
ajax.get({
url : wctx.url("/admin/getFileTree.do"),
data : {},
headers: { Accept: "application/json; charset=utf-8" },
success : (resp) => {
$('#fileTree').jstree(true).settings.core.data = resp.tree;
$('#fileTree').jstree(true).refresh();
}
});
}
/**
* 파일 추가
*/
function fnImportFile(obj){
if(obj.files.length == 0){
return;
}
var form = new FormData();
form.append("newFile", obj.files[0]);
form.append("directories[]", tempPathArray);
ajax.post({
url : wctx.url("/admin/importFile.do"),
data : form,
processData : false,
contentType : false,
success : (resp) => {
if(resp.saved){
getFileTree();
} else {
alert("파일 추가에 실패하였습니다.");
}
}
});
}
$("#btnOpenSggAddDel").on("click", function(){
ajax.get({
url : "/admin/sggAddDelInfo.do",
data: {},
success: (resp) => {
dialog.open({
id: "sggAddDelDialog",
title: "시군구 추가,삭제",
content: resp ,
size: "xxl",
init:() => {}
});
}
});
});
$("#btnOpenCopySggStng").on("click", function(){
ajax.get({
url : "/admin/copySggStngInfo.do",
data: {},
success: (resp) => {
dialog.open({
id: "copySggStngDialog",
title: "시군구 설정 복사",
content: resp ,
size: "xl",
init:() => {}
});
}
});
});
$(document).ready(function(){
getFileTree();
});
</script>

@ -1,192 +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="frmEdit--${pageName}">
<div class="d-flex flex-row justify-content-evenly">
<div class="card" style="width:500px;">
<h3>시군구 백업</h3>
<div class="card-datatable text-nowrap">
<div id="backupSgg-DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="backupSgg-table-responsive--${pageName}" class="table-responsive"
style="overflow-x: scroll;height:500px;overflow-y: scroll;">
<table id="backupSgg-DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr data-key="{SGG_CD}">
<th style="width: 50px;"></th>
<th style="width: 140px;" >시군구코드</th>
<th style="width: 300px;" >시군구명</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="backupSggTbody--${pageName}">
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="card" style="width:100px;">
<div style="display: flex;flex-direction: column;justify-content: space-evenly;height: 100%;">
<button type="button" id="btnAdd--${pageName}">추가 &gt;&gt;</button>
<button type="button" id="btnDel--${pageName}">&lt;&lt; 삭제</button>
</div>
</div>
<div class="card" style="width:500px;">
<h3>시군구</h3>
<div class="card-datatable text-nowrap">
<div id="originalSgg-DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="originalSgg-table-responsive--${pageName}" class="table-responsive"
style="overflow-x: scroll;height:500px;overflow-y: scroll;">
<table id="originalSgg-DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr data-key="{SGG_CD}">
<th style="width: 50px;"></th>
<th style="width: 140px;" >시군구코드</th>
<th style="width: 300px;" >시군구명</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="originalSggTbody--${pageName}">
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</form>
<template id="sggRow--${pageName}">
<tr data-key="{SGG_CD}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center cmn">
<input type="checkbox" value="{SGG_CD}" />
</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center cmn">{SGG_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center cmn">{SGG_NM}</td>
<td class="dummy-td cmn"></td>
</tr>
</template>
<template id="sggNotFound--${pageName}">
<tr>
<td valign="top" colspan="14" class="dataTables_empty text-center">
정보를 찾지 못했습니다.
</td>
</tr>
</template>
<script>
pageObject['${pageName}'] = {};
pageObject['${pageName}'].originalDataset = new Dataset({
keymapper : info => info ? info.SGG_CD : ""
});
pageObject['${pageName}'].backupDataset = new Dataset({
keymapper : info => info ? info.SGG_CD : ""
});
function fnRenderBackupAndOriginal(list,tbodyId,dataset){
$("#"+tbodyId).html("");
if(list != null && list.length > 0){
dataset.setData(list);
} else {
dataset.setData([]);
}
var empty = dataset.empty;
var notFound = [document.getElementById("sggNotFound--${pageName}").innerHTML];
var found = document.getElementById("sggRow--${pageName}").innerHTML;
var replacer = (str, dataItem) => str.replace(/{onclick}/gi, "");
var trs = empty ? notFound : dataset.inStrings(found, replacer);
$("#"+tbodyId).html(trs.join());
}
function getBackupAndOriginalDataList(){
ajax.get({
url : wctx.url("/admin/sggBackup/list.do"),
data : {
originalTable : "TB_SGG",
backupTable : "TB_SGG_ORG",
pkName : "SGG_CD"
},
success : (resp) => {
fnRenderBackupAndOriginal(resp.originalDataList,"originalSggTbody--${pageName}", pageObject['${pageName}'].originalDataset);
fnRenderBackupAndOriginal(resp.backupDataList,"backupSggTbody--${pageName}", pageObject['${pageName}'].backupDataset);
}
});
}
$("#btnAdd--${pageName}").on("click", function(){
var checked = $("#backupSggTbody--${pageName}").find("input[type='checkbox']:checked");
if(checked.length < 1){
return;
}
var arr = [];
checked.each(function(){
arr.push(this.value);
});
ajax.post({
url : wctx.url("/admin/sggBackup/activate.do"),
data : {
originalTable : "TB_SGG",
backupTable : "TB_SGG_ORG",
pkName : "SGG_CD",
pks : arr.join(",")
},
success : (resp) => {
if(resp.saved){
getBackupAndOriginalDataList();
}
}
});
});
$("#btnDel--${pageName}").on("click", function(){
var checked = $("#originalSggTbody--${pageName}").find("input[type='checkbox']:checked");
if(checked.length < 1){
return;
}
var arr = [];
checked.each(function(){
arr.push(this.value);
});
ajax.post({
url : wctx.url("/admin/sggBackup/deactivate.do"),
data : {
originalTable : "TB_SGG",
backupTable : "TB_SGG_ORG",
pkName : "SGG_CD",
pks : arr.join(",")
},
success : (resp) => {
if(resp.saved){
getBackupAndOriginalDataList();
}
}
});
});
$(document).ready(function(){
getBackupAndOriginalDataList();
});
</script>

@ -1,325 +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="pageKorName" scope="request">장비단속레이아웃 관리</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<div class="container-page-btn">
<button type="button" id="btnReset--${pageName}" class="btn btn-outline-dark w-px-120" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" id="btnSearch--${pageName}" class="btn btn-search w-px-120" title="검색">
검색
</button>
</span>
</div>
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-6">
<span class="form-label fw-bold form-search-title">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${TaskListForSgg}" var="item">
<label>
<input name="taskSeCd" type="radio" value="${item.code}"
class="form-check-input" alt="업무구분"
onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<div class="col-6">
</div>
<div class="col-6">
</div>
<div class="col-6">
</div>
<div class="col-6">
</div>
<div class="col-6">
</div>
</div>
</div>
</form>
<div>
<div id="gridbuttonArea--${pageName}" class="container-page-btn">
<div class="d-flex flex-row justify-content-between">
<span id="layoutPaging--${pageName}PagingInfo" class="dataTables_info" role="status" aria-live="polite"></span>
<ul id="layoutPaging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120"
id="btnAdd--${pageName}" title="추가">
추가
</button>
</span>
</div>
</div>
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-500">
<table id="DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr id="layoutThead--${pageName}">
<th style="width: 80px;">No.</th>
<th style="width: 160px;">업무명</th>
<th style="width: 240px;">부서명</th>
<th style="width: 240px;">파일형식</th>
<th style="width: 160px;">업체명</th>
<th style="width: 160px;">업체명(연계)</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="layoutTbody--${pageName}">
</tbody>
<template id="layoutRow--${pageName}">
<tr data-key="{FILE_LAYOUT_ID}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{ROW_NUM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{TASK_SE_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{DEPT_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{DATA_FILE_SE_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{ENT_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{LINK_ENT_NM}</td>
<td class="dummy-td cmn"></td>
</tr>
</template>
<template id="layoutNotFound--${pageName}">
<tr>
<td valign="top" colspan="7" class="dataTables_empty text-center">
레이아웃 정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.layoutControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData:true,
keymapper : info => info ? info.LAYOUT_ID : "",
urls : {
load : "",
getInfo : ""
},
formats: {
REG_DT : datetimeFormat,
MDFCN_DT : datetimeFormat
}
});
$P.layoutControl.defaultFetchSize = FETCH_XS;
$P.layoutControl.query = { pageNum : 1, fetchSize : $P.layoutControl.defaultFetchSize };
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.layoutControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate();
var trs = Apply.fromDataset.getTbody($P.layoutControl.dataset, t.found, t.notFound, t.replacer);
$P.renderLayoutList(obj["Total"], $P.layoutControl.dataset.length, trs, option);
Apply.fromDataset.paging($P.layoutControl.dataset, obj, "layoutPaging--${pageName}");
};
$P.layoutControl.dataset.onCurrentChange = (dataItem) => {
Apply.fromDataset.currentRow($P.layoutControl.dataset, dataItem, $("#layoutTbody--${pageName}")[0]);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnResetAndChangeBiz = (taskSeCd) => {
$P.layoutControl.urls.load = wctx.url("/"+taskSeCd+"/crdn/crdn01/010/list.do");
$P.layoutControl.urls.getInfo = wctx.url("/"+taskSeCd+"/crdn/crdn01/020/info.do");
$P.fnReset();
}
$P.fnReset = () => {
var searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='hidden']").val("");
searchForm.find("input[type='text']").val("");
$P.layoutControl.dataset.setData([]);
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
data.fetchSize = $P.layoutControl.defaultFetchSize;
return data;
}
$P.searchLayoutList = () => {
$P.layoutControl.query = $P.getParams();
$P.layoutControl.load(1);
}
$P.scrollLayoutList = () => {
$P.layoutControl.load($P.layoutControl.query.pageNum + 1);
}
$P.refreshLayoutList = () => {
if($P.layoutControl.query.pageNum == null){
return;
}
$P.layoutControl.reload({all : true});
}
$P.getGridTemplate = () => {
var notFound = [document.getElementById("layoutNotFound--${pageName}").innerHTML];
var found = document.getElementById("layoutRow--${pageName}").innerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickLayoutList('" + dataItem.getValue("FILE_LAYOUT_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].dblclickLayoutList('" + dataItem.getValue("FILE_LAYOUT_ID") + "');");
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
$P.renderLayoutList = (total, listLength, trs, option) => {
let noMore = (listLength >= total);
var initScroll = ($P.layoutControl.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs, initScroll, noMore);
fn_securityModeToggle($("#securityMode--top").is(":checked")); //보안모드
}
$P.clickLayoutList = (dataKey) => {
if(dataKey == ""){
return;
}
$("#layoutTbody--${pageName}").setCurrentRow(dataKey);
Apply.toDataset.current($P.layoutControl.dataset, dataKey);
}
$P.dblclickLayoutList = (dataKey) => {
$P.getInfo(dataKey);
}
$P.createLayout = () => {
$P.getInfo();
}
$P.getInfo = (fileLayoutId) => {
var params = {};
if(fileLayoutId != null){
params.fileLayoutId = fileLayoutId;
}
ajax.get({
url : $P.layoutControl.urls.getInfo,
data : params,
success : (resp) => {
dialog.open({
id : "layoutInfoDialog",
title : "레이아웃 정보",
size : "xl",
content : resp,
init : () => {
var parentRes = new Object();
var childReq = pageObject.childReq.pop();
for(var reqKey in childReq) {
if($P.provide[reqKey]){
parentRes[reqKey] = $P.provide[reqKey];
} else {
parentRes[reqKey] = function(){};
}
}
pageObject.parentRes.push(parentRes);
setDialogZindex();
}
});
}
});
}
$P.provide = {
"refreshList" : function(){
$P.refreshLayoutList();
},
};
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
$('#btnSearch--${pageName}').on('click', () => $P.searchLayoutList());
$('#btnAdd--${pageName}').on('click', () => $P.createLayout());
$('#btnDel--${pageName}').on('click', () => $P.removeLayout());
/**************************************************************************
* 초기화
**************************************************************************/
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollLayoutList);
var defaultBizValue = $("#layout-navbar input[name='taskSeCd']:checked").val();
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + defaultBizValue + "']").prop("checked",true);
$P.fnResetAndChangeBiz(defaultBizValue);
fn_securityModeToggle($("#securityMode--top").is(":checked")); //보안모드
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
});
</script>

@ -1,372 +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="pageKorName" scope="request">장비단속레이아웃 상세</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<form id="frmEdit--${pageName}" name="frmEdit">
<div class="card my-2">
<div class="card-header">
<h5>파일 레이아웃</h5>
</div>
<div class="card-body">
<input type="hidden" id="fileLayoutId--${pageName}" name="fileLayoutId" data-map="FILE_LAYOUT_ID" />
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<input type="hidden" id="instCd--${pageName}" name="instCd" data-map="INST_CD" />
<input type="hidden" id="deptCd--${pageName}" name="deptCd" data-map="DEPT_CD" />
<div class="row g-1">
<div class="col-md-4">
<label for="fileGroup--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end required">
자료 파일 구분
</label>
<select id="fileGroup--${pageName}" name="fileGroup" data-map="DATA_FILE_SE"
class="form-select" required>
<option value="">선택</option>
<option value="TXT">텍스트파일 포함</option>
<option value="JPG">텍스트파일 미포함</option>
<option value="BIN">단일 바이너리 파일</option>
</select>
</div>
<div class="col-md-4">
<label for="fileNameLength--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
파일명 길이
</label>
<input type="text" id="fileNameLength--${pageName}" name="fileNameLength" data-map="FILE_NM_SZ"
class="form-control w-px-70" maxlength="4" data-maxlengthb="4" />
</div>
<div class="col-md-4">
<label for="enterpriseName--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
업체명
</label>
<input type="text" id="enterpriseName--${pageName}" name="enterpriseName" data-map="ENT_NM"
class="form-control" maxlength="100" data-maxlengthb="100" />
</div>
<div class="col-md-2">
<label for="fileNameSeperator--${pageName}"
class="w-px-130 bg-lighter pe-2 ps-2 col-form-label text-sm-start">
파일명 구분 유형
</label>
<select id="fileNameSeperator--${pageName}" name="fileNameSeperator" data-map="FILE_NM_SE_TYPE"
class="form-select">
<option value=""></option>
<option value="_">언더바</option>
</select>
</div>
<div class="col-md-10">
<label for="fileNameItmes--${pageName}"
class="w-px-130 bg-lighter pe-2 ps-2 col-form-label text-sm-start">
파일명 형식
</label>
<input type="text" id="fileNameItmes--${pageName}" name="fileNameItmes" data-map="FILE_NM_LAYOUT"
class="form-control w-100" maxlength="500" data-maxlengthb="500" />
</div>
<div class="col-md-2">
<label for="contentSeperator--${pageName}"
class="w-px-130 bg-lighter pe-2 ps-2 col-form-label text-sm-start">
자료 구분 유형1
</label>
<select id="contentSeperator--${pageName}" name="contentSeperator" data-map="DATA_SE_TYPE1"
class="form-select">
<option value=""></option>
<option value=",">콤마</option>
<option value="byte">바이트</option>
</select>
</div>
<div class="col-md-10">
<label for="contentItems--${pageName}"
class="w-px-130 bg-lighter pe-2 ps-2 col-form-label text-sm-start">
자료 형식1
</label>
<input type="text" id="contentItems--${pageName}" name="contentItems" data-map="DATA_LAYOUT1"
class="form-control w-100" maxlength="500" data-maxlengthb="500" />
</div>
<div class="col-md-2">
<label for="contentSecondSeperator--${pageName}"
class="w-px-130 bg-lighter pe-2 ps-2 col-form-label text-sm-start">
자료 구분 유형2
</label>
<select id="contentSecondSeperator--${pageName}" name="contentSecondSeperator" data-map="DATA_SE_TYPE2"
class="form-select">
<option value=""></option>
<option value=",">콤마</option>
<option value="LineBreak">줄바꿈문자</option>
</select>
</div>
<div class="col-md-10">
<label for="secondSeperatorStarterItems--${pageName}"
class="w-px-130 bg-lighter pe-2 ps-2 col-form-label text-sm-start">
자료 형식2
</label>
<input type="text" id="secondSeperatorStarterItems--${pageName}" name="secondSeperatorStarterItems" data-map="DATA_LAYOUT2"
class="form-control w-100" maxlength="500" data-maxlengthb="500" />
</div>
<div class="col-md-2">
<label for="countPerFileGroup--${pageName}"
class="w-px-130 bg-lighter pe-2 ps-2 col-form-label text-sm-start">
파일 총 건수
</label>
<input type="text" id="countPerFileGroup--${pageName}" name="countPerFileGroup" data-map="FILE_TNOCS"
class="form-control w-50" maxlength="2" data-maxlengthb="2" />
</div>
<div class="col-md-10">
<label for="linkFileLocation--${pageName}"
class="w-px-130 bg-lighter pe-2 ps-2 col-form-label text-sm-start">
연계 파일 경로
</label>
<input type="text" id="linkFileLocation--${pageName}" name="linkFileLocation" data-map="LINK_FILE_PATH"
class="form-control w-100" maxlength="200" data-maxlengthb="200" />
</div>
<div class="col-md-9">
<label for="sameItemsInFileGroup--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
동일 항목
</label>
<input type="text" id="sameItemsInFileGroup--${pageName}" name="sameItemsInFileGroup" data-map="SAME_ITEMS"
class="form-control w-px-600" maxlength="300" data-maxlengthb="300" />
</div>
<div class="col-md-9">
<label for="increaseItemInFileGroup--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
증가 항목
</label>
<input type="text" id="increaseItemInFileGroup--${pageName}" name="increaseItemInFileGroup" data-map="INCREASE_ITEM"
class="form-control w-px-600" maxlength="300" data-maxlengthb="300" />
</div>
<div class="col-md-3">
<label for="increaseTypeInFileGroup--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
증가 형식
</label>
<select id="increaseTypeInFileGroup--${pageName}" name="increaseTypeInFileGroup" data-map="INCREASE_TYPE"
class="form-select">
<option value=""></option>
<option value="number">숫자</option>
<option value="alphabet">영문자</option>
</select>
</div>
</div>
</div>
</div>
<div class="card my-2">
<div class="card-header">
<h5>파일전송 연계 정보</h5>
</div>
<div class="card-body">
<div class="row g-1">
<div class="col-md-4">
<label for="linkEnterpriseName--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
업체명(연계)
</label>
<input type="text" id="linkEnterpriseName--${pageName}" name="linkEnterpriseName" data-map="LINK_ENT_NM"
class="form-control" maxlength="100" data-maxlengthb="100" />
</div>
<div class="col-md-4">
<label for="ip--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
아이피
</label>
<input type="text" id="ip--${pageName}" name="ip" data-map="REMOTE_IP"
class="form-control" maxlength="100" data-maxlengthb="100" />
</div>
<div class="col-md-4">
<label for="port--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
포트
</label>
<input type="number" id="port--${pageName}" name="port" data-map="REMOTE_PORT"
class="form-control" min="1" max="65535" />
</div>
<div class="col-md-6">
<label for="id--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
아이디
</label>
<input type="text" id="id--${pageName}" name="id" data-map="REMOTE_ID"
class="form-control" maxlength="100" data-maxlengthb="100" />
</div>
<div class="col-md-6">
<label for="pw--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
패스워드
</label>
<input type="text" id="pw--${pageName}" name="pw" data-map="REMOTE_PASSWORD"
class="form-control" maxlength="100" data-maxlengthb="100" />
</div>
<div class="col-md-2">
<label for="osType--${pageName}"
class="w-px-130 bg-lighter pe-2 ps-2 col-form-label text-sm-start">
운영체제
</label>
<select id="osType--${pageName}" name="osType" data-map="REMOTE_OS"
class="form-select w-100">
<option value=""></option>
<option value="linux">리눅스</option>
<option value="windows">윈도우</option>
</select>
</div>
<div class="col-md-10">
<label for="workPath--${pageName}"
class="w-px-130 bg-lighter pe-2 ps-2 col-form-label text-sm-start">
파일경로
</label>
<input type="text" id="workPath--${pageName}" name="workPath" data-map="REMOTE_WORK_PATH"
class="form-control w-100" maxlength="100" data-maxlengthb="100" />
</div>
</div>
</div>
</div>
<div class="row m-3">
<div class="col-md-12">
<span class="float-end">
<button type="button" id="btnSave--${pageName}" class="btn btn-primary">저장</button>
<button type="button" id="btnDelete--${pageName}" class="btn btn-primary">삭제</button>
</span>
</div>
</div>
</form>
</div>
</div>
<script>
pageObject["${pageName}"] = {};
pageObject["${pageName}"].provided = {};
pageObject.childReq = [];
pageObject.childReq.push({
refreshList : function(){ },
});
$(document).ready(function(){
var $P = pageObject["${pageName}"];
if(pageObject.parentRes.length > 0){
$P.provided = pageObject.parentRes.pop();
} else {
$P.provided = pageObject.childReq.pop();
}
/**************************************************************************
* DatasetControl, Dataset, FormFields
**************************************************************************/
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
$P.layoutControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData : true,
keymapper : info => info ? info.FILE_LAYOUT_ID : "",
urls : {
create : wctx.url("/${taskSeCd}/crdn/crdn01/020/create.do"),
update : wctx.url("/${taskSeCd}/crdn/crdn01/020/update.do"),
remove : wctx.url("/${taskSeCd}/crdn/crdn01/020/remove.do")
},
formats: {
}
});
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.layoutControl.dataset.onCurrentChange = (dataItem) => {
if(!dataItem){
return;
}
$P.formFields.set($P.layoutControl, dataItem);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnSave = () => {
if(!customValidate($("#frmEdit--${pageName}").find("input,select,textarea"))) return;
var info = $P.formFields.get();
var create = $P.layoutControl.dataset.empty;
ajax.post({
url : create ? $P.layoutControl.urls.create : $P.layoutControl.urls.update,
data : info,
success : (resp) => {
if(resp.saved){
dialog.close("layoutInfoDialog");
dialog.alert({
content:"저장되었습니다.",
init : () => {
setDialogZindex();
focusClose();
},
onClose : () => $P.provided.refreshList()
});
}
}
});
}
$P.fnRemove = () => {
var info = $P.formFields.get();
ajax.post({
url : $P.layoutControl.urls.remove,
data : {
fileLayoutId : info.fileLayoutId
},
success : (resp) => {
if(resp.saved){
dialog.close("layoutInfoDialog");
dialog.alert({
content:"삭제되었습니다.",
init : () => {
setDialogZindex();
focusClose();
},
onClose : () => $P.provided.refreshList()
});
}
}
});
}
/**************************************************************************
* element.on
**************************************************************************/
$("#btnSave--${pageName}").on('click', () => $P.fnSave());
$("#btnDelete--${pageName}").on('click', () => $P.fnRemove());
/**************************************************************************
* 초기화
**************************************************************************/
var layoutInfo = ${layoutInfo};
if(layoutInfo != null){
$P.layoutControl.dataset.setData([layoutInfo]);
} else {
$P.layoutControl.dataset.setData([]);
$("#sggCd--${pageName}").val(MY_INFO.info.sggCd);
$("#instCd--${pageName}").val(MY_INFO.info.instCd);
$("#deptCd--${pageName}").val(MY_INFO.info.deptCd);
$("#taskSeCd--${pageName}").val("${taskSeCd}");
$("#btnDelete--${pageName}").attr("hidden","hidden");
}
});
</script>

File diff suppressed because it is too large Load Diff

@ -1,175 +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="card">
<form id="frmEdit--${pageName}" name="frmEdit">
<input type="hidden" id="crdnId--${pageName}" name="crdnId" data-map="CRDN_ID" />
<div class="row g-1">
<div class="col-md-12">
<label for="levyExclRsnCd--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">금액 수정 구분</label>
<select class="form-select" id="chgAmtSe--${pageName}" name="chgAmtSe" required>
<option value="1">가산</option>
<option value="2">감액</option>
</select>
</div>
<div class="col-md-12">
★ 가산은 단속원금에 만원을 더합니다.<br />
★ 감액은 단속원금을 만원만 남깁니다.
</div>
</div>
</form>
</div>
<div>
<span class="container-page-btn">
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary" id="btnSave--${pageName}" title="금액 수정">금액 수정</button>
<button type="button" class="btn btn-primary" id="btnRestore--${pageName}" title="원금 복원">원금 복원</button>
</span>
</span>
</div>
<!-- / 업무 버튼 표시 -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
/**************************************************************************
* DatasetControl, Dataset, FormFields
**************************************************************************/
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
$P.crdnControl = new DatasetControl({
dataGetter : obj => obj.crdnInfo,
keymapper : info => info ? info.CRDN_ID : "",
urls : {
update : wctx.url("/PVS/crdn/crdn02/050/update.do")
},
formats: {}
});
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.crdnControl.dataset.onCurrentChange = (dataItem) => {
$P.formFields.set($P.crdnControl,dataItem);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnSave = async() => {
var alertMessage = "";
if($("#chgAmtSe--${pageName}").val() == "1"){
if(crdnInfo.OVTM_YN == "Y"){
dialog.alert({
content : "이미 가산 처리된 자료입니다.",
init : function(){
setDialogZindex();
focusClose();
}
});
return;
}
alertMessage = "가산 처리하시겠습니까?";
} else if($("#chgAmtSe--${pageName}").val() == "2"){
if(crdnInfo.OVTM_PRTTN_YN == "Y"){
dialog.alert({
content : "이미 감액 처리된 자료입니다.",
init : function(){
setDialogZindex();
focusClose();
}
});
return;
}
alertMessage = "감액 처리하시겠습니까?";
}
if(await confirm2(alertMessage)){
var info = $P.formFields.get();
if (!info) {
return;
}
ajax.post({
url : $P.crdnControl.urls.update,
data : info,
success : (resp) => {
$P.saveCallback(resp);
}
});
}
}
$P.fnRestore = async() => {
if(crdnInfo.OVTM_YN != "Y" && crdnInfo.OVTM_PRTTN_YN != "Y"){
dialog.alert({
content: "2시간 초과 처리되지 않은 자료입니다.",
init : function() {
setDialogZindex();
focusClose();
}
});
return;
}
if(await confirm2("원금 복원하시겠습니까?")){
var info = $P.formFields.get();
info.chgAmtSe = "0";
ajax.post({
url : $P.crdnControl.urls.update,
data : info,
success : (resp) => {
$P.saveCallback(resp);
}
});
}
}
$P.saveCallback = (resp) => {
if (resp.saved) {
dialog.alert({
content : "저장됐습니다.",
init : function(){
setDialogZindex();
focusClose();
}
});
dialog.close("overTimeProcessDialog--${openerPageName}");
if ("${savedCallbackFuncName}" != "") {
${savedCallbackFuncName}(resp.saved);
}
}
};
/**************************************************************************
* element.on
**************************************************************************/
$("#btnSave--${pageName}").on("click", () => $P.fnSave() );
$("#btnRestore--${pageName}").on("click", () => $P.fnRestore() );
/**************************************************************************
* 초기화
**************************************************************************/
var crdnInfo = ${crdnInfo};
$P.crdnControl.dataset.setData([crdnInfo]);
});
</script>

@ -1,391 +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="pageKorName" scope="request">표지 정보 미확인 자료</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<div class="container-page-btn">
<button type="button" id="btnReset--${pageName}" class="btn btn-outline-dark w-px-120" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" id="btnSearch--${pageName}" class="btn btn-search w-px-120"
title="검색">검색</button>
<button type="button" id="btnExcel--${pageName}" class="btn btn-excel w-px-120"
title="엑셀 저장">엑셀</button>
</span>
</div>
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-6">
<span class="form-label fw-bold form-search-title w-px-120 text-end">단속일자</span>
<span class="form-search-linebox">
<input type="text" id="schCrdnYmdFrom--${pageName}" name="schCrdnYmdFrom"
class="form-control form-date"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" id="schCrdnYmdTo--${pageName}" name="schCrdnYmdTo"
class="form-control form-date"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
</div>
</div>
</div>
</form>
<div>
<span class="container-page-btn">
<div class="d-flex flex-row justify-content-between">
<span id="crdnPaging--${pageName}PagingInfo" class="dataTables_info"
role="status" aria-live="polite"></span>
<ul id="crdnPaging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
<span class="container-window-btn-right">
<button type="button" id="btnUpdateToConfirmData--${pageName}"
class="btn btn-primary" title="개별 확인 자료로 수정">개별 확인 자료로 수정</button>
</span>
</span>
</div>
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-600">
<table id="DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer" >
<thead class="sticky-thead">
<tr id="crdnTheadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}"
data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th style="width: 100px;">No.</th>
<th onclick="searchFromGridTitle('CRDN_INPT_SE_CD',this.innerText,'codeValue','FIM003');"
style="width: 200px;">자료출처</th>
<th onclick="searchFromGridTitle('CRDN_YMD','위반일자','ymd','');"
style="width: 200px;">위반일시</th>
<th onclick="searchFromGridTitle('VHRNO',this.innerText,'match','part');"
style="width: 200px;">차량번호</th>
<th onclick="searchFromGridTitle('CRDN_STDG_NM',this.innerText,'match','perfect');"
style="width: 200px;">법정동</th>
<th
style="width: 200px;"
class="text-orange">잔액</th>
<th onclick="searchFromGridTitle('ATCH_FILE_CNT',this.innerText,'match','perfect');"
style="width: 200px;">사진건수</th>
<th onclick="searchFromGridTitle('CRDN_SN',this.innerText,'match','perfect');"
style="width: 200px;">발행번호</th>
<th class="dummy-th"></th>
</tr>
</thead>
<tbody id="crdnTbody--${pageName}">
</tbody>
<template id="crdnRow--${pageName}">
<tr data-key="{CRDN_ID}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{ROW_NUM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_INPT_SE_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_YMD_TM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{VHRNO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_STDG_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{BLNC}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{ATCH_FILE_CNT}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{CRDN_SN}</td>
<td class="dummy-td"></td>
</tr>
</template>
<template id="crdnNotFound--${pageName}">
<tr>
<td valign="top" colspan="9" class="dataTables_empty text-center">
단속 정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
var FIM003 = new CommonCodes(${FIM003});
var FIM010 = new CommonCodes(${FIM010});
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.crdnControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData:true,
keymapper : info => info ? info.CRDN_ID : "",
urls : {
load : wctx.url("/DPV/crdn/crdn03/030/list.do"),
getInfo : wctx.url("/DPV/sprt/sprt02/010/main.do"),
update: wctx.url("/DPV/crdn/crdn03/030/update.do")
},
formats: {
CRDN_INPT_SE_CD : FIM003,
CRDN_YMD_TM : datetimeFormat,
FFNLG_CRDN_AMT : numberFormat,
CRDN_STTS_CD : FIM010,
BLNC : numberFormat
}
});
$P.crdnControl.defaultFetchSize = FETCH_XS;
$P.crdnControl.query = { pageNum : 1, fetchSize : $P.crdnControl.defaultFetchSize };
$P.crdnControl.beforeCurrent = null;
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.crdnControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate();
var trs = Apply.fromDataset.getTbody($P.crdnControl.dataset, t.found, t.notFound, t.replacer);
$P.renderCrdnList(obj["Total"], $P.crdnControl.dataset.length, trs, option);
Apply.fromDataset.paging($P.crdnControl.dataset, obj, "crdnPaging--${pageName}");
};
$P.crdnControl.dataset.onCurrentChange = (dataItem) => {
Apply.fromDataset.currentRow($P.crdnControl.dataset, dataItem, $("#crdnTbody--${pageName}")[0]);
};
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnReset = () => {
var searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function(){ $(this).find("option:eq(0)").prop("selected", true); });
$("#byOutput--${pageName}").val("동적 검색");
$('#schCrdnYmdFrom--${pageName}').datepicker('setDate', DateUtil.getDateDay(-5475).date);
$('#schCrdnYmdTo--${pageName}').datepicker('setDate', TODAY());
$P.crdnControl.dataset.setData([]);
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
data.taskSeCd = "DPV";
data.fetchSize = $P.crdnControl.defaultFetchSize;
return data;
}
$P.searchCrdnList = () => {
$P.crdnControl.query = $P.getParams();
$P.crdnControl.load(1);
}
$P.scrollCrdnList = () => {
$P.crdnControl.load($P.crdnControl.query.pageNum + 1);
}
$P.refreshCrdnList = () => {
$P.crdnControl.beforeCurrent = {
key : $P.crdnControl.dataset.getCurrent()["CRDN_ID"],
index : $P.crdnControl.dataset.getCurrent()["ROW_NUM"] - 1
};
Apply.fromDatasetControl.reload($P.crdnControl).then((resp)=>{
Apply.toDataset.set($P.crdnControl.dataset, resp);
$P.crdnControl.dataset.onDatasetChange(resp, {reloaded : true});
if($P.crdnControl.beforeCurrent != null){
let beforeCurrentKey = $P.crdnControl.beforeCurrent.key;
let beforeCurrentIndex = $P.crdnControl.beforeCurrent.index;
$P.crdnControl.beforeCurrent = null;
if(!$P.crdnControl.dataset.empty){
var info = $P.crdnControl.dataset.getData(beforeCurrentKey);
if(info != null){
$P.crdnControl.dataset.setCurrent(beforeCurrentKey,true);
} else {
if(beforeCurrentIndex > ($P.crdnControl.dataset.length - 1)){
info = $P.crdnControl.dataset.getDataset()[$P.crdnControl.dataset.length - 1];
} else {
info = $P.crdnControl.dataset.getDataset()[beforeCurrentIndex];
}
$P.crdnControl.dataset.setCurrent(info["CRDN_ID"],true);
}
}
}
});
}
$P.fnExcelDown = () => {
if($P.crdnControl.dataset.empty){
alert("조회된 자료가 없습니다.");
return;
}
var cellDefs = getCellDefs($("#crdnTheadTr--${pageName} th").not(".dummy-th").not(":eq(0)"),
$($("#crdnRow--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)"));
$P.crdnControl.query.cellDefs = cellDefs;
$P.crdnControl.download();
}
$P.getGridTemplate = () => {
var notFound = [document.getElementById("crdnNotFound--${pageName}").innerHTML];
var found = document.getElementById("crdnRow--${pageName}").innerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickCrdnList('" + dataItem.getValue("CRDN_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].dblclickCrdnList('" + dataItem.getValue("CRDN_ID") + "');");
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
$P.renderCrdnList = (total, listLength, trs, option) => {
let noMore = (listLength >= total);
var initScroll = ($P.crdnControl.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs, initScroll, noMore);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
$P.clickCrdnList = (dataKey) => {
if(dataKey == ""){
return;
}
$("#crdnTbody--${pageName}").setCurrentRow(dataKey);
Apply.toDataset.current($P.crdnControl.dataset, dataKey);
}
$P.dblclickCrdnList = (dataKey) => {
let params = {
callControlName : "pageObject['${pageName}'].crdnControl"
, crdnId : dataKey
}
ajax.get({
url : $P.crdnControl.urls.getInfo,
data : params,
success : (resp) => {
dialog.open({
id : "totalInfoMainDialog",
title : "개별총정보", size : "xxl", content : resp,
init : () => {}
});
}
});
}
$P.save = () => {
if(!$P.crdnControl.dataset.getCurrent()) {
dialog.alert({
content : "선택된 자료가 없습니다.",
init : function(){
focusClose();
}
});
return;
};
dialog.alert({
content : "현 자료를 장애차량 확인된 자료로 변경하시겠습니까?",
init : function(){
focusOK();
},
onOK : () => {
var info = { 'crdnId' : $P.crdnControl.dataset.getCurrent()["CRDN_ID"] };
ajax.post({
url : $P.crdnControl.urls.update,
data : info,
success : (resp) => {
$P.saveCallback(resp);
}
});
}
});
}
$P.saveCallback = (resp) => {
if (resp.saved) {
dialog.alert({
content : "저장됐습니다.",
onClose : () => {
$P.refreshCrdnList();
}
});
}
}
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
$('#btnSearch--${pageName}').on('click', () => $P.searchCrdnList());
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress($P.searchCrdnList);
$('#btnExcel--${pageName}').on('click', () => $P.fnExcelDown());
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollCrdnList);
$('#btnUpdateToConfirmData--${pageName}').on('click', () => $P.save());
/**************************************************************************
* 초기화
**************************************************************************/
//달력 초기화
initDatepicker("frmSearch--${pageName}");
$P.fnReset();
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,305 +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="pageKorName" scope="request">단속 자료 등록</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<div class="container-page-btn">
<button type="button" id="btnReset--${pageName}"
class="btn btn-outline-dark w-px-120" title="초기화">초기화</button>
<span class="container-window-btn-right">
<button type="button" id="btnSearch--${pageName}"
class="btn btn-search w-px-120" title="검색">검색</button>
</span>
</div>
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-6">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${TaskListForSgg}" var="item">
<label>
<input name="taskSeCd" type="radio" value="${item.code}"
class="form-check-input" alt="업무구분"
onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="regDt--${pageName}">등록일자</label>
<input type="text" id="regDt--${pageName}" name="regDt"
class="form-control form-date" data-fmt-type="day"
title="금일" disabled="disabled" />
</div>
</div>
</div>
</form>
<div>
<span class="container-page-btn">
<div class="d-flex flex-row justify-content-between">
<span id="crdnPaging--${pageName}PagingInfo" class="dataTables_info"
role="status" aria-live="polite"></span>
<ul id="crdnPaging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
<span class="container-window-btn-right">
<button type="button" id="btnInsertByFile--${pageName}" class="btn btn-primary"
title="단속 파일 등록">단속 파일 등록</button>
<button type="button" id="btnInsertByHand--${pageName}" class="btn btn-primary"
title="단속 수기 등록">단속 수기 등록</button>
</span>
</span>
</div>
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}"
class="table-responsive ox-scroll oy-scroll h-px-600">
<table id="DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr id="crdnTheadTr--${pageName}">
<th style="width: 80px;">No.</th>
<th style="width: 200px;">등록구분</th>
<th style="width: 200px;">자료출처</th>
<th style="width: 200px;">위반일시</th>
<th style="width: 200px;">차량번호</th>
<th style="width: 400px;">단속장소</th>
<th style="width: 200px;">위반내용</th>
<th class="dummy-th"></th>
</tr>
</thead>
<tbody id="crdnTbody--${pageName}"></tbody>
<template id="crdnRow--${pageName}">
<tr data-key="{CRDN_ID}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{ROW_NUM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_REG_SE_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_INPT_SE_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_YMD_TM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{VHRNO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{CRDN_PLC}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{VLTN_ARTCL}</td>
<td class="dummy-td"></td>
</tr>
</template>
<template id="crdnNotFound--${pageName}">
<tr>
<td valign="top" colspan="8" class="dataTables_empty text-center">
단속 정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
var FIM003 = new CommonCodes(${FIM003});
var FIM026 = new CommonCodes(${FIM026});
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.crdnControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData:true,
keymapper : info => info ? info.CRDN_ID : "",
urls : {
load : ""
},
formats: {
CRDN_INPT_SE_CD : FIM003,
CRDN_REG_SE_CD : FIM026,
CRDN_YMD_TM : datetimeFormat
}
});
$P.crdnControl.defaultFetchSize = FETCH_XS;
$P.crdnControl.query = { pageNum : 1, fetchSize : $P.crdnControl.defaultFetchSize };
$P.crdnControl.beforeCurrent = null;
$P.crdnControl.urls.newInfoByFile = "";
$P.crdnControl.urls.newInfoByHand = "";
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.crdnControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate();
var trs = Apply.fromDataset.getTbody($P.crdnControl.dataset, t.found, t.notFound, t.replacer);
$P.renderCrdnList(obj["Total"], $P.crdnControl.dataset.length, trs, option);
Apply.fromDataset.paging($P.crdnControl.dataset, obj, "crdnPaging--${pageName}");
};
$P.crdnControl.dataset.onCurrentChange = (dataItem) => {
Apply.fromDataset.currentRow($P.crdnControl.dataset, dataItem, $("#crdnTbody--${pageName}")[0]);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnReset = () => {
$("#regDt--${pageName}").datepicker('setDate', TODAY());
$P.crdnControl.dataset.setData([]);
}
$P.fnResetAndChangeBiz = (taskSeCd) => {
$P.fnReset();
$P.crdnControl.urls.load = wctx.url("/"+taskSeCd+"/crdn/crdn05/010/list.do");
$P.crdnControl.urls.newInfoByFile = wctx.url("/"+taskSeCd+"/crdn/crdn05/020/info.do");
$P.crdnControl.urls.newInfoByHand = wctx.url("/"+taskSeCd+"/crdn/crdn05/030/info.do");
switch(taskSeCd){
case "PVS" :
case "BPV" :
case "DPV" :
case "ECA" :
case "DVS" :
$("#btnInsertByFile--${pageName}").show();
break;
case "PES" :
default :
$("#btnInsertByFile--${pageName}").hide();
break;
}
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
data.fetchSize = $P.crdnControl.defaultFetchSize;
return data;
}
$P.searchCrdnList = () => {
$P.crdnControl.query = $P.getParams();
$P.crdnControl.load(1);
}
$P.scrollCrdnList = () => {
$P.crdnControl.load($P.crdnControl.query.pageNum + 1);
}
$P.refreshCrdnList = () => {
$P.crdnControl.reload({all : true});
}
$P.getGridTemplate = () => {
var notFound = [document.getElementById("crdnNotFound--${pageName}").innerHTML];
var found = document.getElementById("crdnRow--${pageName}").innerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickCrdnList('" + dataItem.getValue("CRDN_ID") + "');")
.replace(/{ondblclick}/gi, "");
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
$P.renderCrdnList = (total, listLength, trs, option) => {
let noMore = (listLength >= total);
var initScroll = ($P.crdnControl.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs, initScroll, noMore);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
$P.clickCrdnList = (dataKey) => {
if(dataKey == ""){
return;
}
$("#crdnTbody--${pageName}").setCurrentRow(dataKey);
$P.crdnControl.dataset.setCurrent(dataKey);
Apply.toDataset.current($P.crdnControl.dataset, dataKey);
}
$P.newInfo = (type) => {
var url = "";
if(type == "file") url = $P.crdnControl.urls.newInfoByFile;
if(type == "hand") url = $P.crdnControl.urls.newInfoByHand;
var dialogId = "";
if(type == "file") dialogId = "fileDialog";
if(type == "hand") dialogId = "manualDialog";
var title = "";
if(type == "file") title = "단속파일 등록";
if(type == "hand") title = "단속자료 수기 등록";
ajax.get({
url : url,
data : {},
success : (resp) => {
dialog.open({
id: dialogId,
title: title,
content:resp,
size: "xxl",
init:() => {}
});
}
});
};
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
$("#btnSearch--${pageName}").on("click", () => $P.searchCrdnList());
$("#btnInsertByFile--${pageName}").on('click', () => { $P.newInfo("file"); });
$("#btnInsertByHand--${pageName}").on('click', () => { $P.newInfo("hand"); });
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollCrdnList);
/**************************************************************************
* 초기화
**************************************************************************/
initDatepicker("frmSearch--${pageName}"); //달력 초기화
var defaultBizValue = $("#layout-navbar input[name='taskSeCd']:checked").val();
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + defaultBizValue + "']").prop("checked",true);
$P.fnResetAndChangeBiz(defaultBizValue);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
});
</script>

@ -1,509 +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="pageKorName" scope="request">단속 파일 등록</c:set>
<div class="d-flex flex-column">
<div class="d-flex flex-row justify-content-evenly">
<div class="card h-px-80 w-px-1400">
<form id="frmFirst--${pageName}" method="post" enctype="multipart/form-data">
<div class="row g-1">
<div class="col-md-12">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" role="switch" id="direct--${pageName}">
<label class="form-check-label" for="direct--${pageName}">로컬파일업로드</label>
</div>
</div>
</div>
<div class="row g-1">
<div class="col-md-12 d-flex align-items-center flex-nowrap">
<label for="taskSeCd--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">과태료업무</label>
<select id="taskSeCd--${pageName}" name="taskSeCd" class="form-select" disabled>
<c:forEach items="${TaskListForSgg}" var="item">
<option value="${item.code}"
<c:if test="${item.code eq taskSeCd}"> selected="selected" </c:if>
>${item.value}</option>
</c:forEach>
</select>
<span id="uploadFilesArea" hidden>
<label for="uploadFiles--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">파일</label>
<input type="file" id="uploadFiles--${pageName}" name="uploadFiles"
multiple="multiple" class="form-control"/>
</span>
<span class="d-flex justify-content-end float-start ms-4">
<button type="button" id="btnSearch--${pageName}"
class="btn btn-primary">조회</button>
<button type="button" id="btnFileUpload--${pageName}"
class="btn btn-primary" hidden>업로드</button>
</span>
</div>
</div>
</form>
</div>
</div>
<div class="d-flex flex-row justify-content-evenly">
<div class="card my-4 px-4 h-px-600 w-px-700">
<form id="frmGrid--${pageName}">
<div>
<span class="container-page-btn">
<div class="d-flex flex-row justify-content-between">
<span id="parsedInfoPaging--${pageName}PagingInfo" class="dataTables_info"
role="status" aria-live="polite"></span>
<ul id="parsedInfoPaging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
<span class="container-window-btn-right">
</span>
</span>
</div>
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}"
class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-550">
<span>
<table
class="datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr>
<th style="min-width: 80px;">단속자료</th>
<th style="min-width: 80px;" title="더블클릭시 축소/확대 됩니다."
class="downsize" ondblclick="fnDownsizeToggle(this);" href="#">
파일명 <i class='bx bx-expand'></i>
</th>
<th style="min-width: 80px;">타임스탬프</th>
<th style="min-width: 80px;">파일사이즈</th>
<th style="min-width: 80px;">파일확장자</th>
<th style="min-width: 80px;">파일상태</th>
<th style="min-width: 80px;">총사진갯수</th>
<th style="min-width: 80px;">파일순번</th>
<th style="min-width: 80px;">장비코드</th>
<th style="min-width: 80px;">차량번호</th>
<th style="min-width: 80px;">사진구분명</th>
<th style="min-width: 80px;">업체코드</th>
<th style="min-width: 80px;">위반내용</th>
<th style="min-width: 80px;">차량속도</th>
<th style="min-width: 80px;">번호판위치x</th>
<th style="min-width: 80px;">번호판위치y</th>
<th style="min-width: 80px;">번호판width</th>
<th style="min-width: 80px;">번호판height</th>
<th style="min-width: 80px;">위치좌표x</th>
<th style="min-width: 80px;">위치좌표y</th>
<th style="min-width: 80px;">날짜</th>
<th style="min-width: 80px;">시간</th>
<th style="min-width: 80px;">단속시작시간</th>
<th style="min-width: 80px;">단속종료시간</th>
<th style="min-width: 80px;">어린이보호구역</th>
<th style="min-width: 80px;">단속장소명</th>
<th style="min-width: 80px;">단속법정동</th>
<th style="min-width: 80px;">단속장소(주소)</th>
</tr>
</thead>
<tbody></tbody>
<template class="found">
<tr data-key="{FILE_NAME}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{TEMP_GROUP_ID}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}"
title="{FILE_NAME}"
class="text-start text-truncate max-w-th">{FILE_NAME}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{FILE_LAST_MODIFIED}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{FILE_SIZE}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{FILE_EXTENSION}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{FILE_STATUS_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{PHOTO_CNT}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{FILE_SEQ}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{EQPMNT_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{VHRNO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{PHOTO_TYPE_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{BZENTY_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{VLTN_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CAR_VELOCITY}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{MOSC_X}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{MOSC_Y}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{PLATE_WIDTH}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{PLATE_HEIGHT}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{GPS_X}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{GPS_Y}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_YMD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_TM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_BGNG_TM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_END_TM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{CRDN_SPAREA_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{CRDN_PLC}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{CRDN_STDG_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{CRDN_ROAD_NM}</td>
</tr>
</template>
<template class="notFound">
<tr>
<td valign="top" colspan="28" class="dataTables_empty text-center">
정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</span>
</div>
</div>
</div>
</form>
</div>
<div id="imageArea--${pageName}" class="card my-4 px-4 w-px-600 h-px-600 justify-content-center">
</div>
<div class="card my-4 px-2 w-px-120 h-px-600">
<div class="d-flex my-2 flex-column">
<button type="button" id="btnInsertCrdn--${pageName}" class="btn btn-primary my-2">단속등록</button>
<button type="button" id="btnDelete--${pageName}" class="btn btn-primary my-2">삭제</button>
</div>
</div>
</div>
</div>
<form id="frmMultipart--${pageName}" method="post" enctype="multipart/form-data"></form>
<script>
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
$P.tempGroup = {};
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.parsedInfoControl = new DatasetControl({
dataGetter : obj => obj["List"],
keymapper : info => info ? info.FILE_NAME : "",
urls : { },
formats: {
CRDN_YMD : dateFormat,
CRDN_TM : timeFormat,
CRDN_BGNG_TM : timeFormat,
CRDN_END_TM : timeFormat
}
});
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.parsedInfoControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate();
var trs = Apply.fromDataset.getTbody($P.parsedInfoControl.dataset, t.found, t.notFound, t.replacer);
$P.renderParsedInfoList(obj["Total"], $P.parsedInfoControl.dataset.length, trs);
Apply.fromDataset.paging($P.parsedInfoControl.dataset, obj, "parsedInfoPaging--${pageName}");
};
$P.parsedInfoControl.dataset.onCurrentChange = (dataItem) => {
$("#imageArea--${pageName}").html("");
if(dataItem && dataItem.data){
var dataKey = dataItem.data.FILE_NAME;
$("#table-responsive--${pageName}").find("tbody").setCurrentRow(dataKey);
if(dataItem.data.FILE_GROUP_TYPE == "BIN"){
var srcArr = [];
for(var i=1; i <= dataItem.data.PHOTO_CNT; i++){
srcArr.push("data:image/jpg;base64," + dataItem.data["B64IMAGE"+i])
}
$P.renderImage(srcArr);
} else {
if(!dataKey.endsWith(".txt") && !dataKey.endsWith(".TXT")){
var src = dataItem.data.FILE_PATH;
$P.renderImage(src);
}
}
}
};
/**************************************************************************
* pageObject.function
**************************************************************************/
//ftp체크
$P.checkFTP = () => {
ajax.post({
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/importFileFromServer.do"),
data : {
taskSeCd : $("#taskSeCd--${pageName}").val()
},
success : (resp) => {
if(resp.saved){
$P.searchFileList();
} else {
dialog.alert({
content : "파일 조회에 실패하였습니다.",
init : function(){
setDialogZindex();
focusClose();
}
});
}
}
});
}
//로컬파일업로드
$P.uploadLocalFile = () => {
if($("#uploadFiles--${pageName}").val() == ""){
dialog.alert({
content : "파일이 없습니다.",
init : function(){
setDialogZindex();
focusClose();
}
});
return;
}
var formData = new FormData(document.getElementById("frmFirst--${pageName}"));
formData.append("taskSeCd", "${taskSeCd}");
ajax.post({
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/importFileFromClient.do"),
contentType : false, processData : false,
data : formData,
success : (resp) => {
if(resp.saved){
$("#uploadFiles--${pageName}").val("");
$P.searchFileList();
} else {
dialog.alert({
content : "파일 업로드에 실패하였습니다.",
init : function(){
setDialogZindex();
focusClose();
}
});
return;
}
}
});
}
//서버에 등록된 파일 조회
$P.searchFileList = () => {
$P.parsedInfoControl.dataset.setData([]);
ajax.post({
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/list.do"),
data : {
taskSeCd : $("#taskSeCd--${pageName}").val()
},
success : (resp) => {
$P.parsedInfoControl.dataset.setData(resp);
}
});
}
$P.getGridTemplate = () => {
var notFound = [$("#table-responsive--${pageName}").find("template.notFound")[0].innerHTML];
var found = $("#table-responsive--${pageName}").find("template.found")[0].innerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickParsedInfoList('" + dataItem.getValue("FILE_NAME") + "');");
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
//테이블 렌더링
$P.renderParsedInfoList = (total, listLength, trs) => {
$("#table-responsive--${pageName}").find("tbody").html(trs);
if(listLength != 0){
fnDownsizeCheck($("#table-responsive--${pageName}").find("table")[0]);
}
}
//사진 표시
$P.renderImage = (src) => {
if(Array.isArray(src)){
var div = document.createElement("div");
div.style["margin-top"] = "20px";
div.style["margin-bottom"] = "20px";
div.style["overflow-y"] = "scroll";
for(var i=0; i < src.length; i++){
var span = document.createElement("span");
span.style["max-width"] = "260px";
span.style["max-height"] = "260px";
var img = document.createElement("img");
img.style["object-fit"] = "contain";
img.style["max-width"] = "inherit";
img.style["max-height"] = "inherit";
img.src = src[i];
span.appendChild(img);
div.appendChild(span);
}
$("#imageArea--${pageName}").append(div);
} else {
var img = document.createElement("img");
img.style["object-fit"] = "contain";
img.src = src;
$("#imageArea--${pageName}").append(img);
}
}
$P.clickParsedInfoList = (dataKey) => {
if(dataKey == ""){
return;
}
$P.parsedInfoControl.dataset.setCurrent(dataKey);
};
$P.createCrdn = () => {
if($.isEmptyObject($P.tempGroup)){
dialog.alert({
content : "모든 자료가 처리 완료되었습니다.",
init : function(){
setDialogZindex();
focusClose();
}
});
return;
}
var firstGroupKey = Object.keys($P.tempGroup)[0];
var formData = new FormData(document.getElementById("frmMultipart--${pageName}"));
formData.append("taskSeCd", "${taskSeCd}");
formData.append("fileGroupType", $P.tempGroup[firstGroupKey][0].FILE_GROUP_TYPE);
formData.append("fileLayoutId", $P.tempGroup[firstGroupKey][0].FILE_LAYOUT_ID);
if($P.tempGroup[firstGroupKey].length == 1){
formData.append("linkFileInfos", JSON.stringify({}));
}
for(var i=0; i<$P.tempGroup[firstGroupKey].length; i++){
formData.append("linkFileInfos", JSON.stringify($P.tempGroup[firstGroupKey][i]));
}
ajax.post({
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/create.do"),
contentType : false, processData : false,
data : formData,
success : (resp) => {
var removedFileName = $P.tempGroup[firstGroupKey].map(item => item.FILE_NAME);
delete $P.tempGroup[firstGroupKey];
if(resp.saved){
$P.removeCallback(removedFileName);
if(resp.alertMessage){
alert(resp.alertMessage);
}
} else {
alert(resp.failReason);
}
//다음자료 진행
$P.createCrdn();
}
});
};
$P.deleteFile = () => {
var current = $P.parsedInfoControl.dataset.getCurrent();
if(current == null) return;
var fileName = current.FILE_NAME;
var fileLayoutId = current.FILE_LAYOUT_ID;
ajax.get({
url : wctx.url("/${taskSeCd}/crdn/crdn05/020/remove.do"),
data : {
taskSeCd : $("#taskSeCd--${pageName}").val(),
fileLayoutId : fileLayoutId,
fileName : fileName
},
success : (resp) => {
if(resp.saved){
$P.removeCallback(fileName);
}
}
});
}
$P.removeCallback = (removedFileName) => {
$P.parsedInfoControl.dataset.remove(removedFileName);
$P.removeTableRow(removedFileName);
}
$P.removeTableRow = (removedFileName) => {
var fileListTable = $("#table-responsive--${pageName}").find("table")[0];
var targetArr = [];
if(Array.isArray(removedFileName)){
targetArr = removedFileName;
} else {
targetArr = [removedFileName];
}
for(var i = 0; i < targetArr.length; i++){
var target = targetArr[i];
var tr = $(fileListTable).find("tbody").find("tr[data-key='"+target+"']");
var trIndex = $(fileListTable).find("tbody tr").index(tr);
fileListTable.deleteRow(trIndex+1);
}
}
/**************************************************************************
* element.on
**************************************************************************/
$("#btnSearch--${pageName}").on("click", function(){ $P.checkFTP(); });
$("#btnFileUpload--${pageName}").on("click", function(){ $P.uploadLocalFile(); });
$("#btnInsertCrdn--${pageName}").on("click", function(){
$P.tempGroup = Object.groupBy($P.parsedInfoControl.dataset.getDataset(), ({ TEMP_GROUP_ID }) => "temp"+TEMP_GROUP_ID);
if($.isEmptyObject($P.tempGroup)){
alert("처리할 자료가 없습니다.");
return;
}
$P.createCrdn();
});
$("#btnDelete--${pageName}").on("click", function(){ $P.deleteFile(); });
$("#direct--${pageName}").on("click", function(){
if($(this).is(":checked")){
$("#uploadFilesArea").removeAttr("hidden");
$("#btnFileUpload--${pageName}").removeAttr("hidden");
$("#btnSearch--${pageName}").attr("hidden","hidden");
} else {
$("#uploadFilesArea").attr("hidden","hidden");
$("#btnFileUpload--${pageName}").attr("hidden","hidden");
$("#btnSearch--${pageName}").removeAttr("hidden");
$("#uploadFiles--${pageName}").val("");
}
});
$P.parsedInfoControl.dataset.setData([]);
});
</script>

@ -1,741 +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="pageKorName" scope="request">단속자료 수기 등록</c:set>
<div class="d-flex flex-row justify-content-evenly">
<div class="card mw-px-1000">
<form id="frmEdit--${pageName}">
<input type="hidden" id="crdnId-${pageName}" name="crdnId" data-map="CRDN_ID" />
<input type="hidden" id="rtpyrId--${pageName}" name="rtpyrId" data-map="RTPYR_ID"/>
<input type="hidden" id="addrSn--${pageName}" name="addrSn" data-map="ADDR_SN"/>
<input type="hidden" id="sggCd--${pageName}" name="sggCd" value="${sggCd}" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" value="${taskSeCd}" />
<div class="row g-1">
<div class="col-md-12" slot="edit">
<template class="pvs bpv">
<slot>
<label for="crdnSeCd--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
단속구분
</label>
<select id="crdnSeCd--${pageName}" name="crdnSeCd"
data-map="CRDN_SE_CD" class="form-select">
<c:forEach items="${FIM002List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</slot>
</template>
</div>
<div class="col-md-4">
<label for="crdnYmd--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end required">
위반일자
</label>
<input type="text" id="crdnYmd--${pageName}" name="crdnYmd" data-map="CRDN_YMD"
class="form-control form-date" data-fmt-type="day" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<div class="col-md-4">
<label for="crdnTm--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end required">
위반시간
</label>
<input type="text" id="crdnTm--${pageName}" name="crdnTm" data-map="CRDN_TM"
class="form-control form-time" data-fmt-type="time" maxlength="8" required
placeholder="시:분:초" />
</div>
<div class="col-md-4">
<label for="vhrno--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end required">
차량번호
</label>
<input type="text" id="vhrno--${pageName}" name="vhrno" data-map="VHRNO" class="form-control"
data-maxlengthb="30" required />
</div>
<div class="col-md-4">
<label for="vltnCd--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
위반내용
</label>
<select id="vltnCd--${pageName}" name="vltnCd" class="form-select" data-map="VLTN_CD">
<c:forEach items="${VLTNList}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<div class="col-md-4 select2-primary">
<label for="crdnStdgNm--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
법정동
</label>
<input type="text" id="crdnStdgNm--${pageName}" name="crdnStdgNm" data-map="CRDN_STDG_NM"
class="form-control w-px-150" list="stdgNmList--${pageName}" />
<datalist id="stdgNmList--${pageName}">
<c:forEach items="${stdgNmList}" var="item">
<option value="${item}"></option>
</c:forEach>
</datalist>
</div>
<div class="col-md-4 select2-primary">
<label for="crdnRoadNm--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
도로명
</label>
<input type="text" id="crdnRoadNm--${pageName}" name="crdnRoadNm" data-map="CRDN_ROAD_NM"
class="form-control" />
</div>
<div class="col-md-6">
<label for="crdnPlc--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
단속장소
</label>
<input type="text" id="crdnPlc--${pageName}" name="crdnPlc" data-map="CRDN_PLC"
class="form-control w-px-300" data-maxlengthb="200" />
</div>
<div class="col-md-6" slot="edit">
<template class="bpv">
<slot>
<label for="dtlCrdnPlc--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
상세단속장소
</label>
<input type="text" id="dtlCrdnPlc--${pageName}" name="dtlCrdnPlc"
data-map="DTL_CRDN_PLC" class="form-control"
data-maxlenghb="200" />
</slot>
</template>
<template class="pvs">
<slot>
<label for="crdnSpareaCd--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
특별구역
</label>
<select id="crdnSpareaCd--${pageName}" name="crdnSpareaCd"
data-map="CRDN_SPAREA_CD" class="form-select">
<c:forEach items="${FIM007List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</slot>
</template>
</div>
<div class="col-md-12">
<label for="etcCn--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
특기사항
</label>
<input type="text" id="etcCn--${pageName}" name="etcCn"
data-map="ETC_CN" class="form-control"
data-maxlengthb="1000" />
</div>
</div>
<div class="row my-1 mx-4 g-1 border-card rounded-3">
<div class="col-md-4">
<label for="rtpyrNm--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">납부자명</label>
<input type="text" id="rtpyrNm--${pageName}" name="rtpyrNm" data-map="RTPYR_NM"
class="form-control" readonly
/>
</div>
<div class="col-md-3">
<label for="rtpyrSeCd--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">납부자구분</label>
<select id="rtpyrSeCd--${pageName}" name="rtpyrSeCd" data-map="RTPYR_SE_CD"
class="form-select" disabled>
<option value=""></option>
<c:forEach items="${FIM011List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<div class="col-md-5">
<label for="rtpyrNo--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">납부자번호</label>
<input type="text" id="rtpyrNo--${pageName}" name="rtpyrNo" data-map="RTPYR_NO"
class="form-control privacy" readonly />
<input type="text" id="mask-rtpyrNo--${pageName}"
class="form-control privacy-mask" disabled value="******"/>
</div>
<div class="col-md-12">
<label for="zip--${pageName}" class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
우편번호
</label>
<input type="text" id="zip--${pageName}" name="zip" data-map="ZIP" class="form-control w-px-100"
readonly maxlength="7" pattern="(\d{3}-\d{3}|\d{6}|\d{5})" />
</div>
<div class="col-md-12">
<label for="addr--${pageName}" class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
주소
</label>
<input type="text" id="addr--${pageName}" name="addr" data-map="ADDR"
class="form-control w-px-700" readonly data-maxlengthb="320" />
</div>
<div class="col-md-12">
<label for="dtlAddr--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
상세주소
</label>
<input type="text" id="dtlAddr--${pageName}" name="dtlAddr" data-map="DTL_ADDR"
class="form-control w-px-700" readonly data-maxlengthb="200" />
</div>
</div>
<div class="row g-1">
<div class="col-md-4">
<label for="vin--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
차대번호
</label>
<input type="text" id="vin--${pageName}" name="vin"
data-map="VIN" class="form-control" readonly
placeholder="입력항목이 아닙니다." />
</div>
<div class="col-md-4">
<label for="vhclNm--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
차량명칭
</label>
<input type="text" id="vhclNm--${pageName}" name="vhclNm"
data-map="VHCL_NM" class="form-control" readonly
placeholder="입력항목이 아닙니다." />
</div>
<div class="col-md-4">
<label for="vhclColr--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
차량색상
</label>
<input type="text" id="vhclColr--${pageName}" name="vhclColr"
data-map="VHCL_COLR" class="form-control" readonly
placeholder="입력항목이 아닙니다." />
</div>
<div class="col-md-12" slot="edit">
<template class="pvs bpv">
<slot>
<label for="ffnlgCarmdlCd--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
차종
</label>
<select id="ffnlgCarmdlCd--${pageName}" name ="ffnlgCarmdlCd"
data-map="FFNLG_CARMDL_CD" class="form-select">
<option value=""></option>
<c:forEach items="${FIM009List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</slot>
</template>
</div>
<div class="col-md-12" slot="edit">
<template class="eca">
<slot>
<label for="useFuelCd--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
연료구분
</label>
<select id="useFuelCd--${pageName}" name="useFuelCd"
data-map="USE_FUEL_CD" class="form-select" disabled>
<option value=""></option>
<c:forEach items="${LVS005List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</slot>
</template>
</div>
<div class="col-md-4" slot="edit">
<template class="dpv eca pvs">
<slot>
<label for="towngYn--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
견인지시
</label>
<select id="towngYn--${pageName}" name="towngYn" class="form-select" data-map="TOWNG_YN">
<c:forEach items="${FIM053List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</slot>
</template>
</div>
<div class="col-md-4" slot="edit">
<template class="dpv eca pvs">
<slot>
<label for="crdnSn--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
스티커번호
</label>
<input type="text" id="crdnSn--${pageName}" name="crdnSn"
data-map="CRDN_SN" class="form-control"
maxlength="20" data-maxlengthb="20" />
</slot>
</template>
</div>
<div class="col-md-4" slot="edit">
<template class="dpv">
<slot>
<label for="prkPsbltyRsltCd--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
장애차량확인
</label>
<select id="prkPsbltyRsltCd--${pageName}" name="prkPsbltyRsltCd"
data-map="PRK_PSBLTY_RSLT_CD" class="form-select">
<c:forEach items="${FIM034List}" var="item">
<c:if test="${item.code == '0' or item.code == '1'}">
<option value="${item.code}">${item.value}</option>
</c:if>
</c:forEach>
</select>
</slot>
</template>
</div>
<div class="col-md-12" slot="edit">
<template class="pvs bpv">
<slot>
<label for="teamId--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
단속조
</label>
<select id="teamId--${pageName}" name="teamId" data-map="TEAM_ID" class="form-select">
<option value=""></option>
<c:forEach items="${TeamList}" var="item">
<option value="${item.TEAM_ID}">${item.TEAM_NM}</option>
</c:forEach>
</select>
</slot>
</template>
</div>
<div class="col-md-12" slot="edit">
<template class="pvs bpv">
<slot>
<label class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">단속원</label>
<input type="text" id="teamer1--${pageName}" name="teamer1"
data-map="TEAMER_1" class="form-control" />
<input type="text" id="teamer2--${pageName}" name="teamer2"
data-map="TEAMER_2" class="form-control" />
<input type="text" id="teamer3--${pageName}" name="teamer3"
data-map="TEAMER_3" class="form-control" />
<input type="text" id="teamer4--${pageName}" name="teamer4"
data-map="TEAMER_4" class="form-control" />
</slot>
</template>
</div>
<div class="col-md-6">
<label for="doWarning--${pageName}">
<input type="checkbox" id="doWarning--${pageName}" name="doWarning"
class="form-check-input" />
계고처리
</label>
</div>
</div>
<div class="row mt-4 justify-content-end mb-3">
<div class="col-md-6">
<div class="row justify-content-end">
<div class="col-sm-3">
<button type="button" id="btnInst--${pageName}" class="btn btn-primary">등록</button>
</div>
</div>
</div>
</div>
</form>
</div>
<div class="card w-px-400 min-w-px-400">
<form id="frmFile--${pageName}" method="post" enctype="multipart/form-data">
<input type="file" id="newFileList--${pageName}" name="newFileList"
multiple accept="image/*" hidden />
</form>
<form id="frmUploadSet--${pageName}" method="post" enctype="multipart/form-data">
<input type="file" id="inputUploadSet--${pageName}" name="inputUploadSet"
multiple accept="image/*" hidden />
</form>
<div class="col-md-12">
<button type="button" id="btnAddFile--${pageName}" class="btn btn-primary">이미지 추가</button>
<button type="button" id="btnOpenVideoCapture--${pageName}" class="btn btn-primary">동영상 캡쳐</button>
<button type="button" id="btnCancelAddFile--${pageName}" class="btn btn-primary">선택 사진 삭제</button>
</div>
<div id="display--${pageName}" class="oy-scroll h-px-600 border-default">
</div>
</div>
</div>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
$P.captureFileArr = [];
$P.localUploadArr = [];
/**************************************************************************
* DatasetControl, Dataset, FormFields
**************************************************************************/
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
$P.uploadSet = uploadSupport("#inputUploadSet--${pageName}");
$P.crdnControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData : true,
keymapper : info => info ? info.CRDN_ID : "",
urls : {
create : wctx.url("/${taskSeCd}/crdn/crdn05/030/create.do")
},
formats: {
}
});
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.uploadSet.onDatasetChange = () => {
var files = $P.uploadSet.getDataset();
files.forEach(item => $P.localUploadArr.push(item));
$P.fnDisplay();
};
$P.uploadSet.onRemove = () => { };
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnMakeImgForNewFile = (fileArr) => {
var tagsText = "";
for(var index = 0; index < fileArr.length; index++){
var item = fileArr[index];
tagsText += "<label class='mx-2'>";
tagsText += "<input type='checkbox' name='newPhoto' class='form-check-input' value='"+item.id +"' ";
tagsText += " />";
tagsText += "<img src='"+ item.url +"' width='200' height='200' />";
tagsText += "</label>";
if(index % 2 == 1){
tagsText += "<br />";
}
}
return tagsText;
}
$P.fnDisplay = () => {
var displayArea = document.querySelector("#display--${pageName}");
var concatArr = $P.localUploadArr.concat($P.captureFileArr);
var tagsText = $P.fnMakeImgForNewFile(concatArr);
displayArea.innerHTML = tagsText;
};
$P.fnSave = async() => {
if(!customValidate($("#frmEdit--${pageName} input"))) return;
if($("#doWarning--${pageName}").is(":checked")){
var rtpyrNm = document.getElementById("rtpyrNm--${pageName}");
if(rtpyrNm.value == ""){
dialog.alert({
content:"계고 처리를 하기 위해선 소유주정보가 입력되어야 합니다.",
init : function(){
setDialogZindex();
focusClose();
},
onClose:function(){rtpyrNm.focus();}
});
return;
}
}
if(await confirm2("현재 단속 정보를 저장하시겠습니까?")){
var info = $P.formFields.get();
if (!info) {
return;
}
var formData = new FormData(document.getElementById("frmFile--${pageName}"));
for(var key in info) {
var value = info[key];
formData.append(key,value);
}
formData.delete("newFileList");
if($P.localUploadArr.length > 0){
$P.localUploadArr.forEach(item => formData.append("newFileList",item));
}
if($P.captureFileArr.length > 0){
$P.captureFileArr.forEach(item => formData.append("newFileList",item));
}
ajax.post({
url : $P.crdnControl.urls.create,
data : formData, contentType : false, processData : false,
success : (resp) => {
$P.saveCallback(resp);
}
});
}
};
$P.saveCallback = (resp) => {
if (resp.saved) {
dialog.alert({
content : "저장됐습니다.",
init : function(){
setDialogZindex();
focusClose();
}
});
dialog.close("manualDialog");
}
}
$P.videoCallback = (snapshots) => {
snapshots.forEach(function(canvas, index, array){
canvas.toBlob(function(blob){
var identify = new Date().getTime()+ "-" + index;
var file = new File([blob], "capture-"+identify+".png", {type: "image/png"});
file.id = "file-" + identify;
file.url = (window.URL || window.webkitURL).createObjectURL(file);
$P.captureFileArr.push(file);
if(index === array.length - 1){
$P.fnDisplay();
}
});
});
}
/**************************************************************************
* 초기화(업무별 입력항목)
**************************************************************************/
var clsForTask = $("#taskSeCd--${pageName}").val().toLowerCase();
//업무별 입력 항목
renderForTask('frmEdit--${pageName}', clsForTask);
/**************************************************************************
* element.on
**************************************************************************/
$("#btnInst--${pageName}").on('click', () => $P.fnSave());
$("#btnAddFile--${pageName}").on('click', () => { $("#inputUploadSet--${pageName}").trigger("click"); });
$("#btnOpenVideoCapture--${pageName}").on('click', () => {
var popupWidth = 1800;
var popupHeight = 950;
var popupX = (window.screen.width / 2) - (popupWidth / 2);
var popupY= (window.screen.height / 2) - (popupHeight / 2);
var popup = window.open(wctx.url("/sprt/sprt03/010/main.do?openerPageName=${pageName}")
,"newVideoCapture"
,"width="+popupWidth+", height="+popupHeight+", left="+popupX+", top="+popupY
);
popup.onload = () => {
popup.addEventListener('beforeunload', function() {
$.unblockUI();
});
};
});
$("#btnCancelAddFile--${pageName}").on('click', () => {
var checked = $("#display--${pageName}").find("[name='newPhoto']:checked");
if(checked.length < 1){
alert("선택된 사진이 없습니다.");
return;
}
var checkedArr = [];
for(var i=0; i < checked.length; i++){
checkedArr.push(checked[i].value);
}
$P.captureFileArr = $P.captureFileArr.filter(item => checkedArr.indexOf(item.id) == -1);
$P.localUploadArr = $P.localUploadArr.filter(item => checkedArr.indexOf(item.id) == -1);
$P.fnDisplay();
});
$("#vhrno--${pageName}").onEnterPress(function(){
var alertDialogId = "alertDialog";
var crdnYmd = $("#crdnYmd--${pageName}").val().replaceAll("-", "");
var vhrnoEl = event.target;
var vhrno = vhrnoEl.value;
if(crdnYmd == ""){
dialog.alert({
content : "단속일자를 입력하세요.",
init : function(){
setDialogZindex();
focusClose();
},
onClose : function(){ $("#crdnYmd--${pageName}").focus(); }
});
return;
}
if(vhrno == ""){
dialog.alert({
content:"차량번호를 입력하세요.",
init : function(){
setDialogZindex();
focusClose();
},
onClose:function(){ $(vhrnoEl).focus(); }
});
return;
}
json.post({
url: wctx.url("/payer/vehicle.do"),
data: {
sggCd : $("#sggCd--${pageName}").val(),
vhrno : vhrno,
levy_stdde : crdnYmd
},
success : (resp) => {
if(!resp.found){
dialog.alert({
content : "차량정보가 없습니다.",
init : function(){
setDialogZindex();
focusClose();
}
});
$("#rtpyrId--${pageName}").val("");
$("#addrSn--${pageName}").val("");
$("#rtpyrNm--${pageName}").val("");
$("#rtpyrSeCd--${pageName}").val("");
$("#rtpyrNo--${pageName}").val("");
$("#vin--${pageName}").val("");
$("#vhclNm--${pageName}").val("");
$("#vhclColr--${pageName}").val("");
$("#useFuelCd--${pageName}").val("");
$("#ffnlgCarmdlCd--${pageName}").val("");
$("#zip--${pageName}").val("");
$("#addr--${pageName}").val("");
$("#dtlAddr--${pageName}").val("");
return;
}
$("#rtpyrId--${pageName}").val(resp.rtpyrId);
$("#addrSn--${pageName}").val(resp.addrSn);
var vehicle = resp.vehicle;
$("#rtpyrNm--${pageName}").val(vehicle.mber_nm);
var pyrSeCd = "";
switch(vehicle.mber_se_code){
case "11" : pyrSeCd = "01"; break;
case "12" : pyrSeCd = "02"; break;
case "13" : pyrSeCd = "03"; break;
case "14" : pyrSeCd = "04"; break;
case "15" : pyrSeCd = "05"; break;
}
$("#rtpyrSeCd--${pageName}").val(pyrSeCd);
$("#rtpyrNo--${pageName}").val(vehicle.mber_se_no);
$("#vin--${pageName}").val(vehicle.vin);
$("#vhclNm--${pageName}").val(vehicle.cnm);
$("#vhclColr--${pageName}").val(vehicle.color_nm);
$("#useFuelCd--${pageName}").val(vehicle.use_fuel_code);
if(vehicle.vhcty_asort_code == "1"){ //승용
$("#ffnlgCarmdlCd--${pageName}").val("11");
} else if(vehicle.vhcty_asort_code == "2"){ //승합
$("#ffnlgCarmdlCd--${pageName}").val("12");
} else if(vehicle.vhcty_asort_code == "3"){ //화물
if(vehicle.mxmm_ldg <= 4000){
$("#ffnlgCarmdlCd--${pageName}").val("13");
} else {
$("#ffnlgCarmdlCd--${pageName}").val("14");
}
} else if(vehicle.vhcty_asort_code == "4"){ //특수
$("#ffnlgCarmdlCd--${pageName}").val("15");
} else {
$("#ffnlgCarmdlCd--${pageName}").val("");
}
$("#zip--${pageName}").val(vehicle.zip_code); //우편번호
$("#addr--${pageName}").val(vehicle.road_nm_adres); //주소
$("#dtlAddr--${pageName}").val(vehicle.use_strnghld_adres_nm); //상세주소
}
});
});
$("#teamId--${pageName}").on("change",function(){
$("#teamer1--${pageName}").val("");
$("#teamer2--${pageName}").val("");
$("#teamer3--${pageName}").val("");
$("#teamer4--${pageName}").val("");
if(this.value != ""){
ajax.get({
url: wctx.url("/${taskSeCd}/crdn/crdn07/010/info.do"),
data: { "teamId" : this.value},
success : (resp) => {
if(resp.teamInfo != null){
var teamInfo = resp.teamInfo;
$("#teamer1--${pageName}").val(teamInfo.TEAMER_1);
$("#teamer2--${pageName}").val(teamInfo.TEAMER_2);
$("#teamer3--${pageName}").val(teamInfo.TEAMER_3);
$("#teamer4--${pageName}").val(teamInfo.TEAMER_4);
}
}
});
}
});
/**************************************************************************
* 초기화
**************************************************************************/
initDatepicker("frmEdit--${pageName}"); //달력 초기화
$("#frmEdit--${pageName}").find(".form-date").each(function(){
$(this).on("input",function(){
var value = this.value.replaceAll("-","");
if(value.length > 7){
this.value = value.substring(0,4)+"-"+value.substring(4,6)+"-"+value.substring(6);
} else if(value.length > 5){
this.value = value.substring(0,4)+"-"+value.substring(4);
}
});
});
$("#frmEdit--${pageName}").find(".form-time").each(function(){
$(this).on("input",function(){
var value = this.value.replaceAll(":","");
if(value.length > 5){
this.value = value.substring(0,2)+":"+value.substring(2,4)+":"+value.substring(4);
} else if(value.length > 3){
this.value = value.substring(0,2)+":"+value.substring(2);
}
});
});
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
$P.crdnControl.dataset.append({});
});
</script>

@ -1,623 +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="pageKorName" scope="request">단속 자료 조회</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<div class="container-page-btn">
<button type="button" id="btnReset--${pageName}" class="btn btn-outline-dark w-px-120" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" id="btnSearch--${pageName}" class="btn btn-search w-px-120" title="검색">
검색
</button>
<button type="button" id="btnExcel--${pageName}" class="btn btn-excel w-px-120" title="엑셀 저장">
엑셀
</button>
<button type="button" id="btnExcelForApproval--${pageName}" class="btn btn-excel w-px-120" title="엑셀 저장">
엑셀(사진 포함)
</button>
</span>
</div>
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${TaskListForSgg}" var="item">
<label>
<input name="taskSeCd" type="radio" value="${item.code}"
class="form-check-input" alt="업무구분"
onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCrdnYmdFrom--${pageName}">단속일자</label>
<span class="form-search-linebox">
<input type="text" id="schCrdnYmdFrom--${pageName}" name="schCrdnYmdFrom"
class="form-control form-date"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" id="schCrdnYmdTo--${pageName}" name="schCrdnYmdTo"
class="form-control form-date"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="crdnInptSeCd--${pageName}">자료출처</label>
<select id="crdnInptSeCd--${pageName}" name="crdnInptSeCd" class="form-select">
<option value="">전체</option>
<c:forEach items="${FIM003List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="vhrno--${pageName}">차량번호</label>
<input type="text" id="vhrno--${pageName}" name="vhrno" class="form-control" />
</div>
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div>
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row">
<div slot="search" class="col-6 if-empty-col0">
<template class="pvs dpv eca">
<slot>
<span class="form-label fw-bold form-search-title w-px-120 text-end">견인여부</span>
<label class="form-label">
<input type="radio" name="towngYn" value="" class="form-check-input" checked />전체
</label>
<label class="form-label">
<input type="radio" name="towngYn" value="Y" class="form-check-input" />예
</label>
<label class="form-label">
<input type="radio" name="towngYn" value="N" class="form-check-input" />아니오
</label>
</slot>
</template>
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="crdnSttsCd--${pageName}">자료상태</label>
<select id="crdnSttsCd--${pageName}" name="crdnSttsCd" class="form-select">
<option value="">전체</option>
<c:forEach items="${FIM010List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<div slot="search" id="searchForNxrp--${pageName}" class="col-6 if-empty-col0">
<template class="pvs bpv">
<slot>
<label class="form-label fw-bold form-search-title w-px-120 text-end"
for="nxrpSendStts--${pageName}">세외수입 전송 상태</label>
<select id="nxrpSendStts--${pageName}" name="nxrpSendStts" class="form-select">
<option value="">전체</option>
<option value="01">전송가능</option>
<option value="02">전송완료</option>
<option value="03">전송불가(사진없음)</option>
</select>
</slot>
</template>
</div>
<div class="col-12"></div>
<!-- 등록일자, 수정일자 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div>
</form>
<div>
<div id="gridbuttonArea--${pageName}" class="container-page-btn">
<div class="d-flex flex-row justify-content-between">
<span id="crdnPaging--${pageName}PagingInfo" class="dataTables_info" role="status" aria-live="polite"></span>
<ul id="crdnPaging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
<span class="container-window-btn-right">
<span slot="button">
<template class="pvs bpv">
<slot>
<button type="button" class="btn btn-primary w-px-120"
id="btnSendCrdn--${pageName}" title="세외수입 전송">
&#x2611; 세외수입 전송
</button>
</slot>
</template>
</span>
</span>
</div>
</div>
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-500">
<table id="DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr id="crdnThead--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}"
data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="crdnTbody--${pageName}">
</tbody>
<template id="crdnCols--${pageName}">
<th style="width: 80px;" class="cmn">No.</th>
<th class="cmn" style="width: 56px;">
<input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}"
onchange="pageObject['${pageName}'].checkCrdnList(this, this.checked);" />
</th>
<th onclick="searchFromGridTitle('CRDN_INPT_SE_CD',this.innerText,'codeValue','FIM003');"
style="width: 160px;" class="pvs bpv dpv eca">자료출처</th>
<th onclick="searchFromGridTitle('VHRNO',this.innerText,'match','part');"
style="width: 160px;" class="cmn">차량번호</th>
<th onclick="searchFromGridTitle('CRDN_YMD','위반일자','ymd','');"
style="width: 180px;" class="cmn">위반일시</th>
<th onclick="searchFromGridTitle('CRDN_PLC',this.innerText,'match','part');"
style="width: 250px;" class="cmn">단속장소</th>
<th onclick="searchFromGridTitle('ATCH_FILE_CNT',this.innerText,'match','perfect');"
style="width: 100px;" class="cmn">사진건수</th>
<th onclick="searchFromGridTitle('CRDN_SN',this.innerText,'match','perfect');"
style="width: 120px;" class="pvs dpv eca">스티커번호</th>
<th onclick="searchFromGridTitle('PRK_PSBLTY_RSLT_CD',this.innerText,'codeValue','FIM034');"
style="width: 140px;" class="dpv">장애차량확인</th>
<th onclick="searchFromGridTitle('CRDN_STTS_CD',this.innerText,'codeValue','FIM010');"
style="width: 140px;" class="cmn">처리상태</th>
<th onclick="searchFromGridTitle('LEVY_EXCL_RSN_CD',this.innerText,'codeValue','FIM022');"
style="width: 250px;" class="cmn">제외사유</th>
<th onclick="searchFromGridTitle('LEVY_EXCL_YMD',this.innerText,'ymd','');"
style="width: 140px;" class="cmn">제외처리일자</th>
<th onclick="searchFromGridTitle('LEVY_EXCL_ETC_CN',this.innerText,'match','part');"
style="width: 250px;" class="cmn">제외내역</th>
<th class="cmn dummy-th"></th>
</template>
<template id="crdnRow--${pageName}">
<tr data-key="{CRDN_ID}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end cmn">{ROW_NUM}</td>
<td class="cmn text-center">
<input type="checkbox" class="form-check-input" name="gridCheckbox" value="{CRDN_ID}"
onchange="pageObject['${pageName}'].checkCrdnList(this, this.checked);">
</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center cmn">{CRDN_INPT_SE_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center cmn">{VHRNO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center cmn">{CRDN_YMD_TM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start cmn">{CRDN_PLC}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center cmn">{ATCH_FILE_CNT}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start pvs dpv eca">{CRDN_SN}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center dpv">{PRK_PSBLTY_RSLT_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center cmn">{CRDN_STTS_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center cmn">{LEVY_EXCL_RSN_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center cmn">{LEVY_EXCL_YMD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start cmn">{LEVY_EXCL_ETC_CN}</td>
<td class="dummy-td cmn"></td>
</tr>
</template>
<template id="crdnNotFound--${pageName}">
<tr class="dpv">
<td valign="top" colspan="14" class="dataTables_empty text-center">
단속 정보를 찾지 못했습니다.
</td>
</tr>
<tr class="eca">
<td valign="top" colspan="13" class="dataTables_empty text-center">
단속 정보를 찾지 못했습니다.
</td>
</tr>
<tr class="pvs">
<td valign="top" colspan="13" class="dataTables_empty text-center">
단속 정보를 찾지 못했습니다.
</td>
</tr>
<tr class="bpv">
<td valign="top" colspan="12" class="dataTables_empty text-center">
단속 정보를 찾지 못했습니다.
</td>
</tr>
<tr class="pes">
<td valign="top" colspan="12" class="dataTables_empty text-center">
단속 정보를 찾지 못했습니다.
</td>
</tr>
<tr class="dvs">
<td valign="top" colspan="12" class="dataTables_empty text-center">
단속 정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
var FIM002 = new CommonCodes(${FIM002});
var FIM003 = new CommonCodes(${FIM003});
var FIM010 = new CommonCodes(${FIM010});
var FIM022 = new CommonCodes(${FIM022});
var FIM026 = new CommonCodes(${FIM026});
var FIM034 = new CommonCodes(${FIM034});
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.crdnControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData:true,
keymapper : info => info ? info.CRDN_ID : "",
urls : {
load : "",
getInfo : ""
},
formats: {
CRDN_INPT_SE_CD: FIM003,
CRDN_YMD_TM : datetimeFormat,
REG_DT : datetimeFormat,
MDFCN_DT : datetimeFormat,
CVLCPT_PRCS_PRNMNT_DT : dateFormat,
CVLCPT_RCPT_YMD : dateFormat,
RCVMT_AMT : numberFormat,
CRDN_SE_CD: FIM002,
CRDN_STTS_CD : FIM010,
CRDN_REG_SE_CD: FIM026,
LEVY_EXCL_YMD : dateFormat,
LEVY_EXCL_RSN_CD : FIM022,
PRK_PSBLTY_RSLT_CD : FIM034
}
});
$P.crdnControl.defaultFetchSize = FETCH_XS;
$P.crdnControl.query = { pageNum : 1, fetchSize : $P.crdnControl.defaultFetchSize };
$P.crdnControl.beforeCurrent = null;
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.crdnControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate();
var trs = Apply.fromDataset.getTbody($P.crdnControl.dataset, t.found, t.notFound, t.replacer);
$P.renderCrdnList(obj["Total"], $P.crdnControl.dataset.length, trs, option);
Apply.fromDataset.paging($P.crdnControl.dataset, obj, "crdnPaging--${pageName}");
};
$P.crdnControl.dataset.onCurrentChange = (dataItem) => {
Apply.fromDataset.currentRow($P.crdnControl.dataset, dataItem, $("#crdnTbody--${pageName}")[0]);
}
$P.crdnControl.dataset.onSelectionChange = (selectedArr) => {
Apply.fromDataset.gridCheckbox($P.crdnControl.dataset, document.getElementById("crdnTbody--${pageName}"), 1, selectedArr);
Apply.fromDataset.gridButton($P.crdnControl.dataset, $("#btnSendCrdn--${pageName}")[0], selectedArr);
};
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnReset = () => {
var searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function(){ $(this).find("option:eq(0)").prop("selected", true); });
$("#byOutput--${pageName}").val("동적 검색");
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
$('#schCrdnYmdFrom--${pageName}').datepicker('setDate', DateUtil.getDateDay(-365).date);
$('#schCrdnYmdTo--${pageName}').datepicker('setDate', TODAY());
$P.crdnControl.dataset.setData([]);
}
$P.fnResetAndChangeBiz = (taskSeCd) => {
$P.fnReset();
$P.crdnControl.urls.load = wctx.url("/"+taskSeCd+"/crdn/crdn06/010/list.do");
$P.crdnControl.urls.getInfo = wctx.url("/sprt/sprt02/010/main.do");
var clsForTask = taskSeCd.toLowerCase();
//업무별 조회조건
renderForTask("frmSearch--${pageName}", clsForTask);
//업무별 버튼
renderForTask("gridbuttonArea--${pageName}", clsForTask);
//버튼 이벤트 재매핑
$("#btnSendCrdn--${pageName}").off("click");
$("#btnSendCrdn--${pageName}").on("click", () => $P.fnSendCrdn());
//업무별 그리드
var colsContent = document.getElementById("crdnCols--${pageName}").content;
var cols = $(colsContent).find("."+clsForTask+",.cmn");
var colsStr = "";
cols.each(function(){
colsStr += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsStr);
if(SYS_LINK_INFO = null || SYS_LINK_INFO.NXRP_LINK_YN != 'Y'){
$("#btnSendCrdn--${pageName}").attr("hidden","hidden");
$("#searchForNxrp--${pageName}").attr("hidden","hidden");
} else {
$("#btnSendCrdn--${pageName}").prop("disabled", true);
}
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
data.fetchSize = $P.crdnControl.defaultFetchSize;
return data;
}
$P.searchCrdnList = () => {
$P.crdnControl.query = $P.getParams();
$P.crdnControl.load(1);
}
$P.scrollCrdnList = () => {
$P.crdnControl.load($P.crdnControl.query.pageNum + 1);
}
$P.refreshCrdnList = () => {
$P.crdnControl.reload({all : true});
}
$P.fnExcelDown = (forApproval) => {
if($P.crdnControl.dataset.empty){
alert("조회된 자료가 없습니다.");
return;
}
var cellDefs = getCellDefs($("#crdnThead--${pageName} th").not(".dummy-th").not(":eq(0)").not(":eq(0)"),
$($("#crdnRow--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)").not(":eq(0)"));
$P.crdnControl.query.cellDefs = cellDefs;
if(forApproval){
$P.crdnControl.query.includePhoto = "Y";
} else {
$P.crdnControl.query.includePhoto = "N";
}
$P.crdnControl.download();
$P.crdnControl.query.includePhoto = null;
};
$P.checkCrdnList = (element, bool) => {
GRID.checkbox.sync(element, bool);
var atLeastOne = GRID.checkbox.countChecked(element) > 0;
$("#btnSendCrdn--${pageName}").prop("disabled", !atLeastOne);
Apply.toDataset.selection($P.crdnControl.dataset, element, bool);
}
$P.getGridTemplate = () => {
var clsForTask = $("#frmSearch--${pageName} [name='taskSeCd']:checked").val().toLowerCase();
var notFound = [document.getElementById("crdnNotFound--${pageName}").content.querySelector("."+clsForTask+",.cmn").outerHTML];
var foundContent = document.getElementById("crdnRow--${pageName}").content;
var foundTr = $(foundContent).find("tr")[0].cloneNode(false);
var foundTds = $(foundContent).find("."+clsForTask+",.cmn");
foundTds.each(function(){
foundTr.appendChild(this.cloneNode(true));
});
var found = foundTr.outerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickCrdnList('" + dataItem.getValue("CRDN_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].dblclickCrdnList('" + dataItem.getValue("CRDN_ID") + "');");
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
$P.renderCrdnList = (total, listLength, trs, option) => {
let noMore = (listLength >= total);
var initScroll = ($P.crdnControl.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs, initScroll, noMore);
fn_securityModeToggle($("#securityMode--top").is(":checked")); //보안모드
}
$P.clickCrdnList = (dataKey) => {
if(dataKey == ""){
return;
}
$("#crdnTbody--${pageName}").setCurrentRow(dataKey);
Apply.toDataset.current($P.crdnControl.dataset, dataKey);
}
$P.dblclickCrdnList = (dataKey) => {
var params = {
callControlName : "pageObject['${pageName}'].crdnControl",
crdnId : dataKey
};
ajax.get({
url : $P.crdnControl.urls.getInfo,
data : params,
success : (resp) => {
dialog.open({
id : "totalInfoMainDialog",
title : "개별총정보", size : "xxl", content : resp,
init : () => {}
});
}
});
}
$P.fnSendCrdn = () => {
var datas = $P.crdnControl.dataset.getDataset("selected");
var taskSeCd = datas[0].TASK_SE_CD;
var keys = $P.crdnControl.dataset.getKeys("selected");
var url = "";
if(taskSeCd == "PVS"){
url = "/"+taskSeCd+"/nxrp/nxrp01/010/createIndivB01.do";
} else if(taskSeCd == "BPV"){
url = "/"+taskSeCd+"/nxrp/nxrp01/010/createIndivC01.do";
} else {
return;
}
ajax.post({
url : wctx.url(url),
data : { "crdnIds" : keys.join(",") },
success : (resp) => {
if(resp.saved){
dialog.alert({
content : "처리되었습니다.",
init : function() {
setDialogZindex();
focusClose();
},
onClose : function(){
$P.refreshCrdnList();
}
});
} else {
alert(resp.rtnMsg);
}
}
});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
$('#btnSearch--${pageName}').on('click', () => $P.searchCrdnList());
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress($P.searchCrdnList);
$('#btnExcel--${pageName}').on('click', () => $P.fnExcelDown(false));
$('#btnExcelForApproval--${pageName}').on('click', () => $P.fnExcelDown(true));
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollCrdnList);
/**************************************************************************
* 초기화
**************************************************************************/
initDatepicker("frmSearch--${pageName}"); //달력 초기화
initDetailSearchButton("frmSearch--${pageName}");
var defaultBizValue = $("#layout-navbar input[name='taskSeCd']:checked").val();
if("${taskSeCd}" == ""){
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + defaultBizValue + "']").prop("checked",true);
$P.fnResetAndChangeBiz(defaultBizValue);
} else {
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + "${taskSeCd}" + "']").prop("checked",true);
$P.fnResetAndChangeBiz("${taskSeCd}");
}
fn_securityModeToggle($("#securityMode--top").is(":checked")); //보안모드
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
});
</script>

@ -1,486 +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>
<!-- inner page html -->
<div class="content-pop">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<!-- Page Body -->
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<input type="hidden" id="crdnId--${pageName}" name="crdnId" data-map="CRDN_ID" />
<div class="row g-1">
<!-- 단속 일자 -->
<div class="col-md-6">
<label for="crdnYmd--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">단속일자</label>
<input type="text" id="crdnYmd--${pageName}" name="crdnYmd"
class="form-control form-date" data-map="CRDN_YMD"
data-fmt-type="day" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<!-- 단속 시간 -->
<div class="col-md-6">
<label for="crdnTm--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">단속시간</label>
<input type="text" id="crdnTm--${pageName}" name="crdnTm"
class="form-control form-time" data-map="CRDN_TM"
data-fmt-type="time" maxlength="8" required placeholder="시:분:초" />
</div>
<!-- 차량번호 -->
<div class="col-md-6">
<label for="vhrno--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">차량번호</label>
<input type="text" id="vhrno--${pageName}" name="vhrno" class="form-control w-30" data-map="VHRNO" />
<button type="button" id="btnVehicle--${pageName}" class="btn btn-sm btn-outline-dark" title="차량 검색">조회</button>
</div>
<!-- 위반 내용 -->
<div class="col-md-6">
<label for="vltnCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">위반내용</label>
<select class="form-select w-px-200" id="vltnCd--${pageName}" name="vltnCd" data-map="VLTN_CD">
<c:forEach items="${VLTNList}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 법정동 -->
<div class="col-md-6 select2-primary">
<label for="crdnStdgNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">법정동</label>
<input type="text" id="crdnStdgNm--${pageName}" name="crdnStdgNm"
class="form-control w-40" data-map="CRDN_STDG_NM" list="stdgNmList--${pageName}" />
<datalist id="stdgNmList--${pageName}">
<c:forEach items="${stdgNmList}" var="item">
<option value="${item}"></option>
</c:forEach>
</datalist>
</div>
<!-- 도로명 -->
<div class="col-md-6 select2-primary">
<label for="crdnRoadNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">도로명</label>
<input type="text" id="crdnRoadNm--${pageName}" name="crdnRoadNm"
class="form-control w-40" data-map="CRDN_ROAD_NM" />
</div>
<!-- 단속 장소 -->
<div class="col-md-12">
<label for="crdnPlc--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">단속장소</label>
<input type="text" id="crdnPlc--${pageName}" name="crdnPlc"
class="form-control w-80" data-map="CRDN_PLC" data-maxlengthb="200" />
</div>
<!-- 상세 단속 장소 -->
<div class="col-md-12" slot="edit">
<template class="bpv">
<slot>
<label for="dtlCrdnPlc--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">상세단속장소</label>
<input type="text" id="dtlCrdnPlc--${pageName}" name="dtlCrdnPlc"
class="form-control w-80" data-map="DTL_CRDN_PLC" data-maxlenghb="200" />
</slot>
</template>
</div>
<div class="col-md-6" slot="edit">
<template class="pvs">
<slot>
<label for="crdnSpareaCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">특별구역</label>
<select id="crdnSpareaCd--${pageName}" name="crdnSpareaCd"
class="form-select" data-map="CRDN_SPAREA_CD">
<c:forEach items="${FIM007List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</slot>
</template>
</div>
<div class="col-md-6" slot="edit">
<template class="pvs">
<slot>
<label for="ovtmYn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">2시간초과</label>
<select class="form-select" id="ovtmYn--${pageName}" name="ovtmYn" data-map="OVTM_YN" required>
<c:forEach items="${CMN006List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</slot>
</template>
</div>
<!-- 기타 내용 -->
<div class="col-md-12">
<label for="etcCn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">특기사항</label>
<input type="text" id="etcCn--${pageName}" name="etcCn"
class="form-control w-80" data-map="ETC_CN" data-maxlengthb="1000" />
</div>
<div class="col-md-6">
<label for="vin--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">차대번호</label>
<input type="text" id="vin--${pageName}" name="vin"
class="form-control" data-map="VIN" readonly placeholder="입력항목이 아닙니다." />
</div>
<div class="col-md-6">
<label for="vhclNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">차량명칭</label>
<input type="text" id="vhclNm--${pageName}" name="vhclNm"
class="form-control" data-map="VHCL_NM" readonly placeholder="입력항목이 아닙니다." />
</div>
<div class="col-md-6">
<label for="vhclColr--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">차량색상</label>
<input type="text" id="vhclColr--${pageName}" name="vhclColr"
class="form-control" data-map="VHCL_COLR" readonly placeholder="입력항목이 아닙니다." />
</div>
<div class="col-md-12" slot="edit">
<template class="pvs bpv">
<slot>
<label for="ffnlgCarmdlCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">차종</label>
<select id="ffnlgCarmdlCd--${pageName}" name="ffnlgCarmdlCd" class="form-select" data-map="FFNLG_CARMDL_CD">
<option value=""></option>
<c:forEach items="${FIM009List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</slot>
</template>
</div>
<div class="col-md-12" slot="edit">
<template class="eca">
<slot>
<label for="useFuelCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">연료구분</label>
<select id="useFuelCd--${pageName}" class="form-select" name="useFuelCd" data-map="USE_FUEL_CD" disabled>
<option value=""></option>
<c:forEach items="${LVS005List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</slot>
</template>
</div>
<div class="col-md-6" slot="edit">
<template class="dpv eca pvs">
<slot>
<label for="towngYn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">견인지시</label>
<select id="towngYn--${pageName}" name="towngYn" class="form-select w-px-120" data-map="TOWNG_YN">
<c:forEach items="${FIM053List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</slot>
</template>
</div>
<div class="col-md-6" slot="edit">
<template class="dpv eca pvs">
<slot>
<label for="crdnSn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">단속일련번호</label>
<input type="text" id="crdnSn--${pageName}" name="crdnSn"
class="form-control" data-map="CRDN_SN" maxlength="20" data-maxlengthb="20" />
</slot>
</template>
</div>
<div class="col-md-6" slot="edit">
<template class="dpv">
<slot>
<label for="prkPsbltyRsltCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">장애차량확인</label>
<select id="prkPsbltyRsltCd--${pageName}" name="prkPsbltyRsltCd" class="form-select w-px-120" data-map="PRK_PSBLTY_RSLT_CD">
<c:forEach items="${FIM034List}" var="item">
<c:if test="${item.code == '0' or item.code == '1'}">
<option value="${item.code}">${item.value}</option>
</c:if>
</c:forEach>
</select>
</slot>
</template>
</div>
</div>
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" id="btnSave--${pageName}" class="btn btn-primary w-px-80" title="저장">
저장
</button>
</span>
</span>
</div> <!-- 업무 버튼 및 건수 표시 -->
</div> <!-- <div class="card"> -->
<!-- Page Body -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "crdn"
, prefixName: "단속"
, keymapper: info => info ? info.CRDN_ID : ""
, dataGetter: obj => obj.crdnInfo
});
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
$P.control.onCurrentChange = (item) => {
if (!item) return;
// 1. 업무별 입력 항목
$P.fnRenderTask(item.data.TASK_SE_CD);
// 2. Dataset 셋팅
$P.formFields.set($P.control, item);
// 3. 업무구분에 따른 URL 변경
$P.fnSetURL(item.data.TASK_SE_CD);
}
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
dialog.alert({
content: showMessage
, init: function() {
setDialogZindex();
focusClose();
}
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
ajax.post({
url: $P.control.urls.update
, data: info || {}
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 업무별 입력 항목
$P.fnRenderTask = (taskSeCd) => {
if (taskSeCd == undefined || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#taskSeCd--${pageName}").val();
}
renderForTask("frmEdit--${pageName}", taskSeCd.toLowerCase());
}
// 업무구분에 따른 URL 설정
$P.fnSetURL = (taskSeCd) => {
$P.control.urls.update = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/020/update.do"); // 수정
}
// 차적 조회
$P.fnGetVehicle = (params) => {
if (!params) return;
json.post({
url: wctx.url("/payer/vehicle.do")
, data: params || {}
, success: resp => {
// 항목 초기화
$("#vin--${pageName}").val("");
$("#vhclNm--${pageName}").val("");
$("#vhclColr--${pageName}").val("");
$("#useFuelCd--${pageName}").val("");
$("#ffnlgCarmdlCd--${pageName}").val("");
if (!resp.found) {
dialog.alert({
content: "차량 정보가 없습니다.",
init: function() {
setDialogZindex();
focusClose();
}
});
return;
}
let vehicle = resp.vehicle;
// 단속(TB_CRDN) - 공통 항목
$("#vin--${pageName}").val(vehicle.vin); // 차대번호
$("#vhclNm--${pageName}").val(vehicle.cnm); // 차량명
$("#vhclColr--${pageName}").val(vehicle.color_nm); // 차량색상
// 단속 부가 정보(TB_CRDN_ADI) - 사용 연료 코드
$("#useFuelCd--${pageName}").val(vehicle.use_fuel_code);
// 단속 부가 정보(TB_CRDN_ADI) - 과태료 차종 코드
if (vehicle.vhcty_asort_code == "1") { // 승용
$("#ffnlgCarmdlCd--${pageName}").val("11");
} else if (vehicle.vhcty_asort_code == "2") { // 승합
$("#ffnlgCarmdlCd--${pageName}").val("12");
} else if (vehicle.vhcty_asort_code == "3") { // 화물
if(vehicle.mxmm_ldg <= 4000){
$("#ffnlgCarmdlCd--${pageName}").val("13");
} else {
$("#ffnlgCarmdlCd--${pageName}").val("14");
}
} else if (vehicle.vhcty_asort_code == "4") { // 특수
$("#ffnlgCarmdlCd--${pageName}").val("15");
} else {
$("#ffnlgCarmdlCd--${pageName}").val("");
}
}
});
}
// 차적 조회
$P.fnVehicle = (title) => {
let crdnYmd = $("#crdnYmd--${pageName}").val().replaceAll("-", "");
let vhrno = $("#vhrno--${pageName}").val();
// 단속일자
if (crdnYmd == "") {
dialog.alert({
content: "단속일자를 입력하세요.",
init: function() {
setDialogZindex();
focusClose();
},
onClose : function() { $("#crdnYmd--${pageName}").focus(); }
});
return;
}
// 차량번호
if (vhrno == "") {
dialog.alert({
content: "차량번호를 입력하세요.",
init: function() {
setDialogZindex();
focusClose();
},
onClose : function() { $("#vhrno--${pageName}").focus(); }
});
return;
}
let params = {
inqire_se_code : "3"
, sggCd: $("#sggCd--${pageName}").val()
, levy_stdde: crdnYmd
, vhrno: vhrno
}
$P.fnGetVehicle(params);
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 저장
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
// 단속 ID
let crdnId = $P.control.dataset.getValue("CRDN_ID");
// 단속 ID 가 없다면.. return
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
dialog.alert({
content: "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, init: function() {
setDialogZindex();
focusOK();
}, onOK: () => {
$P.control.save($P.formFields.get()); // formFields
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmEdit--${pageName}").find(".form-date").each(function() {
$(this).on("input",function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0,4) + "-" + value.substring(4,6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0,4) + "-" + value.substring(4);
}
});
});
$("#frmEdit--${pageName}").find(".form-time").each(function() {
$(this).on("input",function() {
let value = this.value.replaceAll(":", "");
if (value.length > 5) {
this.value = value.substring(0,2) + ":" + value.substring(2,4) + ":" + value.substring(4);
} else if (value.length > 3) {
this.value = value.substring(0,2) + ":" + value.substring(2);
}
});
});
// 차량번호 엔터 이벤트
$("#vhrno--${pageName}").onEnterPress(function() {
$P.fnVehicle("차적 조회");
});
// 버튼 이벤트
$("#btnVehicle--${pageName}").on("click", () => $P.fnVehicle()); // 차량번호 조회
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장
}
// 초기 화면 설정
$P.initForm = () => {
// 달력 초기화
initDatepicker("frmEdit--${pageName}");
$("#crdnYmd--${pageName}").datepicker("setDate", TODAY());
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. Dataset 설정
$P.control.setData([${crdnInfo}]);
});
</script>

@ -1,182 +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>
<!-- inner page html -->
<div class="content-pop">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<!-- Page Body -->
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<input type="hidden" id="crdnId--${pageName}" name="crdnId" data-map="CRDN_ID" />
<div class="row g-1">
<!-- 단속 처리 상태 코드 -->
<div class="col-md-12">
<label for="crdnSttsCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">처리상태</label>
<select id="crdnSttsCd--${pageName}" name="crdnSttsCd" class="form-select" data-map="CRDN_STTS_CD" required>
<option value="">선택하세요</option>
<c:forEach items="${FIM010List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 기타 내용 --> <!-- DB에 등록할 때 문구가 추가로 붙기 때문에 data-maxlengthb="940" 으로 지정 -->
<div class="col-md-12">
<label for="etcCn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">기타내용</label>
<input type="text" class="form-control w-85" id="etcCn--${pageName}" name="etcCn" data-maxlengthb="940" />
</div>
</div>
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" id="btnSave--${pageName}" class="btn btn-primary w-px-80" title="저장">
저장
</button>
</span>
</span>
</div> <!-- 업무 버튼 및 건수 표시 -->
</div> <!-- <div class="card"> -->
<!-- Page Body -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "crdnSttsCd"
, prefixName: "단속처리상태"
, keymapper: info => info ? info.CRDN_ID : ""
, dataGetter: obj => obj.${infoPrefix}Info
});
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
// Dataset 셋팅
$P.formFields.set($P.control, item);
// 업무구분에 따른 URL 변경
$P.fnSetURL(item.data.TASK_SE_CD);
}
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
dialog.alert({
content: showMessage
, init: function() {
setDialogZindex();
focusClose();
}
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
ajax.post({
url: $P.control.urls.update
, data: info || {}
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 업무구분에 따른 URL 설정
$P.fnSetURL = (taskSeCd) => {
$P.control.urls.update = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/030/update.do"); // 수정
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 저장 버튼 클릭 이벤트
$P.fnSave = (title) => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, init: function() { focusOK(); }
, onOK: () => {
$P.control.save($P.formFields.get()); // formFields
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장
}
// 초기 화면 설정
$P.initForm = () => {
//
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. Dataset 설정
$P.control.setData([${crdnSttsCdInfo}]);
});
</script>

@ -1,511 +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="pageKorName" scope="request">단속팀 관리</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 조회조건 -->
<div class="container-page-btn">
<button type="button" id="btnReset--${pageName}" class="btn btn-outline-dark w-px-120" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" id="btnSearch--${pageName}" class="btn btn-search w-px-120" title="검색">
검색
</button>
</span>
</div>
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-6">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${FIM054List}" var="item">
<c:if test="${item.code == 'PVS' or item.code == 'BPV'}">
<label>
<input name="taskSeCd" type="radio" value="${item.code}"
class="form-check-input" alt="업무구분"
onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:if>
</c:forEach>
</span>
</div>
</div>
</div>
</form>
<!-- 리스트 -->
<div>
<span class="container-page-btn">
<div class="d-flex flex-row justify-content-between">
<span id="useTeamPaging--${pageName}PagingInfo" class="dataTables_info"
role="status" aria-live="polite"></span>
<ul id="useTeamPaging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
</span>
</div>
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive_0--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-300">
<table id="DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr id="useTeamTheadTr--${pageName}">
<th style="width: 160px;">단속조</th>
<th style="width: 160px;">단속구분</th>
<th style="width: 160px;">단속원1</th>
<th style="width: 160px;">단속원2</th>
<th style="width: 160px;">단속원3</th>
<th style="width: 160px;">단속원4</th>
<th style="width: 400px;">특이사항</th>
<th style="width: 180px;">등록일시</th>
<th class="dummy-th"></th>
</tr>
</thead>
<tbody id="useTeamTbody--${pageName}"></tbody>
<template id="useTeamRow--${pageName}">
<tr data-key="{TEAM_ID}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{TEAM_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{CRDN_SE_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{TEAMER_1}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{TEAMER_2}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{TEAMER_3}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{TEAMER_4}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{ETC_CN}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{REG_DT}</td>
<td class="dummy-td"></td>
</tr>
</template>
<template id="useTeamNotFound--${pageName}">
<tr>
<td valign="top" colspan="9" class="dataTables_empty text-center">
단속팀 정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- 입력, 수정 -->
<div class="card">
<form id="frmEdit--${pageName}">
<div class="row g-1">
<div class="col-md-3">
<label for="teamNm--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end required">
단속조명
</label>
<input type="text" id="teamNm--${pageName}" name="teamNm" class="form-control"
data-maxlengthb="20" required />
</div>
<div class="col-md-9">
<label for="teamNm--${pageName}" class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
단속구분
</label>
<select id="crdnSeCd--${pageName}" name="crdnSeCd" class="form-select">
<option value=""></option>
<c:forEach items="${FIM002List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<div class="col-md-3">
<label for="teamer1--${pageName}" class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
단속원1
</label>
<input type="text" id="teamer1--${pageName}" name="teamer1" class="form-control"
data-maxlengthb="20" />
</div>
<div class="col-md-3">
<label for="teamer2--${pageName}" class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
단속원2
</label>
<input type="text" id="teamer2--${pageName}" name="teamer2" class="form-control"
data-maxlengthb="20" />
</div>
<div class="col-md-3">
<label for="teamer3--${pageName}" class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
단속원3
</label>
<input type="text" id="teamer3--${pageName}" name="teamer3" class="form-control"
data-maxlengthb="20" />
</div>
<div class="col-md-3">
<label for="teamer4--${pageName}" class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
단속원4
</label>
<input type="text" id="teamer4--${pageName}" name="teamer4" class="form-control"
data-maxlengthb="20" />
</div>
<div class="col-md-12">
<label for="etcCn--${pageName}" class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
특이사항
</label>
<input type="text" id="etcCn--${pageName}" name="etcCn"
class="form-control w-px-700" data-maxlengthb="1000" />
</div>
</div>
<div class="row mt-4 justify-content-end mb-3">
<div class="col-md-6">
<div class="row justify-content-end">
<div class="col-sm-3">
<button type="button" id="btnSave--${pageName}" class="btn btn-primary">저장</button>
<button type="button" id="btnRemove--${pageName}" class="btn btn-primary">삭제</button>
</div>
</div>
</div>
</div>
</form>
</div>
<!-- 비사용 리스트 -->
<div class="container-search">
<div class="row g-1">
<div class="col-6">
<label for="deletedTeamNm--${pageName}" class="form-label fw-bold form-search-title">
선택된 단속조
</label>
<span class="form-search-linebox">
<input type="text" id="deletedTeamNm--${pageName}" name="deletedTeamNm"
class="form-control" />
<button type="button" id="btnShowDeleted--${pageName}" class="btn btn-search">
비사용 단속조 조회
</button>
</span>
</div>
</div>
</div>
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive_1--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-300">
<table id="DataTables_Table_1--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr id="delTeamTheadTr--${pageName}">
<th style="width: 200px;">단속조</th>
<th style="width: 200px;">단속구분</th>
<th style="width: 200px;">단속원1</th>
<th style="width: 200px;">단속원2</th>
<th style="width: 200px;">단속원3</th>
<th style="width: 200px;">단속원4</th>
<th style="width: 200px;">특이사항</th>
<th style="width: 200px;">등록일</th>
<th style="width: 200px;">해체일</th>
<th class="dummy-th"></th>
</tr>
</thead>
<tbody id="delTeamTbody--${pageName}"></tbody>
<template id="delTeamRow--${pageName}">
<tr data-key="{TEAM_ID}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{TEAM_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{CRDN_SE_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{TEAMER_1}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{TEAMER_2}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{TEAMER_3}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{TEAMER_4}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{ETC_CN}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{REG_DT}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{MDFCN_DT}</td>
<td class="dummy-td"></td>
</tr>
</template>
<template id="delTeamNotFound--${pageName}">
<tr>
<td valign="top" colspan="10" class="dataTables_empty text-center">
조회된 정보가 없습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
var FIM071 = new CommonCodes(${FIM071});
var FIM002 = new CommonCodes(${FIM002});
$(document).ready(function(){
var $P = pageObject["${pageName}"];
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.useTeamControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData:false,
keymapper : info => info ? info.TEAM_ID : "",
urls : {
load : "",
remove : "",
save : ""
},
formats: {
OGDP_SE_CD : FIM071,
CRDN_SE_CD : FIM002,
REG_DT : datetimeFormat,
MDFCN_DT : datetimeFormat,
DEL_DT : datetimeFormat
}
});
$P.delTeamControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData: false,
keymapper : info => info ? info.TEAM_ID : "",
urls : { },
formats: {
OGDP_SE_CD : FIM071,
CRDN_SE_CD : FIM002,
REG_DT : datetimeFormat,
MDFCN_DT : datetimeFormat,
DEL_DT : datetimeFormat
}
});
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.useTeamControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate("useTeam");
var trs = Apply.fromDataset.getTbody($P.useTeamControl.dataset, t.found, t.notFound, t.replacer);
$P.renderUseTeamList(obj["Total"], $P.useTeamControl.dataset.length, trs);
Apply.fromDataset.paging($P.useTeamControl.dataset, obj, "useTeamPaging--${pageName}");
};
$P.delTeamControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate("delTeam");
var trs = Apply.fromDataset.getTbody($P.delTeamControl.dataset, t.found, t.notFound, t.replacer);
$P.renderDelTeamList(obj["Total"], $P.delTeamControl.dataset.length, trs);
};
$P.useTeamControl.dataset.onCurrentChange = (dataItem) => {
if(!dataItem){
$("#teamNm--${pageName}").val("");
$("#crdnSeCd--${pageName}").val("");
$("#teamer1--${pageName}").val("");
$("#teamer2--${pageName}").val("");
$("#teamer3--${pageName}").val("");
$("#teamer4--${pageName}").val("");
$("#etcCn--${pageName}").val("");
return;
}
Apply.fromDataset.currentRow($P.useTeamControl.dataset, dataItem, $("#useTeamTbody--${pageName}")[0]);
$("#teamNm--${pageName}").val(dataItem.data.TEAM_NM);
$("#crdnSeCd--${pageName}").val(dataItem.data.CRDN_SE_CD);
$("#teamer1--${pageName}").val(dataItem.data.TEAMER_1);
$("#teamer2--${pageName}").val(dataItem.data.TEAMER_2);
$("#teamer3--${pageName}").val(dataItem.data.TEAMER_3);
$("#teamer4--${pageName}").val(dataItem.data.TEAMER_4);
$("#etcCn--${pageName}").val(dataItem.data.ETC_CN);
$("#deletedTeamNm--${pageName}").val(dataItem.data.TEAM_NM);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnReset = () => {
var searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
$P.useTeamControl.dataset.setData([]);
var editForm = $("#frmEdit--${pageName}");
editForm.find("input[type='text']").val("");
editForm.find("input[type='hidden']").val("");
$P.delTeamControl.dataset.setData([]);
}
$P.fnResetAndChangeBiz = (taskSeCd) => {
$P.fnReset();
$P.useTeamControl.urls.load = wctx.url("/"+taskSeCd+"/crdn/crdn07/010/list.do");
$P.useTeamControl.urls.remove = wctx.url("/"+taskSeCd+"/crdn/crdn07/010/remove.do");
$P.useTeamControl.urls.save = wctx.url("/"+taskSeCd+"/crdn/crdn07/010/save.do");
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
return data;
}
$P.searchUseTeamList = () => {
$P.useTeamControl.query = $P.getParams();
$P.useTeamControl.load(1);
}
$P.refreshUseTeamList = () => {
if($P.useTeamControl.query.pageNum == null){
$P.useTeamControl.query.pageNum = 1;
}
$P.useTeamControl.load(1);
}
$P.getGridTemplate = (gridType) => {
var found;
var notFound;
var replacer;
if(gridType == "useTeam"){
notFound = [document.getElementById("useTeamNotFound--${pageName}").innerHTML];
found = document.getElementById("useTeamRow--${pageName}").innerHTML;
replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickUseTeamList('" + dataItem.getValue("TEAM_ID") + "');")
.replace(/{ondblclick}/gi, "");
} else {
notFound = [document.getElementById("delTeamNotFound--${pageName}").innerHTML];
found = document.getElementById("delTeamRow--${pageName}").innerHTML;
replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "")
.replace(/{ondblclick}/gi, "");
}
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
$P.renderUseTeamList = (total, listLength, trs) => {
$("#useTeamTbody--${pageName}").html(trs);
}
$P.renderDelTeamList = (total, listLength, trs) => {
$("#delTeamTbody--${pageName}").html(trs);
}
$P.clickUseTeamList = (dataKey) => {
$P.useTeamControl.dataset.setCurrent(dataKey);
}
$P.fnSave = () => {
var formFields = new FimsFormFields("#frmEdit--${pageName}");
var data = formFields.get();
data.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val();
ajax.get({
url : $P.useTeamControl.urls.save,
data : data,
success : (resp) => {
if(resp.saved){
$P.refreshUseTeamList();
}
}
});
}
$P.fnRemove = () => {
var dataKey = $P.useTeamControl.dataset.getCurrent()["TEAM_ID"];
ajax.get({
url : $P.useTeamControl.urls.remove,
data : {
"teamId" : dataKey
},
success : (resp) => {
if(resp.saved){
$P.refreshUseTeamList();
}
}
});
};
$P.fnShowDeleted = () => {
var teamNm = $("#deletedTeamNm--${pageName}").val();
var taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val();
ajax.get({
url : wctx.url("/" + taskSeCd + "/crdn/crdn07/010/removedTeamList.do"),
data: {
"teamNm" : teamNm,
"taskSeCd" : taskSeCd
},
success:(resp) => {
$P.delTeamControl.dataset.setData(resp);
}
});
}
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
$("#btnSearch--${pageName}").on("click", () => $P.searchUseTeamList());
$("#btnSave--${pageName}").on('click', () => { $P.fnSave(); });
$("#btnRemove--${pageName}").on('click', () => { $P.fnRemove(); });
$("#btnShowDeleted--${pageName}").on('click', () => { $P.fnShowDeleted(); });
fnMakeResizableTable($("#table-responsive_0--${pageName}")[0]);
fnMakeResizableTable($("#table-responsive_1--${pageName}")[0]);
/**************************************************************************
* 초기화
**************************************************************************/
var defaultBizValue = $("#layout-navbar input[name='taskSeCd']:checked").val();
if(defaultBizValue == "PVS" || defaultBizValue == "BPV"){
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + defaultBizValue + "']").prop("checked",true);
} else {
var taskForUser = MY_INFO.info.taskForUser;
var hasPVS = taskForUser.indexOf("PVS") != -1;
var hasBPV = taskForUser.indexOf("BPV") != -1;
if(hasPVS && !hasBPV){
$("#frmSearch--${pageName} input[name='taskSeCd'][value='PVS']").prop("checked",true);
} else if(!hasPVS && hasBPV){
$("#frmSearch--${pageName} input[name='taskSeCd'][value='BPV']").prop("checked",true);
} else {
$("#frmSearch--${pageName} input[name='taskSeCd']").eq(0).prop("checked",true);
}
}
$P.fnResetAndChangeBiz(defaultBizValue);
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
});
</script>

@ -1,447 +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="pageKorName" scope="request">면제차량 관리</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<div class="container-page-btn">
<button type="button" id="btnReset--${pageName}" class="btn btn-outline-dark w-px-120" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" id="btnSearch--${pageName}" class="btn btn-search w-px-120" title="검색">
검색
</button>
<button type="button" id="btnExcel--${pageName}" class="btn btn-excel w-px-120" title="엑셀 저장">
엑셀
</button>
</span>
</div>
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="vhrno--${pageName}">
차량번호
</label>
<input type="text" id="vhrno--${pageName}" name="vhrno" class="form-control" />
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="delYn--${pageName}">
삭제여부
</label>
<select id="delYn--${pageName}" name="denYn" class="form-select">
<option value="">전체</option>
<option value="N">사용</option>
<option value="Y">삭제</option>
</select>
</div>
</div>
</div>
</form>
<div>
<span class="container-page-btn">
<div class="d-flex flex-row justify-content-between">
<span id="exmptnVhclPaging--${pageName}PagingInfo" class="dataTables_info"
role="status" aria-live="polite"></span>
<ul id="exmptnVhclPaging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
<span class="container-window-btn-right">
<button type="button" id="btnCreate--${pageName}"
class="btn btn-primary" title="면제차량 등록">면제차량 등록</button>
<button type="button" id="btnOpenDelRsn--${pageName}"
class="btn btn-primary" title="면제차량 삭제">면제차량 삭제</button>
<button type="button" id="btnHistory--${pageName}"
class="btn btn-primary" title="면제차량 수정이력">면제차량 수정이력</button>
</span>
</span>
</div>
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-600">
<table id="DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr id="exmptnVhclTheadTr--${pageName}">
<th style="width: 80px;">No.</th>
<th style="width: 200px;">차량번호</th>
<th style="width: 200px;">사유</th>
<th style="width: 200px;">공문번호</th>
<th style="width: 200px;">소유주명</th>
<th style="width: 200px;">면제시작일</th>
<th style="width: 200px;">면제종료일</th>
<th style="width: 200px;">입력자</th>
<th style="width: 200px;">입력일시</th>
<th style="width: 200px;">수정자</th>
<th style="width: 200px;">수정일시</th>
<th style="width: 200px;">삭제자</th>
<th style="width: 200px;">삭제사유</th>
<th style="width: 200px;">삭제일시</th>
<th class="dummy-th"></th>
</tr>
</thead>
<tbody id="exmptnVhclTbody--${pageName}"></tbody>
<template id="exmptnVhclRow--${pageName}">
<tr data-key="{EXMPTN_VHCL_ID}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{ROW_NUM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{VHRNO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{EXMPTN_RSN}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{DOC_NO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{OWNR_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{EXMPTN_BGNG_YMD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{EXMPTN_END_YMD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{RGTR_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{REG_DT}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{MDFR_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{MDFCN_DT}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{DLTR_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{DEL_RSN}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{DEL_DT}</td>
<td class="dummy-td"></td>
</tr>
</template>
<template id="exmptnVhclNotFound--${pageName}">
<tr>
<td valign="top" colspan="15" class="dataTables_empty text-center">
면제차량 정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<template id="delRsnDialogTemplate--${pageName}">
<form id="frmEdit--${pageName}">
<div class="card">
<div class="row g-1">
<div class="col-md-12">
<label for="delRsn--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">삭제사유</label>
<input type="text" id="delRsn--${pageName}" name="delRsn"
class="form-control w-80" type="text" maxlength="1000" data-maxlengthb="1000" />
</div>
</div>
</div>
<div>
<span class="container-page-btn">
<span class="container-window-btn-right">
<button type="button" id="btnRemove--${pageName}" class="btn btn-primary" title="확인">확인</button>
</span>
</span>
</div>
</form>
</template>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.exmptnVhclControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData:true,
keymapper : info => info ? info.EXMPTN_VHCL_ID : "",
urls : {
load : wctx.url("/BPV/crdn/crdn08/010/list.do"),
remove : wctx.url("/BPV/crdn/crdn08/010/remove.do"),
newInfo : wctx.url("/BPV/crdn/crdn08/020/info.do"),
getInfo : wctx.url("/BPV/crdn/crdn08/020/info.do")
},
formats: {
EXMPTN_BGNG_YMD : dateFormat,
EXMPTN_END_YMD : dateFormat,
REG_DT : datetimeFormat,
MDFCN_DT : datetimeFormat,
DEL_DT : datetimeFormat
}
});
$P.exmptnVhclControl.defaultFetchSize = FETCH_XS;
$P.exmptnVhclControl.query = { pageNum : 1, fetchSize : $P.exmptnVhclControl.defaultFetchSize };
$P.exmptnVhclControl.beforeCurrent = null;
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.exmptnVhclControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate();
var trs = Apply.fromDataset.getTbody($P.exmptnVhclControl.dataset, t.found, t.notFound, t.replacer);
$P.renderExmptnVhclList(obj["Total"], $P.exmptnVhclControl.dataset.length, trs, option);
Apply.fromDataset.paging($P.exmptnVhclControl.dataset, obj, "exmptnVhclPaging--${pageName}");
};
$P.exmptnVhclControl.dataset.onCurrentChange = (dataItem) => {
Apply.fromDataset.currentRow($P.exmptnVhclControl.dataset, dataItem, $("#exmptnVhclTbody--${pageName}")[0]);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnReset = () => {
var searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
$P.exmptnVhclControl.dataset.setData([]);
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
data.taskSeCd = "BPV";
data.fetchSize = $P.exmptnVhclControl.defaultFetchSize;
return data;
}
$P.searchExmptnVhclList = () => {
$P.exmptnVhclControl.query = $P.getParams();
$P.exmptnVhclControl.load(1);
}
$P.scrollExmptnVhclList = () => {
$P.exmptnVhclControl.load($P.exmptnVhclControl.query.pageNum + 1);
}
$P.refreshExmptnVhclList = () => {
if($P.exmptnVhclControl.query.pageNum == null){
$P.exmptnVhclControl.query.pageNum = 1;
}
$P.exmptnVhclControl.reload({all : true});
}
$P.fnExcelDown = () => {
if($P.exmptnVhclControl.dataset.empty){
alert("조회된 자료가 없습니다.");
return;
}
var cellDefs = getCellDefs($("#exmptnVhclTheadTr--${pageName} th").not(".dummy-th").not(":eq(0)"),
$($("#exmptnVhclRow--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)"));
$P.exmptnVhclControl.query.cellDefs = cellDefs;
$P.exmptnVhclControl.download();
}
$P.getGridTemplate = () => {
var notFound = [document.getElementById("exmptnVhclNotFound--${pageName}").innerHTML];
var found = document.getElementById("exmptnVhclRow--${pageName}").innerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickExmptnVhclList('" + dataItem.getValue("EXMPTN_VHCL_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].dblclickExmptnVhclList('" + dataItem.getValue("EXMPTN_VHCL_ID") + "');");
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
$P.renderExmptnVhclList = (total, listLength, trs, option) => {
let noMore = (listLength >= total);
var initScroll = ($P.exmptnVhclControl.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs, initScroll, noMore);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
$P.clickExmptnVhclList = (dataKey) => {
if(dataKey == ""){
$("#btnOpenDelRsn--${pageName}").prop("disabled", true);
$("#btnHistory--${pageName}").prop("disabled", true);
return;
}
if($P.exmptnVhclControl.dataset.getData(dataKey)["DEL_YN"] == "N"){
$("#btnOpenDelRsn--${pageName}").prop("disabled", false);
} else {
$("#btnOpenDelRsn--${pageName}").prop("disabled", true);
}
$("#btnHistory--${pageName}").prop("disabled", false);
$("#exmptnVhclTbody--${pageName}").setCurrentRow(dataKey);
Apply.toDataset.current($P.exmptnVhclControl.dataset, dataKey);
}
$P.dblclickExmptnVhclList = (dataKey) => {
if(dataKey == ""){
return;
}
var data = $P.exmptnVhclControl.dataset.getData(dataKey);
if(data.DEL_YN == "Y"){
dialog.alert({
content : "삭제된 자료입니다.",
init : function() {
focusClose();
}
});
return;
}
$P.getInfo({"exmptnVhclId" : dataKey});
}
$P.getInfo = (param) => {
ajax.get({
url : $P.exmptnVhclControl.urls.getInfo,
data: param,
success:(resp) => {
dialog.open({
id: "exmptnvhclDialog",
title: "면제차량 수정",
content:resp,
size: "lg",
init:() => {
var parentRes = new Object();
var childReq = pageObject.childReq.pop();
for(var reqKey in childReq) {
if($P.provide[reqKey]){
parentRes[reqKey] = $P.provide[reqKey];
} else {
parentRes[reqKey] = function(){};
}
}
pageObject.parentRes.push(parentRes);
}
});
}
});
};
$P.newInfo = () => {
ajax.get({
url : $P.exmptnVhclControl.urls.newInfo,
data: {},
success:(resp) => {
dialog.open({
id: "exmptnvhclDialog",
title: "면제차량 등록",
content:resp,
size: "lg",
init:() => {
var parentRes = new Object();
var childReq = pageObject.childReq.pop();
for(var reqKey in childReq) {
if($P.provide[reqKey]){
parentRes[reqKey] = $P.provide[reqKey];
} else {
parentRes[reqKey] = function(){};
}
}
pageObject.parentRes.push(parentRes);
}
});
}
});
};
$P.fnOpenDelRsnDialog = () => {
dialog.open({
id : "delRsnDialog--${pageName}",
title : "삭제사유입력다이얼로그",
content : document.getElementById("delRsnDialogTemplate--${pageName}").innerHTML,
size : "xl",
init : () => {
$("#delRsnDialog--${pageName} .modal-content").addClass("min-w-px-700");
$('#btnRemove--${pageName}').on("click", () => $P.fnRemove());
},
onClose : () => {}
});
}
$P.fnRemove = () => {
var dataKey = $P.exmptnVhclControl.dataset.getCurrent()["EXMPTN_VHCL_ID"];
ajax.get({
url : $P.exmptnVhclControl.urls.remove,
data : {
"exmptnVhclId" : dataKey,
"delRsn" : $("#delRsn--${pageName}").val()
},
success : (resp) => {
if(resp.saved){
dialog.close("delRsnDialog--${pageName}");
$P.refreshExmptnVhclList();
}
}
});
};
$P.fnOpenHistory = () => {
var dataKey = $P.exmptnVhclControl.dataset.getCurrent()["EXMPTN_VHCL_ID"];
ajax.get({
url : wctx.url("/BPV/crdn/crdn08/030/list.do"),
data: { "exmptnVhclId" : dataKey },
success:(resp) => {
dialog.open({
id: "exmptnvhclHistoryDialog",
title: "면제차량 이력",
content : resp,
size: "xxl",
init:() => {
}
});
}
});
}
$P.provide = {
"refreshList" : function(){
$P.refreshExmptnVhclList();
}
}
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
$("#btnSearch--${pageName}").on("click", () => $P.searchExmptnVhclList());
$('#btnExcel--${pageName}').on('click', () => $P.fnExcelDown());
$("#btnCreate--${pageName}").on('click', () => { $P.newInfo(); });
$("#btnOpenDelRsn--${pageName}").on('click', () => { $P.fnOpenDelRsnDialog(); });
$("#btnHistory--${pageName}").on('click', () => { $P.fnOpenHistory(); });
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollExmptnVhclList);
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
/**************************************************************************
* 초기화
**************************************************************************/
initDatepicker("frmSearch--${pageName}"); //달력 초기화
$P.fnReset();
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</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"%>
<c:set var="pageKorName" scope="request">면제차량 상세 조회</c:set>
<div class="card">
<form id="frmEdit--${pageName}">
<input type="hidden" id="exmptnVhclId--${pageName}" name="exmptnVhclId" data-map="EXMPTN_VHCL_ID" />
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<div class="row g-1">
<div class="col-md-12">
<label for="vhrno--${pageName}" class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end required">
차량번호
</label>
<input type="text" id="vhrno--${pageName}" name="vhrno" data-map="VHRNO" class="form-control"
data-maxlengthb="30" required />
</div>
<div class="col-md-12">
<label class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
면제기간
</label>
<input type="text" id="exmptnBgngYmd--${pageName}" name="exmptnBgngYmd" data-map="EXMPTN_BGNG_YMD"
class="form-control form-date" data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" id="exmptnEndYmd--${pageName}" name="exmptnEndYmd" data-map="EXMPTN_END_YMD"
class="form-control form-date" data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<div class="col-md-12">
<label for="exmptnRsn--${pageName}" class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
면제 사유
</label>
<input type="text" id="exmptnRsn--${pageName}" name="exmptnRsn" data-map="EXMPTN_RSN"
class="form-control w-px-300" data-maxlengthb="1000" />
</div>
<div class="col-md-12">
<label for="docNo--${pageName}" class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
공문번호
</label>
<input type="text" id="docNo--${pageName}" name="docNo" data-map="DOC_NO"
class="form-control w-px-300" data-maxlengthb="100" />
</div>
<div class="col-md-12">
<label for="ownrNm--${pageName}" class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end">
소유주명
</label>
<input type="text" id="ownrNm--${pageName}" name="ownrNm" data-map="OWNR_NM"
class="form-control w-px-300" data-maxlengthb="200" />
</div>
</div>
<div class="row mt-4 justify-content-end mb-3">
<div class="col-md-6">
<div class="row justify-content-end">
<div class="col-sm-3">
<button type="button" id="btnSave--${pageName}" class="btn btn-primary">저장</button>
</div>
</div>
</div>
</div>
</form>
</div>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
pageObject["${pageName}"].provided = {};
pageObject.childReq = [];
pageObject.childReq.push({
refreshList : function(){}
});
$(document).ready(function(){
var $P = pageObject["${pageName}"];
if(pageObject.parentRes.length > 0){
$P.provided = pageObject.parentRes.pop();
} else {
$P.provided = pageObject.childReq.pop();
}
/**************************************************************************
* DatasetControl, Dataset, FormFields
**************************************************************************/
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
$P.exmptnVhclControl = new DatasetControl({
dataGetter : obj => obj.exmptnVhclInfo,
keymapper : info => info ? info.EXMPTN_VHCL_ID : "",
urls : {
create : wctx.url("/BPV/crdn/crdn08/020/create.do"),
update : wctx.url("/BPV/crdn/crdn08/020/update.do")
},
formats : {
}
});
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.setInfo = (item) => {
$P.formFields.set($P.exmptnVhclControl, item);
var create = isEmpty(item.EXMPTN_VHCL_ID);
$("#vhrno--${pageName}").prop("readonly", !create);
}
$P.fnSave = async() => {
if(!customValidate($("#frmEdit--${pageName} input"))) return;
if(await confirm2("면제 차량 정보를 저장하시겠습니까?")){
var info = $P.formFields.get();
if (!info) {
return;
}
var create = isEmpty(info.exmptnVhclId);
ajax.post({
url : !create ? $P.exmptnVhclControl.urls.update : $P.exmptnVhclControl.urls.create,
data : info,
success : (resp) => {
$P.saveCallback(resp);
}
});
}
};
$P.saveCallback = (resp) => {
if (resp.saved) {
dialog.alert({
content : "저장됐습니다.",
init : function() {
setDialogZindex();
focusClose();
}
});
dialog.close("exmptnvhclDialog");
$P.provided.refreshList();
}
};
/**************************************************************************
* element.on
**************************************************************************/
$("#btnSave--${pageName}").on('click', () => $P.fnSave());
/**************************************************************************
* 초기화
**************************************************************************/
initDatepicker("frmEdit--${pageName}"); //달력 초기화
$("#frmEdit--${pageName}").find(".form-date").each(function(){
$(this).on("input",function(){
var value = this.value.replaceAll("-","");
if(value.length > 7){
this.value = value.substring(0,4)+"-"+value.substring(4,6)+"-"+value.substring(6);
} else if(value.length > 5){
this.value = value.substring(0,4)+"-"+value.substring(4);
}
});
});
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
var exmptnVhclInfo = ${exmptnVhclInfo};
$P.setInfo(exmptnVhclInfo);
});
</script>

@ -1,129 +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="pageKorName" scope="request">면제차량 이력</c:set>
<div class="card">
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-550">
<table id="DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr id="exmptnVhclTheadTr--${pageName}">
<th style="width: 80px;">No.</th>
<th style="width: 140px;">차량번호</th>
<th style="width: 300px;">면제사유</th>
<th style="width: 200px;">공문번호</th>
<th style="width: 160px;">소유주명</th>
<th style="width: 160px;">면제시작일</th>
<th style="width: 160px;">면제종료일</th>
<th style="width: 100px;">삭제 여부</th>
<th style="width: 200px;">삭제사유</th>
<th style="width: 160px;">입력자</th>
<th style="width: 200px;">입력일시</th>
<th style="width: 160px;">수정자</th>
<th style="width: 200px;">수정일시</th>
<th style="width: 160px;">삭제자</th>
<th style="width: 200px;">삭제일시</th>
<th class="dummy-th"></th>
</tr>
</thead>
<tbody id="exmptnVhclTbody--${pageName}"></tbody>
<template id="exmptnVhclRow--${pageName}">
<tr data-key="{HSTRY_SN}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{HSTRY_SN}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{VHRNO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{EXMPTN_RSN}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{DOC_NO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{OWNR_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{EXMPTN_BGNG_YMD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{EXMPTN_END_YMD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{DEL_YN}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{DEL_RSN}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{RGTR_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{REG_DT}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{MDFR_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{MDFCN_DT}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{DLTR_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{DEL_DT}</td>
<td class="dummy-td"></td>
</tr>
</template>
<template id="exmptnVhclNotFound--${pageName}">
<tr>
<td valign="top" colspan="15" class="dataTables_empty text-center">
면제차량 이력 정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
</div>
<script>
pageObject["${pageName}"] = {};
var NTR034 = new CommonCodes(${NTR034});
$(document).ready(function(){
var list = ${list};
var $P = pageObject["${pageName}"];
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.exmptnVhclControl = new DatasetControl({
dataGetter : obj => obj, appendData:false,
keymapper : info => info ? info.HSTRY_SN : "",
urls : { },
formats: {
EXMPTN_BGNG_YMD : dateFormat,
EXMPTN_END_YMD : dateFormat,
REG_DT : datetimeFormat,
MDFCN_DT : datetimeFormat,
DEL_DT : datetimeFormat,
DEL_YN : NTR034
}
});
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.exmptnVhclControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate();
var trs = Apply.fromDataset.getTbody($P.exmptnVhclControl.dataset, t.found, t.notFound, t.replacer);
$P.renderExmptnVhclList(obj["Total"], $P.exmptnVhclControl.dataset.length, trs);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.getGridTemplate = () => {
var notFound = [document.getElementById("exmptnVhclNotFound--${pageName}").innerHTML];
var found = document.getElementById("exmptnVhclRow--${pageName}").innerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "")
.replace(/{ondblclick}/gi, "");
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
$P.renderExmptnVhclList = (total, listLength, trs) => {
$("#exmptnVhclTbody--${pageName}").html(trs);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
$P.exmptnVhclControl.dataset.setData(list);
});
</script>

@ -1,713 +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="pageKorName" scope="request">민원접수자료</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<div class="container-page-btn">
<button type="button" id="btnReset--${pageName}" class="btn btn-outline-dark w-px-120" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" id="btnSearch--${pageName}" class="btn btn-search w-px-120" title="검색">
검색
</button>
<button type="button" id="btnExcel--${pageName}" class="btn btn-excel w-px-120" title="엑셀 저장">
엑셀
</button>
</span>
</div>
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${TaskListForSgg}" var="item">
<label>
<input name="taskSeCd" type="radio" value="${item.code}"
class="form-check-input" alt="업무구분"
onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCvlcptRcptYmdFrom--${pageName}">접수일자</label>
<span class="form-search-linebox">
<input type="text" id="schCvlcptRcptYmdFrom--${pageName}" name="schCvlcptRcptYmdFrom"
class="form-control form-date"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" id="schCvlcptRcptYmdTo--${pageName}" name="schCvlcptRcptYmdTo"
class="form-control form-date"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<div class="col-6">
<button type="button" class="w-px-120" onclick="$('#cvlcptPrcsPicNm--${pageName}').val('${currentUserName}');">
담당자명 지정
</button>
<input type="text" id="cvlcptPrcsPicNm--${pageName}" name="cvlcptPrcsPicNm"
class="form-control" />
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCvlcptPrcsPrnmntDtFrom--${pageName}">처리기한</label>
<span class="form-search-linebox">
<input type="text" id="schCvlcptPrcsPrnmntDtFrom--${pageName}" name="schCvlcptPrcsPrnmntDtFrom"
class="form-control form-date"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" id="schCvlcptPrcsPrnmntDtTo--${pageName}" name="schCvlcptPrcsPrnmntDtTo"
class="form-control form-date"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div>
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row">
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
</div>
</div>
</form>
<div>
<span class="container-page-btn">
<div class="d-flex flex-row justify-content-between">
<span id="crdnPaging--${pageName}PagingInfo" class="dataTables_info"
role="status" aria-live="polite"></span>
<ul id="crdnPaging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
<span class="container-window-btn-right">
<button type="button" id="btnOpenCvlcptOrgnl--${pageName}" class="btn btn-primary"
title="민원원본보기">
민원원본보기
</button>
<button type="button" id="btnHold--${pageName}" class="btn btn-primary" title="처리 잠시 보류">
처리 잠시 보류
</button>
</span>
</span>
</div>
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-500">
<table id="DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead id="crdnThead--${pageName}" class="sticky-thead">
<tr data-by="by--${pageName}" data-by-output="byOutput--${pageName}"
data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th style="width: 80px;">No.</th>
<th onclick="searchFromGridTitle('CVLCPT_RCPT_NO',this.innerText,'match','part');"
style="width: 180px;">접수번호</th>
<th onclick="searchFromGridTitle('CVLCPT_LIST_NO',this.innerText,'match','part');"
style="width: 100px;">목록번호</th>
<th onclick="searchFromGridTitle('CRDN_REG_SE_CD',this.innerText,'codeValue','FIM026');"
style="width: 100px;">등록구분</th>
<th onclick="searchFromGridTitle('CVLCPT_APLCNT_NM',this.innerText,'match','part');"
style="width: 140px;">신고자</th>
<th onclick="searchFromGridTitle('CVLCPT_PRCS_PIC_NM',this.innerText,'match','part');"
style="width: 140px;">담당자</th>
<th onclick="searchFromGridTitle('CVLCPT_PRCS_PIC_TELNO',this.innerText,'match','part');"
style="width: 160px;">담당자전화번호</th>
<th onclick="searchFromGridTitle('CVLCPT_RCPT_YMD',this.innerText,'ymd');"
style="width: 120px;">접수일자</th>
<th onclick="searchFromGridTitle('CVLCPT_PRCS_PRNMNT_DT',this.innerText,'ymd');"
style="width: 180px;">처리기한</th>
<th onclick="searchFromGridTitle('CRDN_YMD','위반일자','ymd');"
style="width: 180px;">위반일시</th>
<th onclick="searchFromGridTitle('VLTN_ARTCL',this.innerText);"
style="width: 100px;">위반내용</th>
<th onclick="searchFromGridTitle('VHRNO',this.innerText,'match','part');"
style="width: 140px;">차량번호</th>
<th onclick="searchFromGridTitle('ATCH_FILE_CNT',this.innerText,'match','perfect');"
style="width: 100px;">사진건수</th>
<th class="dummy-th"></th>
</tr>
</thead>
<tbody id="crdnTbody--${pageName}"></tbody>
<template id="crdnRow--${pageName}">
<tr data-key="{CRDN_ID}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{ROW_NUM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_RCPT_NO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_LIST_NO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_REG_SE_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_APLCNT_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_PRCS_PIC_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_PRCS_PIC_TELNO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_RCPT_YMD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_PRCS_PRNMNT_DT}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_YMD_TM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{VLTN_ARTCL}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{VHRNO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{ATCH_FILE_CNT}</td>
<td class="dummy-td"></td>
</tr>
</template>
<template id="crdnNotFound--${pageName}">
<tr>
<td valign="top" colspan="14" class="dataTables_empty text-center">
민원 정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<div class="mt-2">
단속장소 <input id="bottomCrdnPlc--${pageName}" type="text" class="form-control" size="100" readonly />
<button type="button" id="btnDelete--${pageName}" class="btn btn-primary" title="선택자료 삭제">
선택자료 삭제
</button>
<button type="button" id="btnDeleteSameRcptYmd--${pageName}" class="btn btn-primary" title="접수일 전체 삭제">
접수일 전체 삭제
</button>
</div>
<div class="toast-container position-fixed bottom-0 end-0 p-3">
<div id="divToast--${pageName}" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
<div class="toast-body bg-black text-white">
삭제 되었습니다.
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
var FIM026 = new CommonCodes(${FIM026});
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
$P.holdList = [];
$P.toast = new bootstrap.Toast(document.getElementById('divToast--${pageName}'), {
animation: true,
autohide: true,
delay: 2000
});
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.crdnControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData:true,
keymapper : info => info ? info.CRDN_ID : "",
urls : {
load : "",
getInfo : "",
remove : ""
},
formats : {
CRDN_REG_SE_CD : FIM026,
CVLCPT_RCPT_YMD : dateFormat,
CVLCPT_PRCS_PRNMNT_DT : datetimeFormat,
CRDN_YMD_TM : datetimeFormat
}
});
$P.crdnControl.defaultFetchSize = FETCH_XS;
$P.crdnControl.query = { pageNum : 1, fetchSize : $P.crdnControl.defaultFetchSize };
$P.crdnControl.beforeCurrent = null;
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.crdnControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate();
var trs = Apply.fromDataset.getTbody($P.crdnControl.dataset, t.found, t.notFound, t.replacer);
$P.renderCrdnList(obj["Total"], $P.crdnControl.dataset.length, trs, option);
Apply.fromDataset.paging($P.crdnControl.dataset, obj, "crdnPaging--${pageName}");
};
$P.crdnControl.dataset.onCurrentChange = (dataItem) => {
Apply.fromDataset.currentRow($P.crdnControl.dataset, dataItem, $("#crdnTbody--${pageName}")[0]);
if(!dataItem){
$("#bottomCrdnPlc--${pageName}").val("");
$("#btnOpenCvlcptOrgnl--${pageName}").hide();
$("#btnDelete--${pageName}").hide();
$("#btnDeleteSameRcptYmd--${pageName}").hide();
} else {
$("#bottomCrdnPlc--${pageName}").val(dataItem.data["CRDN_PLC"]);
if($P.holdList.includes(dataItem.data["CRDN_ID"])){
$("#btnOpenCvlcptOrgnl--${pageName}").hide();
$("#btnDelete--${pageName}").hide();
$("#btnDeleteSameRcptYmd--${pageName}").hide();
} else {
$("#btnOpenCvlcptOrgnl--${pageName}").show();
$("#btnDelete--${pageName}").show();
$("#btnDeleteSameRcptYmd--${pageName}").show();
}
}
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnReset = () => {
$P.holdList = [];
$("#btnOpenCvlcptOrgnl--${pageName}").show();
$("#btnDelete--${pageName}").show();
$("#btnDeleteSameRcptYmd--${pageName}").show();
var searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function(){ $(this).find("option:eq(0)").prop("selected", true); });
$("#byOutput--${pageName}").val("동적 검색");
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
$('#schCvlcptRcptYmdFrom--${pageName}').datepicker('setDate', DateUtil.getDateDay(-5475).date);
$('#schCvlcptRcptYmdTo--${pageName}').datepicker('setDate', TODAY());
$P.crdnControl.dataset.setData([]);
}
$P.fnResetAndChangeBiz = (taskSeCd) => {
$P.fnReset();
$P.crdnControl.urls.load = wctx.url("/"+taskSeCd+"/cvlc/cvlc01/010/list.do");
$P.crdnControl.urls.getInfo = wctx.url("/"+taskSeCd+"/cvlc/cvlc01/020/info.do");
$P.crdnControl.urls.remove = wctx.url("/"+taskSeCd+"/cvlc/cvlc01/010/remove.do");
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
data.fetchSize = $P.crdnControl.defaultFetchSize;
return data;
}
$P.searchCrdnList = () => {
$P.holdList = [];
$("#btnDelete--${pageName}").show();
$("#btnDeleteSameRcptYmd--${pageName}").show();
$P.crdnControl.query = $P.getParams();
$P.crdnControl.load(1);
}
$P.scrollCrdnList = () => {
$P.crdnControl.load($P.crdnControl.query.pageNum + 1);
}
$P.refreshCrdnList = () => {
$P.crdnControl.beforeCurrent = {
key : $P.crdnControl.dataset.getCurrent()["CRDN_ID"],
index : $P.crdnControl.dataset.getCurrent()["ROW_NUM"] - 1
};
Apply.fromDatasetControl.reload($P.crdnControl).then((resp)=>{
Apply.toDataset.set($P.crdnControl.dataset, resp);
$P.crdnControl.dataset.onDatasetChange(resp, {reloaded : true});
if($P.crdnControl.beforeCurrent != null){
var beforeCurrentKey = $P.crdnControl.beforeCurrent.key;
var beforeCurrentIndex = $P.crdnControl.beforeCurrent.index;
$P.crdnControl.beforeCurrent = null;
if(!$P.crdnControl.dataset.empty){
var info = $P.crdnControl.dataset.getData(beforeCurrentKey);
if(info != null){
$P.crdnControl.dataset.setCurrent(beforeCurrentKey,true);
} else {
if(beforeCurrentIndex > ($P.crdnControl.dataset.length - 1)){
info = $P.crdnControl.dataset.getDataset()[$P.crdnControl.dataset.length - 1];
} else {
info = $P.crdnControl.dataset.getDataset()[beforeCurrentIndex];
}
$P.crdnControl.dataset.setCurrent(info["CRDN_ID"],true);
}
}
}
$("label[for='table-responsive--${pageName}']").trigger("refreshEnd");
});
}
$P.fnExcelDown = () => {
if($P.crdnControl.dataset.empty){
alert("조회된 자료가 없습니다.");
return;
}
var cellDefs = getCellDefs($("#crdnThead--${pageName} th").not(".dummy-th").not(":eq(0)"),
$($("#crdnRow--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)"));
$P.crdnControl.query.cellDefs = cellDefs;
$P.crdnControl.download();
}
$P.getGridTemplate = () => {
var notFound = [document.getElementById("crdnNotFound--${pageName}").innerHTML];
var found = document.getElementById("crdnRow--${pageName}").innerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickCrdnList('" + dataItem.getValue("CRDN_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].dblclickCrdnList('" + dataItem.getValue("CRDN_ID") + "');");
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
$P.renderCrdnList = (total, listLength, trs, option) => {
let noMore = (listLength >= total);
var initScroll = ($P.crdnControl.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs, initScroll, noMore);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
$P.holdList.forEach(function(item){
$("#crdnTbody--${pageName}").find("tr[data-key='"+item+"']").addClass("bg-dark");
});
}
$P.clickCrdnList = (dataKey) => {
if(dataKey == ""){
$("#bottomCrdnPlc--${pageName}").val("");
return;
}
$("#crdnTbody--${pageName}").setCurrentRow(dataKey);
$("#bottomCrdnPlc--${pageName}").val($P.crdnControl.dataset.getData(dataKey)["CRDN_PLC"]);
if($P.holdList.includes(dataKey)){
$("#btnOpenCvlcptOrgnl--${pageName}").hide();
$("#btnDelete--${pageName}").hide();
$("#btnDeleteSameRcptYmd--${pageName}").hide();
} else {
$("#btnOpenCvlcptOrgnl--${pageName}").show();
$("#btnDelete--${pageName}").show();
$("#btnDeleteSameRcptYmd--${pageName}").show();
}
Apply.toDataset.current($P.crdnControl.dataset, dataKey);
}
$P.dblclickCrdnList = (dataKey) => {
if($P.holdList.includes(dataKey)){
return;
}
var dialogId = "cvlcptInitialDataEditDialog--${pageName}";
ajax.get({
url : $P.crdnControl.urls.getInfo,
data : {
"crdnId" : dataKey,
"openerPageName" : "${pageName}"
},
success : (resp) => {
dialog.open({
id : dialogId,
title : "민원접수 초기자료 편집",
content : resp,
size : "xxl",
init : () => {
var parentRes = new Object();
var childReq = pageObject.childReq.pop();
for(var reqKey in childReq) {
if($P.provide[reqKey]){
parentRes[reqKey] = $P.provide[reqKey];
} else {
parentRes[reqKey] = function(){};
}
}
pageObject.parentRes.push(parentRes);
$("#"+dialogId).find("label[class='parentGrid']").attr("for","table-responsive--${pageName}");
}
});
}
});
}
$P.fnHold = () => {
var curKey = $P.crdnControl.dataset.getCurrent()["CRDN_ID"];
if($P.holdList.includes(curKey)){
return;
}
$P.holdList.push(curKey);
$("#crdnTbody--${pageName}").find("tr[data-key='"+curKey+"']").addClass("bg-dark");
$("#btnOpenCvlcptOrgnl--${pageName}").hide();
$("#btnDelete--${pageName}").hide();
$("#btnDeleteSameRcptYmd--${pageName}").hide();
}
$P.fnRemove = (rcptYmd) => {
if(rcptYmd != null){
var ds = $P.crdnControl.dataset.getDataset();
var crdnIds = [];
var filtered = ds.filter(function(item){
if(item['CVLCPT_RCPT_YMD'] == rcptYmd && !$P.holdList.includes(item['CRDN_ID'])){
return true;
} else {
return false;
}
});
for(var i=0; i < filtered.length; i++){
crdnIds.push(filtered[i].CRDN_ID);
}
$P.crdnControl.dataset.select(crdnIds,true);
} else {
var cur = $P.crdnControl.dataset.getCurrent();
if(cur == null){
return;
}
var curKey = cur["CRDN_ID"];
$P.crdnControl.dataset.select(curKey,true);
}
var selected = $P.crdnControl.dataset.getKeys("selected");
if (selected.length < 1) {
return;
}
var params = {
"crdnIds" : selected.join(",")
};
ajax.post({
url : $P.crdnControl.urls.remove,
data : params,
success : (resp) => {
$P.removeCallback(resp);
}
});
}
$P.removeCallback = (resp) => {
if (resp.saved){
$P.toast.show();
sleep(1000).then(() => $P.refreshCrdnList());
}
};
$P.fnRemoveSameRcptYmd = () => {
var cur = $P.crdnControl.dataset.getCurrent();
if(cur == null){
return;
}
var curRcptYmd = cur["CVLCPT_RCPT_YMD"];
dialog.alert({
content : "접수일 : "+dateFormat.format(curRcptYmd)+"<br/>모든 자료를 제거하시겠습니까?",
init : function() {
focusOK();
},
onOK : () => {
$P.fnRemove(curRcptYmd);
}
});
}
$P.fnOpenCvlcptOrgnl = () => {
var cur = $P.crdnControl.dataset.getCurrent();
if(cur == null){
return;
}
var taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val();
var dialogId = "cvlcptOrgnlDialog--${pageName}";
ajax.get({
url : wctx.url("/"+taskSeCd+"/cvlc/cvlc01/050/info.do"),
data : { crdnId : cur["CRDN_ID"] },
success : (resp) => {
dialog.open({
id : dialogId,
title : "민원내역 원본",
content : resp,
size : "xl",
init : () => {
var parentRes = new Object();
var childReq = pageObject.childReq.pop();
for(var reqKey in childReq) {
if($P.provide[reqKey]){
parentRes[reqKey] = $P.provide[reqKey];
} else {
parentRes[reqKey] = function(){};
}
}
pageObject.parentRes.push(parentRes);
}
});
}
});
}
$P.provide = {
"getCountStatus" : function(currentKey){
var ds = $P.crdnControl.dataset.getDataset();
var index = ds.findIndex(item => item.CRDN_ID == currentKey);
return (index+1) + " of " + ds.length;
},
"getNextKey" : function(currentKey){
var ds = $P.crdnControl.dataset.getDataset();
var index = ds.findIndex(item => item.CRDN_ID == currentKey);
if(ds.length > index+1){
if($P.holdList.includes(ds[index+1]["CRDN_ID"])){
return $P.provide.getNextKey(ds[index+1]["CRDN_ID"]);
} else {
return ds[index+1]["CRDN_ID"];
}
} else {
return "";
}
},
"getPrevKey" : function(currentKey){
var ds = $P.crdnControl.dataset.getDataset();
var index = ds.findIndex(item => item.CRDN_ID == currentKey);
if(index != 0 && ds.length > 1){
if($P.holdList.includes(ds[index-1]["CRDN_ID"])){
return $P.provide.getPrevKey(ds[index-1]["CRDN_ID"]);
} else {
return ds[index-1]["CRDN_ID"];
}
} else {
return "";
}
},
"selectRow" : function(currentKey){
$P.clickCrdnList(currentKey);
},
"holdRow" : function(currentKey){
$P.fnHold(currentKey);
},
"refreshList" : function(){
$P.refreshCrdnList();
},
"hasData" : function(key){
if($P.crdnControl.dataset.getData(key) == null){
return false;
} else {
return true;
}
},
};
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
$('#btnSearch--${pageName}').on('click', () => $P.searchCrdnList());
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress($P.searchCrdnList);
$('#btnExcel--${pageName}').on('click', () => $P.fnExcelDown());
$("#btnHold--${pageName}").on("click", () => $P.fnHold());
$("#btnDelete--${pageName}").on("click", () => $P.fnRemove());
$("#btnDeleteSameRcptYmd--${pageName}").on("click", () => $P.fnRemoveSameRcptYmd());
$("#btnOpenCvlcptOrgnl--${pageName}").on("click", () => $P.fnOpenCvlcptOrgnl());
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollCrdnList);
/**************************************************************************
* 초기화
**************************************************************************/
//달력 초기화
initDatepicker("frmSearch--${pageName}");
initDetailSearchButton("frmSearch--${pageName}");
var defaultBizValue = $("#layout-navbar input[name='taskSeCd']:checked").val();
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + defaultBizValue + "']").prop("checked",true);
$P.fnResetAndChangeBiz(defaultBizValue);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
});
</script>

File diff suppressed because it is too large Load Diff

@ -1,201 +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="pageKorName" scope="request">민원 원본 보기</c:set>
<div class="d-flex flex-row justify-content-evenly">
<div class="card">
<form id="frmEdit--${pageName}">
<input id="crdnId--${pageName}" name="crdnId" type="hidden" data-map="CRDN_ID" />
<div class="row g-1">
<div class="col-md-4">
<label for="cvlcptListNo--${pageName}" class="w-px-150 bg-lighter pe-2 col-form-label text-sm-end">
목록번호
</label>
<input type="text" id="cvlcptListNo--${pageName}" name="cvlcptListNo" data-map="CVLCPT_LIST_NO"
class="form-control" readonly />
</div>
<div class="col-md-4">
<label for="cvlcptRcptNo--${pageName}"
class="w-px-150 bg-lighter pe-2 col-form-label text-sm-end">
접수번호
</label>
<input type="text" id="cvlcptRcptNo--${pageName}" name="cvlcptRcptNo"
data-map="CVLCPT_RCPT_NO" class="form-control" readonly />
</div>
<div class="col-md-4">
<label for="cvlcptAplcntNm--${pageName}"
class="w-px-150 bg-lighter pe-2 col-form-label text-sm-end">
신청자
</label>
<input type="text" id="cvlcptAplcntNm--${pageName}" name="cvlcptAplcntNm"
data-map="CVLCPT_APLCNT_NM" class="form-control" readonly />
</div>
<div class="col-md-4">
<label for="cvlcptRcptYmd--${pageName}"
class="w-px-150 bg-lighter pe-2 col-form-label text-sm-end">
접수일자
</label>
<input type="text" id="cvlcptRcptYmd--${pageName}" name="cvlcptRcptYmd"
data-map="CVLCPT_RCPT_YMD" class="form-control" readonly />
</div>
<div class="col-md-4">
<label for="cvlcptPrcsPrnmtDt--${pageName}"
class="w-px-150 bg-lighter pe-2 col-form-label text-sm-end">
처리기한
</label>
<input type="text" id="cvlcptPrcsPrnmtDt--${pageName}" name="cvlcptPrcsPrnmtDt"
data-map="CVLCPT_PRCS_PRNMNT_DT" class="form-control" readonly />
</div>
<div class="col-md-12">
<label for="cvlcptAplyCn--${pageName}"
class="w-px-150 bg-lighter pe-2 col-form-label text-sm-center">
민원 내용
</label>
<span class="float-end pe-4">
<button type="button" class="btn btn-blue" id="btnMakeHwp--${pageName}" title="한글파일 다운">
한글파일 다운
</button>
<div id="tempArea--${pageName}"></div>
</span>
</div>
<div class="col-md-12">
<div class="px-2">
<textarea id="cvlcptAplyCn--${pageName}" name="cvlcptAplyCn" data-map="CVLCPT_APLY_CN"
rows="25" class="w-100" readonly
></textarea>
</div>
</div>
<div class="col-md-6">
<label for="cvlcptAplySeCd--${pageName}"
class="w-px-150 bg-lighter pe-2 col-form-label text-sm-center">
접수경로
</label>
<select id="cvlcptAplySeCd--${pageName}" name="cvlcptAplySeCd" class="form-select"
data-map="CVLCPT_APLY_SE_CD"
disabled="disabled">
<option value=""></option>
<c:forEach items="${FIM039List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<div class="col-md-6" id="pageNavArea--${pageName}">
<input type="text" id="countStauts--${pageName}"
class="form-control w-px-150 text-center fw-bold" readonly />
<button type="button" id="btnPrev--${pageName}" class="w-px-50 btn-PageUp">◀</button>
<button type="button" id="btnNext--${pageName}" class="w-px-50 btn-PageDown">▶</button>
</div>
</div>
</form>
</div>
</div>
<script>
pageObject["${pageName}"] = {};
pageObject["${pageName}"].provided = {};
pageObject.childReq = [];
pageObject.childReq.push({
getCountStatus : function(){ return ""; },
getNextKey : function(){ return ""; },
getPrevKey : function(){ return ""; },
selectRow : function(){}
});
$(document).ready(function() {
var $P = pageObject["${pageName}"];
$P.taskSeCd = "${taskSeCd}";
if(pageObject.parentRes.length > 0){
$P.provided = pageObject.parentRes.pop();
} else {
$P.provided = pageObject.childReq.pop();
$("#pageNavArea--${pageName}").hide();
}
/**************************************************************************
* DatasetControl, Dataset, FormFields
**************************************************************************/
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
$P.cvlcptControl = new DatasetControl({
dataGetter:obj => obj.cvlcptInfo,
keymapper:info => info ? info.CRDN_ID : "",
urls : {
getInfo : wctx.url("/"+$P.taskSeCd+"/cvlc/cvlc01/050/info.do")
},
formats: {
CVLCPT_RCPT_YMD : dateFormat,
CVLCPT_PRCS_PRNMNT_DT : dateFormat
}
});
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.cvlcptControl.dataset.onCurrentChange = (dataItem) => {
$P.formFields.set($P.cvlcptControl,dataItem);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnPrev = () => {
var prevKey = $P.provided.getPrevKey($("#crdnId--${pageName}").val());
if(prevKey != ""){
$P.fnGo(prevKey);
}
}
$P.fnNext = () => {
var nextKey = $P.provided.getNextKey($("#crdnId--${pageName}").val());
if(nextKey != ""){
$P.fnGo(nextKey);
}
}
$P.fnGo = (crdnId) => {
ajax.get({
url: $P.cvlcptControl.urls.getInfo,
data: { "crdnId" : crdnId },
headers: {
Accept: "application/json; charset=utf-8"
},
success : (resp) => {
var cvlcptInfo = resp.cvlcptInfo;
cvlcptInfo.CVLCPT_APLY_CN = escapeHTMLEntity(cvlcptInfo.CVLCPT_APLY_CN);
$P.cvlcptControl.dataset.setData([cvlcptInfo]);
var cs = $P.provided.getCountStatus($("#crdnId--${pageName}").val());
$("#countStauts--${pageName}").val(cs);
$P.provided.selectRow(crdnId);
}
});
}
$P.fnMakeHwp = () => {
var url = wctx.url("/"+$P.taskSeCd+"/cvlc/cvlc01/050/makeFileFromHwpFormat.do");
var parameter = toQuery({ crdnId : $("#crdnId--${pageName}").val() });
document.location.href = url + "?" + parameter;
}
/**************************************************************************
* element.on
**************************************************************************/
$("#btnPrev--${pageName}").on("click", () => $P.fnPrev() );
$("#btnNext--${pageName}").on("click", () => $P.fnNext() );
$("#btnMakeHwp--${pageName}").on("click", () => $P.fnMakeHwp() );
/**************************************************************************
* 초기화
**************************************************************************/
var cvlcptInfo = ${cvlcptInfo};
cvlcptInfo.CVLCPT_APLY_CN = escapeHTMLEntity(cvlcptInfo.CVLCPT_APLY_CN);
$P.cvlcptControl.dataset.setData([cvlcptInfo]);
var cs = $P.provided.getCountStatus($("#crdnId--${pageName}").val());
$("#countStauts--${pageName}").val(cs);
});
</script>

@ -1,710 +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="pageKorName" scope="request">민원답변대상자료</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<div class="container-page-btn">
<button type="button" id="btnReset--${pageName}" class="btn btn-outline-dark w-px-120" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" id="btnSearch--${pageName}" class="btn btn-search w-px-120" title="검색">
검색
</button>
<button type="button" id="btnExcel--${pageName}" class="btn btn-excel w-px-120" title="엑셀 저장">
엑셀
</button>
<button type="button" id="btnExcelForApproval--${pageName}" class="btn btn-excel w-px-120" title="엑셀 저장">
엑셀(사진 포함)
</button>
</span>
</div>
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${TaskListForSgg}" var="item">
<label>
<input name="taskSeCd" type="radio" value="${item.code}"
class="form-check-input" alt="업무구분"
onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCvlcptRcptYmdFrom--${pageName}">접수일자</label>
<span class="form-search-linebox">
<input type="text" id="schCvlcptRcptYmdFrom--${pageName}" name="schCvlcptRcptYmdFrom"
class="form-control form-date"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" id="schCvlcptRcptYmdTo--${pageName}" name="schCvlcptRcptYmdTo"
class="form-control form-date"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="cvlcptPrcsCd--${pageName}">처리구분</label>
<select id="cvlcptPrcsCd--${pageName}" name="cvlcptPrcsCd" class="form-select w-px-160">
<option value="">전체</option>
<c:forEach items="${FIM017List}" var="item">
<c:if test="${item.code == '02' or item.code == '03' or item.code == '04'}">
<option value="${item.code}">${item.value}</option>
</c:if>
</c:forEach>
</select>
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCvlcptPrcsPrnmntDtFrom--${pageName}">처리기한</label>
<span class="form-search-linebox">
<input type="text" id="schCvlcptPrcsPrnmntDtFrom--${pageName}" name="schCvlcptPrcsPrnmntDtFrom"
class="form-control form-date"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" id="schCvlcptPrcsPrnmntDtTo--${pageName}" name="schCvlcptPrcsPrnmntDtTo"
class="form-control form-date"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div>
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row">
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
</div>
</div>
</form>
<div class="text-red">
빨간색 글자로 표시된 자료는 복사등록 자료가 있습니다.
</div>
<div>
<span class="container-page-btn">
<div class="d-flex flex-row justify-content-between">
<span id="crdnPaging--${pageName}PagingInfo" class="dataTables_info"
role="status" aria-live="polite"></span>
<ul id="crdnPaging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
<span id="gridbuttonArea--${pageName}" class="container-window-btn-right">
<button type="button" id="btnOpenCvlcptOrgnl--${pageName}"
class="btn btn-primary" title="민원원본보기">민원원본보기</button>
<button type="button" id="btnOpenAnswerPreview--${pageName}"
class="btn btn-primary" title="답변미리보기">답변미리보기</button>
<button type="button" id="btnExecuteAnswer--${pageName}"
class="btn btn-primary" title="답변등록 실행">&#x2611; 답변등록 실행</button>
<button type="button" id="btnAnswerComplete--${pageName}"
class="btn btn-primary" title="답변완료로 수정">&#x2611; 답변완료로 수정</button>
<span slot="button">
<template class="dpv">
<slot>
<button type="button" id="btnExecuteDisabledTagInfoInquire--${pageName}"
class="btn btn-primary" title="표지정보 조회">&#x2611; 표지정보 조회</button>
</slot>
</template>
</span>
</span>
</span>
</div>
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-500">
<table id="DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead id="crdnThead--${pageName}" class="sticky-thead">
<tr data-by="by--${pageName}" data-by-output="byOutput--${pageName}"
data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th style="width: 80px;">No.</th>
<th style="width: 60px;">
<input type="checkbox" id="gridAllCheckbox--${pageName}"
onchange="pageObject['${pageName}'].checkCrdnList(this, this.checked);" />
</th>
<th onclick="searchFromGridTitle('CVLCPT_RCPT_NO',this.innerText,'match','part');"
style="width: 180px;">접수번호</th>
<th onclick="searchFromGridTitle('CVLCPT_LIST_NO',this.innerText,'match','part');"
style="width: 160px;">목록번호</th>
<th onclick="searchFromGridTitle('CVLCPT_APLCNT_NM',this.innerText,'match','part');"
style="width: 160px;">신고자</th>
<th onclick="searchFromGridTitle('CVLCPT_PRCS_PIC_NM',this.innerText,'match','part');"
style="width: 160px;">담당자</th>
<th onclick="searchFromGridTitle('CVLCPT_PRCS_PIC_TELNO',this.innerText,'match','part');"
style="width: 160px;">담당자전화번호</th>
<th onclick="searchFromGridTitle('CVLCPT_RCPT_YMD',this.innerText,'ymd','');"
style="width: 160px;">접수일자</th>
<th onclick="searchFromGridTitle('CVLCPT_PRCS_PRNMNT_DT',this.innerText,'ymd','');"
style="width: 180px;">처리기한</th>
<th onclick="searchFromGridTitle('CRDN_YMD','위반일자','ymd','');"
style="width: 180px;">위반일시</th>
<th onclick="searchFromGridTitle('VLTN_ARTCL',this.innerText);"
style="width: 160px;">위반내용</th>
<th onclick="searchFromGridTitle('VHRNO',this.innerText,'match','part');"
style="width: 160px;">차량번호</th>
<th onclick="searchFromGridTitle('LEVY_EXCL_RSN_CD',this.innerText,'codeValue','FIM022');"
style="width: 160px;">서손/계고사유</th>
<th onclick="searchFromGridTitle('ETC_CN',this.innerText,'match','part');"
style="width: 160px;">특기사항</th>
<th class="dummy-th"></th>
</tr>
</thead>
<tbody id="crdnTbody--${pageName}"></tbody>
<template id="crdnRow--${pageName}">
<tr data-key="{CRDN_ID}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{ROW_NUM}</td>
<td class="text-center">
<input type="checkbox" name="gridCheckbox" name="gridCheckbox" value="{CRDN_ID}"
onchange="pageObject['${pageName}'].checkCrdnList(this, this.checked);" />
</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_RCPT_NO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_LIST_NO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_APLCNT_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_PRCS_PIC_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_PRCS_PIC_TELNO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_RCPT_YMD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_PRCS_PRNMNT_DT}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_YMD_TM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{VLTN_ARTCL}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{VHRNO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{LEVY_EXCL_RSN_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{ETC_CN}</td>
<td class="dummy-td"></td>
</tr>
</template>
<template id="crdnNotFound--${pageName}">
<tr>
<td valign="top" colspan="15" class="dataTables_empty text-center">
민원 정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
var FIM022 = new CommonCodes(${FIM022});
var FIM026 = new CommonCodes(${FIM026});
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.crdnControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData:true,
keymapper : info => info ? info.CRDN_ID : "",
urls : {
load : "",
getInfo : "",
update : ""
},
formats : {
CRDN_REG_SE_CD : FIM026,
CVLCPT_RCPT_YMD : dateFormat,
CVLCPT_PRCS_PRNMNT_DT : datetimeFormat,
CRDN_YMD_TM : datetimeFormat,
LEVY_EXCL_RSN_CD : FIM022
}
});
$P.crdnControl.defaultFetchSize = FETCH_XS;
$P.crdnControl.query = { pageNum : 1, fetchSize : $P.crdnControl.defaultFetchSize };
$P.crdnControl.beforeCurrent = null;
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.crdnControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate();
var trs = Apply.fromDataset.getTbody($P.crdnControl.dataset, t.found, t.notFound, t.replacer);
$P.renderCrdnList(obj["Total"], $P.crdnControl.dataset.length, trs, option);
Apply.fromDataset.paging($P.crdnControl.dataset, obj, "crdnPaging--${pageName}");
};
$P.crdnControl.dataset.onCurrentChange = (dataItem) => {
Apply.fromDataset.currentRow($P.crdnControl.dataset, dataItem, $("#crdnTbody--${pageName}")[0]);
}
$P.crdnControl.dataset.onSelectionChange = (selectedArr) => {
Apply.fromDataset.gridCheckbox($P.crdnControl.dataset, document.getElementById("crdnTbody--${pageName}"), 1, selectedArr);
Apply.fromDataset.gridButton($P.crdnControl.dataset, $("#btnExecuteAnswer--${pageName}")[0], selectedArr);
Apply.fromDataset.gridButton($P.crdnControl.dataset, $("#btnAnswerComplete--${pageName}")[0], selectedArr);
Apply.fromDataset.gridButton($P.crdnControl.dataset, $("#btnExecuteDisabledTagInfoInquire--${pageName}")[0], selectedArr);
};
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnReset = () => {
var searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function(){ $(this).find("option:eq(0)").prop("selected", true); });
$("#byOutput--${pageName}").val("동적 검색");
$('#schCvlcptRcptYmdFrom--${pageName}').datepicker('setDate', DateUtil.getDateDay(-31).date);
$('#schCvlcptRcptYmdTo--${pageName}').datepicker('setDate', TODAY());
$P.crdnControl.dataset.setData([]);
}
$P.fnResetAndChangeBiz = taskSeCd => {
var clsForTask = taskSeCd.toLowerCase();
//업무별 버튼
renderForTask("gridbuttonArea--${pageName}", clsForTask);
//버튼 이벤트 재매핑
$("#btnExecuteDisabledTagInfoInquire--${pageName}").off("click");
$("#btnExecuteDisabledTagInfoInquire--${pageName}").on("click", () => $P.fnExecuteDisabledTagInfoInquire());
$P.fnReset();
$P.crdnControl.urls.load = wctx.url("/"+taskSeCd+"/cvlc/cvlc02/030/list.do");
$P.crdnControl.urls.update = wctx.url("/"+taskSeCd+"/cvlc/cvlc02/030/update.do");
$P.crdnControl.urls.getInfo = wctx.url("/sprt/sprt02/010/main.do");
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
data.fetchSize = $P.crdnControl.defaultFetchSize;
return data;
}
$P.searchCrdnList = () => {
$P.crdnControl.query = $P.getParams();
$P.crdnControl.load(1);
}
$P.scrollCrdnList = () => {
$P.crdnControl.load($P.crdnControl.query.pageNum + 1);
}
$P.refreshCrdnList = () => {
$P.crdnControl.reload({all : true});
}
$P.fnExcelDown = (forApproval) => {
if($P.crdnControl.dataset.empty){
alert("조회된 자료가 없습니다.");
return;
}
var cellDefs = getCellDefs($("#crdnThead--${pageName} th").not(".dummy-th").not(":eq(0)").not(":eq(0)"),
$($("#crdnRow--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)").not(":eq(0)"));
$P.crdnControl.query.cellDefs = cellDefs;
if(forApproval){
$P.crdnControl.query.includePhoto = "Y";
} else {
$P.crdnControl.query.includePhoto = "N";
}
$P.crdnControl.download();
$P.crdnControl.query.includePhoto = null;
};
$P.getGridTemplate = () => {
var notFound = [document.getElementById("crdnNotFound--${pageName}").innerHTML];
var found = document.getElementById("crdnRow--${pageName}").innerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickCrdnList('" + dataItem.getValue("CRDN_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].dblclickCrdnList('" + dataItem.getValue("CRDN_ID") + "');");
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
$P.renderCrdnList = (total, listLength, trs, option) => {
let noMore = (listLength >= total);
var initScroll = ($P.crdnControl.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs, initScroll, noMore);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
$("#crdnTbody--${pageName}").find("tr[data-key]").each(function(item){
var crdnId = this.dataset.key;
var data = $P.crdnControl.dataset.getData(crdnId);
if(data.COPY_EXIST_YN == "Y"){
$(this).addClass("text-red");
} else {
$(this).removeClass("text-red");
}
});
}
$P.checkCrdnList = (element, bool) => {
GRID.checkbox.sync(element, bool);
var atLeastOne = GRID.checkbox.countChecked(element) > 0;
$("#btnExecuteAnswer--${pageName}").prop("disabled", !atLeastOne);
$("#btnAnswerComplete--${pageName}").prop("disabled", !atLeastOne);
$("#btnExecuteDisabledTagInfoInquire--${pageName}").prop("disabled", !atLeastOne);
Apply.toDataset.selection($P.crdnControl.dataset, element, bool);
}
$P.clickCrdnList = (dataKey) => {
if(dataKey == ""){
return;
}
$("#crdnTbody--${pageName}").setCurrentRow(dataKey);
Apply.toDataset.current($P.crdnControl.dataset, dataKey);
}
$P.dblclickCrdnList = (dataKey) => {
let params = {
callControlName : "pageObject['${pageName}'].crdnControl"
, crdnId : dataKey
}
ajax.get({
url : $P.crdnControl.urls.getInfo,
data : params,
success : (resp) => {
dialog.open({
id : "totalInfoMainDialog",
title : "개별총정보", size : "xxl", content : resp,
init : () => {}
});
}
});
}
$P.fnOpenCvlcptOrgnl = () => {
var cur = $P.crdnControl.dataset.getCurrent();
if(cur == null){
return;
}
var taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val();
var dialogId = "cvlcptOrgnlDialog--${pageName}";
ajax.get({
url : wctx.url("/"+taskSeCd+"/cvlc/cvlc01/050/info.do"),
data : { crdnId : cur["CRDN_ID"] },
success : (resp) => {
dialog.open({
id : dialogId,
title : "민원내역 원본",
content : resp,
size : "xl",
init : () => {
var parentRes = new Object();
var childReq = pageObject.childReq.pop();
for(var reqKey in childReq) {
if($P.provide[reqKey]){
parentRes[reqKey] = $P.provide[reqKey];
} else {
parentRes[reqKey] = function(){};
}
}
pageObject.parentRes.push(parentRes);
}
});
}
});
}
$P.fnOpenAnswerPreview = () => {
var cur = $P.crdnControl.dataset.getCurrent();
if(cur == null){
return;
}
var taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val();
var dialogId = "answerPreviewDialog--${pageName}";
ajax.get({
url : wctx.url("/"+taskSeCd+"/cvlc/cvlc02/060/info.do"),
data : { crdnId : cur["CRDN_ID"] },
success : (resp) => {
dialog.open({
id : dialogId,
title : "답변내용 미리보기",
content : resp,
size : "xl",
init : () => {
var parentRes = new Object();
var childReq = pageObject.childReq.pop();
for(var reqKey in childReq) {
if($P.provide[reqKey]){
parentRes[reqKey] = $P.provide[reqKey];
} else {
parentRes[reqKey] = function(){};
}
}
pageObject.parentRes.push(parentRes);
}
});
}
});
}
$P.fnExecuteAnswer = () => {
var count = $P.crdnControl.dataset.getKeys("selected").length;
dialog.alert({
content : "선택된 "+count+"건의 자료를 답변등록을 실행하시겠습니까?",
init : function() {
focusOK();
},
onOK : () => {
$P.save('answerExecute');
}
});
}
$P.fnAnswerComplete = () => {
var count = $P.crdnControl.dataset.getKeys("selected").length;
dialog.alert({
content : "선택된 "+count+"건의 자료를 답변완료 상태로 변경하시겠습니까?",
init : function() {
focusOK();
},
onOK : () => {
$P.save('answerComplete');
}
});
}
//
$P.save = (processType) => {
ajax.post({
url : $P.crdnControl.urls.update,
data : {
"processType" : processType,
"crdnIds" : $P.crdnControl.dataset.getKeys("selected").join(",")
},
success : (resp) => {
if(resp.saved){
dialog.alert({
content : "처리되었습니다.",
init : function() {
focusClose();
}
});
$P.refreshCrdnList();
}
}
});
}
//표지정보 조회
$P.fnExecuteDisabledTagInfoInquire = () => {
var keys = [];
var selected = $P.crdnControl.dataset.getDataset("selected");
for(var i=0; i < selected.length; i++){
if(selected[i].CVLCPT_PRCS_CD == "02"){
keys.push(selected[i].CRDN_ID);
}
}
if(keys.length == 0){
dialog.alert({
content : "표지조회는 부과대상자료만 가능합니다.<br/>선택된 자료 중에 부과대상자료가 없습니다.",
init : function() {
focusClose();
}
});
return;
}
var message = "※표지정보 조회 후 장애인차량이 아닌 자료는 서손처리 됩니다."
+"<br/>※현재 날짜("+TODAY()+")를 기준으로 차량번호로 조회합니다."
+"<br/>표지조회를 실행하시겠습니까?"
+"<br/>부과대상 자료 : "+keys.length+"건";
dialog.alert({
content : message,
init : function() {
setDialogZindex();
focusOK();
},
onOK : () => {
ajax.get({
url : wctx.url("/DPV/cvlc/cvlc02/040/update.do"),
data : {
"crdnIds" : keys.join(",")
},
success : (resp) => {
dialog.alert({
content : "표지정보조회가 실행되었습니다.",
init : function() {
setDialogZindex();
focusClose();
}
});
$P.refreshCrdnList();
}
});
}
});
}
$P.provide = {
"getCountStatus" : function(currentKey){
var ds = $P.crdnControl.dataset.getDataset();
var index = ds.findIndex(item => item.CRDN_ID == currentKey);
return (index+1) + " of " + ds.length;
},
"getNextKey" : function(currentKey){
var ds = $P.crdnControl.dataset.getDataset();
var index = ds.findIndex(item => item.CRDN_ID == currentKey);
if(ds.length > index+1){
return ds[index+1]["CRDN_ID"];
} else {
return "";
}
},
"getPrevKey" : function(currentKey){
var ds = $P.crdnControl.dataset.getDataset();
var index = ds.findIndex(item => item.CRDN_ID == currentKey);
if(index != 0 && ds.length > 1){
return ds[index-1]["CRDN_ID"];
} else {
return "";
}
},
"selectRow" : function(currentKey){
$P.clickCrdnList(currentKey);
},
"refreshList" : function(){
$P.refreshCrdnList();
}
};
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
$('#btnSearch--${pageName}').on('click', () => $P.searchCrdnList());
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress($P.searchCrdnList);
$('#btnExcel--${pageName}').on('click', () => $P.fnExcelDown(false));
$('#btnExcelForApproval--${pageName}').on('click', () => $P.fnExcelDown(true));
$("#btnOpenCvlcptOrgnl--${pageName}").on("click", () => $P.fnOpenCvlcptOrgnl());
$("#btnOpenAnswerPreview--${pageName}").on("click", () => $P.fnOpenAnswerPreview());
$("#btnExecuteAnswer--${pageName}").on("click", () => $P.fnExecuteAnswer());
$("#btnAnswerComplete--${pageName}").on("click", () => $P.fnAnswerComplete());
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollCrdnList);
/**************************************************************************
* 초기화
**************************************************************************/
//달력 초기화
initDatepicker("frmSearch--${pageName}");
initDetailSearchButton("frmSearch--${pageName}");
var defaultBizValue = $("#layout-navbar input[name='taskSeCd']:checked").val();
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + defaultBizValue + "']").prop("checked",true);
$P.fnResetAndChangeBiz(defaultBizValue);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
});
</script>

@ -1,207 +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="pageKorName" scope="request">민원 답변내용 미리보기</c:set>
<div class="d-flex flex-row justify-content-evenly">
<div class="card">
<form id="frmEdit--${pageName}">
<input id="crdnId--${pageName}" name="crdnId" type="hidden" data-map="CRDN_ID" />
<input id="cvlcptLinkId--${pageName}" name="cvlcptLinkId" type="hidden" data-map="CVLCPT_LINK_ID" />
<div class="row g-1">
<div class="col-md-6">
<label for="cvlcptAplyCn--${pageName}"
class="w-px-150 bg-lighter pe-2 col-form-label text-sm-center">
민원 내용
</label>
</div>
<div class="col-md-6 text-end">
<input type="text" id="countStauts--${pageName}"
class="form-control w-px-150 text-center fw-bold" readonly />
<button type="button" id="btnPrev--${pageName}" class="w-px-50 btn-PageUp">◀</button>
<button type="button" id="btnNext--${pageName}" class="w-px-50 btn-PageDown">▶</button>
</div>
<div class="col-md-12">
<div class="px-2">
<textarea id="cvlcptAplyCn--${pageName}" name="cvlcptAplyCn"
data-map="CVLCPT_APLY_CN" rows="10" class="w-100"
></textarea>
</div>
</div>
<div class="col-md-12">
<label for="cvlcptPrcsRsltCn--${pageName}"
class="required w-px-150 bg-lighter pe-2 col-form-label text-sm-center">
답변 내용
</label>
</div>
<div class="col-md-12">
<div class="px-2">
<textarea id="cvlcptPrcsRsltCn--${pageName}" name="cvlcptPrcsRsltCn"
data-map="CVLCPT_PRCS_RSLT_CN"
required rows="10" class="w-100"
></textarea>
</div>
</div>
<div class="col-md-6">
변경할내용이있으면 수정하시오.
</div>
<div class="col-md-6 text-end">
<button type="button" id="btnSave--${pageName}" class="btn btn-primary">
변경 내용 저장
</button>
</div>
</div>
</form>
</div>
</div>
<script>
pageObject["${pageName}"] = {};
pageObject["${pageName}"].parentRes = {};
pageObject.childReq = [];
pageObject.childReq.push({
getCountStatus : function(){ return ""; },
getNextKey : function(){ return ""; },
getPrevKey : function(){ return ""; },
selectRow : function(){}
});
$(document).ready(function() {
var $P = pageObject["${pageName}"];
$P.taskSeCd = "${taskSeCd}";
if(pageObject.parentRes.length > 0){
$P.parentRes = pageObject.parentRes.pop();
} else {
$P.parentRes = pageObject.childReq.pop();
}
/**************************************************************************
* DatasetControl, Dataset, FormFields
**************************************************************************/
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
$P.cvlcptControl = new DatasetControl({
dataGetter:obj => obj.cvlcptInfo,
keymapper:info => info ? info.CRDN_ID : "",
urls : {
getInfo : wctx.url("/"+$P.taskSeCd+"/cvlc/cvlc02/060/info.do"),
update : wctx.url("/"+$P.taskSeCd+"/cvlc/cvlc02/060/update.do")
},
formats: {
CVLCPT_RCPT_YMD : dateFormat,
CVLCPT_PRCS_PRNMNT_DT : dateFormat
}
});
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.cvlcptControl.dataset.onCurrentChange = (dataItem) => {
$P.formFields.set($P.cvlcptControl,dataItem);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnPrev = () => {
var prevKey = $P.parentRes.getPrevKey($("#crdnId--${pageName}").val());
if(prevKey != ""){
$P.fnGo(prevKey);
}
}
$P.fnNext = () => {
var nextKey = $P.parentRes.getNextKey($("#crdnId--${pageName}").val());
if(nextKey != ""){
$P.fnGo(nextKey);
}
}
$P.fnGo = (crdnId) => {
ajax.get({
url: $P.cvlcptControl.urls.getInfo,
data: { "crdnId" : crdnId },
headers: {
Accept: "application/json; charset=utf-8"
},
success : (resp) => {
var cvlcptInfo = resp.cvlcptInfo;
cvlcptInfo.CVLCPT_APLY_CN = escapeHTMLEntity(cvlcptInfo.CVLCPT_APLY_CN);
$P.cvlcptControl.dataset.setData([cvlcptInfo]);
var cs = $P.parentRes.getCountStatus($("#crdnId--${pageName}").val());
$("#countStauts--${pageName}").val(cs);
$P.parentRes.selectRow(crdnId);
}
});
}
$P.fnSave = async() => {
if(!customValidate($("#frmEdit--${pageName} input"))) return;
if(await confirm2("현재 답변 내용을 저장하시겠습니까?")){
var info = $P.formFields.get();
if (!info) {
return;
}
ajax.post({
url : $P.cvlcptControl.urls.update,
data : info,
success : (resp) => {
$P.saveCallback(resp);
}
});
}
}
$P.saveCallback = (resp) => {
if (resp.saved) {
dialog.alert({
content : "표지정보조회가 실행되었습니다.",
init : function() {
setDialogZindex();
focusClose();
}
});
}
}
/**************************************************************************
* element.on
**************************************************************************/
$("#btnPrev--${pageName}").on("click", () => $P.fnPrev() );
$("#btnNext--${pageName}").on("click", () => $P.fnNext() );
$("#btnSave--${pageName}").on("click", () => $P.fnSave() );
/**************************************************************************
* 초기화
**************************************************************************/
var cvlcptInfo = ${cvlcptInfo};
cvlcptInfo.CVLCPT_APLY_CN = escapeHTMLEntity(cvlcptInfo.CVLCPT_APLY_CN);
$P.cvlcptControl.dataset.setData([cvlcptInfo]);
var cs = $P.parentRes.getCountStatus($("#crdnId--${pageName}").val());
$("#countStauts--${pageName}").val(cs);
let openerPageName = "${openerPageName}";
if (openerPageName == "sprt02020") {
$("#btnSave--${pageName}").hide();
} else {
$("#btnSave--${pageName}").show();
}
});
</script>

@ -1,579 +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="pageKorName" scope="request">민원관리</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<div class="container-page-btn">
<button type="button" id="btnReset--${pageName}" class="btn btn-outline-dark w-px-120" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" id="btnSearch--${pageName}" class="btn btn-search w-px-120" title="검색">
검색
</button>
<button type="button" id="btnExcel--${pageName}" class="btn btn-excel w-px-120" title="엑셀 저장">
엑셀
</button>
</span>
</div>
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${TaskListForSgg}" var="item">
<label>
<input name="taskSeCd" type="radio" value="${item.code}"
class="form-check-input" alt="업무구분"
onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCvlcptRcptYmdFrom--${pageName}">접수일자</label>
<span class="form-search-linebox">
<input type="text" id="schCvlcptRcptYmdFrom--${pageName}" name="schCvlcptRcptYmdFrom"
class="form-control form-date"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" id="schCvlcptRcptYmdTo--${pageName}" name="schCvlcptRcptYmdTo"
class="form-control form-date"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<div class="col-6">
<button type="button" class="w-px-120" onclick="$('#cvlcptPrcsPicNm--${pageName}').val('${currentUserName}');">
담당자명 지정
</button>
<input type="text" id="cvlcptPrcsPicNm--${pageName}" name="cvlcptPrcsPicNm"
class="form-control" />
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCvlcptPrcsPrnmntDtFrom--${pageName}">처리기한</label>
<span class="form-search-linebox">
<input type="text" id="schCvlcptPrcsPrnmntDtFrom--${pageName}" name="schCvlcptPrcsPrnmntDtFrom"
class="form-control form-date"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" id="schCvlcptPrcsPrnmntDtTo--${pageName}" name="schCvlcptPrcsPrnmntDtTo"
class="form-control form-date"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div>
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row">
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
</div>
</div>
</form>
<div>
<span class="container-page-btn">
<div class="d-flex flex-row justify-content-between">
<span id="crdnPaging--${pageName}PagingInfo" class="dataTables_info"
role="status" aria-live="polite"></span>
<ul id="crdnPaging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
<span class="container-window-btn-right">
<button type="button" id="btnOpenCvlcptOrgnl--${pageName}"
class="btn btn-primary" title="민원원본보기">민원원본보기</button>
<button type="button" id="btnDelete--${pageName}"
class="btn btn-primary" title="선택자료 삭제">선택자료 삭제</button>
</span>
</span>
</div>
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-500">
<table id="DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead id="crdnThead--${pageName}" class="sticky-thead">
<tr data-by="by--${pageName}" data-by-output="byOutput--${pageName}"
data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th style="width: 80px;">No.</th>
<th onclick="searchFromGridTitle('CVLCPT_RCPT_NO',this.innerText,'match','part');"
style="width: 160px;">접수번호</th>
<th onclick="searchFromGridTitle('CVLCPT_LIST_NO',this.innerText,'match','part');"
style="width: 160px;">목록번호</th>
<th onclick="searchFromGridTitle('CRDN_REG_SE_CD',this.innerText,'codeValue','FIM026');"
style="width: 160px;">등록구분</th>
<th onclick="searchFromGridTitle('CVLCPT_APLCNT_NM',this.innerText,'match','part');"
style="width: 160px;">신고자</th>
<th onclick="searchFromGridTitle('CVLCPT_PRCS_PIC_NM',this.innerText,'match','part');"
style="width: 160px;">담당자</th>
<th onclick="searchFromGridTitle('CVLCPT_PRCS_PIC_TELNO',this.innerText,'match','part');"
style="width: 160px;">담당자전화번호</th>
<th onclick="searchFromGridTitle('CVLCPT_RCPT_YMD',this.innerText,'ymd');"
style="width: 160px;">접수일자</th>
<th onclick="searchFromGridTitle('CVLCPT_PRCS_PRNMNT_DT',this.innerText,'ymd');"
style="width: 180px;">처리기한</th>
<th onclick="searchFromGridTitle('CRDN_YMD','위반일자','ymd');"
style="width: 180px;">위반일시</th>
<th onclick="searchFromGridTitle('VLTN_ARTCL',this.innerText);"
style="width: 160px;">위반내용</th>
<th onclick="searchFromGridTitle('VHRNO',this.innerText,'match','part');"
style="width: 160px;">차량번호</th>
<th onclick="searchFromGridTitle('ATCH_FILE_CNT',this.innerText,'match','perfect');"
style="width: 160px;">사진건수</th>
<th onclick="searchFromGridTitle('LEVY_EXCL_RSN_CD',this.innerText,'codeValue','FIM022');"
style="width: 160px;">서손/계고사유</th>
<th onclick="searchFromGridTitle('ETC_CN',this.innerText,'match','part');"
style="width: 160px;">특기사항</th>
<th class="dummy-th"></th>
</tr>
</thead>
<tbody id="crdnTbody--${pageName}"></tbody>
<template id="crdnRow--${pageName}">
<tr data-key="{CRDN_ID}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{ROW_NUM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_RCPT_NO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_LIST_NO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_REG_SE_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_APLCNT_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_PRCS_PIC_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_PRCS_PIC_TELNO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_RCPT_YMD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CVLCPT_PRCS_PRNMNT_DT}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{CRDN_YMD_TM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{VLTN_ARTCL}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{VHRNO}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{ATCH_FILE_CNT}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{LEVY_EXCL_RSN_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{ETC_CN}</td>
<td class="dummy-td"></td>
</tr>
</template>
<template id="crdnNotFound--${pageName}">
<tr>
<td valign="top" colspan="16" class="dataTables_empty text-center">
민원 정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<div class="toast-container position-fixed bottom-0 end-0 p-3">
<div id="divToast--${pageName}" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
<div class="toast-body bg-black text-white">
삭제 되었습니다.
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
var FIM022 = new CommonCodes(${FIM022});
var FIM026 = new CommonCodes(${FIM026});
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
$P.toast = new bootstrap.Toast(document.getElementById('divToast--${pageName}'), {
animation: true,
autohide: true,
delay: 2000
});
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.crdnControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData:true,
keymapper : info => info ? info.CRDN_ID : "",
urls : {
load : "",
getInfo : "",
remove : ""
},
formats : {
CRDN_REG_SE_CD : FIM026,
CVLCPT_RCPT_YMD : dateFormat,
CVLCPT_PRCS_PRNMNT_DT : datetimeFormat,
CRDN_YMD_TM : datetimeFormat
}
});
$P.crdnControl.defaultFetchSize = FETCH_XS;
$P.crdnControl.query = { pageNum : 1, fetchSize : $P.crdnControl.defaultFetchSize };
$P.crdnControl.beforeCurrent = null;
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.crdnControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate();
var trs = Apply.fromDataset.getTbody($P.crdnControl.dataset, t.found, t.notFound, t.replacer);
$P.renderCrdnList(obj["Total"], $P.crdnControl.dataset.length, trs, option);
Apply.fromDataset.paging($P.crdnControl.dataset, obj, "crdnPaging--${pageName}");
};
$P.crdnControl.dataset.onCurrentChange = (dataItem) => {
Apply.fromDataset.currentRow($P.crdnControl.dataset, dataItem, $("#crdnTbody--${pageName}")[0]);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnReset = () => {
var searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function(){ $(this).find("option:eq(0)").prop("selected", true); });
$("#byOutput--${pageName}").val("동적 검색");
$('#schCvlcptRcptYmdFrom--${pageName}').datepicker('setDate', DateUtil.getDateDay(-365).date);
$('#schCvlcptRcptYmdTo--${pageName}').datepicker('setDate', TODAY());
$P.crdnControl.dataset.setData([]);
}
$P.fnResetAndChangeBiz = (taskSeCd) => {
$P.fnReset();
$P.crdnControl.urls.load = wctx.url("/"+taskSeCd+"/cvlc/cvlc03/010/list.do");
$P.crdnControl.urls.remove = wctx.url("/"+taskSeCd+"/cvlc/cvlc01/010/remove.do");
$P.crdnControl.urls.getInfo = wctx.url("/sprt/sprt02/010/main.do");
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
data.fetchSize = $P.crdnControl.defaultFetchSize;
return data;
}
$P.searchCrdnList = () => {
$P.crdnControl.query = $P.getParams();
$P.crdnControl.load(1);
}
$P.scrollCrdnList = () => {
$P.crdnControl.load($P.crdnControl.query.pageNum + 1);
}
$P.refreshCrdnList = () => {
$P.crdnControl.beforeCurrent = {
key : $P.crdnControl.dataset.getCurrent()["CRDN_ID"],
index : $P.crdnControl.dataset.getCurrent()["ROW_NUM"] - 1
};
Apply.fromDatasetControl.reload($P.crdnControl).then((resp)=>{
Apply.toDataset.set($P.crdnControl.dataset, resp);
$P.crdnControl.dataset.onDatasetChange(resp, {reloaded : true});
if($P.crdnControl.beforeCurrent != null){
var beforeCurrentKey = $P.crdnControl.beforeCurrent.key;
var beforeCurrentIndex = $P.crdnControl.beforeCurrent.index;
$P.crdnControl.beforeCurrent = null;
if(!$P.crdnControl.dataset.empty){
var info = $P.crdnControl.dataset.getData(beforeCurrentKey);
if(info != null){
$P.crdnControl.dataset.setCurrent(beforeCurrentKey,true);
} else {
if(beforeCurrentIndex > ($P.crdnControl.dataset.length - 1)){
info = $P.crdnControl.dataset.getDataset()[$P.crdnControl.dataset.length - 1];
} else {
info = $P.crdnControl.dataset.getDataset()[beforeCurrentIndex];
}
$P.crdnControl.dataset.setCurrent(info["CRDN_ID"],true);
}
}
}
$("label[for='table-responsive--${pageName}']").trigger("refreshEnd");
});
}
$P.fnExcelDown = () => {
if($P.crdnControl.dataset.empty){
alert("조회된 자료가 없습니다.");
return;
}
var cellDefs = getCellDefs($("#crdnThead--${pageName} th").not(".dummy-th").not(":eq(0)"),
$($("#crdnRow--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)"));
$P.crdnControl.query.cellDefs = cellDefs;
$P.crdnControl.download();
}
$P.getGridTemplate = () => {
var notFound = [document.getElementById("crdnNotFound--${pageName}").innerHTML];
var found = document.getElementById("crdnRow--${pageName}").innerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickCrdnList('" + dataItem.getValue("CRDN_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].dblclickCrdnList('" + dataItem.getValue("CRDN_ID") + "');");
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
$P.renderCrdnList = (total, listLength, trs, option) => {
let noMore = (listLength >= total);
var initScroll = ($P.crdnControl.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs, initScroll, noMore);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
$P.clickCrdnList = (dataKey) => {
if(dataKey == ""){
return;
}
$("#crdnTbody--${pageName}").setCurrentRow(dataKey);
Apply.toDataset.current($P.crdnControl.dataset, dataKey);
}
$P.dblclickCrdnList = (dataKey) => {
let params = {
callControlName : "pageObject['${pageName}'].crdnControl"
, crdnId : dataKey
}
ajax.get({
url : $P.crdnControl.urls.getInfo,
data : params,
success : (resp) => {
dialog.open({
id : "totalInfoMainDialog",
title : "개별총정보", size : "xxl", content : resp,
init : () => {}
});
}
});
}
$P.fnRemove = () => {
var cur = $P.crdnControl.dataset.getCurrent();
if(cur == null){
return;
}
var curKey = cur["CRDN_ID"];
$P.crdnControl.dataset.select(curKey,true);
var selected = $P.crdnControl.dataset.getKeys("selected");
if (selected.length < 1) {
return;
}
var params = {
"crdnIds" : selected.join(",")
};
ajax.post({
url : $P.crdnControl.urls.remove,
data : params,
success : (resp) => {
$P.saveCallback(selected, resp);
}
});
}
$P.saveCallback = (selected, resp) => {
if (resp.saved){
$P.toast.show();
sleep(1000).then(() => $P.refreshCrdnList());
}
}
$P.fnOpenCvlcptOrgnl = () => {
var cur = $P.crdnControl.dataset.getCurrent();
if(cur == null){
return;
}
var taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val();
var dialogId = "cvlcptOrgnlDialog--${pageName}";
ajax.get({
url : wctx.url("/"+taskSeCd+"/cvlc/cvlc01/050/info.do"),
data : { crdnId : cur["CRDN_ID"] },
success : (resp) => {
dialog.open({
id : dialogId,
title : "민원내역 원본",
content : resp,
size : "xl",
init : () => {
var parentRes = new Object();
var childReq = pageObject.childReq.pop();
for(var reqKey in childReq) {
if($P.provide[reqKey]){
parentRes[reqKey] = $P.provide[reqKey];
} else {
parentRes[reqKey] = function(){};
}
}
pageObject.parentRes.push(parentRes);
}
});
}
});
}
$P.provide = {
"getCountStatus" : function(currentKey){
var ds = $P.crdnControl.dataset.getDataset();
var index = ds.findIndex(item => item.CRDN_ID == currentKey);
return (index+1) + " of " + ds.length;
},
"getNextKey" : function(currentKey){
var ds = $P.crdnControl.dataset.getDataset();
var index = ds.findIndex(item => item.CRDN_ID == currentKey);
if(ds.length > index+1){
return ds[index+1]["CRDN_ID"];
} else {
return "";
}
},
"getPrevKey" : function(currentKey){
var ds = $P.crdnControl.dataset.getDataset();
var index = ds.findIndex(item => item.CRDN_ID == currentKey);
if(index != 0 && ds.length > 1){
return ds[index-1]["CRDN_ID"];
} else {
return "";
}
},
"selectRow" : function(currentKey){
$P.clickCrdnList(currentKey);
},
"refreshList" : function(){
$P.refreshCrdnList();
},
"hasData" : function(key){
if($P.crdnControl.dataset.getData(key) == null){
return false;
} else {
return true;
}
},
};
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
$('#btnSearch--${pageName}').on('click', () => $P.searchCrdnList());
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress($P.searchCrdnList);
$('#btnExcel--${pageName}').on('click', () => $P.fnExcelDown());
$("#btnDelete--${pageName}").on("click", () => $P.fnRemove());
$("#btnOpenCvlcptOrgnl--${pageName}").on("click", () => $P.fnOpenCvlcptOrgnl());
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollCrdnList);
/**************************************************************************
* 초기화
**************************************************************************/
//달력 초기화
initDatepicker("frmSearch--${pageName}");
initDetailSearchButton("frmSearch--${pageName}");
var defaultBizValue = $("#layout-navbar input[name='taskSeCd']:checked").val();
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + defaultBizValue + "']").prop("checked",true);
$P.fnResetAndChangeBiz(defaultBizValue);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
});
</script>

@ -1,464 +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="pageKorName" scope="request">민원 개별 등록</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<div class="container-page-btn">
<button type="button" id="btnReset--${pageName}" class="btn btn-outline-dark w-px-120" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" id="btnSearch--${pageName}" class="btn btn-search w-px-120" title="검색">
검색
</button>
</span>
</div>
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${TaskListForSgg}" var="item">
<label>
<input name="taskSeCd" type="radio" value="${item.code}"
class="form-check-input" alt="업무구분"
onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schDmndYmdFrom--${pageName}">요청일자</label>
<span class="form-search-linebox">
<input type="text" id="schDmndYmdFrom--${pageName}" name="schDmndYmdFrom"
class="form-control form-date"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" id="schDmndYmdTo--${pageName}" name="schDmndYmdTo"
class="form-control form-date"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
</div>
</div>
</form>
<div>
<span class="container-page-btn">
<div class="d-flex flex-row justify-content-between">
<span id="dmndPaging--${pageName}PagingInfo" class="dataTables_info"
role="status" aria-live="polite"></span>
<ul id="dmndPaging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
<span class="container-window-btn-right">
<button type="button" id="btnOpenDmndPop--${pageName}"
class="btn btn-primary" title="요청 등록">요청 등록</button>
<button type="button" id="btnDelete--${pageName}"
class="btn btn-primary" title="한 건 삭제">한 건 삭제</button>
<button type="button" id="btnDeleteAllCompleteData--${pageName}"
class="btn btn-primary" title="요청 완료자료 전체 삭제">요청 완료자료 전체 삭제</button>
</span>
</span>
</div>
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-600">
<table id="DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead id="dmndThead--${pageName}" class="sticky-thead">
<tr data-by="by--${pageName}" data-by-output="byOutput--${pageName}"
data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th style="width: 80px;">No.</th>
<th style="width: 180px;">요청일시</th>
<th style="width: 180px;">요청자</th>
<th style="width: 180px;">접수일자</th>
<th style="width: 180px;">목록번호</th>
<th style="width: 180px;">상태</th>
<th style="width: 180px;">응답일시</th>
<th class="dummy-th"></th>
</tr>
</thead>
<tbody id="dmndTbody--${pageName}"></tbody>
<template id="dmndRow--${pageName}">
<tr data-key="{INDIV_ID}">
<td onclick="{onclick}" class="text-end">{ROW_NUM}</td>
<td onclick="{onclick}" class="text-center">{DMND_YMD}</td>
<td onclick="{onclick}" class="text-center">{RGTR}</td>
<td onclick="{onclick}" class="text-center">{RCPT_YMD}</td>
<td onclick="{onclick}" class="text-center">{PST_NO}</td>
<td onclick="{onclick}" class="text-center">{STTS_NM}</td>
<td onclick="{onclick}" class="text-center">{RSPNS_DT}</td>
<td class="dummy-td"></td>
</tr>
</template>
<template id="dmndNotFound--${pageName}">
<tr>
<td valign="top" colspan="8" class="dataTables_empty text-center">
요청 정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<div class="toast-container position-fixed bottom-0 end-0 p-3">
<div id="divToast--${pageName}" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
<div id="toastText--${pageName}" class="toast-body bg-black text-white">
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<template id="seallDmndDialogTemplate--${pageName}">
<form id="frmEdit--${pageName}">
<div class="card">
<div class="row g-1">
<div class="col-md-12">
<label for="rcptYmd--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">접수일자</label>
<input type="text" id="rcptYmd--${pageName}" name="rcptYmd"
class="form-control form-date" required data-fmt-type="day" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<div class="col-md-12">
<label for="pstNo--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">목록번호</label>
<input type="text" id="pstNo--${pageName}" name="pstNo" class="form-control"
required maxlength="6" data-maxlengthb="6" data-fmt-type="zeroLpadNumber" />
</div>
</div>
</div>
<div>
<span class="container-page-btn">
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary" id="btnCreate--${pageName}" title="확인">
확인
</button>
</span>
</span>
</div>
</form>
</template>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
var FIM063 = new CommonCodes(${FIM063});
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
$P.toast = new bootstrap.Toast(document.getElementById('divToast--${pageName}'), {
animation: true,
autohide: true,
delay: 2000
});
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.dmndControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData:true,
keymapper : info => info ? info.INDIV_ID : "",
urls : {
load : "",
create : "",
remove : ""
},
formats : {
DMND_YMD : dateFormat,
RCPT_YMD : dateFormat,
RSPNS_DT : datetimeFormat
}
});
$P.dmndControl.defaultFetchSize = FETCH_XS;
$P.dmndControl.query = { pageNum : 1, fetchSize : $P.dmndControl.defaultFetchSize };
$P.dmndControl.beforeCurrent = null;
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.dmndControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate();
var trs = Apply.fromDataset.getTbody($P.dmndControl.dataset, t.found, t.notFound, t.replacer);
$P.renderDmndList(obj["Total"], $P.dmndControl.dataset.length, trs, option);
Apply.fromDataset.paging($P.dmndControl.dataset, obj, "dmndPaging--${pageName}");
};
$P.dmndControl.dataset.onCurrentChange = (dataItem) => {
Apply.fromDataset.currentRow($P.dmndControl.dataset, dataItem, $("#dmndTbody--${pageName}")[0]);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnReset = () => {
$('#schDmndYmdFrom--${pageName}').datepicker('setDate', DateUtil.getDateDay(-5475).date);
$('#schDmndYmdTo--${pageName}').datepicker('setDate', TODAY());
$P.dmndControl.dataset.setData([]);
}
$P.fnResetAndChangeBiz = (taskSeCd) => {
$P.fnReset();
$P.dmndControl.urls.load = wctx.url("/"+taskSeCd+"/cvlc/cvlc04/010/list.do");
$P.dmndControl.urls.create = wctx.url("/"+taskSeCd+"/cvlc/cvlc04/010/create.do");
$P.dmndControl.urls.remove = wctx.url("/"+taskSeCd+"/cvlc/cvlc04/010/remove.do");
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
data.fetchSize = $P.dmndControl.defaultFetchSize;
return data;
}
$P.searchDmndList = () => {
$P.dmndControl.query = $P.getParams();
$P.dmndControl.load(1);
}
$P.scrollDmndList = () => {
$P.dmndControl.load($P.dmndControl.query.pageNum + 1);
}
$P.refreshDmndList = () => {
if(!$P.dmndControl.dataset.empty){
$P.dmndControl.beforeCurrent = {
key : $P.dmndControl.dataset.getCurrent()["INDIV_ID"],
index : $P.dmndControl.dataset.getCurrent()["ROW_NUM"] - 1
};
}
Apply.fromDatasetControl.reload($P.dmndControl).then((resp)=>{
Apply.toDataset.set($P.dmndControl.dataset, resp);
$P.dmndControl.dataset.onDatasetChange(resp, {reloaded : true});
if($P.dmndControl.beforeCurrent != null){
var beforeCurrentKey = $P.dmndControl.beforeCurrent.key;
var beforeCurrentIndex = $P.dmndControl.beforeCurrent.index;
$P.dmndControl.beforeCurrent = null;
if(!$P.dmndControl.dataset.empty){
var info = $P.dmndControl.dataset.getData(beforeCurrentKey);
if(info != null){
$P.dmndControl.dataset.setCurrent(beforeCurrentKey,true);
} else {
if(beforeCurrentIndex > ($P.dmndControl.dataset.length - 1)){
info = $P.dmndControl.dataset.getDataset()[$P.dmndControl.dataset.length - 1];
} else {
info = $P.dmndControl.dataset.getDataset()[beforeCurrentIndex];
}
$P.dmndControl.dataset.setCurrent(info["INDIV_ID"],true);
}
}
}
});
}
$P.getGridTemplate = () => {
var notFound = [document.getElementById("dmndNotFound--${pageName}").innerHTML];
var found = document.getElementById("dmndRow--${pageName}").innerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickDmndList('" + dataItem.getValue("INDIV_ID") + "');");
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
$P.renderDmndList = (total, listLength, trs, option) => {
let noMore = (listLength >= total);
var initScroll = ($P.dmndControl.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs, initScroll, noMore);
}
$P.clickDmndList = (dataKey) => {
if(dataKey == ""){
return;
}
$("#dmndTbody--${pageName}").setCurrentRow(dataKey);
Apply.toDataset.current($P.dmndControl.dataset, dataKey);
}
$P.fnRemove = (allCompleteDataIds) => {
if(allCompleteDataIds != null){
$P.dmndControl.dataset.select(allCompleteDataIds,true);
} else {
var cur = $P.dmndControl.dataset.getCurrent();
if(cur == null){
return;
}
var curKey = cur["INDIV_ID"];
$P.dmndControl.dataset.select(curKey,true);
}
var selected = $P.dmndControl.dataset.getKeys("selected");
if (selected.length < 1) {
return;
}
var params = {
"indivIds" : selected.join(",")
};
ajax.post({
url : $P.dmndControl.urls.remove,
data : params,
success : (resp) => {
$P.removeCallback(selected, resp);
}
});
}
$P.removeCallback = (selected, resp) => {
if (resp.saved){
$("#toastText--${pageName}").html("삭제 되었습니다.");
$P.toast.show();
sleep(1000).then(() => $P.refreshDmndList());
}
}
$P.fnRemoveAllCompleteData = () => {
var cur = $P.dmndControl.dataset.getCurrent();
if(cur == null){
return;
}
var ds = $P.dmndControl.dataset.getDataset();
var indivIds = ds.filter(function(item){
if(item['STTS_CD'] == '9' || item['STTS_CD'] == 'B'){
return item["INDIV_ID"];
}
});
if(indivIds.length == 0){
dialog.alert({
content : "요청 완료자료가 없습니다.",
init : function() {
focusClose();
}
});
return;
}
dialog.alert({
content : "완료된 자료를 모두 삭제하시겠습니까?",
init : function() {
focusOK();
},
onOK : () => {
$P.fnRemove(indivIds);
}
});
}
//요청 등록 팝업 호출
$P.fnOpenDmndPop = () => {
dialog.open({
id : "seallDmndDialog--${pageName}",
title : "새올 접수 요청",
content : document.getElementById("seallDmndDialogTemplate--${pageName}").innerHTML,
size : "lg",
init : () => {
initDatepicker("seallDmndDialog--${pageName}");
$('#rcptYmd--${pageName}').datepicker('setDate', TODAY());
$('#btnCreate--${pageName}').on("click", () => $P.fnCreateDmnd());
},
onClose : () => {}
});
}
//요청 등록
$P.fnCreateDmnd = () => {
if(!customValidate($("#frmEdit--${pageName} input"))) return;
var info = (new FimsFormFields("#frmEdit--${pageName}")).get();
info.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val();
ajax.get({
url : $P.dmndControl.urls.create,
data : info,
success : (resp) => {
if(resp.saved){
dialog.close("seallDmndDialog--${pageName}");
$("#toastText--${pageName}").html("등록 되었습니다.");
$P.toast.show();
if(!$P.dmndControl.dataset.empty){
sleep(1000).then(() => $P.refreshDmndList());
}
}
}
});
}
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
$('#btnSearch--${pageName}').on('click', () => $P.searchDmndList());
$("#btnOpenDmndPop--${pageName}").on("click", () => $P.fnOpenDmndPop());
$("#btnDelete--${pageName}").on("click", () => $P.fnRemove(null));
$("#btnDeleteAllCompleteData--${pageName}").on("click", () => $P.fnRemoveAllCompleteData());
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDmndList);
/**************************************************************************
* 초기화
**************************************************************************/
//달력 초기화
initDatepicker("frmSearch--${pageName}");
var defaultBizValue = $("#layout-navbar input[name='taskSeCd']:checked").val();
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + defaultBizValue + "']").prop("checked",true);
$P.fnResetAndChangeBiz(defaultBizValue);
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
});
</script>

@ -1,792 +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="pageKorName" scope="request">민원신고 답변 문구 관리</c:set>
<div class="content-wrapper" id="wrapper--${pageName}">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${TaskListForSgg}" var="item">
<label>
<input name="taskSeCd" type="radio" value="${item.code}"
class="form-check-input" alt="업무구분"
onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
</div>
</div>
</form>
<div class="container-page-btn mt-3">
<button type="button" id="btnReset--${pageName}" class="btn btn-outline-dark w-px-120" title="초기화">
초기화
</button>
<span class="container-window-btn-right"></span>
</div>
<span class="d-flex justify-content-center">
<div class="nav-align-top mb-1 w-px-1300">
<ul class="nav nav-tabs" role="tablist">
<li class="nav-item">
<button type="button" id="btnAnsBasicTab--${pageName}" class="nav-link active"
role="tab" data-bs-toggle="tab">
머리말/꼬리말
</button>
</li>
<li class="nav-item">
<button type="button" id="btnLevyAnsBodyTab--${pageName}" class="nav-link"
role="tab" data-bs-toggle="tab">
부과건 답변내용
</button>
</li>
<li class="nav-item">
<button type="button" id="btnWarningAnsBodyTab--${pageName}" class="nav-link"
role="tab" data-bs-toggle="tab">
계도건 답변내용
</button>
</li>
<li class="nav-item">
<button type="button" id="btnNonlevyAnsBodyTab--${pageName}" class="nav-link"
role="tab" data-bs-toggle="tab">
미부과처리건 답변내용
</button>
</li>
</ul>
</div>
</span>
<div class="h-px-500 mt-1">
<!-- 머리말,꼬리말 영역 -->
<span class="area-answerbasic">
<div class="d-flex flex-row justify-content-center h-100">
<div class="card p-4 justify-content-center align-items-center w-px-1300">
<form id="frmEditAnsBasic--${pageName}">
<div class="w-px-900">
<div class="row">
<div class="col-12">
<label for="headerCn--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end align-top"
>머리말</label>
<textarea id="headerCn--${pageName}" name="headerCn"
rows="5" cols="80%" class="form-control" required
placeholder="머리말이 없습니다."
></textarea>
</div>
</div>
<div class="row">
<div class="col-12">
<label for="footerCn--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-end align-top"
>꼬리말</label>
<textarea id="footerCn--${pageName}" name="footerCn"
rows="5" cols="80%" class="form-control" required
placeholder="꼬리말이 없습니다."
></textarea>
</div>
</div>
<div class="row justify-content-end">
<div class="col-12">
<button type="button" id="btnSaveAnsBasic--${pageName}"
class="btn btn-primary float-end" title="적용">적용</button>
</div>
</div>
</div>
</form>
</div>
</div>
</span>
<!-- 본문처리 영역 -->
<span class="area-answerbody area-answerbody-common">
<div class="d-flex flex-row justify-content-center h-100">
<div class="card p-4 d-flex flex-row w-px-1300">
<!-- 그리드 영역 -->
<div class="card-datatable text-nowrap d-inline-flex border-card">
<div class="dataTables_wrapper dt-bootstrap5 no-footer">
<!-- 부과건 그리드 -->
<span class="area-answerbody area-levy">
<div id="table-responsive-levy--${pageName}"
class="table-responsive oy-auto h-100"
style="width:470px;">
<table class="datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr>
<th style="width:50px;"></th>
<th style="min-width: 300px;">위반내용</th>
</tr>
</thead>
<tbody id="vltnTbody--${pageName}"></tbody>
<template id="vltnRow--${pageName}">
<tr data-key="{VLTN_CASE_ID}">
<td class="text-center min-w-px-50 mw-px-50">
<input type="radio" name="levyRadio" value="{VLTN_CASE_ID}"
onchange="{onchange}" />
</td>
<td onclick="{onclick}" class="text-center">{VLTN_CASE_NM}</td>
</tr>
</template>
<template id="vltnNotFound--${pageName}">
<tr>
<td valign="top" colspan="2"
class="dataTables_empty text-center">정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</span>
<!-- 계도건 그리드 -->
<span class="area-answerbody area-warning">
<div id="table-responsive-warning--${pageName}"
class="table-responsive oy-auto h-100"
style="width:470px;">
<table class="datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr>
<th style="width:50px;"></th>
<th style="min-width: 300px;">계도내용</th>
</tr>
</thead>
<tbody id="warningTbody--${pageName}"></tbody>
<template id="warningRow--${pageName}">
<tr data-key="{LEVY_EXCL_RSN_CD}">
<td class="text-center min-w-px-50 mw-px-50">
<input type="radio" name="warningRadio" value="{LEVY_EXCL_RSN_CD}"
onchange="{onchange}" />
</td>
<td onclick="{onclick}" class="text-center">{LEVY_EXCL_RSN_NM}</td>
</tr>
</template>
<template id="warningNotFound--${pageName}">
<tr>
<td valign="top" colspan="2"
class="dataTables_empty text-center">정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</span>
<!-- 미부과처리건 그리드 -->
<span class="area-answerbody area-nonlevy">
<div id="table-responsive-nonlevy--${pageName}"
class="table-responsive oy-auto h-100"
style="width:470px;">
<table class="datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr>
<th style="width:50px;"></th>
<th style="min-width: 300px;">미부과사유</th>
<th style="min-width: 100px;">답변여부</th>
</tr>
</thead>
<tbody id="nonlevyTbody--${pageName}"></tbody>
<template id="nonlevyRow--${pageName}">
<tr data-key="{LEVY_EXCL_RSN_CD}">
<td class="text-center min-w-px-50 mw-px-50">
<input type="radio" name="nonlevyRadio" value="{LEVY_EXCL_RSN_CD}"
onchange="{onchange}" />
</td>
<td onclick="{onclick}" class="text-center">{LEVY_EXCL_RSN_NM}</td>
<td onclick="{onclick}" class="text-center">{USE_YN}</td>
</tr>
</template>
<template id="nonlevyNotFound--${pageName}">
<tr>
<td valign="top" colspan="3"
class="dataTables_empty text-center">정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</span>
</div>
</div>
<!-- 답변내용 표시영역 -->
<div class="w-px-800 d-inline-flex">
<div class="container-md d-flex justify-content-between flex-column">
<div class="row g-1 h-px-400 oy-auto border-separator-b">
<div class="col-12">
<form id="frmEditAnsBody--${pageName}">
<input type="hidden" id="ansRsnCd--${pageName}" name="ansRsnCd" />
<input type="hidden" id="dstrbncYn--${pageName}" name="dstrbncYn" />
<input type="hidden" id="ansWordsId--${pageName}" name="ansWordsId" />
<label for="prcsRsltCn--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-center">
답변내용
</label>
<br/>
<textarea id="prcsRsltCn--${pageName}" name="prcsRsltCn"
class="form-control w-100" required rows="15"
></textarea>
</form>
</div>
</div>
<div class="row g-1 py-2">
<div class="col-12">
<div class="btns float-start">
<button type="button" id="btnRemove--${pageName}"
class="btn btn-primary area-answerbody area-nonlevy"
title="답변대상 제외">답변대상 제외</button>
</div>
<div class="btns float-end">
<button type="button" id="btnOpenPreviewPop--${pageName}"
class="btn btn-primary" title="미리보기">미리보기</button>
<button type="button" id="btnSaveAnsBody--${pageName}"
class="btn btn-primary" title="적용">적용</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</span>
</div>
<!-- 매크로 삽입 버튼 영역 -->
<div class="mt-4 d-flex flex-row justify-content-center align-items-center">
<div class="card ps-3 py-3 w-px-1300">
<div class="row">
<div class="col-12 btns">
<strong>[매크로 문자 삽입]</strong>
<label id="macroTarget--${pageName}" for="" hidden></label>
<button type="button" id="btnInsertMacro1--${pageName}"
class="btn btn-primary" title="일련번호 삽입">일련번호</button>
<button type="button" id="btnInsertMacro2--${pageName}"
class="btn btn-primary" title="사용자 전화번호 삽입">사용자 전화번호</button>
<button type="button" id="btnInsertMacro3--${pageName}"
class="btn btn-primary" title="사용자 성명 삽입">사용자 성명</button>
</div>
</div>
</div>
</div>
<div class="toast-container position-fixed bottom-0 end-0 p-3">
<div id="divToast--${pageName}" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
<div class="toast-body bg-black text-white">
저장 되었습니다.
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<template id="previewDialogTemplate--${pageName}">
<form id="frmView--${pageName}">
<div class="card">
<textarea id="preview--${pageName}" rows="15"
></textarea>
</div>
<div>
<span class="container-page-btn">
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary" id="btnClose--${pageName}" title="닫기">닫기</button>
</span>
</span>
</div>
</form>
</template>
<script>
LoadScript("answerWordsScript","/resources/js/fims/cvlc/answerWords.js");
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
$P.toast = new bootstrap.Toast(document.getElementById('divToast--${pageName}'), {
animation: true,
autohide: true,
delay: 2000
});
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.ansBodyControl = new AnswerBodyControl({
dataGetter : obj => obj["levyCaseList"], urls : {}, formats : {},
keymapper : info => info ? info.VLTN_CASE_ID : ""
},
{
dataGetter : obj => obj["warningCaseList"], urls : {}, formats : {},
keymapper : info => info ? info.LEVY_EXCL_RSN_CD : ""
},
{
dataGetter : obj => obj["nonlevyCaseList"], urls : {}, formats : {},
keymapper : info => info ? info.LEVY_EXCL_RSN_CD : ""
});
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnResetAndChangeBiz = (taskSeCd) => {
$P.ansBodyControl.urls = {};
$P.ansBodyControl.urls.load = wctx.url("/"+taskSeCd+"/cvlc/cvlc05/010/info.do");
$P.ansBodyControl.urls.update = wctx.url("/"+taskSeCd+"/cvlc/cvlc05/010/save.do");
$P.ansBodyControl.urls.remove = wctx.url("/"+taskSeCd+"/cvlc/cvlc05/010/remove.do");
$P.fnReset();
}
$P.fnReset = () => {
$('#btnAnsBasicTab--${pageName}').trigger("click");
$P.ansBodyControl.levy.setData([]);
$P.ansBodyControl.warning.setData([]);
$P.ansBodyControl.nonlevy.setData([]);
$P.renderAnsBodyList(0,'levy');
$P.renderAnsBodyList(0,'warning');
$P.renderAnsBodyList(0,'nonlevy');
$("#frmEditAnsBasic--${pageName}").find("input, textarea").val("");
$("#frmEditAnsBody--${pageName}").find("input, textarea").val("");
$P.searchWordsStng();
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
return data;
}
$P.searchWordsStng = () => {
var taskSeCd = $("#frmSearch--${pageName}").find("input[name='taskSeCd']:checked").val();
ajax.get({
url : $P.ansBodyControl.urls.load,
data : {"taskSeCd" : taskSeCd},
success : (resp) => {
$("#headerCn--${pageName}").val(resp.headerCn);
$("#footerCn--${pageName}").val(resp.footerCn);
$P.ansBodyControl.levy.setData(resp.levyCaseList);
$P.ansBodyControl.warning.setData(resp.warningCaseList);
$P.ansBodyControl.nonlevy.setData(resp.nonlevyCaseList);
$P.renderAnsBodyList(resp.levyCaseList.length,'levy');
$P.renderAnsBodyList(resp.warningCaseList.length,'warning');
$P.renderAnsBodyList(resp.nonlevyCaseList.length,'nonlevy');
if(resp.levyCaseList.length > 0){
var current = $P.ansBodyControl.levy.getCurrent()["VLTN_CASE_ID"];
$P.clickAnsBodyList(current,'levy');
}
if(resp.warningCaseList.length > 0){
var current = $P.ansBodyControl.warning.getCurrent()["LEVY_EXCL_RSN_CD"];
$P.clickAnsBodyList(current,'warning');
}
if(resp.nonlevyCaseList.length > 0){
var current = $P.ansBodyControl.nonlevy.getCurrent()["LEVY_EXCL_RSN_CD"];
$P.clickAnsBodyList(current,'nonlevy');
}
}
});
}
$P.renderAnsBodyList = (total, renderDataType) => {
var notFoundId = "";
var foundId = "";
var tbodyId = "";
if(renderDataType == "levy"){
notFoundId = "vltnNotFound--${pageName}";
foundId = "vltnRow--${pageName}";
tbodyId = "vltnTbody--${pageName}";
} else if(renderDataType == "warning"){
notFoundId = "warningNotFound--${pageName}";
foundId = "warningRow--${pageName}";
tbodyId = "warningTbody--${pageName}";
} else if(renderDataType == "nonlevy"){
notFoundId = "nonlevyNotFound--${pageName}";
foundId = "nonlevyRow--${pageName}";
tbodyId = "nonlevyTbody--${pageName}";
} else {
return;
}
var ansBodyDS = $P.ansBodyControl[renderDataType].dataset;
var empty = ansBodyDS.empty;
var notFound = [document.getElementById(notFoundId).innerHTML];
var found = document.getElementById(foundId).innerHTML;
var replacer = () => {};
if(renderDataType == "levy"){
replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickAnsBodyList('" + dataItem.getValue("VLTN_CASE_ID") + "','levy');")
.replace(/{onchange}/gi, "pageObject['${pageName}'].radioClickAnsBodyList('" + dataItem.getValue("VLTN_CASE_ID") + "','levy');");
} else if(renderDataType == "warning"){
replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickAnsBodyList('" + dataItem.getValue("LEVY_EXCL_RSN_CD") + "','warning');")
.replace(/{onchange}/gi, "pageObject['${pageName}'].radioClickAnsBodyList('" + dataItem.getValue("LEVY_EXCL_RSN_CD") + "','warning');");
} else if(renderDataType == "nonlevy"){
replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickAnsBodyList('" + dataItem.getValue("LEVY_EXCL_RSN_CD") + "','nonlevy');")
.replace(/{onchange}/gi, "pageObject['${pageName}'].radioClickAnsBodyList('" + dataItem.getValue("LEVY_EXCL_RSN_CD") + "','nonlevy');");
}
var trs = empty ? notFound : ansBodyDS.inStrings(found, replacer);
$("#"+tbodyId).html(trs.join());
}
$P.radioClickAnsBodyList = (dataKey, gridType) => {
$P.ansBodyControl[gridType].setCurrent(dataKey);
var tbodyId = "";
if(gridType == "levy"){
tbodyId = "vltnTbody--${pageName}";
} else if(gridType == "warning"){
tbodyId = "warningTbody--${pageName}";
} else if(gridType == "nonlevy"){
tbodyId = "nonlevyTbody--${pageName}";
} else {
return;
}
$("#"+tbodyId).setCurrentRow(dataKey);
if(gridType == "levy" && $P.currentDisplay == "levyAnsBody"){
$P.changeAnsBodyText();
} else if(gridType == "warning" && $P.currentDisplay == "warningAnsBody"){
$P.changeAnsBodyText();
} else if(gridType == "nonlevy" && $P.currentDisplay == "nonlevyAnsBody"){
$P.changeAnsBodyText();
}
}
$P.clickAnsBodyList = (dataKey, gridType) => {
var radioName = "";
if(gridType == "levy"){
radioName = "levyRadio";
} else if(gridType == "warning"){
radioName = "warningRadio";
} else if(gridType == "nonlevy"){
radioName = "nonlevyRadio";
} else {
return;
}
$("#wrapper--${pageName}").find(":radio[name='"+radioName+"'][value='"+dataKey+"']").prop("checked",true);
if(gridType == "levy" && $P.currentDisplay == "levyAnsBody"){
$("#wrapper--${pageName}").find(":radio[name='"+radioName+"'][value='"+dataKey+"']").focus();
} else if(gridType == "warning" && $P.currentDisplay == "warningAnsBody"){
$("#wrapper--${pageName}").find(":radio[name='"+radioName+"'][value='"+dataKey+"']").focus();
} else if(gridType == "nonlevy" && $P.currentDisplay == "nonlevyAnsBody"){
$("#wrapper--${pageName}").find(":radio[name='"+radioName+"'][value='"+dataKey+"']").focus();
}
$P.radioClickAnsBodyList(dataKey, gridType);
}
$P.changeAnsBodyText = () => {
var curData = null;
var rnsRsnCd = "";
var dstrbncYn = "";
if($P.currentDisplay == "levyAnsBody"){
curData = $P.ansBodyControl.levy.getCurrent();
} else if($P.currentDisplay == "warningAnsBody"){
curData = $P.ansBodyControl.warning.getCurrent();
} else if($P.currentDisplay == "nonlevyAnsBody"){
curData = $P.ansBodyControl.nonlevy.getCurrent();
}
if(curData == null){
$("#ansRsnCd--${pageName}").val("");
$("#dstrbncYn--${pageName}").val("");
$("#ansWordsId--${pageName}").val("");
$("#prcsRsltCn--${pageName}").val("");
return;
}
if($P.currentDisplay == "levyAnsBody"){
if(curData["VLTN_CASE_ID"].endsWith("D")){
rnsRsnCd = "3" + curData["VLTN_CASE_ID"].substring(0,2);
dstrbncYn = "Y";
} else {
rnsRsnCd = "3" + curData["VLTN_CASE_ID"];
dstrbncYn = "N";
}
} else if($P.currentDisplay == "warningAnsBody"){
rnsRsnCd = curData["LEVY_EXCL_RSN_CD"]
} else if($P.currentDisplay == "nonlevyAnsBody"){
rnsRsnCd = curData["LEVY_EXCL_RSN_CD"]
if(curData["ANS_WORDS_ID"] == null){
$("#btnRemove--${pageName}").prop("disabled",true);
} else {
$("#btnRemove--${pageName}").prop("disabled",false);
}
}
$("#ansRsnCd--${pageName}").val(rnsRsnCd);
$("#dstrbncYn--${pageName}").val(dstrbncYn);
$("#ansWordsId--${pageName}").val(curData["ANS_WORDS_ID"]);
$("#prcsRsltCn--${pageName}").val(curData["PRCS_RSLT_CN"]);
}
$P.refreshAnsWordsInfo = () => {
var cursor1 = $P.ansBodyControl.levy.getCurrent()["VLTN_CASE_ID"];
var cursor2 = $P.ansBodyControl.warning.getCurrent()["LEVY_EXCL_RSN_CD"];
var cursor3 = $P.ansBodyControl.nonlevy.getCurrent()["LEVY_EXCL_RSN_CD"];
var taskSeCd = $("#frmSearch--${pageName}").find("input[name='taskSeCd']:checked").val();
ajax.get({
url : $P.ansBodyControl.urls.load,
data : {"taskSeCd" : taskSeCd},
success : (resp) => {
$("#headerCn--${pageName}").val(resp.headerCn);
$("#footerCn--${pageName}").val(resp.footerCn);
$P.ansBodyControl.levy.setData(resp.levyCaseList);
$P.ansBodyControl.warning.setData(resp.warningCaseList);
$P.ansBodyControl.nonlevy.setData(resp.nonlevyCaseList);
$P.renderAnsBodyList(resp.levyCaseList.length,'levy');
$P.renderAnsBodyList(resp.warningCaseList.length,'warning');
$P.renderAnsBodyList(resp.nonlevyCaseList.length,'nonlevy');
if(resp.levyCaseList.length > 0){
$P.ansBodyControl.levy.setCurrent(cursor1);
var current = $P.ansBodyControl.levy.getCurrent()["VLTN_CASE_ID"];
$P.clickAnsBodyList(current,'levy');
}
if(resp.warningCaseList.length > 0){
$P.ansBodyControl.warning.setCurrent(cursor2);
var current = $P.ansBodyControl.warning.getCurrent()["LEVY_EXCL_RSN_CD"];
$P.clickAnsBodyList(current,'warning');
}
if(resp.nonlevyCaseList.length > 0){
$P.ansBodyControl.nonlevy.setCurrent(cursor3);
var current = $P.ansBodyControl.nonlevy.getCurrent()["LEVY_EXCL_RSN_CD"];
$P.clickAnsBodyList(current,'nonlevy');
}
}
});
}
//적용
$P.fnSave = (isBasicWords) => {
var formId = "";
var confirmMessage = "";
if(isBasicWords){
confirmMessage = "머리말/꼬리말 내용을 저장하시겠습니까?";
formId = "frmEditAnsBasic--${pageName}";
} else {
confirmMessage = "본문내용을 저장하시겠습니까?"
formId = "frmEditAnsBody--${pageName}";
}
if(!customValidate($("#"+formId).find("input, select, textarea"))) return;
var info = (new FimsFormFields("#"+formId)).get();
if(isBasicWords){
info.saveData = "basic";
} else {
info.saveData = "body";
}
info.taskSeCd = $("#frmSearch--${pageName}").find("input[name='taskSeCd']:checked").val();
dialog.alert({
content : confirmMessage,
init : function() { focusOK(); },
onOK: () => {
ajax.get({
url : $P.ansBodyControl.urls.update,
data : info,
success : (resp) => {
if(resp.saved){
$P.toast.show();
sleep(1000).then(() => $P.refreshAnsWordsInfo());
}
}
});
}
});
}
//답변대상 제외
$P.fnRemove = () => {
if(!customValidate($("#frmEditAnsBody--${pageName}").find("input, select, textarea"))) return;
var info = (new FimsFormFields("#frmEditAnsBody--${pageName}")).get();
dialog.alert({
content : "해당 미부과사유를 답변대상에서 제외하시겠습니까?",
init : function() { focusOK(); },
onOK: () => {
ajax.get({
url : $P.ansBodyControl.urls.remove,
data : info,
success : (resp) => {
if(resp.saved){
$P.toast.show();
sleep(1000).then(() => $P.refreshAnsWordsInfo());
}
}
});
}
});
}
//미리보기 팝업 호출
$P.fnOpenPreviewPop = () => {
var result = fnMacroWordsReplace(
$("#headerCn--${pageName}").val(),
$("#footerCn--${pageName}").val(),
$("#prcsRsltCn--${pageName}").val(),
"${currentUserTelno}",
"${currentUserName}"
);
dialog.open({
id : "previewDialog--${pageName}",
title : "답변 내용 미리보기",
content : document.getElementById("previewDialogTemplate--${pageName}").innerHTML,
size : "lg",
init : () => {
$("#preview--${pageName}").val(result);
$("#btnClose--${pageName}").on("click", () => dialog.close("previewDialog--${pageName}"));
},
onOk : () => {},
onClose : () => {}
});
}
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
//탭 버튼
$('#btnAnsBasicTab--${pageName}').on('click', (event) => {
$("#wrapper--${pageName}").find(".area-answerbasic").show();
$("#wrapper--${pageName}").find(".area-answerbody").hide();
$P.currentDisplay = "ansBasic";
$("#macroTarget--${pageName}").attr("for","");
});
$('#btnLevyAnsBodyTab--${pageName}').on('click', (event) => {
$("#wrapper--${pageName}").find(".area-answerbasic").hide();
$("#wrapper--${pageName}").find(".area-answerbody").each(function(){
if($(this).hasClass("area-answerbody-common") || $(this).hasClass("area-levy")){
$(this).show();
} else {
$(this).hide();
}
});
$P.currentDisplay = "levyAnsBody";
$("#wrapper--${pageName}").find(":radio[name='levyRadio']:checked").focus();
$P.changeAnsBodyText();
$("#macroTarget--${pageName}").attr("for","");
});
$('#btnWarningAnsBodyTab--${pageName}').on('click', (event) => {
$("#wrapper--${pageName}").find(".area-answerbasic").hide();
$("#wrapper--${pageName}").find(".area-answerbody").each(function(){
if($(this).hasClass("area-answerbody-common") || $(this).hasClass("area-warning")){
$(this).show();
} else {
$(this).hide();
}
});
$P.currentDisplay = "warningAnsBody";
$("#wrapper--${pageName}").find(":radio[name='warningRadio']:checked").focus();
$P.changeAnsBodyText();
$("#macroTarget--${pageName}").attr("for","");
});
$('#btnNonlevyAnsBodyTab--${pageName}').on('click', (event) => {
$("#wrapper--${pageName}").find(".area-answerbasic").hide();
$("#wrapper--${pageName}").find(".area-answerbody").each(function(){
if($(this).hasClass("area-answerbody-common") || $(this).hasClass("area-nonlevy")){
$(this).show();
} else {
$(this).hide();
}
});
$P.currentDisplay = "nonlevyAnsBody";
$("#wrapper--${pageName}").find(":radio[name='nonlevyRadio']:checked").focus();
$P.changeAnsBodyText();
$("#macroTarget--${pageName}").attr("for","");
});
//업무처리 버튼
$("#btnSaveAnsBasic--${pageName}").on("click", () => $P.fnSave(true));
$("#btnSaveAnsBody--${pageName}").on("click", () => $P.fnSave(false));
$("#btnRemove--${pageName}").on("click", () => $P.fnRemove());
$("#btnOpenPreviewPop--${pageName}").on("click", () => $P.fnOpenPreviewPop());
$("#headerCn--${pageName},#footerCn--${pageName},#prcsRsltCn--${pageName}").on("focus", (event) => {
$("#macroTarget--${pageName}").attr("for", event.target.id);
});
$("#btnInsertMacro1--${pageName}").on("click", () => {
var macroTarget = $("#macroTarget--${pageName}").attr("for");
if(macroTarget == ""){ return; }
fnMacroStringInsert(macroTarget, MACRO_STRING.MACRO_SEQ);
});
$("#btnInsertMacro2--${pageName}").on("click", () => {
var macroTarget = $("#macroTarget--${pageName}").attr("for");
if(macroTarget == ""){ return; }
fnMacroStringInsert(macroTarget, MACRO_STRING.MACRO_TELNO);
});
$("#btnInsertMacro3--${pageName}").on("click", () => {
var macroTarget = $("#macroTarget--${pageName}").attr("for");
if(macroTarget == ""){ return; }
fnMacroStringInsert(macroTarget, MACRO_STRING.MACRO_PIC_NM);
});
/**************************************************************************
* 초기화
**************************************************************************/
var defaultBizValue = $("#layout-navbar input[name='taskSeCd']:checked").val();
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + defaultBizValue + "']").prop("checked",true);
$P.fnResetAndChangeBiz(defaultBizValue);
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
});
</script>

@ -1,318 +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="pageKorName" scope="request">계도문 문구 관리</c:set>
<div class="content-wrapper" id="wrapper--${pageName}">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${TaskListForSgg}" var="item">
<label>
<input name="taskSeCd" type="radio" value="${item.code}"
class="form-check-input" alt="업무구분"
onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
</div>
</div>
</form>
<div class="container-page-btn mt-3">
<button type="button" id="btnReset--${pageName}" class="btn btn-outline-dark w-px-120" title="초기화">
초기화
</button>
</div>
<div class="h-px-500 mt-4">
<div class="d-flex flex-row justify-content-center h-100">
<div class="card p-4 d-flex flex-row w-px-1300">
<!-- 그리드 영역 -->
<div class="card-datatable text-nowrap d-inline-flex border-card">
<div class="dataTables_wrapper dt-bootstrap5 no-footer">
<div class="table-responsive oy-auto h-100"
style="width:470px;">
<table class="datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr>
<th style="width:50px;"></th>
<th style="min-width: 300px;">계도사유</th>
</tr>
</thead>
<tbody id="warningWordsTbody--${pageName}"></tbody>
<template id="warningWordsRow--${pageName}">
<tr data-key="{LEVY_EXCL_RSN_CD}">
<td class="text-center min-w-px-50 mw-px-50">
<input type="radio" name="gridRadio" value="{LEVY_EXCL_RSN_CD}"
onchange="{onchange}" />
</td>
<td onclick="{onclick}" class="text-center">{LEVY_EXCL_RSN_NM}</td>
</tr>
</template>
<template id="warningWordsNotFound--${pageName}">
<tr>
<td valign="top" colspan="2"
class="dataTables_empty text-center">정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- 제목,내용 표시영역 -->
<div class="w-px-800 d-inline-flex">
<div class="container-md d-flex justify-content-between flex-column">
<div class="row g-1 h-px-400 border-separator-b oy-auto">
<div class="col-12">
<form id="frmEditWarningWords--${pageName}">
<input type="hidden" id="ansRsnCd--${pageName}" name="ansRsnCd" />
<input type="hidden" id="ansWordsId--${pageName}" name="ansWordsId" />
<label for="mailTtlNm--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-center">제목</label>
<input type="text" id="mailTtlNm--${pageName}" name="mailTtlNm" required
class="form-control w-px-500" />
<br/>
<label for="mailCn--${pageName}"
class="w-px-130 bg-lighter pe-2 col-form-label text-sm-center" hidden>
내용
</label>
<textarea id="mailCn--${pageName}" name="mailCn" class="form-control w-100"
required rows="15"
></textarea>
</form>
</div>
</div>
<div class="row g-1 py-2">
<div class="col-12">
<div class="btns float-end">
<button type="button" id="btnSave--${pageName}"
class="btn btn-primary" title="적용">적용</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="toast-container position-fixed bottom-0 end-0 p-3">
<div id="divToast--${pageName}" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
<div class="toast-body bg-black text-white">
저장 되었습니다.
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
$P.toast = new bootstrap.Toast(document.getElementById('divToast--${pageName}'), {
animation: true,
autohide: true,
delay: 2000
});
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.warningWordsControl = new DatasetControl({
dataGetter : obj => obj["List"],
keymapper : info => info ? info.LEVY_EXCL_RSN_CD : "",
urls : {},
formats : {}
});
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnResetAndChangeBiz = (taskSeCd) => {
$P.warningWordsControl.urls = {};
$P.warningWordsControl.urls.load = wctx.url("/"+taskSeCd+"/cvlc/cvlc06/010/list.do");
$P.warningWordsControl.urls.update = wctx.url("/"+taskSeCd+"/cvlc/cvlc06/010/save.do");
$P.fnReset();
}
$P.fnReset = () => {
$P.warningWordsControl.dataset.setData([]);
$P.renderWarningWordsList(0);
$("#frmEditWarningWords--${pageName}").find("input, textarea").val("");
$P.searchWordsStng();
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
return data;
}
$P.searchWordsStng = () => {
var taskSeCd = $("#frmSearch--${pageName}").find("input[name='taskSeCd']:checked").val();
ajax.get({
url : $P.warningWordsControl.urls.load,
data : {"taskSeCd" : taskSeCd},
success : (resp) => {
$P.warningWordsControl.dataset.setData(resp.List);
$P.renderWarningWordsList(resp.List.length);
if(resp.List.length > 0){
var current = $P.warningWordsControl.dataset.getCurrent()["LEVY_EXCL_RSN_CD"];
$P.clickWarningWordsList(current);
}
}
});
}
$P.renderWarningWordsList = (total) => {
var warningWordsDS = $P.warningWordsControl.dataset;
var empty = warningWordsDS.empty;
var notFound = [document.getElementById("warningWordsNotFound--${pageName}").innerHTML];
var found = document.getElementById("warningWordsRow--${pageName}").innerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickWarningWordsList('" + dataItem.getValue("LEVY_EXCL_RSN_CD") + "');")
.replace(/{onchange}/gi, "pageObject['${pageName}'].radioClickWarningWordsList('" + dataItem.getValue("LEVY_EXCL_RSN_CD") + "');");
var trs = empty ? notFound : warningWordsDS.inStrings(found, replacer);
$("#warningWordsTbody--${pageName}").html(trs.join());
}
$P.radioClickWarningWordsList = (dataKey, gridType) => {
$P.warningWordsControl.dataset.setCurrent(dataKey);
$("#warningWordsTbody--${pageName}").setCurrentRow(dataKey);
$P.changeTextarea();
}
$P.clickWarningWordsList = (dataKey, gridType) => {
$("#wrapper--${pageName}").find(":radio[name='gridRadio'][value='"+dataKey+"']").prop("checked",true);
$("#wrapper--${pageName}").find(":radio[name='gridRadio'][value='"+dataKey+"']").focus();
$P.radioClickWarningWordsList(dataKey, gridType);
}
$P.changeTextarea = () => {
var curData = $P.warningWordsControl.dataset.getCurrent();
if(curData == null){
$("#ansRsnCd--${pageName}").val("");
$("#ansWordsId--${pageName}").val("");
$("#mailTtlNm--${pageName}").val("");
$("#mailCn--${pageName}").val("");
return;
}
$("#ansRsnCd--${pageName}").val(curData["LEVY_EXCL_RSN_CD"]);
$("#ansWordsId--${pageName}").val(curData["ANS_WORDS_ID"]);
$("#mailTtlNm--${pageName}").val(curData["MAIL_TTL_NM"]);
$("#mailCn--${pageName}").val(curData["MAIL_CN"]);
}
$P.refreshWarningWordsInfo = () => {
var cursor = $P.warningWordsControl.dataset.getCurrent()["LEVY_EXCL_RSN_CD"];
var taskSeCd = $("#frmSearch--${pageName}").find("input[name='taskSeCd']:checked").val();
ajax.get({
url : $P.warningWordsControl.urls.load,
data : {"taskSeCd" : taskSeCd},
success : (resp) => {
$P.warningWordsControl.dataset.setData(resp.List);
$P.renderWarningWordsList(resp.List.length);
if(resp.List.length > 0){
$P.warningWordsControl.dataset.setCurrent(cursor);
var current = $P.warningWordsControl.dataset.getCurrent()["LEVY_EXCL_RSN_CD"];
$P.clickWarningWordsList(current,'warning');
}
}
});
}
//적용
$P.fnSave = () => {
if(!customValidate($("#frmEditWarningWords--${pageName}").find("input, select, textarea"))) return;
var info = (new FimsFormFields("#frmEditWarningWords--${pageName}")).get();
info.taskSeCd = $("#frmSearch--${pageName}").find("input[name='taskSeCd']:checked").val();
dialog.alert({
content : "저장하시겠습니까?",
init : function() {
focusOK();
},
onOK: () => {
ajax.get({
url : $P.warningWordsControl.urls.update,
data : info,
success : (resp) => {
if(resp.saved){
$P.toast.show();
sleep(1000).then(() => $P.refreshWarningWordsInfo());
}
}
});
}
});
}
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
//업무처리 버튼
$("#btnSave--${pageName}").on("click", () => $P.fnSave());
/**************************************************************************
* 초기화
**************************************************************************/
var defaultBizValue = $("#layout-navbar input[name='taskSeCd']:checked").val();
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + defaultBizValue + "']").prop("checked",true);
$P.fnResetAndChangeBiz(defaultBizValue);
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
});
</script>

@ -1,590 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 발송 구분 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSndngSeCd--${pageName}">발송구분</label>
<select class="form-select w-px-160" id="schSndngSeCd--${pageName}" name="schSndngSeCd">
<option value="">전체</option>
<c:forEach items="${FIM047List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 동적검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 등록일자, 수정일자 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnCreate--${pageName}" title="안내문 등록">
안내문 등록
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnUpdate--${pageName}" title="안내문 수정">
안내문 수정
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnRemove--${pageName}" title="안내문 삭제">
안내문 삭제
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;">업무구분</th>
<th class="cmn" style="width: 140px;">발송구분</th>
<th class="cmn" style="width: 180px;">최종사용일시</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('TTL_NM', this.innerText, 'match', 'part');">제목</th>
<th class="cmn" style="width: 400px;">문구내용</th>
<th class="cmn" style="width: 100px;">사용여부</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{GDNTC_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{GDNTC_ID}" onchange="pageObject['${pageName}'].control.select('{GDNTC_ID}', this.checked);"></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LAST_USE_DT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{TTL_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{WORDS_CN}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{USE_YN_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="13" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "epostGdntc"
, prefixName: "전자우편 안내문"
, keymapper: info => info ? info.GDNTC_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "md"
, formats: {
LAST_USE_DT: datetimeFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.GDNTC_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 삭제 버튼
$("#btnRemove--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 상세정보 dialog
$P.control.getInfo = (gdntcId) => {
let dialogTitle = "";
let params = {};
if (typeof gdntcId == "undefined" || gdntcId == null || gdntcId == "") {
dialogTitle = $P.control.prefixName + " 등록";
params.callPurpose = "create";
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
} else {
dialogTitle = $P.control.prefixName + " 수정";
params.callPurpose = "update";
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
params.gdntcId = gdntcId;
}
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/020/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("Dialog--${pageName}")
, title: dialogTitle
, content: resp
, size: $P.control.infoSize
, onClose : () => { $P.fnRefreshList(); } // 자료 재조회
});
}
});
}
// 삭제 callback
$P.control.onRemove = (resp) => {
let btnTitle = $("#btnRemove--${pageName}").attr("title");
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, btnTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) { $P.fnRefreshList(); } // 자료 재조회
}
// 삭제
$P.control.remove = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/010/remove.do")
, data: params || {}
, success: resp => $P.control.onRemove(resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("GDNTC_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].control.getInfo('" + dataItem.getValue("GDNTC_ID") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경 이벤트
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 전자우편 안내문 등록 버튼 이벤트
$P.fnCreate = (title) => {
$P.control.getInfo();
}
// 전자우편 안내문 수정 버튼 이벤트
$P.fnUpdate = (title) => {
// 안내문 ID
let gdntcId = $P.control.dataset.getValue("GDNTC_ID");
// 안내문 ID 가 없다면.. return
if (typeof gdntcId == "undefined" || gdntcId == null || gdntcId == "") return;
$P.control.getInfo(gdntcId);
}
// 삭제 버튼 이벤트
$P.fnRemove = (title) => {
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) return;
let params = {};
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
params.gdntcIds = selected.join(","); // params[$P.control.prefixed("IDs")] = selected.join(",");
dialog.alert({
content: "선택한 " + $P.control.prefixName + " 정보를 삭제하시겠습니까?"
, onOK: () => {
$P.control.remove(params);
}
});
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 버튼 이벤트
$("#btnCreate--${pageName}").on("click", function() {
$P.fnCreate($(this).attr("title")); // 안내문 등록
});
$("#btnUpdate--${pageName}").on("click", function() {
$P.fnUpdate($(this).attr("title")); // 안내문 수정
});
$("#btnRemove--${pageName}").on("click", function() {
$P.fnRemove($(this).attr("title")); // 안내문 삭제
});
// DataTables width 변경 조정 업무별 그리드가 존재 한다면.. crdn06010-main.jsp 참고
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/010/list.do"); // 검색
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,207 +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>
<!-- inner page html -->
<div class="content-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<input type="hidden" id="gdntcId--${pageName}" name="gdntcId" data-map="GDNTC_ID" />
<div class="row g-1">
<!-- 발송 구분 코드 -->
<div class="col-md-12">
<label for="sndngSeCd--${pageName}" class="w-px-100 bg-lighter pe-2 col-form-label text-sm-end required">발송구분</label>
<select class="form-select" id="sndngSeCd--${pageName}" name="sndngSeCd" data-map="SNDNG_SE_CD" required>
<option value="">선택하세요</option>
<c:forEach items="${FIM047List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 제목 명 -->
<div class="col-md-12">
<label for="ttlNm--${pageName}" class="w-px-100 bg-lighter pe-2 col-form-label text-sm-end required">제목</label>
<input type="text" class="form-control w-75" id="ttlNm--${pageName}" name="ttlNm" data-map="TTL_NM" required autocomplete="off" />
</div>
<!-- 문구 내용 -->
<div class="col-md-12">
<label for="wordsCn--${pageName}" class="w-px-100 bg-lighter pe-2 col-form-label text-sm-end">문구내용</label>
</div>
<div class="col-md-12">
<textarea class="form-control w-100" id="wordsCn--${pageName}" name="wordsCn" data-map="WORDS_CN" rows="15" data-maxlengthb="4000" autocomplete="off"></textarea>
</div>
</div>
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-80" id="btnSave--${pageName}" title="저장">
저장
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
</div> <!-- <div class="card"> -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "epostGdntc"
, prefixName: "안내문 정보"
, keymapper: info => info ? info.GDNTC_ID : ""
, dataGetter: obj => obj.${infoPrefix}Info
});
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
// Dataset 셋팅
$P.formFields.set($P.control, item);
// 업무구분에 따른 URL 변경
$P.fnSetURL(item.data.TASK_SE_CD);
}
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
let create = ($P.callPurpose == "create");
ajax.post({
url: !create ? $P.control.urls.update : $P.control.urls.create
, data: info
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 업무구분에 따른 URL 설정
$P.fnSetURL = (taskSeCd) => {
$P.control.urls.create = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/020/create.do"); // 등록
$P.control.urls.update = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/020/update.do"); // 수정
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 저장
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.control.save($P.formFields.get()); // formFields
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmEdit--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-","");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장
}
// 초기 화면 설정
$P.initForm = () => {
// View로 호출
if ($P.callPurpose == "view") {
// input 요소들을 disabled
$("#frmEdit--${pageName}").find("input,textarea,select").prop("disabled", true);
// button 요소들을 disabled
$("#btnSave--${pageName}").prop("disabled", true); // 저장 버튼
}
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. Dataset 설정
$P.control.setData([${epostGdntcInfo}]);
});
</script>

@ -1,855 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<input type="hidden" id="deptCd--${pageName}" name="deptCd" />
<input type="hidden" id="conOrg--${pageName}" name="conOrg" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 발송 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSendDateFrom--${pageName}">발송일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schSendDateFrom--${pageName}" name="schSendDateFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schSendDateTo--${pageName}" name="schSendDateTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 접수 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRceptYmdFrom--${pageName}">접수일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRceptYmdFrom--${pageName}" name="schRceptYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRceptYmdTo--${pageName}" name="schRceptYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- -->
<div class="col-6">
</div>
<!-- 동적검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 등록일자, 수정일자 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnUpdate--${pageName}" title="발송 취소">
발송 취소
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnRemove--${pageName}" title="발송 삭제">
발송 삭제
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- tab -->
<div class="nav-align-top">
<ul class="nav nav-tabs" id="tabs--${pageName}" role="tablist">
<li class="nav-item">
<button type="button" class="nav-link w-px-160 h-100 active" role="tab" data-bs-toggle="tab" data-bs-target="#tabEpostRcpt0"
aria-controls="tabEpostRcpt0" aria-selected="true" onClick="pageObject['${pageName}'].fnTabEpostRcpt0();">
전체
</button>
</li>
<li class="nav-item">
<button type="button" class="nav-link w-px-160 h-100" role="tab" data-bs-toggle="tab" data-bs-target="#tabEpostRcpt1"
aria-controls="tabEpostRcpt1" aria-selected="false" onClick="pageObject['${pageName}'].fnTabEpostRcpt1();">
발송대기
</button>
</li>
<li class="nav-item">
<button type="button" class="nav-link w-px-160 h-100" role="tab" data-bs-toggle="tab" data-bs-target="#tabEpostRcpt2"
aria-controls="tabEpostRcpt2" aria-selected="false" onClick="pageObject['${pageName}'].fnTabEpostRcpt2();">
발송취소
</button>
</li>
<li class="nav-item">
<button type="button" class="nav-link w-px-160 h-100" role="tab" data-bs-toggle="tab" data-bs-target="#tabEpostRcpt3"
aria-controls="tabEpostRcpt3" aria-selected="false" onClick="pageObject['${pageName}'].fnTabEpostRcpt3();">
전송
</button>
</li>
<li class="nav-item">
<button type="button" class="nav-link w-px-160 h-100" role="tab" data-bs-toggle="tab" data-bs-target="#tabEpostRcpt4"
aria-controls="tabEpostRcpt4" aria-selected="false" onClick="pageObject['${pageName}'].fnTabEpostRcpt4();">
접수
</button>
</li>
<li class="nav-item">
<button type="button" class="nav-link w-px-160 h-100" role="tab" data-bs-toggle="tab" data-bs-target="#tabEpostRcpt5"
aria-controls="tabEpostRcpt5" aria-selected="false" onClick="pageObject['${pageName}'].fnTabEpostRcpt5();">
제작불가
</button>
</li>
<li class="nav-item">
<button type="button" class="nav-link w-px-160 h-100" role="tab" data-bs-toggle="tab" data-bs-target="#tabEpostRcpt6"
aria-controls="tabEpostRcpt6" aria-selected="false" onClick="pageObject['${pageName}'].fnTabEpostRcpt6();">
제작
</button>
</li>
<li class="nav-item">
<button type="button" class="nav-link w-px-160 h-100" role="tab" data-bs-toggle="tab" data-bs-target="#tabEpostRcpt7"
aria-controls="tabEpostRcpt7" aria-selected="false" onClick="pageObject['${pageName}'].fnTabEpostRcpt7();">
배달중
</button>
</li>
<li class="nav-item">
<button type="button" class="nav-link w-px-160 h-100" role="tab" data-bs-toggle="tab" data-bs-target="#tabEpostRcpt8"
aria-controls="tabEpostRcpt8" aria-selected="false" onClick="pageObject['${pageName}'].fnTabEpostRcpt8();">
배달완료
</button>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane fade show active" id="tabEpostRcpt0" role="tabpanel"></div>
<div class="tab-pane fade" id="tabEpostRcpt1" role="tabpanel"></div>
<div class="tab-pane fade" id="tabEpostRcpt2" role="tabpanel"></div>
<div class="tab-pane fade" id="tabEpostRcpt3" role="tabpanel"></div>
<div class="tab-pane fade" id="tabEpostRcpt4" role="tabpanel"></div>
<div class="tab-pane fade" id="tabEpostRcpt5" role="tabpanel"></div>
<div class="tab-pane fade" id="tabEpostRcpt6" role="tabpanel"></div>
<div class="tab-pane fade" id="tabEpostRcpt7" role="tabpanel"></div>
<div class="tab-pane fade" id="tabEpostRcpt8" role="tabpanel"></div>
</div>
</div>
<!-- tab -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap" id="datatable--${pageName}">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SEND_DATE', this.innerText, 'ymd', '');">발송일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('JOB_CD', this.innerText, 'match', 'part');">발송내역</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('DIV_KB', this.innerText, 'codeValue', 'EGP002');">취급구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCEPT_YMD', this.innerText, 'ymd', '');">접수일자</th>
<th class="cmn" style="width: 240px;" onclick="searchFromGridTitle('CON_KEY', this.innerText, 'match', 'part');">자료키</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RECEV_CNT', this.innerText, 'match', 'part');">발송건수</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('POST_PRCS_STTS_CD', this.innerText, 'codeValue', 'EGP012');">우편처리상태</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{CON_KEY}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{CON_KEY}" onchange="pageObject['${pageName}'].control.select('{CON_KEY}', this.checked);"></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SEND_DATE}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{JOB_CD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DIV_KB_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCEPT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CON_KEY}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{RECEV_CNT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{POST_PRCS_STTS_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="12" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "epostRcptReg"
, prefixName: "우편 발송"
, keymapper: info => info ? info.CON_KEY : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "xxl"
, formats: {
SEND_DATE: dateFormat
, RCEPT_YMD: dateFormat
, RECEV_CNT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.CON_KEY;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 삭제 버튼
$("#btnRemove--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 상세정보 dialog
$P.control.getInfo = (callPurpose, conKey) => {
if (typeof conKey == "undefined" || conKey == null || conKey == "") return;
if (typeof callPurpose == "undefined" || callPurpose == null || callPurpose == "") {
callPurpose = "view";
}
let params = {
callPurpose: callPurpose
, sggCd: $("#sggCd--${pageName}").val() // 시군구 코드
, taskSeCd: $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val() // 업무 구분 코드
, conKey: conKey //
}
let dialogTitle = "";
if (params.callPurpose == "create") {
dialogTitle = $P.control.prefixName + " 등록";
} else if (params.callPurpose == "update") {
dialogTitle = $P.control.prefixName + " 수정";
} else {
dialogTitle = $P.control.prefixName + " 정보";
}
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/040/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("DtlDialog--${pageName}")
, title: dialogTitle
, content: resp
, size: $P.control.infoSize
});
}
});
}
// 저장 callback
$P.control.onSave = (resp) => {
let btnTitle = $("#btnUpdate--${pageName}").attr("title");
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, btnTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, onOK: () => { }
});
if (resp.saved) { $P.fnRefreshList(); } // 자료 재조회
}
// 저장
$P.control.save = (info) => {
if (!info) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/030/updateSttsCd.do") // 발송취소
, data: info || {}
, success: resp => $P.control.onSave(resp)
});
}
// 삭제 callback
$P.control.onRemove = (selected, resp) => {
let btnTitle = $("#btnRemove--${pageName}").attr("title");
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, btnTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, onOK: () => { }
});
if (resp.saved) { $P.fnRefreshList(); } // 자료 재조회
}
// 삭제
$P.control.remove = (params) => {
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) return;
if (!params) {
params = {};
params["conKeys"] = selected.join(","); // params[$P.control.prefixed("IDs")] = selected.join(",");
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
}
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/030/remove.do")
, data: params || {}
, success: resp => $P.control.onRemove(selected, resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("CON_KEY") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].control.getInfo('view', '" + dataItem.getValue("CON_KEY") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
// 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
/**************************************************************************
* 사용자 함수
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = (clickTab) => {
// 검색조건
$P.control.query = $P.formFields.get();
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
$P.control.query.conOrg = $("#conOrg--${pageName}").val(); // 외부기관구분코드
$P.control.query.relorsectCd = $("#deptCd--${pageName}").val(); // 결제부서코드(부서코드)
$P.control.query.delYn = "N"; // 삭제 여부
// 탭 선택에 따른 우편 처리 상태(POST_PROC_STT) 설정.
if (clickTab == "tab1") { // 발송대기
$P.control.query.postPrcsSttsCdFrom = "01";
$P.control.query.postPrcsSttsCdTo = "01";
} else if (clickTab == "tab2") { // 발송취소
$P.control.query.postPrcsSttsCdFrom = "02";
$P.control.query.postPrcsSttsCdTo = "02";
} else if (clickTab == "tab3") { // 전송
$P.control.query.postPrcsSttsCdFrom = "03";
$P.control.query.postPrcsSttsCdTo = "03";
} else if (clickTab == "tab4") { // 접수
$P.control.query.postPrcsSttsCdFrom = "05";
$P.control.query.postPrcsSttsCdTo = "05";
} else if (clickTab == "tab5") { // 제작불가
$P.control.query.postPrcsSttsCdFrom = "21";
$P.control.query.postPrcsSttsCdTo = "79";
} else if (clickTab == "tab6") { // 제작완료
$P.control.query.postPrcsSttsCdFrom = "80";
$P.control.query.postPrcsSttsCdTo = "80";
} else if (clickTab == "tab7") { // 배달중
$P.control.query.postPrcsSttsCdFrom = "90";
$P.control.query.postPrcsSttsCdTo = "90";
} else if (clickTab == "tab8") { // 배달완료
$P.control.query.postPrcsSttsCdFrom = "95";
$P.control.query.postPrcsSttsCdTo = "95";
} else { // 전체
//
}
$P.control.load(1); // 검색
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 발송 취소 버튼 이벤트
$P.fnUpdateCancle = (title) => {
// 외부연계식별키
let conKey = $P.control.dataset.getValue("CON_KEY");
// 외부연계식별키 가 없다면.. return
if (typeof conKey == "undefined" || conKey == null || conKey == "") return;
// 발송 ID
let sndngId = $P.control.dataset.getValue("SNDNG_ID");
// 발송 ID 가 없다면.. return
if (typeof sndngId == "undefined" || sndngId == null || sndngId == "") return;
// 우편 처리 상태 코드
let postPrcsSttsCd = $P.control.dataset.getValue("POST_PRCS_STTS_CD");
// 우편 처리 상태 확인
if (postPrcsSttsCd != "01") {
dialog.alert({
content: "우편통합 처리상태가 '" + postPrcsSttsNm + "' 입니다."
+ "<br>" + "[" + title + "]" + " 실행은 발송대기 자료만 가능합니다."
, onOK: () => { }
});
return;
}
let params = {
callPurpose: "update"
, title: title
, sggCd: $P.control.dataset.getValue("SGG_CD")
, conKey: conKey // 외부연계식별키
, sndngId: sndngId // 발송 ID
};
dialog.alert({
content: "선택한 " + $P.control.prefixName + " 정보를 취소하시겠습니까?"
, onOK: () => {
$P.control.save(params);
}
});
}
// 발송 삭제 버튼 이벤트
$P.fnRemove = (title) => {
// 외부연계식별키
let conKey = $P.control.dataset.getValue("CON_KEY");
// 외부연계식별키 가 없다면.. return
if (typeof conKey == "undefined" || conKey == null || conKey == "") return;
// 우편 처리 상태 코드
let postPrcsSttsCd = $P.control.dataset.getValue("POST_PRCS_STTS_CD");
// 우편 처리 상태 확인
if (postPrcsSttsCd != "02" && postPrcsSttsCd != "03" && postPrcsSttsCd != "05"
&& postPrcsSttsCd != "21" && postPrcsSttsCd != "22" && postPrcsSttsCd != "23"
&& postPrcsSttsCd != "24" && postPrcsSttsCd != "61" && postPrcsSttsCd != "62") {
dialog.alert({
content: "우편통합 처리상태가 '" + postPrcsSttsNm + "' 입니다."
+ "<br>" + "[" + title + "]" + " 실행은 '발송취소', '전송', '접수', '제작불가' 자료만 가능합니다."
, onOK: () => { }
});
return;
}
dialog.alert({
content: "선택한 " + $P.control.prefixName + " 정보를 삭제하시겠습니까?"
, onOK: () => {
$P.control.remove();
}
});
}
// 탭0
$P.fnTabEpostRcpt0 = () => {
$("#tabEpostRcpt0").html($("#datatable--${pageName}"));
$P.fnSearchList("tab0");
}
// 탭1
$P.fnTabEpostRcpt1 = () => {
$("#tabEpostRcpt1").html($("#datatable--${pageName}"));
$P.fnSearchList("tab1");
}
// 탭2
$P.fnTabEpostRcpt2 = () => {
$("#tabEpostRcpt2").html($("#datatable--${pageName}"));
$P.fnSearchList("tab2");
}
// 탭3
$P.fnTabEpostRcpt3 = () => {
$("#tabEpostRcpt3").html($("#datatable--${pageName}"));
$P.fnSearchList("tab3");
}
// 탭4
$P.fnTabEpostRcpt4 = () => {
$("#tabEpostRcpt4").html($("#datatable--${pageName}"));
$P.fnSearchList("tab4");
}
// 탭5
$P.fnTabEpostRcpt5 = () => {
$("#tabEpostRcpt5").html($("#datatable--${pageName}"));
$P.fnSearchList("tab5");
}
// 탭6
$P.fnTabEpostRcpt6 = () => {
$("#tabEpostRcpt6").html($("#datatable--${pageName}"));
$P.fnSearchList("tab6");
}
// 탭7
$P.fnTabEpostRcpt7 = () => {
$("#tabEpostRcpt7").html($("#datatable--${pageName}"));
$P.fnSearchList("tab7");
}
// 탭8
$P.fnTabEpostRcpt8 = () => {
$("#tabEpostRcpt8").html($("#datatable--${pageName}"));
$P.fnSearchList("tab8");
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 발송 취소 버튼 이벤트
$("#btnUpdateCancel--${pageName}").on("click", function() {
$P.fnUpdateCancle($(this).attr("title"));
});
// 발송 삭제 버튼 이벤트
$("#btnRemove--${pageName}").on("click", function() {
$P.fnRemove($(this).attr("title"));
});
// DataTables width 변경 조정 업무별 그리드가 존재 한다면.. crdn06010-main.jsp 참고
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#deptCd--${pageName}").val("${deptCd}"); // 부서 코드
$("#conOrg--${pageName}").val("${conOrg}"); // E그린 외부기관구분코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schSendDateFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date);
$("#schSendDateTo--${pageName}").datepicker("setDate", new Date());
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
// 첫번째 "전체" 탭에 datatable 설정
$("#tabEpostRcpt0").html($("#datatable--${pageName}"));
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/030/list.do"); // 조회
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,295 +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>
<!-- inner page html -->
<div class="content-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<!-- hidden -->
<input type="hidden" id="conKey--${pageName}" name="conKey" />
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap" id="datatable--${pageName}">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 160px;">등기번호</th>
<th class="cmn" style="width: 100px;">우편번호</th>
<th class="cmn" style="width: 200px;">수취인명</th>
<th class="cmn" style="width: 180px;">배달일시</th>
<th class="cmn" style="width: 120px;">배달결과</th>
<th class="cmn" style="width: 120px;">수령인명</th>
<th class="cmn" style="width: 120px;">수령인관계</th>
<th class="cmn" style="width: 200px;">미배달사유</th>
<th class="cmn" style="width: 280px;">주소</th>
<th class="cmn" style="width: 320px;">상세주소</th>
<th class="cmn" style="width: 240px;">연계식별키</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{RGST_NMBR}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGST_NMBR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RECEV_CAR_OWNER_ZIPCODE}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RECEV_CAR_OWNER_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DELIV_YMD_TM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DELIVRSLTCD_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{SUBRECPRSNNM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RELRECPRSNCDNM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{NONDELIVREASNCDNM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RECEV_CAR_OWNER_ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RECEV_CAR_OWNER_DETAILADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CON_KEY}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="17" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card"> -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
// main 의 검색 조건을 그대로 유지
$P.mainQuery = ${mainQuery};
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "epostRcptRegDtl"
, prefixName: "우편 발송 정보"
, keymapper: info => info ? info.RGST_NMBR : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, formats: {
DELIV_YMD_TM: datetimeFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.RGST_NMBR;
$("#tbody--${pageName}").setCurrentRow(key);
// CON_KEY
$("#conKey--${pageName}").val(item.data.CON_KEY);
};
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("RGST_NMBR") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content : "검색된 자료가 없습니다."
, onOK : () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
// DataTables width 변경 조정 업무별 그리드가 존재 한다면.. crdn06010-main.jsp 참고
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
// DataTables 스크롤을 위해서 다이얼로그 화면이 생성된 후 Dataset을 설정한다.
$("#${infoPrefix}Dialog--${openerPageName}").on("shown.bs.modal", function (e) {
$P.control.setData({
${infoPrefix}List: ${epostRcptRegDtlList}
, ${infoPrefix}Start: ${epostRcptRegDtlStart}
, ${infoPrefix}Fetch: ${epostRcptRegDtlFetch}
, ${infoPrefix}Total: ${epostRcptRegDtlTotal}
});
// 업무 구분별 설정
$P.setTask("${taskSeCd}");
});
}
// 초기 화면 설정
$P.initForm = () => {
// 화면 초기화
$("#frmEdit--${pageName}")[0].reset();
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 검색 조건 설정
$P.control.query = $P.mainQuery;
// CON_KEY
$("#conKey--${pageName}").val($P.control.dataset.getValue("CON_KEY"));
// 업무구분에 따른 URL 변경
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/040/list.do"); // 검색
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,566 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<input type="hidden" id="deptCd--${pageName}" name="deptCd" />
<input type="hidden" id="conOrg--${pageName}" name="conOrg" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 발송 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schExtriRegymdFrom--${pageName}">발송일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schExtriRegymdFrom--${pageName}" name="schExtriRegymdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schExtriRegymdTo--${pageName}" name="schExtriRegymdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 동적 검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 등록일자, 수정일자 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-400" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 240px;" onclick="searchFromGridTitle('RELETCDATA', this.innerText, 'match', 'part');">발송자료키</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('JOB_CD', this.innerText, 'match', 'part');">우편물코드</th>
<th class="cmn" style="width: 120px;">우편물종류</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('EXTRI_REGYMD', this.innerText, 'ymd', '');">발송일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCEPT_YMD', this.innerText, 'ymd', '');">접수일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('DIV_KB', this.innerText, 'codeValue', 'EGP002');">취급구분</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('RCEPT_CNT', this.innerText, 'match', 'part');">발송건수</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCEPT_AMT', this.innerText, 'match', 'part');">결제금액</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('USEFEE_AMT', this.innerText, 'match', 'part');">제작수수료</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('TOTPOST_PRC', this.innerText, 'match', 'part');">우편요금</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{RCPT_RSLT_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RELETCDATA}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{JOB_CD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{JOB_CD3_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{EXTRI_REGYMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCEPT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DIV_KB_NM}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{RCEPT_CNT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{RCEPT_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{USEFEE_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{TOTPOST_PRC}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="14" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
<p> </p>
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_1_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-150" id="table-responsive-1--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_1--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTrSumAmt--${pageName}">
<th class="cmn" style="width: 160px;">취급구분</th>
<th class="cmn" style="width: 160px;">발송건수</th>
<th class="cmn" style="width: 200px;">결제금액</th>
<th class="cmn" style="width: 200px;">제작수수료</th>
<th class="cmn" style="width: 200px;">우편요금</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="tbodySumAmt--${pageName}">
</tbody>
<template id="${infoPrefix}SumAmtRow--${pageName}">
<tr data-key="{DIV_KB}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DIV_KB_NM}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{RCEPT_CNT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{RCEPT_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{USEFEE_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{TOTPOST_PRC}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}SumAmtNotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="6" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "epostRcptRslt"
, prefixName: "전자우편 접수 결과"
, keymapper: info => info ? info.RCPT_RSLT_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "lg"
, formats : {
EXTRI_REGYMD: dateFormat
, RCEPT_YMD: dateFormat
, RCEPT_CNT: numberFormat
, RCEPT_AMT: numberFormat
, USEFEE_AMT: numberFormat
, TOTPOST_PRC: numberFormat
, REG_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
// 합계 금액 정보 Dataset
$P.sumAmtDataset = new Dataset({
prefix: "sumAmt"
, prefixName: "합계 금액"
, keymapper: info => info ? info.DIV_KB : ""
, dataGetter: obj => obj.sumAmtList
, formats: {
RCEPT_CNT: numberFormat
, RCEPT_AMT: numberFormat
, USEFEE_AMT: numberFormat
, TOTPOST_PRC: numberFormat
}
, onDatasetChange: obj => {
$P.renderSumAmtList();
}
, onCurrentChange: item => {
if (!item) return;
let key = item.data.DIV_KB;
$("#tbodySumAmt--${pageName}").setCurrentRow(key);
}
});
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = item => {
if (!item) return;
let key = item.data.RCPT_RSLT_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("RCPT_RSLT_ID") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 click, dbclick 이벤트
$P.renderSumAmtList = () => {
let ${infoPrefix}SumAmtList = $P.sumAmtDataset;
let empty = ${infoPrefix}SumAmtList.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}SumAmtNotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}SumAmtList.inStrings(
document.getElementById("${infoPrefix}SumAmtRow--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].sumAmtDataset.setCurrent('" + dataItem.getValue("DIV_KB") + "');")
);
$("#tbodySumAmt--${pageName}").html(trs.join());
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
// 합계 금액 조회
$P.getSumAmtInfo = (query) => {
ajax.get({
url: wctx.url("/" + query.taskSeCd + "${infoPrefixUrl}" + "/050/sumAmt.do")
, data: query || {}
, success: resp => {
$P.sumAmtDataset.setData(resp.sumAmt);
}
});
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경 이벤트
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
$P.sumAmtDataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get();
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.relorsectCd = $("#deptCd--${pageName}").val(); // 결제부서코드(부서코드)
$P.control.load(1);
// 합계금액 검색 - 검색시 log에 등록할때 MAX+1 오류 발생으로 인한 타이머 동작
setTimeout(() => $P.getSumAmtInfo($P.control.query), 500);
//$P.getSumAmtInfo($P.control.query);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();  
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// DataTables width 변경 조정 업무별 그리드가 존재 한다면.. crdn06010-main.jsp 참고
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
fnMakeResizableTable($("#table-responsive-1--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 화면 초기 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#deptCd--${pageName}").val("${deptCd}"); // 부서 코드
$("#conOrg--${pageName}").val("${conOrg}"); // E그린 외부기관구분코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schExtriRegymdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date);
$("#schExtriRegymdTo--${pageName}").datepicker("setDate", new Date());
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/050/list.do"); // 검색
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,766 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무 구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 부과 제외 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schLevyExclYmdFrom--${pageName}">부과제외일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schLevyExclYmdFrom--${pageName}" name="schLevyExclYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schLevyExclYmdTo--${pageName}" name="schLevyExclYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 부과 제외 구분 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schLevyExclSeCd--${pageName}">부과제외구분</label>
<select class="form-select w-px-120" id="schLevyExclSeCd--${pageName}" name="schLevyExclSeCd">
<option value="">전체</option>
<c:forEach items="${FIM021List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 부과 제외 사유 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schLevyExclRsnCd--${pageName}">부과제외사유</label>
<select class="form-select w-px-120" id="schLevyExclRsnCd--${pageName}" name="schLevyExclRsnCd">
<option value="">전체</option>
<c:forEach items="${FIM022List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 동적검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 단속일자 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCrdnYmdFrom--${pageName}">단속일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schCrdnYmdFrom--${pageName}" name="schCrdnYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schCrdnYmdTo--${pageName}" name="schCrdnYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 차량번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVhrno--${pageName}">차량번호</label>
<input type="text" class="form-control w-px-160" id="schVhrno--${pageName}" name="schVhrno" autocomplete="off" />
</div>
<!-- 납부자번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNm--${pageName}">납부자번호</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNm--${pageName}" name="schRtpyrNm" autocomplete="off" />
</div>
<!-- 납부자명 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNo--${pageName}">납부자명</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNo--${pageName}" name="schRtpyrNo" autocomplete="off" />
</div>
<!-- 등록일자, 수정일자 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnUpdate--${pageName}" title="부과제외 수정">
부과제외 수정
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnRemove--${pageName}" title="부과제외 삭제">
부과제외 삭제
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;">업무구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('LEVY_EXCL_YMD', this.innerText, 'ymd', '');">부과제외일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('LEVY_EXCL_SE_CD', this.innerText, 'codeValue', 'FIM021');">부과제외구분</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('LEVY_EXCL_RSN_CD', this.innerText, 'codeValue', 'FIM022');">부과제외사유</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ETC_CN', this.innerText, 'match', 'part');">기타내용</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CVLCPT_APLY_NO', this.innerText, 'match', 'part');">민원신청번호</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CVLCPT_RCPT_NO', this.innerText, 'match', 'part');">민원접수번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('CVLCPT_RCPT_YMD', this.innerText, 'ymd', '');">민원접수일자</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CRDN_YMD', this.innerText, 'ymd', '');">단속일시</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VHRNO', this.innerText, 'match', 'part');">차량번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RTPYR_SE_CD', this.innerText, 'codeValue', 'FIM011');">납부자구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RTPYR_NO', this.innerText, 'ymd', '');">납부자번호</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('RTPYR_NM', this.innerText, 'match', 'part');">납부자명</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VLTN_ARTCL', this.innerText, 'match', 'part');">위반항목</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('CRDN_STDG_NM', this.innerText, 'match', 'part');">단속법정동</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('CRDN_PLC', this.innerText, 'match', 'part');">단속장소</th>
<th class="bpv" style="width: 280px;" onclick="searchFromGridTitle('DTL_CRDN_PLC', this.innerText, 'match', 'part');">상세단속장소</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_CRDN_AMT', this.innerText, 'match', 'part');">단속원금</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STTS_CD', this.innerText, 'codeValue', 'FIM010');">처리상태</th>
<th class="pvs" style="width: 140px;" onclick="searchFromGridTitle('CRDN_SPAREA_CD', this.innerText, 'codeValue', 'FIM007');">단속특별구역</th>
<th class="eca" style="width: 140px;" onclick="searchFromGridTitle('USE_FUEL_CD', this.innerText, 'codeValue', 'LVS005');">사용연료</th>
<th class="dpv" style="width: 140px;" onclick="searchFromGridTitle('PRK_PSBLTY_RSLT_CD', this.innerText, 'codeValue', 'FIM034');">주차가능여부</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('ZIP', this.innerText, 'match', 'part');">우편번호</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ADDR', this.innerText, 'match', 'part');">주소</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('DTL_ADDR', this.innerText, 'match', 'part');">상세주소</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{LEVY_EXCL_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{LEVY_EXCL_ID}" onchange="pageObject['${pageName}'].control.select('{LEVY_EXCL_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_EXCL_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_EXCL_SE_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_EXCL_RSN_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ETC_CN}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_APLY_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_YMD_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_SE_NM}</td>
<td class="cmn text-center privacy-cell" onclick="{onclick}" ondblclick="{ondblclick}">
<span>{RTPYR_NO}</span>
<span>*************</span>
</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="bpv text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_CRDN_PLC}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_CRDN_AMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STTS_NM}</td>
<td class="pvs text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_SPAREA_NM}</td>
<td class="eca text-center" onclick="{onclick}" ondblclick="{ondblclick}">{USE_FUEL_NM}</td>
<td class="dpv text-center" onclick="{onclick}" ondblclick="{ondblclick}">{PRK_PSBLTY_RSLT_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="bpv">
<td valign="top" colspan="29" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="dpv">
<td valign="top" colspan="29" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="eca">
<td valign="top" colspan="29" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pvs">
<td valign="top" colspan="29" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pes">
<td valign="top" colspan="29" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "levyExcl"
, prefixName: "부과제외"
, keymapper: info => info ? info.LEVY_EXCL_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "md"
, formats: {
LEVY_EXCL_YMD: dateFormat
, CRDN_YMD_TM: datetimeFormat
, CVLCPT_RCPT_YMD: dateFormat
, FFNLG_CRDN_AMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.LEVY_EXCL_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 삭제 버튼
$("#btnRemove--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 상세정보 dialog
$P.control.getInfo = (params) => {
if (!params) return;
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/020/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("Dialog--${pageName}")
, title: params.title
, content: resp
, size: $P.control.infoSize
, init: () => { }
, onClose: () => { $P.fnRefreshList(); } // 자료 재조회
});
}
});
}
// 삭제 callback
$P.control.onRemove = (resp) => {
let btnTitle = $("#btnRemove--${pageName}").attr("title");
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, btnTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) { $P.fnRefreshList(); } // 자료 재조회
}
// 삭제
$P.control.remove = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/010/remove.do")
, data: params || {}
, success: resp => $P.control.onRemove(resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let clsForTask = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val().toLowerCase(); // 소문자
// 업무별 DataTables(그리드) tr, td
let foundContent = document.getElementById("${infoPrefix}Row--${pageName}").content;
let foundTr = $(foundContent).find("tr")[0].cloneNode(false);
let foundTds = $(foundContent).find("." + clsForTask + ",.cmn");
foundTds.each(function() {
foundTr.appendChild(this.cloneNode(true));
});
let replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("LEVY_EXCL_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');");
let trs = empty ? [document.getElementById("${infoPrefix}NotFound--${pageName}").content.querySelector("." + clsForTask + ",.cmn").outerHTML]
: ${infoPrefix}List.inStrings(foundTr.outerHTML, replacer);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if (option != null && option.reloaded) {
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
// 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
, init: () => { }
, onClose: () => { }
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
// 삭제사유 callback
$P.callbackRsn = (obj) => {
// 서버에 전송할 data(파라미터) 생성
let params = {};
let selected = $P.control.dataset.getKeys("selected");
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
params[$P.control.prefixed("Ids")] = selected.join(","); // 부과 제외 IDs
params.delRsn = obj.reason; // 삭제 사유
$P.control.remove(params);
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경 이벤트
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 클릭 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 클릭 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 부과제외 수정 버튼 클릭 이벤트
$P.fnUpdate = (title) => {
// 부과제외 ID
let levyExclId = $P.control.dataset.getValue("LEVY_EXCL_ID");
// 부과제외 ID 가 없다면.. return
if (typeof levyExclId == "undefined" || levyExclId == null || levyExclId == "") return;
let params = {
title: title
, callPurpose: "update" // 호출용도: 수정
, sggCd: $P.control.dataset.getValue("SGG_CD") // 시군구 코드
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
, levyExclId: levyExclId // 부과제외 ID
, levyExclSeCd: $P.control.dataset.getValue("LEVY_EXCL_SE_CD") // 부과제외 구분 코드
};
$P.control.getInfo(params);
}
// 부과제외 삭제 버튼 클릭 이벤트
$P.fnRemove = (title) => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) {
dialog.alert({
content: "선택하신 " + $P.control.prefixName + " 정보가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// 삭제 메세지 확인
dialog.alert({
content: "선택하신 " + selected.length + "건의 " + $P.control.prefixName + " 정보를 삭제하시겠습니까?"
, onOK: () => {
// 삭제 사유 입력
fetch(wctx.url("/resources/html/inputRsnDialog.html"))
.then(function(resp) { return resp.text(); })
.then(function(template) {
dialog.open({
id: "inputDelRsnDialog"
, title: title
, size: "lg"
, content: template
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.callbackRsn({ reason: $("#reason").val() });
}
});
});
}
});
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if (value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 버튼 이벤트
$("#btnUpdate--${pageName}").on("click", function() {
$P.fnUpdate($(this).attr("title")); // 부과제외 수정
});
$("#btnRemove--${pageName}").on("click", function() {
$P.fnRemove($(this).attr("title")); // 부과제외 삭제
});
// DataTables width 변경 조정 (업무별 그리드가 존재 한다면.. crdn06010-main.jsp 참고)
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schLevyExclYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date); // 부과 제외 일자 시작
$("#schLevyExclYmdTo--${pageName}").datepicker("setDate", new Date()); // 부과 제외 일자 종료
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/010/list.do"); // 검색
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + taskSeCd.toLowerCase() + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
//# sourceURL=excl01010-main.jsp
</script>

@ -1,269 +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>
<!-- inner page html -->
<div class="content-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<input type="hidden" id="crdnId--${pageName}" name="crdnId" data-map="CRDN_ID" />
<input type="hidden" id="levyExclId--${pageName}" name="levyExclId" data-map="LEVY_EXCL_ID" />
<div class="row g-1">
<!-- 단속일시 -->
<div class="col-md-12">
<label for="crdnYmdTm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">단속일시</label>
<input type="text" class="form-control w-35" id="crdnYmdTm--${pageName}" name="crdnYmdTm" data-map="CRDN_YMD_TM" data-fmt-type="dt" />
</div>
<!-- 차량번호 -->
<div class="col-md-12">
<label for="vhrno--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">차량번호</label>
<input type="text" class="form-control w-px-120" id="vhrno--${pageName}" name="vhrno" data-map="VHRNO" autocomplete="off" />
</div>
<!-- 부과 제외 구분 -->
<div class="col-md-12">
<label for="levyExclSeNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">부과제외구분</label>
<input type="text" class="form-control w-px-120" id="levyExclSeNm--${pageName}" autocomplete="off" />
<input type="hidden" id="levyExclSeCd--${pageName}" name="levyExclSeCd" data-map="LEVY_EXCL_SE_CD" />
</div>
<!-- 부과 제외 일자 -->
<div class="col-md-12">
<label for="levyExclYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">부과제외일자</label>
<input type="text" class="form-control form-date" id="levyExclYmd--${pageName}" name="levyExclYmd" data-map="LEVY_EXCL_YMD"
data-fmt-type="day" autocomplete="off" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white" id="btnLevyExclYmd--${pageName}"></button>
</div>
<!-- 부과 제외 사유 -->
<div class="col-md-12">
<label for="levyExclRsnCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">부과제외사유</label>
<select class="form-select" id="levyExclRsnCd--${pageName}" name="levyExclRsnCd" data-map="LEVY_EXCL_RSN_CD" required>
<option value="">선택하세요</option>
<c:forEach items="${FIM022List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 기타 내용 -->
<div class="col-md-12">
<label for="etcCn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">기타 내용</label>
<textarea type="text" class="form-control w-70" id="etcCn--${pageName}" name="etcCn" data-map="ETC_CN" autocomplete="off" rows="3" data-maxlengthb="1000"></textarea>
</div>
</div>
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-80" id="btnSave--${pageName}" title="저장">
저장
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
</div> <!-- <div class="card"> -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
// 공통 코드
var FIM021 = new CommonCodes(${FIM021}, true);
var FIM022 = new CommonCodes(${FIM022}, true);
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "levyExcl"
, prefixName: "부과제외"
, keymapper: info => info ? info.LEVY_EXCL_ID : ""
, dataGetter: obj => obj.${infoPrefix}Info
});
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
// Dataset 셋팅
$P.formFields.set($P.control, item);
// 업무구분에 따른 URL 변경
$P.fnSetURL(item.data.TASK_SE_CD);
// 부과제외구분에 따른 부과제외사유 설정
$P.fnSetFim021(item.data.LEVY_EXCL_SE_CD, item.data.LEVY_EXCL_RSN_CD);
// 호출용도가 등록 이라면..
if ($P.callPurpose == "create") {
$("#levyExclYmd--${pageName}").datepicker("setDate", new Date());
}
}
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
if ("${savedCallbackFuncName}" != "") {
${savedCallbackFuncName}(resp.saved);
}
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
let create = ($P.callPurpose == "create");
// 민원 접수 관리에서 호출했다면..
if (create && "${saveCallbackFuncName}" != "") {
${saveCallbackFuncName}(info);
} else {
ajax.post({
url: !create ? $P.control.urls.update : $P.control.urls.create
, data: info || {}
, success: resp => $P.control.onSave(resp)
});
}
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 업무구분에 따른 URL 설정
$P.fnSetURL = (taskSeCd) => {
$P.control.urls.create = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/020/create.do"); // 등록
$P.control.urls.update = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/020/update.do"); // 수정
}
// 부과제외 구분에 따른 부과제외 사유 코드 설정
$P.fnSetFim021 = (seCode, rsnCode) => {
let cmnCode = FIM021[seCode];
$("#levyExclSeCd--${pageName}").val(cmnCode.code);
$("#levyExclSeNm--${pageName}").val(cmnCode.value);
let reasons = FIM022.list().filter(reason => "2" == seCode ? reason.code > "200" : reason.code < "200");
$("#levyExclRsnCd--${pageName}").html(reasons.map(reason => "<option value='" + reason.code + "'>" + reason.value + "</option>").join());
if (typeof rsnCode != "undefined" && rsnCode != "") {
$("#levyExclRsnCd--${pageName}").val(rsnCode);
}
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 저장 버튼 클릭 이벤트
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.control.save($P.formFields.get()); // formFields
}
});
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmEdit--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장
}
// 초기 화면 설정
$P.initForm = () => {
// 달력 초기화
initDatepicker("frmEdit--${pageName}");
$("#levyExclYmd--${pageName}").datepicker("setDate", new Date());
// 화면 활성화 설정
$("#crdnYmdTm--${pageName}").prop("readonly", true); // 단속 일시
$("#vhrno--${pageName}").prop("readonly", true); // 차량번호
$("#levyExclSeNm--${pageName}").prop("readonly", true); // 부과 제외 구분
// View로 호출
if ($P.callPurpose == "view") {
// input 요소들을 disabled
$("#frmEdit--${pageName}").find("input,textarea,select").prop("disabled", true);
// button 요소들을 disabled
$("#btnLevyExclYmd--${pageName}").prop("disabled", true); // 부과제외 일자 달력 버튼
$("#btnSave--${pageName}").prop("disabled", true); // 저장 버튼
}
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. Dataset 설정
$P.control.setData([${levyExclInfo}]);
});
</script>

@ -1,924 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 의견제출 접수일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRcptYmdFrom--${pageName}">접수일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRcptYmdFrom--${pageName}" name="schRcptYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRcptYmdTo--${pageName}" name="schRcptYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 의견제출 답변일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schAnsYmdFrom--${pageName}">답변일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schAnsYmdFrom--${pageName}" name="schAnsYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schAnsYmdTo--${pageName}" name="schAnsYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 의견 제출 상태 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schOpnnSbmsnSttsCd--${pageName}">의견제출상태</label>
<select class="form-select w-px-120" id="schOpnnSbmsnSttsCd--${pageName}" name="schOpnnSbmsnSttsCd">
<option value="">전체</option>
<c:forEach items="${FIM031List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 의견 제출 구분 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schOpnnSbmsnSeCd--${pageName}">의견제출구분</label>
<select class="form-select w-px-120" id="schOpnnSbmsnSeCd--${pageName}" name="schOpnnSbmsnSeCd">
<option value="">전체</option>
<c:forEach items="${FIM033List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 진술자명 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSttrNm--${pageName}">진술자명</label>
<input type="text" class="form-control w-px-160" id="schSttrNm--${pageName}" name="schSttrNm" />
</div>
<!-- 동적검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 단속 일자 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCrdnYmdFrom--${pageName}">단속일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schCrdnYmdFrom--${pageName}" name="schCrdnYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schCrdnYmdTo--${pageName}" name="schCrdnYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 차량번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVhrno--${pageName}">차량번호</label>
<input type="text" class="form-control w-px-160" id="schVhrno--${pageName}" name="schVhrno" />
</div>
<!-- 납부자번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNm--${pageName}">납부자번호</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNm--${pageName}" name="schRtpyrNm" autocomplete="off" />
</div>
<!-- 납부자명 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNo--${pageName}">납부자명</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNo--${pageName}" name="schRtpyrNo" autocomplete="off" />
</div>
<!-- 등록일자, 수정일자 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">
검색
</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-info w-px-120" id="btnDlbrMbr--${pageName}" title="심의위원 관리">
심의위원 관리
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnUpdate--${pageName}" title="의견제출 수정">
의견제출 수정
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnUpdateOpnnDlbr--${pageName}" title="의견제출 심의">
의견제출 심의
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnRemove--${pageName}" title="의견제출 삭제">
의견제출 삭제
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnPrintDlbrDecsn--${pageName}" title="심의의결서 출력">
심의의결서 출력
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-450" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;">업무구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCPT_NO', this.innerText, 'match', 'part');">접수번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCPT_YMD', this.innerText, 'ymd', '');">접수일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCPT_SE_CD', this.innerText, 'codeValue', 'FIM029');">접수구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('NTFCTN_SE_CD', this.innerText, 'codeValue', 'FIM030');">통보구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('OWNR_REL_CD', this.innerText, 'codeValue', 'FIM032');">소유주관계</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('STTR_NM', this.innerText, 'match', 'part');">진술자명</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('STTR_BRDT', this.innerText, 'ymd', '');">진술자생일</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('STTR_ZIP', this.innerText, 'match', 'part');">진술자우편번호</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('STTR_ADDR', this.innerText, 'match', 'part');">진술자주소</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('STTR_DADDR', this.innerText, 'match', 'part');">진술자상세주소</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('OPNN_SBMSN_STTS_CD', this.innerText, 'codeValue', 'FIM031');">의견제출상태</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('OPNN_SBMSN_SE_CD', this.innerText, 'codeValue', 'FIM033');">의견제출분류</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('OPNN_SBMSN_GIST', this.innerText, 'match', 'part');">의견제출요지</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('DOC_NO', this.innerText, 'ymd', '');">문서번호</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('ANS_YMD', this.innerText, 'ymd', '');">답변일시</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ANS_CN', this.innerText, 'match', 'part');">답변내용</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CRDN_YMD', this.innerText, 'ymd', '');">단속일시</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VHRNO', this.innerText, 'match', 'part');">차량번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RTPYR_SE_CD', this.innerText, 'codeValue', 'FIM011');">납부자구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RTPYR_NO', this.innerText, 'ymd', '');">납부자번호</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('RTPYR_NM', this.innerText, 'match', 'part');">납부자명</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VLTN_ARTCL', this.innerText, 'match', 'part');">위반항목</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('CRDN_STDG_NM', this.innerText, 'match', 'part');">단속법정동</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('CRDN_PLC', this.innerText, 'match', 'part');">단속장소</th>
<th class="bpv" style="width: 280px;" onclick="searchFromGridTitle('DTL_CRDN_PLC', this.innerText, 'match', 'part');">상세단속장소</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_CRDN_AMT', this.innerText, 'match', 'part');">단속원금</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_AMT', this.innerText, 'match', 'part');">과태료금액</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STTS_CD', this.innerText, 'codeValue', 'FIM010');">처리상태</th>
<th class="pvs" style="width: 140px;" onclick="searchFromGridTitle('CRDN_SPAREA_CD', this.innerText, 'codeValue', 'FIM007');">단속특별구역</th>
<th class="eca" style="width: 140px;" onclick="searchFromGridTitle('USE_FUEL_CD', this.innerText, 'codeValue', 'LVS005');">사용연료</th>
<th class="dpv" style="width: 140px;" onclick="searchFromGridTitle('PRK_PSBLTY_RSLT_CD', this.innerText, 'codeValue', 'FIM034');">주차가능여부</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('ZIP', this.innerText, 'match', 'part');">우편번호</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ADDR', this.innerText, 'match', 'part');">주소</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('DTL_ADDR', this.innerText, 'match', 'part');">상세주소</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{OPNN_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{OPNN_ID}" onchange="pageObject['${pageName}'].control.select('{OPNN_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCPT_NO_MASK}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCPT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCPT_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{NTFCTN_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{OWNR_REL_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{STTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{STTR_BRDT_MASK}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{STTR_ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{STTR_ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{STTR_DADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{OPNN_SBMSN_STTS_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{OPNN_SBMSN_SE_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{OPNN_SBMSN_GIST}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DOC_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ANS_YMD_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ANS_CN}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_YMD_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_SE_NM}</td>
<td class="cmn text-center privacy-cell" onclick="{onclick}" ondblclick="{ondblclick}">
<span>{RTPYR_NO}</span>
<span>*************</span>
</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="bpv text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_CRDN_PLC}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_CRDN_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_AMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STTS_NM}</td>
<td class="pvs text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_SPAREA_NM}</td>
<td class="eca text-center" onclick="{onclick}" ondblclick="{ondblclick}">{USE_FUEL_NM}</td>
<td class="dpv text-center" onclick="{onclick}" ondblclick="{ondblclick}">{PRK_PSBLTY_RSLT_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="bpv">
<td valign="top" colspan="39" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="dpv">
<td valign="top" colspan="39" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="eca">
<td valign="top" colspan="39" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pvs">
<td valign="top" colspan="39" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pes">
<td valign="top" colspan="39" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "opnn"
, prefixName: "의견제출"
, infoSize: "xl"
, keymapper: info => info ? info.OPNN_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, formats: {
RCPT_YMD: dateFormat
, ANS_YMD: dateFormat
, ANS_YMD_TM: datetimeFormat
, CRDN_YMD_TM: datetimeFormat
, FFNLG_CRDN_AMT: numberFormat
, FFNLG_AMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "$P.control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.OPNN_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 삭제 버튼
$("#btnRemove--${pageName}").prop("disabled", keys.length < 1);
// 심의의결서 출력 버튼
$("#btnPrintDlbrDecsn--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 상세정보 dialog
$P.control.getInfo = (params) => {
if (!params) return;
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/020/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("Dialog--${pageName}")
, title: params.title
, content: resp
, size: $P.control.infoSize
, init: () => { }
, onClose: () => { $P.fnRefreshList(); } // 자료 재조회
});
}
});
}
// 삭제 callback
$P.control.onRemove = (resp) => {
let btnTitle = $("#btnRemove--${pageName}").attr("title");
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, btnTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, onOK: () => { }
});
// 자료 재조회
if (resp.saved) { $P.fnRefreshList(); }
}
// 삭제
$P.control.remove = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/010/remove.do")
, data: params || {}
, success: resp => $P.control.onRemove(resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let clsForTask = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val().toLowerCase(); // 소문자
// 업무별 DataTables(그리드) tr, td
let foundContent = document.getElementById("${infoPrefix}Row--${pageName}").content;
let foundTr = $(foundContent).find("tr")[0].cloneNode(false);
let foundTds = $(foundContent).find("." + clsForTask + ",.cmn");
foundTds.each(function() {
foundTr.appendChild(this.cloneNode(true));
});
//
let replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("OPNN_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');");
let trs = empty ? [document.getElementById("${infoPrefix}NotFound--${pageName}").content.querySelector("." + clsForTask + ",.cmn").outerHTML]
: ${infoPrefix}List.inStrings(foundTr.outerHTML, replacer);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
// 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
// 삭제사유 callback
$P.callbackRsn = (obj) => {
// 서버에 전송할 data(파라미터) 생성
let params = {};
let selected = $P.control.dataset.getKeys("selected");
params[$P.control.prefixed("Ids")] = selected.join(","); // IDs
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
params.delRsn = obj.reason; // 삭제 사유
$P.control.remove(params);
}
// 심의의결서 출력
$P.makeHwpFileDlbrDecsn = (params) => {
if (!params) return;
let url = wctx.url("/" + params.taskSeCd + "/excl/excl02/010/makeHwp.do")
let parameter = toQuery({
opnnIds: params.opnnIds
, taskSeCd: params.taskSeCd
});
document.location.href = url + "?" + parameter;
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수 FETCH_XS = 30
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 심의위원 관리 버튼 클릭 이벤트
$P.fnDlbrMbr = (title) => {
let params = {
title: title
, callPurpose: "update" // 호출용도: 수정
, sggCd: $("#sggCd--${pageName}").val() // 시군구 코드
, taskSeCd: $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val() // 업무 구분 코드
};
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/040/info.do") + "?openerPageName=${pageName}"
, data: params
, success: resp => {
dialog.open({
id: $P.control.prefixed("DlbrMbrDialog--${pageName}")
, title: $P.control.prefixName + " 심의위원 관리"
, content: resp
, size: "md"
});
}
});
}
// 의견제출 수정 버튼 클릭 이벤트
$P.fnUpdate = (title) => {
// 의견제출 ID
let opnnId = $P.control.dataset.getValue("OPNN_ID");
// 의견제출 ID 가 없다면.. return
if (typeof opnnId == "undefined" || opnnId == null || opnnId == "") return;
let params = {
title: title
, callPurpose: "update" // 호출용도: 수정
, sggCd: $P.control.dataset.getValue("SGG_CD") // 시군구 코드
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
, opnnId: opnnId // 의견제출 ID
};
$P.control.getInfo(params);
}
// 의견제출 심의 버튼 클릭 이벤트
$P.fnUpdateOpnnDlbr = (title) => {
// 의견제출 ID
let opnnId = $P.control.dataset.getValue("OPNN_ID");
// 의견제출 ID 가 없다면.. return
if (typeof opnnId == "undefined" || opnnId == null || opnnId == "") return;
let params = {
title: title
, callPurpose: "update" // 호출용도: 수정
, sggCd: $P.control.dataset.getValue("SGG_CD") // 시군구 코드
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
, opnnId: opnnId // 의견제출 ID
};
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/030/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("DlbrDialog--${pageName}")
, title: $P.control.prefixName + " 심의"
, content: resp
, size: "lg"
, onClose: () => { $P.fnRefreshList(); } // 자료 재조회
});
}
});
}
// 의견제출 삭제 버튼 클릭 이벤트
$P.fnRemove = (title) => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) {
dialog.alert({
content: "선택하신 " + $P.control.prefixName + " 의견제출 정보가 없습니다."
, onOK: () => { }
});
return;
}
// 삭제 메세지 확인
dialog.alert({
content: "선택하신 " + selected.length + "건의 " + $P.control.prefixName + " 정보를 삭제하시겠습니까?"
, onOK: () => {
// 삭제 사유 입력
fetch(wctx.url("/resources/html/inputRsnDialog.html"))
.then(function(resp) { return resp.text(); })
.then(function(template) {
dialog.open({
id: "inputDelRsnDialog"
, title: title
, size: "lg"
, content: template
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.callbackRsn({ reason: $("#reason").val() });
}
});
});
}
});
}
// 심의의결서 출력 버튼 클릭 이벤트
$P.fnPrintDlbrDecsn = (title) => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) {
dialog.alert({
content: "선택하신 의견제출 정보가 없습니다."
, onOK: () => { }
});
return;
}
let params = {
callPurpose: "download"
, title: title
, sggCd: $P.control.dataset.getValue("SGG_CD") // 시군구 코드
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
, opnnIds: selected.join(",") // 의견제출 IDs
};
$P.makeHwpFileDlbrDecsn(params);
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();  
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 심의위원 관리 버튼 이벤트
$("#btnDlbrMbr--${pageName}").on("click", function() {
$P.fnDlbrMbr($(this).attr("title"));
});
// 의견제출 수정 버튼 이벤트
$("#btnUpdate--${pageName}").on("click", function() {
$P.fnUpdate($(this).attr("title"));
});
// 의견제출 심의 버튼 이벤트
$("#btnUpdateOpnnDlbr--${pageName}").on("click", function() {
$P.fnUpdateOpnnDlbr($(this).attr("title"));
});
// 의견제출 삭제 버튼 이벤트
$("#btnRemove--${pageName}").on("click", function() {
$P.fnRemove($(this).attr("title"));
});
// 심의의결서 출력 버튼 이벤트
$("#btnPrintDlbrDecsn--${pageName}").on("click", function() {
$P.fnPrintDlbrDecsn($(this).attr("title"));
});
// DataTables width 변경 조정
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schRcptYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date); // 접수 일자 시작
$("#schRcptYmdTo--${pageName}").datepicker("setDate", new Date()); // 접수 일자 종료
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/010/list.do"); // 검색
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + taskSeCd.toLowerCase() + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,521 +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>
<!-- inner page html -->
<div class="content-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<input type="hidden" id="crdnId--${pageName}" name="crdnId" data-map="CRDN_ID" />
<input type="hidden" id="opnnId--${pageName}" name="opnnId" data-map="OPNN_ID" />
<div class="row g-1">
<!-- 단속일시 -->
<div class="col-md-4">
<label for="crdnYmdTm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">단속일시</label>
<input type="text" class="form-control w-50" id="crdnYmdTm--${pageName}" name="crdnYmdTm" data-map="CRDN_YMD_TM" data-fmt-type="dt" />
</div>
<!-- 차량번호 -->
<div class="col-md-4">
<label for="vhrno--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">차량번호</label>
<input type="text" class="form-control w-40" id="vhrno--${pageName}" name="vhrno" data-map="VHRNO" />
</div>
<!-- 납부자 명 -->
<div class="col-md-4">
<label for="rtpyrNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">납부자</label>
<input type="text" class="form-control w-55" id="rtpyrNm--${pageName}" name="rtpyrNm" data-map="RTPYR_NM" />
</div>
<!-- 접수 번호 -->
<div class="col-md-4">
<label for="rcptNo--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">접수번호</label>
<input type="text" class="form-control w-40" id="rcptNo--${pageName}" name="rcptNo" data-map="RCPT_NO" />
</div>
<!-- 접수 일자 -->
<div class="col-md-4">
<label for="rcptYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">접수일자</label>
<input type="text" class="form-control form-date" id="rcptYmd--${pageName}" name="rcptYmd" data-map="RCPT_YMD"
data-fmt-type="day" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white" id="btnRcptYmd--${pageName}"></button>
</div>
<!-- 접수 구분 -->
<div class="col-md-4">
<label for="rcptSeCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">접수구분</label>
<select class="form-select" id="rcptSeCd--${pageName}" name="rcptSeCd" data-map="RCPT_SE_CD" required>
<option value="">선택하세요</option>
<c:forEach items="${FIM029List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 진술자 이름 -->
<div class="col-md-4">
<label for="sttrNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">성명</label>
<input type="text" class="form-control w-35" id="sttrNm--${pageName}" name="sttrNm" data-map="STTR_NM" required />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnSearchPayer--${pageName}" title="납부자 정보 적용">
납부자
</button>
</div>
<!-- 진술자 생년월일 -->
<div class="col-md-4">
<label for="sttrBrdt--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">생년월일</label>
<input type="text" class="form-control w-30" id="sttrBrdt--${pageName}" name="sttrBrdt" data-map="STTR_BRDT" placeholder="YYMMDD" />
</div>
<!-- 소유주 관계 구분 코드 -->
<div class="col-md-4">
<label for="ownrRelCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">소유주관계</label>
<select class="form-select" id="ownrRelCd--${pageName}" name="ownrRelCd" data-map="OWNR_REL_CD">
<option value="">선택하세요</option>
<c:forEach items="${FIM032List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 진술자 주소 --><!-- 진술자 우편번호 -->
<div class="col-md-12">
<label for="sttrAddr--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">주소</label>
<input type="text" class="form-control w-70" id="sttrAddr--${pageName}" name="sttrAddr" data-map="STTR_ADDR" />
<input type="text" class="form-control w-px-75" id="sttrZip--${pageName}" name="sttrZip" data-map="STTR_ZIP" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnSearchAddr--${pageName}" title="주소 검색">
검색
</button>
</div>
<!-- 진술자 상세주소 -->
<div class="col-md-12">
<label for="sttrDaddr--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">상세주소</label>
<input type="text" class="form-control w-85" id="sttrDaddr--${pageName}" name="sttrDaddr" data-map="STTR_DADDR" />
</div>
<!-- 진술자 연락처 -->
<div class="col-md-4">
<label for="sttrCttpc--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">연락처</label>
<input type="text" class="form-control w-45" id="sttrCttpc--${pageName}" name="sttrCttpc" data-map="STTR_CTTPC" />
</div>
<!-- 진술자 이메일 -->
<div class="col-md-8">
<label for="sttrEml--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">이메일</label>
<input type="text" class="form-control w-40" id="sttrEml--${pageName}" name="sttrEml" data-map="STTR_EML" />
</div>
<!-- 의견 제출 내용 -->
<div class="col-md-12">
<label for="opnnSbmsnCn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">의견제출내용</label>
<textarea type="text" class="form-control w-85" id="opnnSbmsnCn--${pageName}" name="opnnSbmsnCn" data-map="OPNN_SBMSN_CN" rows="5" data-maxlengthb="4000"></textarea>
</div>
<!-- 의견 제출 구분 코드 -->
<div class="col-md-12">
<label for="opnnSbmsnSeCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">의견제출구분</label>
<select class="form-select" id="opnnSbmsnSeCd--${pageName}" name="opnnSbmsnSeCd" data-map="OPNN_SBMSN_SE_CD" required>
<option value="">선택하세요</option>
<c:forEach items="${FIM033List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 의견 제출 요지 -->
<div class="col-md-12">
<label for="opnnSbmsnGist--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">의견제출요지</label>
<input type="text" class="form-control w-85" id="opnnSbmsnGist--${pageName}" name="opnnSbmsnGist" data-map="OPNN_SBMSN_GIST" data-maxlengthb="300" />
</div>
<!-- 담당자 검토 의견 -->
<div class="col-md-12">
<label for="picRvwOpnn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">검토의견</label>
<textarea class="form-control w-85" id="picRvwOpnn--${pageName}" name="picRvwOpnn" data-map="PIC_RVW_OPNN" rows="3" data-maxlengthb="1000">
</textarea>
</div>
</div>
</form>
<!-- 입력 영역 -->
<!-- 첨부 파일 -->
<div class="card">
<form id="frmFile--${pageName}" method="post" enctype="multipart/form-data" >
<input type="file" id="uploadFiles--${pageName}" name="uploadFiles" multiple="multiple" onchange="pageObject['${pageName}'].fnAddFiles(this);" hidden />
</form>
<div class="row g-1">
<div class="col-md-12">
<button type="button" class="btn btn-blue w-px-120" id="btnAddFile--${pageName}" title="첨부파일 추가">파일추가</button>
</div>
</div>
<!-- 첨부 파일 테이블 -->
<div class="table-responsive">
<table class="table table-bordered table-hover table-striped" id="fileList--${pageName}">
<thead>
<th class="text-center" style="width: 24px">No.</th>
<th class="text-center" style="width: 200px">파일번호</th>
<th class="text-center">파일이름</th>
<th class="text-center" style="width: 200px">파일크기</th>
<th class="text-center" style="width: 120px">다운로드</th>
<th class="text-center" style="width: 120px">삭제</th>
</thead>
<tbody>
</tbody>
</table>
</div> <!-- 첨부 파일 테이블 <div class="table-responsive"> -->
</div> <!-- <div class="card"> -->
<!-- 첨부 파일 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnSave--${pageName}" title="저장">저장</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
</div> <!-- <div class="card"> -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
// 파일 리스트
$P.fileListArr = new Array();
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "opnn"
, prefixName: "의견제출"
, keymapper: info => info ? info.OPNN_ID : ""
, dataGetter: obj => obj.${infoPrefix}Info
});
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
// Dataset 셋팅
$P.formFields.set($P.control, item);
// 업무구분에 따른 URL 변경
$P.fnSetURL(item.data.TASK_SE_CD);
// 호출용도가 등록..
if ($P.callPurpose == "create") {
$("#rcptYmd--${pageName}").datepicker("setDate", new Date());
} else {
$P.fnSearchFileList(item.data.OPNN_ID); // 첨부파일 조회
}
}
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) {
// 폼을 리셋해서 uploadFiles에 출력된 선택 파일을 초기화시킨다.
document.getElementById("frmFile--${pageName}").reset();
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
let create = ($P.callPurpose == "create");
let formData = new FormData();
// 첨부파일 배열에 있는 내용을 등록
for (let iLoop = 0; iLoop < $P.fileListArr.length; iLoop++) {
formData.append("uploadFiles" , $P.fileListArr[iLoop]);
}
for (let key in info) {
let value = info[key];
formData.append(key, value);
}
ajax.post({
url: !create ? $P.control.urls.update : $P.control.urls.create
, data: formData
, contentType: false
, processData: false
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 업무구분에 따른 url 변경
$P.fnSetURL = (taskSeCd) => {
$P.control.urls.create = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/020/create.do"); // 등록
$P.control.urls.update = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/020/update.do"); // 수정
}
// 주소 검색 결과 callback
$P.callbackSearchAddr = (obj) => {
$("#sttrAddr--${pageName}").val(obj.ADDR); // 주소
$("#sttrZip--${pageName}").val(obj.ZIP); // 우편번호
$("#sttrDaddr--${pageName}").val(obj.DTL_ADDR); // 상세 주소
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 납부자 정보를 진술자 정보로 입력한다.
$P.fnSearchPayer = (title) => {
$("select[name='ownrRelCd'] option:contains('본인')").attr("selected", "selected");
$("#sttrNm--${pageName}").val($P.control.getValue("RTPYR_NM"));
$("#sttrBrdt--${pageName}").val($P.control.getValue("RTPYR_BRDT"));
$("#sttrAddr--${pageName}").val($P.control.getValue("ADDR"));
$("#sttrZip--${pageName}").val($P.control.getValue("ZIP"));
$("#sttrDaddr--${pageName}").val($P.control.getValue("DTL_ADDR"));
if ($P.control.getValue("RTPYR_MBL_TELNO") != "")
$("#sttrCttpc--${pageName}").val($P.control.getValue("RTPYR_MBL_TELNO"));
else
$("#sttrCttpc--${pageName}").val($P.control.getValue("RTPYR_TELNO"));
$("#sttrEml--${pageName}").val($P.control.getValue("RTPYR_EML"));
}
// 주소 검색
$P.fnSearchAddr = async(title) => {
let resp = await fetch(wctx.url("/resources/html/searchAddr.html"));
let template = await resp.text();
dialog.open({
id: "searchAddrDialog"
, title: title
, size: "lg"
, content: template
, init: () => {
$("#searchAddrCallback").val("pageObject['${pageName}'].callbackSearchAddr");
setDialogZindex();
}
});
}
// 첨부파일 조회
$P.fnSearchFileList = (opnnId) => {
// 의견제출 등록일 경우에는 첨부파일을 조회하지 안는다..
if (opnnId == null || opnnId == "") return;
// 첨부파일 리스트
ajax.get({
url: "file/list.do"
, data: {
infoType: "110"
, infoKeys: opnnId
, fetchSize: 0
}
, success: resp => {
let fileNo = 0;
let fileList = resp.fileList;
fileList.forEach(function (item, index, array) {
fileNo = index + 1;
let innerHtml = "";
innerHtml += "<tr>";
innerHtml += "<td class='text-center'>" + fileNo + "</td>";
innerHtml += "<td class='text-center'>" + item.FILE_ID + "</td>";
innerHtml += "<td class='text-center'>" + item.FILE_NM + "</td>";
innerHtml += "<td class='text-center'>" + item.FILE_SIZE + " byte</td>";
innerHtml += "<td class='text-center'>" + "<button type='button' class='btn' onclick=";
innerHtml += "pageObject['${pageName}'].fnFileDownload(" + item.FILE_ID + ");" + "><i class='bx bx-download me-1'></i></button>" + "</td>";
innerHtml += "<td class='text-center'>" + "<button type='button' class='btn' onclick=";
innerHtml += "pageObject['${pageName}'].fnFileRemove(this);" + "><i class='bx bx-trash me-1'></i></button>" + "</td>";
innerHtml += "</tr>";
$("#fileList--${pageName} > tbody:last").append(innerHtml);
});
}
});
}
// 첨부파일 등록
$P.fnAddFiles = (obj) => {
let fileNo = $("#fileList--${pageName} > tbody tr").length; // table의 tr 개수
let maxFileCnt = 3; // 첨부파일 최대 개수
let attFileCnt = obj.files.length; // 선택한 파일 개수 + 기존 파일 개수
let fileArr = new Array(); // 파일 배열
fileArr = $P.fileListArr;
// 등록할 파일 개수 확인
if (attFileCnt + fileNo > maxFileCnt) {
dialog.alert({
content : "첨부파일은 최대 " + maxFileCnt + "개 까지 첨부 가능합니다."
});
return;
}
// 첨부파일을 table에 추가.
for (let iLoop = 0; iLoop < attFileCnt; iLoop++) {
let selectedFile = obj.files[iLoop];
let innerHtml = "";
fileNo += 1;
innerHtml += "<tr>";
innerHtml += "<td class='text-center'>" + fileNo + "</td>";
innerHtml += "<td class='text-center'>" + "</td>";
innerHtml += "<td class='text-center'>" + selectedFile.name + "</td>";
innerHtml += "<td class='text-center'>" + selectedFile.size + " byte</td>";
innerHtml += "<td class='text-center'>" + "</td>";
innerHtml += "<td class='text-center'>" + "<button type='button' class='btn' onclick=";
innerHtml += "pageObject['${pageName}'].fnFileRemove(this);" + "><i class='bx bx-trash me-1'></i></button>" + "</td>";
innerHtml += "</tr>";
$("#fileList--${pageName} > tbody:last").append(innerHtml);
fileArr.push(obj.files[iLoop]);
}
}
// 첨부파일 삭제 아이콘 클릭 이벤트
$P.fnFileRemove = (obj) => {
dialog.alert({
content: "선택한 파일을 삭제하시겠습니까?"
, onOK: () => {
let tr = $(obj).parent().parent(); // 클릭한 버튼이 속한 tr 요소
let td = tr.children();
let fileNo = td.eq(0).text(); // 삭제할 파일 번호
let fileId = td.eq(1).text();
if (fileId != null && fileId != "") {
ajax.post({
url: "file/remove.do"
, data: { fileIDs : fileId }
, success: resp => { // 성공
}
});
} else {
// 배열에서 삭제한다. 배열은 0부터 시작하기 때문에 -1 해준다.
$P.fileListArr.splice(fileNo - 1);
}
$(obj).closest("tr").remove(); // table 에서 제거
}
});
}
// 첨부파일 다운로드 아이콘 클릭 이벤트
$P.fnFileDownload = (fileID) => {
top.location.href = "/file/download.do?fileID=" + fileID;
}
// 저장
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.control.save($P.formFields.get()); // formFields
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmEdit--${pageName}").find(".form-date").each(function() {
$(this).on("input",function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0,4) + "-" + value.substring(4,6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0,4) + "-" + value.substring(4);
}
});
});
// 버튼 이벤트
$("#btnSearchPayer--${pageName}").on("click", function() { // 납부자 정보 조회 버튼 이벤트
$P.fnSearchPayer($(this).attr("title"));
});
$("#btnSearchAddr--${pageName}").on("click", function() { // 주소 검색 버튼 이벤트
$P.fnSearchAddr($(this).attr("title"));
});
$("#btnAddFile--${pageName}").on('click', () => $("#uploadFiles--${pageName}").trigger("click")); // 파일 등록 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장 버튼 이벤트
}
// 초기 화면 설정
$P.initForm = () => {
// 달력 초기화
initDatepicker("frmEdit--${pageName}");
$("#rcptYmd--${pageName}").datepicker("setDate", new Date());
// 화면 활성화 설정
$("#vhrno--${pageName}").prop("readonly", true); // 차량번호
$("#crdnYmdTm--${pageName}").prop("readonly", true); // 단속 일자
$("#rtpyrNm--${pageName}").prop("readonly", true); // 납부자 명
// View로 호출
if ($P.callPurpose == "view") {
// input 요소들을 disabled
$("#frmEdit--${pageName}").find("input,textarea,select").prop("disabled", true);
// button 요소들을 disabled
$("#btnRcptYmd--${pageName}").prop("disabled", true); // 접수 일자 달력 버튼
$("#btnSearchPayer--${pageName}").prop("disabled", true); // 납부자 버튼
$("#btnSearchAddr--${pageName}").prop("disabled", true); // 우편번호 버튼
$("#btnAddFile--${pageName}").prop("disabled", true); // 파일 추가 버튼
$("#btnSave--${pageName}").prop("disabled", true); // 저장 버튼
} else if ($P.callPurpose == "create") {
$("#rcptNo--${pageName}").prop("readonly", true); // 접수 번호
$("#rcptYmd--${pageName}").datepicker("setDate", new Date()); // 접수 일자
}
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. Dataset 설정
$P.control.setData([${opnnSbmsnInfo}]);
});
</script>

@ -1,321 +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>
<!-- inner page html -->
<div class="content-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<input type="hidden" id="crdnId--${pageName}" name="crdnId" data-map="CRDN_ID" />
<input type="hidden" id="opnnId--${pageName}" name="opnnId" data-map="OPNN_ID" />
<div class="row g-1">
<!-- 접수 번호 -->
<div class="col-md-6">
<label for="rcptNo--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">접수번호</label>
<input type="text" class="form-control w-30" id="rcptNo--${pageName}" name="rcptNo" data-map="RCPT_NO" readonly />
</div>
<!-- 접수 일자 -->
<div class="col-md-6">
<label for="rcptYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">접수일자</label>
<input type="text" class="form-control w-25" id="rcptYmd--${pageName}" name="rcptYmd" data-map="RCPT_YMD" data-fmt-type="day" readonly />
</div>
<!-- 진술자 이름 -->
<div class="col-md-6">
<label for="sttrNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">성명</label>
<input type="text" class="form-control w-30" id="sttrNm--${pageName}" name="sttrNm" data-map="STTR_NM" readonly />
</div>
<!-- 의견 제출 구분 코드 -->
<div class="col-md-6">
<label for="opnnSbmsnSeNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">의견제출구분</label>
<input type="text" class="form-control w-50" id="opnnSbmsnSeNm--${pageName}" name="opnnSbmsnSeNm" data-map="OPNN_SBMSN_SE_NM" readonly />
</div>
<!-- 의견 제출 요지 -->
<div class="col-md-12">
<label for="opnnSbmsnGist--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">의견제출요지</label>
<textarea class="form-control w-85" id="opnnSbmsnGist--${pageName}" name="opnnSbmsnGist" data-map="OPNN_SBMSN_GIST" rows="2" data-maxlengthb="300" readonly></textarea>
</div>
<!-- 담당자 검토 의견 -->
<div class="col-md-12">
<label for="picRvwOpnn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">검토의견</label>
<textarea class="form-control w-85" id="picRvwOpnn--${pageName}" name="picRvwOpnn" data-map="PIC_RVW_OPNN" rows="3" data-maxlengthb="1000"></textarea>
</div>
<!-- 문서 번호 -->
<div class="col-md-6">
<label for="docNo--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">문서번호</label>
<input type="text" class="form-control w-40" id="docNo--${pageName}" name="docNo" data-map="DOC_NO" />
</div>
<!-- 통보 구분 코드 -->
<div class="col-md-6">
<label for="ntfctnSeCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">통보구분</label>
<select class="form-select" id="ntfctnSeCd--${pageName}" name="ntfctnSeCd" data-map="NTFCTN_SE_CD" required>
<option value="">선택하세요</option>
<c:forEach items="${FIM030List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 의견 제출 상태 코드 -->
<div class="col-md-6">
<label for="opnnSbmsnSttsCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">심의결과</label>
<select class="form-select" id="opnnSbmsnSttsCd--${pageName}" name="opnnSbmsnSttsCd" data-map="OPNN_SBMSN_STTS_CD" onchange="pageObject['${pageName}'].fnChangeOpnnSbmsnSttsCd(this.value);" required>
<option value="">선택하세요</option>
<c:forEach items="${FIM031List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 답변 일시 -->
<div class="col-md-6">
<label for="ansYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">심의일시</label>
<input type="text" class="form-control form-date" id="ansYmd--${pageName}" name="ansYmd" data-map="ANS_YMD"
data-fmt-type="day" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
<input type="text" class="form-control form-time" id="ansTm--${pageName}" name="ansTm" data-map="ANS_TM"
data-fmt-type="time" maxlength="8" placeholder="시:분:초" required />
</div>
<!-- 감경 사유 코드 -->
<div class="col-md-6" id="divRdctRsnCd--${pageName}">
<label for="rdctRsnCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">감경사유</label>
<select class="form-select" id="rdctRsnCd--${pageName}" name="rdctRsnCd" data-map="RDCT_RSN_CD">
<c:forEach items="${FIM019List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 감경 금액 -->
<div class="col-md-6" id="divRdctAmt--${pageName}">
<label for="rdctAmt--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">감경금액</label>
<input type="text" class="form-control w-30 text-end" id="rdctAmt--${pageName}" name="rdctAmt" data-map="RDCT_AMT" readonly />
</div>
<!-- 답변 내용 -->
<div class="col-md-12">
<label for="ansCn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">심의내용</label>
<textarea class="form-control w-85" id="ansCn--${pageName}" name="ansCn" data-map="ANS_CN" rows="5" data-maxlengthb="4000"></textarea>
</div>
</div>
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-80" id="btnSave--${pageName}" title="저장">
저장
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
</div> <!-- <div class="card"> -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "opnnDlbr"
, prefixName: "의견제출 심의"
, keymapper: info => info ? info.OPNN_ID : ""
, dataGetter: obj => obj.${infoPrefix}Info
});
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
// Dataset 셋팅
$P.formFields.set($P.control, item);
// 업무구분에 따른 URL 변경
$P.fnSetURL(item.data.TASK_SE_CD);
// 의견제출 상태 코드 변경
$P.fnChangeOpnnSbmsnSttsCd(item.data.OPNN_SBMSN_STTS_CD);
if (item.data.ANS_YMD == null || item.data.ANS_YMD == "") {
$("#ansYmd--${pageName}").datepicker("setDate", new Date()); // 날짜
$("#ansTm--${pageName}").val(new Date().toTimeString().split(" ")[0]); // 시간 "09:51:35 GMT+0900 (한국 표준시)"의 형식에서 공백을 기준으로 잘라 시간 부분만 가져와줍니다.
}
}
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
ajax.post({
url: $P.control.urls.update
, data: info
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 업무구분에 따른 URL 설정
$P.fnSetURL = (taskSeCd) => {
$P.control.urls.update = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/030/update.do"); // 수정
}
// 의견제출 상태 코드 변경
$P.fnChangeOpnnSbmsnSttsCd = (obj) => {
// javascript를 이용한 visibility 변경 (이 방법을 사용하는 경우, 안에 있는 요소들이 보이지않지만 그 요소들이 할당 하고 있는 공간은 그대로 유지(공백처리))
// document.getElementById("divRdctRsnCd--${pageName}").style.visibility = "hidden";
// document.getElementById("divRdctRsnCd--${pageName}").style.visibility = "visible";
$("#divRdctRsnCd--${pageName}").hide();
$("#divRdctAmt--${pageName}").hide();
$("#rdctRsnCd--${pageName}").attr("required", false);
$("#rdctAmt--${pageName}").attr("required", false);
if (obj == "04") { // 의견제출 상태 코드(FIM031) 04: 과태료감경
// 필수 선택 추가 필요
$("#divRdctRsnCd--${pageName}").show();
$("#divRdctAmt--${pageName}").show();
$("#rdctRsnCd--${pageName}").attr("required", true);
$("#rdctAmt--${pageName}").attr("required", true);
}
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 저장
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
// 감경 사유 확인
let opnnSbmsnSttsCd = $("#opnnSbmsnSttsCd--${pageName}").val();
let rdctRsnCd = $("#rdctRsnCd--${pageName} option:selected").val();
let rdctRsnNm = $("#rdctRsnCd--${pageName} option:selected").text();
if (opnnSbmsnSttsCd == "04" && rdctRsnCd == "00") {
dialog.alert({
content: "감경사유가 '" + rdctRsnNm + "' 입니다."
+ "<br>" + "[" + $P.control.prefixName + " 저장" + "]" + " 실행이 취소되었습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
dialog.alert({
content: "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.control.save($P.formFields.get()); // formFields
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmEdit--${pageName}").find(".form-date").each(function() {
$(this).on("input",function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// form-date 항목에서 키보드로 입력시 시간 포맷팅 적용
$("#frmEdit--${pageName}").find(".form-time").each(function() {
$(this).on("input",function() {
let value = this.value.replaceAll(":", "");
if (value.length > 5) {
this.value = value.substring(0, 2) + ":" + value.substring(2, 4) + ":" + value.substring(4);
} else if (value.length > 3) {
this.value = value.substring(0, 2) + ":" + value.substring(2);
}
});
});
// 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장
}
// 초기 화면 설정
$P.initForm = () => {
// 달력 초기화
initDatepicker("frmEdit--${pageName}");
$("#ansYmd--${pageName}").datepicker("setDate", new Date());
$("#ansTm--${pageName}").val(new Date().toTimeString().split(" ")[0]);
// view 로 호출됐을 경우..
if ($P.callPurpose == "view") {
$("btnSave--${pageName}").attr("disabled", true);
}
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. Dataset 설정
$P.control.setData([${opnnSbmsnInfo}]);
});
</script>

@ -1,240 +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>
<!-- inner page html -->
<div class="content-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<input type="hidden" id="mngId--${pageName}" name="mngId" data-map="MNG_ID" />
<div class="row g-1">
<!-- 1 직급 -->
<div class="col-md-7">
<label for="dlbrMbrJbgd1--${pageName}" class="w-px-70 bg-lighter pe-2 col-form-label text-sm-end">심의위원1</label>
<label for="dlbrMbrJbgd1--${pageName}" class="w-px-40 bg-lighter pe-2 col-form-label text-sm-end">직급</label>
<input type="text" class="form-control w-50" id="dlbrMbrJbgd1--${pageName}" name="dlbrMbrJbgd1" data-map="DLBR_MBR_JBGD1" />
</div>
<!-- 1 회원명 -->
<div class="col-md-5">
<label for="dlbrMbrNm1--${pageName}" class="w-px-60 bg-lighter pe-2 col-form-label text-sm-end">성명</label>
<input type="text" class="form-control w-60" id="dlbrMbrNm1--${pageName}" name="dlbrMbrNm1" data-map="DLBR_MBR_NM1" />
</div>
<!-- 2 직급 -->
<div class="col-md-7">
<label for="dlbrMbrJbgd2--${pageName}" class="w-px-70 bg-lighter pe-2 col-form-label text-sm-end">심의위원2</label>
<label for="dlbrMbrJbgd2--${pageName}" class="w-px-40 bg-lighter pe-2 col-form-label text-sm-end">직급</label>
<input type="text" class="form-control w-50" id="dlbrMbrJbgd2--${pageName}" name="dlbrMbrJbgd2" data-map="DLBR_MBR_JBGD2" />
</div>
<!-- 2 회원명 -->
<div class="col-md-5">
<label for="dlbrMbrNm2--${pageName}" class="w-px-60 bg-lighter pe-2 col-form-label text-sm-end">성명</label>
<input type="text" class="form-control w-60" id="dlbrMbrNm2--${pageName}" name="dlbrMbrNm2" data-map="DLBR_MBR_NM2" />
</div>
<!-- 3 직급 -->
<div class="col-md-7">
<label for="dlbrMbrJbgd3--${pageName}" class="w-px-70 bg-lighter pe-2 col-form-label text-sm-end">심의위원3</label>
<label for="dlbrMbrJbgd3--${pageName}" class="w-px-40 bg-lighter pe-2 col-form-label text-sm-end">직급</label>
<input type="text" class="form-control w-50" id="dlbrMbrJbgd3--${pageName}" name="dlbrMbrJbgd3" data-map="DLBR_MBR_JBGD3" />
</div>
<!-- 3 회원명 -->
<div class="col-md-5">
<label for="dlbrMbrNm3--${pageName}" class="w-px-60 bg-lighter pe-2 col-form-label text-sm-end">성명</label>
<input type="text" class="form-control w-60" id="dlbrMbrNm3--${pageName}" name="dlbrMbrNm3" data-map="DLBR_MBR_NM3" />
</div>
<!-- 4 직급 -->
<div class="col-md-7">
<label for="dlbrMbrJbgd4--${pageName}" class="w-px-70 bg-lighter pe-2 col-form-label text-sm-end">심의위원4</label>
<label for="dlbrMbrJbgd4--${pageName}" class="w-px-40 bg-lighter pe-2 col-form-label text-sm-end">직급</label>
<input type="text" class="form-control w-50" id="dlbrMbrJbgd4--${pageName}" name="dlbrMbrJbgd4" data-map="DLBR_MBR_JBGD4" />
</div>
<!-- 4 회원명 -->
<div class="col-md-5">
<label for="dlbrMbrNm4--${pageName}" class="w-px-60 bg-lighter pe-2 col-form-label text-sm-end">성명</label>
<input type="text" class="form-control w-60" id="dlbrMbrNm4--${pageName}" name="dlbrMbrNm4" data-map="DLBR_MBR_NM4" />
</div>
<!-- 5 직급 -->
<div class="col-md-7">
<label for="dlbrMbrJbgd5--${pageName}" class="w-px-70 bg-lighter pe-2 col-form-label text-sm-end">심의위원5</label>
<label for="dlbrMbrJbgd5--${pageName}" class="w-px-40 bg-lighter pe-2 col-form-label text-sm-end">직급</label>
<input type="text" class="form-control w-50" id="dlbrMbrJbgd5--${pageName}" name="dlbrMbrJbgd5" data-map="DLBR_MBR_JBGD5" />
</div>
<!-- 5 회원명 -->
<div class="col-md-5">
<label for="dlbrMbrNm5--${pageName}" class="w-px-60 bg-lighter pe-2 col-form-label text-sm-end">성명</label>
<input type="text" class="form-control w-60" id="dlbrMbrNm5--${pageName}" name="dlbrMbrNm5" data-map="DLBR_MBR_NM5" />
</div>
<!-- 6 직급 -->
<div class="col-md-7">
<label for="dlbrMbrJbgd6--${pageName}" class="w-px-70 bg-lighter pe-2 col-form-label text-sm-end">심의위원6</label>
<label for="dlbrMbrJbgd6--${pageName}" class="w-px-40 bg-lighter pe-2 col-form-label text-sm-end">직급</label>
<input type="text" class="form-control w-50" id="dlbrMbrJbgd6--${pageName}" name="dlbrMbrJbgd6" data-map="DLBR_MBR_JBGD6" />
</div>
<!-- 6 회원명 -->
<div class="col-md-5">
<label for="dlbrMbrNm6--${pageName}" class="w-px-60 bg-lighter pe-2 col-form-label text-sm-end">성명</label>
<input type="text" class="form-control w-60" id="dlbrMbrNm6--${pageName}" name="dlbrMbrNm6" data-map="DLBR_MBR_NM6" />
</div>
<!-- 7 직급 -->
<div class="col-md-7">
<label for="dlbrMbrJbgd7--${pageName}" class="w-px-70 bg-lighter pe-2 col-form-label text-sm-end">심의위원7</label>
<label for="dlbrMbrJbgd7--${pageName}" class="w-px-40 bg-lighter pe-2 col-form-label text-sm-end">직급</label>
<input type="text" class="form-control w-50" id="dlbrMbrJbgd7--${pageName}" name="dlbrMbrJbgd7" data-map="DLBR_MBR_JBGD7" />
</div>
<!-- 7 회원명 -->
<div class="col-md-5">
<label for="dlbrMbrNm7--${pageName}" class="w-px-60 bg-lighter pe-2 col-form-label text-sm-end">성명</label>
<input type="text" class="form-control w-60" id="dlbrMbrNm7--${pageName}" name="dlbrMbrNm7" data-map="DLBR_MBR_NM7" />
</div>
</div>
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-80" id="btnSave--${pageName}" title="저장">
저장
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
</div> <!-- <div class="card"> -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "opnnDlbrMbr"
, prefixName: "의견제출 심의위원 관리"
, keymapper: info => info ? info.MNG_ID : ""
, dataGetter: obj => obj.${infoPrefix}Info
});
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = item => {
if (!item) return;
// Dataset 셋팅
$P.formFields.set($P.control, item);
// 업무구분에 따른 URL 변경
$P.fnSetURL(item.data.TASK_SE_CD);
}
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
let create = (info.mngId == "");
ajax.post({
url: !create ? $P.control.urls.update : $P.control.urls.create
, data: info || {}
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 업무구분에 따른 URL 설정
$P.fnSetURL = (taskSeCd) => {
$P.control.urls.create = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/040/create.do"); // 등록
$P.control.urls.update = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/040/update.do"); // 수정
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 저장
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.control.save($P.formFields.get()); // formFields
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장
}
// 초기 화면 설정
$P.initForm = () => {
//
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. Dataset 설정
$P.control.setData([${opnnDlbrMbrInfo}]);
});
</script>

@ -1,602 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 재등록일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schReRegYmdFrom--${pageName}">재등록일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schReRegYmdFrom--${pageName}" name="schReRegYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schReRegYmdTo--${pageName}" name="schReRegYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 동적검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 단속일자 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCrdnYmdFrom--${pageName}">단속일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schCrdnYmdFrom--${pageName}" name="schCrdnYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schCrdnYmdTo--${pageName}" name="schCrdnYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 차량번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVhrno--${pageName}">차량번호</label>
<input type="text" class="form-control w-px-160" id="schVhrno--${pageName}" name="schVhrno" autocomplete="off" />
</div>
<!-- 납부자번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNm--${pageName}">납부자번호</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNm--${pageName}" name="schRtpyrNm" autocomplete="off" />
</div>
<!-- 납부자명 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNo--${pageName}">납부자명</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNo--${pageName}" name="schRtpyrNo" autocomplete="off" />
</div>
<!-- 등록일자, 수정일자 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnBfrCrdnTotalInfo--${pageName}" title="이전 단속 정보">
이전 단속 정보
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 160px;">업무구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RE_REG_YMD', this.innerText, 'ymd', '');">재등록일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('CRDN_REG_SE_CD', this.innerText, 'codeValue', 'FIM026');">단속등록구분</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ETC_CN', this.innerText, 'match', 'part');">기타내용</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CRDN_YMD', this.innerText, 'ymd', '');">단속일시</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VHRNO', this.innerText, 'match', 'part');">차량번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RTPYR_SE_CD', this.innerText, 'codeValue', 'FIM011');">납부자구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RTPYR_NO', this.innerText, 'ymd', '');">납부자번호</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('RTPYR_NM', this.innerText, 'match', 'part');">납부자명</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VLTN_ARTCL', this.innerText, 'match', 'part');">위반항목</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('CRDN_STDG_NM', this.innerText, 'match', 'part');">단속법정동</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('CRDN_PLC', this.innerText, 'match', 'part');">단속장소</th>
<th class="bpv" style="width: 280px;" onclick="searchFromGridTitle('DTL_CRDN_PLC', this.innerText, 'match', 'part');">상세단속장소</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_CRDN_AMT', this.innerText, 'match', 'part');">단속원금</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STTS_CD', this.innerText, 'codeValue', 'FIM010');">처리상태</th>
<th class="pvs" style="width: 140px;" onclick="searchFromGridTitle('CRDN_SPAREA_CD', this.innerText, 'codeValue', 'FIM007');">단속특별구역</th>
<th class="eca" style="width: 140px;" onclick="searchFromGridTitle('USE_FUEL_CD', this.innerText, 'codeValue', 'LVS005');">사용연료</th>
<th class="dpv" style="width: 140px;" onclick="searchFromGridTitle('PRK_PSBLTY_RSLT_CD', this.innerText, 'codeValue', 'FIM034');">주차가능여부</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('ZIP', this.innerText, 'match', 'part');">우편번호</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ADDR', this.innerText, 'match', 'part');">주소</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('DTL_ADDR', this.innerText, 'match', 'part');">상세주소</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{RE_REG_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RE_REG_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_REG_SE_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ETC_CN}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_YMD_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_SE_NM}</td>
<td class="cmn text-center privacy-cell" onclick="{onclick}" ondblclick="{ondblclick}">
<span>{RTPYR_NO}</span>
<span>*************</span>
</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="bpv text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_CRDN_PLC}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_CRDN_AMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STTS_NM}</td>
<td class="pvs text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_SPAREA_NM}</td>
<td class="eca text-center" onclick="{onclick}" ondblclick="{ondblclick}">{USE_FUEL_NM}</td>
<td class="dpv text-center" onclick="{onclick}" ondblclick="{ondblclick}">{PRK_PSBLTY_RSLT_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="bpv">
<td valign="top" colspan="22" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="dpv">
<td valign="top" colspan="22" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="eca">
<td valign="top" colspan="22" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pvs">
<td valign="top" colspan="22" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pes">
<td valign="top" colspan="22" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "crdnReReg"
, prefixName: "단속 재등록"
, keymapper: info => info ? info.RE_REG_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, formats: {
RE_REG_YMD: dateFormat
, CRDN_YMD_TM: datetimeFormat
, FFNLG_CRDN_AMT: numberFormat
, REG_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "$P.control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.RE_REG_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let clsForTask = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val().toLowerCase(); // 소문자
// 업무별 DataTables(그리드) tr, td
let foundContent = document.getElementById("${infoPrefix}Row--${pageName}").content;
let foundTr = $(foundContent).find("tr")[0].cloneNode(false);
let foundTds = $(foundContent).find("." + clsForTask + ",.cmn");
foundTds.each(function() {
foundTr.appendChild(this.cloneNode(true));
});
//
let replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("RE_REG_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');");
let trs = empty ? [document.getElementById("${infoPrefix}NotFound--${pageName}").content.querySelector("." + clsForTask + ",.cmn").outerHTML]
: ${infoPrefix}List.inStrings(foundTr.outerHTML, replacer);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId, callSection) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let callControlName = "";
if (typeof callSection == "undefined" || callSection == null || callSection == "") {
callControlName = "pageObject['${pageName}'].control";
} else {
callControlName = callSection;
}
let params = {
callControlName: callControlName
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수 FETCH_XS = 30
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 이전 단속정보보기 버튼 이벤트
$P.fnBfrCrdnTotalInfo = (title) => {
let bfrCrdnId = $P.control.dataset.getValue("BFR_CRDN_ID");
// 이전 단속 ID 가 없다면.. return
if (typeof bfrCrdnId == "undefined" || bfrCrdnId == null || bfrCrdnId == "") return;
// 개별총정보 dialog
$P.getTotalInfo(bfrCrdnId, "noControlName");
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 버튼 이벤트
$("#btnBfrCrdnTotalInfo--${pageName}").on("click", function() {
$P.fnBfrCrdnTotalInfo($(this).attr("title")); // 이전 단속정보
});
// DataTables width 변경 조정 업무별 그리드가 존재 한다면.. crdn06010-main.jsp 참고
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schReRegYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date); // 재등록 일자 시작
$("#schReRegYmdTo--${pageName}").datepicker("setDate", new Date()); // 재등록 일자 종료
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/010/list.do"); // 검색
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + taskSeCd.toLowerCase() + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,764 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 단속 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCrdnYmdFrom--${pageName}">단속일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schCrdnYmdFrom--${pageName}" name="schCrdnYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schCrdnYmdTo--${pageName}" name="schCrdnYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 위반 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVltnCd--${pageName}">위반항목</label>
<select class="form-select w-px-120" id="schVltnCd--${pageName}" name="schVltnCd">
<option value="">전체</option>
<c:forEach items="${FIM004List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 차량번호 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVhrno--${pageName}">차량번호</label>
<input type="text" class="form-control w-px-160" id="schVhrno--${pageName}" name="schVhrno" autocomplete="off" />
</div>
<!-- 동적검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 민원 접수 일자 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCvlcptRcptYmdFrom--${pageName}">민원접수일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schCvlcptRcptYmdFrom--${pageName}" name="schCvlcptRcptYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schCvlcptRcptYmdTo--${pageName}" name="schCvlcptRcptYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 민원 처리 완료 일시 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCvlcptPrcsCmptnDtFrom--${pageName}">민원처리일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schCvlcptPrcsCmptnDtFrom--${pageName}" name="schCvlcptPrcsCmptnDtFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schCvlcptPrcsCmptnDtTo--${pageName}" name="schCvlcptPrcsCmptnDtTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 민원 처리 담당자 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCvlcptPrcsPic--${pageName}">민원담당자</label>
<input type="text" class="form-control w-px-150" id="schCvlcptPrcsPic--${pageName}" name="schCvlcptPrcsPic" />
</div>
<!-- 납부자번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNm--${pageName}">납부자번호</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNm--${pageName}" name="schRtpyrNm" autocomplete="off" />
</div>
<!-- 납부자명 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNo--${pageName}">납부자명</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNo--${pageName}" name="schRtpyrNo" autocomplete="off" />
</div>
<!-- 등록일자, 수정일자 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnCreateSlctnTrgt--${pageName}" title="선택 대상 감경부과 등록">
선택 대상 감경부과 등록
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnCreateWholTrgt--${pageName}" title="전체 대상 감경부과 등록">
전체 대상 감경부과 등록
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-400" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;">업무구분</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CRDN_YMD', this.innerText, 'ymd', '');">단속일시</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VHRNO', this.innerText, 'match', 'part');">차량번호</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STDG_NM', this.innerText, 'match', 'part');">법정동</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('CRDN_PLC', this.innerText, 'match', 'part');">단속장소</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VLTN_ARTCL', this.innerText, 'match', 'part');">위반항목</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_CRDN_AMT', this.innerText, 'match', 'part');">단속원금</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_AMT', this.innerText, 'match', 'part');">과태료금액</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STTS_CD', this.innerText, 'codeValue', 'FIM010');">처리상태</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('CVLCPT_RCPT_YMD', this.innerText, 'ymd', '');">민원접수일자</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CVLCPT_APLY_NO', this.innerText, 'match', 'part');">민원신청번호</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CVLCPT_RCPT_NO', this.innerText, 'match', 'part');">민원접수번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('CVLCPT_PRCS_PIC_NM', this.innerText, 'match', 'part');">민원담당자</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CVLCPT_PRCS_CMPTN_DT', this.innerText, 'ymd', '');">민원처리일시</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('CVLCPT_TRSM_CD', this.innerText, 'codeValue', 'FIM018');">민원전송결과</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RTPYR_SE_CD', this.innerText, 'codeValue', 'FIM011');">납부자구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RTPYR_NO', this.innerText, 'ymd', '');">납부자번호</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('RTPYR_NM', this.innerText, 'match', 'part');">납부자명</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('ZIP', this.innerText, 'match', 'part');">우편번호</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ADDR', this.innerText, 'match', 'part');">주소</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('DTL_ADDR', this.innerText, 'match', 'part');">상세주소</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{CRDN_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{CRDN_ID}" onchange="pageObject['${pageName}'].control.select('{CRDN_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_YMD_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_CRDN_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_AMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STTS_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_APLY_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_NO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_PRCS_PIC_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_PRCS_CMPTN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_TRSM_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_SE_NM}</td>
<td class="cmn text-center privacy-cell" onclick="{onclick}" ondblclick="{ondblclick}">
<span>{RTPYR_NO}</span>
<span>*************</span>
</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="bpv">
<td valign="top" colspan="28" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="dpv">
<td valign="top" colspan="28" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="eca">
<td valign="top" colspan="28" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pvs">
<td valign="top" colspan="28" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pes">
<td valign="top" colspan="28" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- / <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
// 공통 코드
var FIM004 = new CommonCodes(${FIM004}, true); // 주정차위반 내역 코드
var FIM005 = new CommonCodes(${FIM005}, true); // 전용차로위반 내역 코드
var FIM006 = new CommonCodes(${FIM006}, true); // 장애인주차위반 내역 코드
var FIM061 = new CommonCodes(${FIM061}, true); // 전기차 충전구역 및 충전방해 위반 코드
var FIM064 = new CommonCodes(${FIM064}, true); // 화물자동차 밤샘주차 위반 코드
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "rdctLevyTrgt"
, prefixName: "감경부과 대상"
, infoSize: "md"
, keymapper: info => info ? info.CRDN_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, formats: {
CRDN_YMD_TM: datetimeFormat
, CVLCPT_RCPT_YMD: dateFormat
, FFNLG_CRDN_AMT: numberFormat
, FFNLG_AMT: numberFormat
, CVLCPT_PRCS_CMPTN_DT: datetimeFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list : $P.control.dataset
, prefix : "paging--${pageName}"
, start : obj.${infoPrefix}Start
, totalSize : obj.${infoPrefix}Total
, fetchSize : obj.${infoPrefix}Fetch
, func : "$P.control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.CRDN_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 선택 대상 감경부과 등록 버튼
$("#btnCreateSlctnTrgt--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 상세정보 dialog
$P.control.getInfo = (params) => {
if (!params) return;
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/020/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("Dialog--${pageName}")
, title: params.title
, content: resp
, size: $P.control.infoSize
, onClose: () => {
$P.control.query.crdnIds = null; // 체크 자료
$P.fnRefreshList(); // 자료 재조회
}
});
}
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let clsForTask = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val().toLowerCase(); // 소문자
// 업무별 DataTables(그리드) tr, td
let foundContent = document.getElementById("${infoPrefix}Row--${pageName}").content;
let foundTr = $(foundContent).find("tr")[0].cloneNode(false);
let foundTds = $(foundContent).find("." + clsForTask + ",.cmn");
foundTds.each(function() {
foundTr.appendChild(this.cloneNode(true));
});
//
let replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("CRDN_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');");
let trs = empty ? [document.getElementById("${infoPrefix}NotFound--${pageName}").content.querySelector("." + clsForTask + ",.cmn").outerHTML]
: ${infoPrefix}List.inStrings(foundTr.outerHTML, replacer);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
// 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id : "totalInfoMainDialog"
, title : "개별총정보"
, content : resp
, size : "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경 이벤트
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content : "검색된 자료가 없습니다."
, onOK : () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 선택 감경부과 등록 버튼 이벤트
$P.fnCreateSlctnTrgt = (title) => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) return;
let tnocs = selected.length;
let strAmt = "";
let gramtFfnlgAmt = 0;
let gramtAdvntceAmt = 0;
selected.forEach (function (el, index) {
pageObject['${pageName}'].control.setCurrent(selected[index]);
strAmt = $P.control.dataset.getValue("FFNLG_AMT");
gramtFfnlgAmt = gramtFfnlgAmt + Number(strAmt.replaceAll(",", ""));
gramtAdvntceAmt = gramtAdvntceAmt + Number($P.control.dataset.getValue("ADVNTCE_AMT"));
});
// 파라미터 설정
let params = $P.control.query; // 검색 조건
params.title = title; // 타이틀
params.callPurpose = "create"; // 호출 용도 (등록)
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
params.tnocs = tnocs; // 총 건수
params.gramtFfnlgAmt = gramtFfnlgAmt; // 총 과태료 금액
params.gramtAdvntceAmt = gramtAdvntceAmt; // 총 사전 감경 금액
params.crdnIds = selected.join(","); // Ids
params.delYn = "N"; // 삭제 여부
$P.control.getInfo(params);
}
// 전체 감경부과 등록 버튼 이벤트
$P.fnCreateWholTrgt = (title) => {
if ($P.control.dataset.empty) {
dialog.alert({
content : "검색된 자료가 없습니다."
, onOK : () => { }
});
return;
}
// 파라미터 설정
let params = $P.control.query; // 검색 조건
params.title = title; // 타이틀
params.callPurpose = "create"; // 호출 용도 (등록)
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
params.tnocs = $P.control.dataset.getValue("TNOCS"); // 총 건수
params.gramtFfnlgAmt = $P.control.dataset.getValue("GRAMT_FFNLG_AMT"); // 총 과태료 금액
params.gramtAdvntceAmt = $P.control.dataset.getValue("GRAMT_ADVNTCE_AMT"); // 총 사전 감경 금액
params.delYn = "N"; // 삭제 여부
$P.control.getInfo(params);
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList(); 
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 버튼 이벤트
$("#btnCreateSlctnTrgt--${pageName}").on("click", function() {
$P.fnCreateSlctnTrgt($(this).attr("title")); // 선택 대상 감경부과 등록
});
$("#btnCreateWholTrgt--${pageName}").on("click", function() {
$P.fnCreateWholTrgt($(this).attr("title")); // 전체 대상 감경부과 등록
});
// DataTables width 변경 조정 업무별 그리드가 존재 한다면.. crdn06010-main.jsp 참고
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schCrdnYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date); // 단속 일자 시작
$("#schCrdnYmdTo--${pageName}").datepicker("setDate", new Date()); // 단속 일자 종료
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/010/list.do"); // 검색
// 업무에 따른 위반 내용
let vltnCd = [];
if (taskSeCd == "PVS") { // 주정차 위반
vltnCd = FIM004.list();
} else if (taskSeCd == "BPV") { // 전용차로 위반
vltnCd = FIM005.list();
} else if (taskSeCd == "DPV") { // 장애인 전용
vltnCd = FIM006.list();
} else if (taskSeCd == "ECA") { // 전기차 주차 위반
vltnCd = FIM061.list();
} else if (taskSeCd == "PES") { // 밤샘 주차 위반
vltnCd = FIM064.list();
} else {
return;
}
// 위반 항목
$("#schVltnCd--${pageName}").empty();
$("#schVltnCd--${pageName}").append("<option value=''>" + "전체" + "</option>");
$(vltnCd).each(function(index, item) {
$("#schVltnCd--${pageName}").append("<option value='" + vltnCd[index].code +"'>" + vltnCd[index].value + "</option>");
});
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + taskSeCd.toLowerCase() + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,247 +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>
<!-- inner page html -->
<div class="content-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<input type="hidden" id="advntceDayCnt--${pageName}" name="advntceDayCnt" data-map="ADVNTCE_DAY_CNT" />
<div class="row g-1">
<!-- 총건수 -->
<div class="col-md-12">
<label for="tnocs--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">총 건수/금액</label>
<input type="text" class="form-control w-px-60 text-end" id="tnocs--${pageName}" name="tnocs" data-map="TNOCS" />
<input type="text" class="form-control w-px-120 text-end" id="gramtFfnlgAmt--${pageName}" name="gramtFfnlgAmt" data-map="GRAMT_FFNLG_AMT" />
</div>
<!-- 감경 율 -->
<div class="col-md-12">
<label for="advntceRdcrt--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">감경율</label>
<input type="text" class="form-control w-px-40 fw-bold text-end" id="advntceRdcrt--${pageName}" name="advntceRdcrt" data-map="ADVNTCE_RDCRT" /> %
</div>
<!-- 감경 부과 금액 -->
<div class="col-md-12">
<label for="gramtAdvntceAmt--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">감경부과금액</label>
<input type="text" class="form-control w-px-120 fw-bold text-red text-end" id="gramtAdvntceAmt--${pageName}" name="gramtAdvntceAmt" data-map="GRAMT_ADVNTCE_AMT" />
</div>
<!-- 회계연도 -->
<div class="col-md-12">
<label for="fyr--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">회계연도</label>
<input type="text" class="form-control w-px-60" id="fyr--${pageName}" name="fyr" data-map="FYR" autocomplete="off" required />
</div>
<!-- 부과 일자 -->
<div class="col-md-12">
<label for="levyYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">부과일자</label>
<input type="text" class="form-control form-date" id="levyYmd--${pageName}" name="levyYmd" data-map="LEVY_YMD"
data-fmt-type="day" autocomplete="off" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white" id="btnLevyYmd--${pageName}"></button>
</div>
<!-- 납기 일자 -->
<div class="col-md-12">
<label for="dudtYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">납기일자</label>
<input type="text" class="form-control form-date" id="dudtYmd--${pageName}" name="dudtYmd" data-map="DUDT_YMD"
data-fmt-type="day" autocomplete="off" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white" id="btnDudtYmd--${pageName}"></button>
</div>
</div>
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-80" id="btnSave--${pageName}" title="저장">
저장
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
</div> <!-- <div class="card"> -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
// main 의 검색 조건을 그대로 유지
$P.mainQuery = ${mainQuery};
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "rdctLevyTrgt"
, prefixName: "감경부과"
, keymapper: info => info ? info.CRDN_ID : ""
, dataGetter: obj => obj.${infoPrefix}Info
, formats: {
TNOCS: numberFormat
, GRAMT_FFNLG_AMT: numberFormat
, GRAMT_ADVNTCE_AMT: numberFormat
}
});
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = item => {
if (!item) return;
// Dataset 셋팅
$P.formFields.set($P.control, item);
// 업무구분에 따른 URL 변경
$P.fnSetURL(item.data.TASK_SE_CD);
}
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
ajax.post({
url: $P.control.urls.create
, data: params || {}
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 업무구분에 따른 URL 설정
$P.fnSetURL = (taskSeCd) => {
$P.control.urls.create = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/020/createRdctLevyList.do"); // 등록
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 저장 버튼 클릭 이벤트
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
// 메인에서 받은 검색 조건과 객체를 합친다.
let params = $.extend({}, $P.mainQuery, $P.formFields.get());
dialog.alert({
content: "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.control.save(params); // formFields
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmEdit--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-","");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 부과 일자 변경 이벤트
$("#levyYmd--${pageName}").on("change", function() {
let levyYmd = $("#levyYmd--${pageName}").val();
let advntceDayCnt = $("#advntceDayCnt--${pageName}").val();
$("#dudtYmd--${pageName}").val(addDate(levyYmd, Number(advntceDayCnt)));
});
// 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장
}
// 초기 화면 설정
$P.initForm = () => {
// 달력 초기화
initDatepicker("frmEdit--${pageName}");
$("#levyYmd--${pageName}").datepicker("setDate", new Date());
$("#dudtYmd--${pageName}").datepicker("setDate", new Date());
// 화면 활성화 설정
$("#tnocs--${pageName}").prop("readonly", true); // 총건수
$("#gramtFfnlgAmt--${pageName}").prop("readonly", true); // 총금액
$("#advntceRdcrt--${pageName}").prop("readonly", true); // 감경율
$("#gramtAdvntceAmt--${pageName}").prop("readonly", true); // 감경 부과금액
if ($P.callPurpose == "view") {
// input 요소들을 disabled
$("#frmEdit--${pageName}").find("input,textarea,select").prop("disabled", true);
// button 요소들을 disabled
$("#btnLevyYmd--${pageName}").prop("disabled", true); // 부과 일자 버튼
$("#btnDudtYmd--${pageName}").prop("disabled", true); // 납기 일자 버튼
$("#btnSave--${pageName}").prop("disabled", true); // 저장 버튼
}
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. Dataset 설정
$P.control.setData([${rdctLevyTrgtInfo}]);
});
</script>

@ -1,700 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 회계연도 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schFyr--${pageName}">회계연도</label>
<input type="text" class="form-control w-px-60" id="schFyr--${pageName}" name="schFyr" maxlength="4" autocomplete="off" />
</div>
<!-- 부과 번호 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schLevyNoFrom--${pageName}">부과번호</label>
<input type="text" class="form-control w-px-80" id="schLevyNoFrom--${pageName}" name="schLevyNoFrom" maxlength="6" autocomplete="off" />
~
<input type="text" class="form-control w-px-80" id="schLevyNoTo--${pageName}" name="schLevyNoTo" maxlength="6" autocomplete="off" />
</div>
<!-- 감경 구분 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRdctSeCd--${pageName}">감경구분</label>
<select class="form-select w-px-120" id="schRdctSeCd--${pageName}" name="schRdctSeCd">
<option value="">전체</option>
<c:forEach items="${FIM046List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 부과 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schLevyYmdFrom--${pageName}">부과일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schLevyYmdFrom--${pageName}" name="schLevyYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schLevyYmdTo--${pageName}" name="schLevyYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 단속 상태 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCrdnSttsCd--${pageName}">단속상태</label>
<select class="form-select w-px-160" id="schCrdnSttsCd--${pageName}" name="schCrdnSttsCd">
<option value="">전체</option>
<c:forEach items="${FIM010List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 동적검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 단속일자 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCrdnYmdFrom--${pageName}">단속일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schCrdnYmdFrom--${pageName}" name="schCrdnYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schCrdnYmdTo--${pageName}" name="schCrdnYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 차량번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVhrno--${pageName}">차량번호</label>
<input type="text" class="form-control w-px-160" id="schVhrno--${pageName}" name="schVhrno" autocomplete="off" />
</div>
<!-- 납부자번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNm--${pageName}">납부자번호</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNm--${pageName}" name="schRtpyrNm" autocomplete="off" />
</div>
<!-- 납부자명 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNo--${pageName}">납부자명</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNo--${pageName}" name="schRtpyrNo" autocomplete="off" />
</div>
<!-- 등록일자, 수정일자 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-400" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;">업무구분</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('FYR', this.innerText, 'match', 'part');">회계연도</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('ACNTG_SE_CD', this.innerText, 'codeValue', 'FIM074');">회계코드</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('TXITM_CD', this.innerText, 'codeValue', 'FIM075');">세목코드</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('TXITM_CD', this.innerText, 'codeValue', 'FIM075');">세목명</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('LEVY_NO', this.innerText, 'match', 'part');">부과번호</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('ISPY_SN', this.innerText, 'match', 'part');">분납순번</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('LEVY_SE_CD', this.innerText, 'codeValue', 'FIM040');">부과구분</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('RDCT_SE_CD', this.innerText, 'codeValue', 'FIM046');">감경구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('LEVY_YMD', this.innerText, 'ymd', '');">부과일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FRST_DUDT_YMD', this.innerText, 'ymd', '');">최초납기일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('DUDT_YMD', this.innerText, 'ymd', '');">납기일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_AMT', this.innerText, 'match', 'part');">과태료금액</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('LEVY_PCPTAX', this.innerText, 'match', 'part');">부과본세</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('LEVY_ADAMT', this.innerText, 'match', 'part');">부과가산금</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCVMT_PCPTAX', this.innerText, 'match', 'part');">수납본세</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCVMT_ADAMT', this.innerText, 'match', 'part');">수납가산금</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RDAMT_PCPTAX', this.innerText, 'match', 'part');">감액본세</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RDAMT_ADAMT', this.innerText, 'match', 'part');">감액가산금</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SUM_AMT', this.innerText, 'match', 'part');">미납금액</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('TXTN_THING', this.innerText, 'match', 'part');">과세물건</th>
<th class="cmn" style="width: 240px;" onclick="searchFromGridTitle('NPMNT_RSN_CD', this.innerText, 'codeValue', 'FIM043');">체납사유</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCVMT_YMD', this.innerText, 'ymd', '');">수납일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SZR_YMD', this.innerText, 'ymd', '');">압류일자</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('SZR_THING', this.innerText, 'match', 'part');">압류물건</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RPM_SZR_VHRNO', this.innerText, 'match', 'part');">대체압류차량</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SZR_RMV_YMD', this.innerText, 'match', 'part');">압류해제일자</th>
<th class="cmn" style="width: 240px;" onclick="searchFromGridTitle('EPAYNO', this.innerText, 'match', 'part');">전자납부번호</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('BANK_NM', this.innerText, 'match', 'part');">은행명</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('VR_ACTNO', this.innerText, 'match', 'part');">가상계좌번호</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CRDN_YMD', this.innerText, 'ymd', '');">단속일시</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('VHRNO', this.innerText, 'match', 'part');">차량번호</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STDG_NM', this.innerText, 'match', 'part');">법정동</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('CRDN_PLC', this.innerText, 'match', 'part');">단속장소</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VLTN_ARTCL', this.innerText, 'match', 'part');">위반항목</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_CRDN_AMT', this.innerText, 'match', 'part');">단속원금</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STTS_CD', this.innerText, 'codeValue', 'FIM010');">처리상태</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RTPYR_SE_CD', this.innerText, 'codeValue', 'FIM011');">납부자구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RTPYR_NO', this.innerText, 'ymd', '');">납부자번호</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('RTPYR_NM', this.innerText, 'match', 'part');">납부자명</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('ZIP', this.innerText, 'match', 'part');">우편번호</th>
<th class="cmn" style="width: 240px;" onclick="searchFromGridTitle('ADDR', this.innerText, 'match', 'part');">주소</th>
<th class="cmn" style="width: 340px;" onclick="searchFromGridTitle('DTL_ADDR', this.innerText, 'match', 'part');">상세주소</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{LEVY_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{LEVY_ID}" onchange="pageObject['${pageName}'].control.select('{LEVY_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{FYR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ACNTG_SE_CD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TXITM_CD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TXITM_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ISPY_SN}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RDCT_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{FRST_DUDT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DUDT_YMD}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_PCPTAX}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_ADAMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_PCPTAX}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_ADAMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{RDAMT_PCPTAX}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{RDAMT_ADAMT}</td>
<td class="cmn text-end fw-bold text-red" onclick="{onclick}" ondblclick="{ondblclick}">{SUM_AMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{TXTN_THING}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{NPMNT_RSN_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SZR_YMD}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{SZR_THING}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RPM_SZR_VHRNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SZR_RMV_YMD}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{EPAYNO_MASK}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{BANK_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{VR_ACTNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_YMD_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_CRDN_AMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STTS_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_SE_NM}</td>
<td class="cmn text-center privacy-cell" onclick="{onclick}" ondblclick="{ondblclick}">
<span>{RTPYR_NO}</span>
<span>*************</span>
</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="bpv">
<td valign="top" colspan="50" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="dpv">
<td valign="top" colspan="50" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="eca">
<td valign="top" colspan="50" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pvs">
<td valign="top" colspan="50" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pes">
<td valign="top" colspan="50" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "levy"
, prefixName: "부과"
, keymapper: info => info ? info.LEVY_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "xl"
, formats: {
LEVY_YMD: dateFormat
, FRST_DUDT_YMD: dateFormat
, DUDT_YMD: dateFormat
, RCVMT_YMD: dateFormat
, SZR_YMD: dateFormat
, SZR_RMV_YMD: dateFormat
, FFNLG_AMT: numberFormat
, LEVY_PCPTAX: numberFormat
, LEVY_ADAMT: numberFormat
, ISPY_INT: numberFormat
, RCVMT_PCPTAX: numberFormat
, RCVMT_ADAMT: numberFormat
, RDAMT_PCPTAX: numberFormat
, RDAMT_ADAMT: numberFormat
, SUM_AMT: numberFormat
, CRDN_YMD_TM: datetimeFormat
, FFNLG_CRDN_AMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "$P.control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.LEVY_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 상세정보 dialog
$P.control.getInfo = (params) => {
if (!params) return;
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let clsForTask = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val().toLowerCase(); // 소문자
// 업무별 DataTables(그리드) tr, td
let foundContent = document.getElementById("${infoPrefix}Row--${pageName}").content;
let foundTr = $(foundContent).find("tr")[0].cloneNode(false);
let foundTds = $(foundContent).find("." + clsForTask + ",.cmn");
foundTds.each(function() {
foundTr.appendChild(this.cloneNode(true));
});
//
let replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("LEVY_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');");
let trs = empty ? [document.getElementById("${infoPrefix}NotFound--${pageName}").content.querySelector("." + clsForTask + ",.cmn").outerHTML]
: ${infoPrefix}List.inStrings(foundTr.outerHTML, replacer);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
// 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// callback 사용자 검색
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content : "검색된 자료가 없습니다."
, onOK : () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// DataTables width 변경 조정 업무별 그리드가 존재 한다면.. crdn06010-main.jsp 참고
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schFyr--${pageName}").val(new Date().getFullYear()); // 회계 연도
$("#schLevyNoFrom--${pageName}").val("000000"); // 부과 번호 시작
$("#schLevyNoTo--${pageName}").val("999999"); // 부과 번호 종료
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/050/list.do"); // 검색
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + taskSeCd.toLowerCase() + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,745 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 감경 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRdctYmdFrom--${pageName}">감경일자</label>
<span class="form-search-linebox">
<input type="text" id="schRdctYmdFrom--${pageName}" name="schRdctYmdFrom" class="form-control form-date"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" id="schRdctYmdTo--${pageName}" name="schRdctYmdTo" class="form-control form-date"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 감경 사유 구분 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRdctRsnCd--${pageName}">감경사유</label>
<select class="form-select w-px-160" id="schRdctRsnCd--${pageName}" name="schRdctRsnCd">
<option value="">전체</option>
<c:forEach items="${FIM019List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<div class="col-6">
</div>
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 단속일자 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCrdnYmdFrom--${pageName}">단속일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schCrdnYmdFrom--${pageName}" name="schCrdnYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schCrdnYmdTo--${pageName}" name="schCrdnYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 차량번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVhrno--${pageName}">차량번호</label>
<input type="text" class="form-control w-px-160" id="schVhrno--${pageName}" name="schVhrno" autocomplete="off" />
</div>
<!-- 납부자번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNm--${pageName}">납부자번호</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNm--${pageName}" name="schRtpyrNm" autocomplete="off" />
</div>
<!-- 납부자명 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNo--${pageName}">납부자명</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNo--${pageName}" name="schRtpyrNo" autocomplete="off" />
</div>
<!-- 등록일자, 수정일자 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span id="paging--${pageName}PagingInfo" class="dataTables_info" role="status" aria-live="polite"></span>
<ul id="paging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnUpdate--${pageName}" title="감경 수정">
감경 수정
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnRemove--${pageName}" title="감경 삭제">
감경 삭제
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;">업무구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RDCT_YMD', this.innerText, 'ymd', '');">감경일자</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('RDCT_RSN_CD', this.innerText, 'codeValue', 'FIM019');">감경사유</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ETC_CN', this.innerText, 'match', 'part');">감경특기사항</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CRDN_YMD', this.innerText, 'ymd', '');">단속일시</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VHRNO', this.innerText, 'match', 'part');">차량번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RTPYR_SE_CD', this.innerText, 'codeValue', 'FIM011');">납부자구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RTPYR_NO', this.innerText, 'ymd', '');">납부자번호</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('RTPYR_NM', this.innerText, 'match', 'part');">납부자명</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('CRDN_STDG_NM', this.innerText, 'match', 'part');">단속법정동</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('CRDN_PLC', this.innerText, 'match', 'part');">단속장소</th>
<th class="bpv" style="width: 280px;" onclick="searchFromGridTitle('DTL_CRDN_PLC', this.innerText, 'match', 'part');">상세단속장소</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_CRDN_AMT', this.innerText, 'match', 'perfect');">단속원금</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RDCT_AMT', this.innerText, 'match', 'perfect');">감경금액</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_AMT', this.innerText, 'match', 'perfect');">과태료금액</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SUM_AMT', this.innerText, 'match', 'part');">미납금액</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STTS_CD' ,this.innerText, 'codeValue', 'FIM010');">처리상태</th>
<th class="pvs" style="width: 140px;" onclick="searchFromGridTitle('CRDN_SPAREA_CD', this.innerText, 'codeValue', 'FIM007');">단속특별구역</th>
<th class="eca" style="width: 140px;" onclick="searchFromGridTitle('USE_FUEL_CD', this.innerText, 'codeValue', 'LVS005');">사용연료</th>
<th class="dpv" style="width: 140px;" onclick="searchFromGridTitle('PRK_PSBLTY_RSLT_CD', this.innerText, 'codeValue', 'FIM034');">주차가능여부</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{RDCT_ID}">
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{RDCT_ID}" onchange="pageObject['${pageName}'].control.select('{RDCT_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RDCT_YMD}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RDCT_RSN_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ETC_CN}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_YMD_TM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_SE_NM}</td>
<td class="cmn text-center privacy-cell" onclick="{onclick}" ondblclick="{ondblclick}">
<span>{RTPYR_NO}</span>
<span>*************</span>
</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="bpv text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_CRDN_PLC}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_CRDN_AMT}</td>
<td class="cmn text-end fw-bold text-orange" onclick="{onclick}" ondblclick="{ondblclick}">{RDCT_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_AMT}</td>
<td class="cmn text-end fw-bold text-red" onclick="{onclick}" ondblclick="{ondblclick}">{SUM_AMT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STTS_NM}</td>
<td class="pvs text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_SPAREA_NM}</td>
<td class="eca text-center" onclick="{onclick}" ondblclick="{ondblclick}">{USE_FUEL_NM}</td>
<td class="dpv text-center" onclick="{onclick}" ondblclick="{ondblclick}">{PRK_PSBLTY_RSLT_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="bpv">
<td valign="top" colspan="24" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="dpv">
<td valign="top" colspan="24" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="eca">
<td valign="top" colspan="24" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pvs">
<td valign="top" colspan="24" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pes">
<td valign="top" colspan="24" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "rdct"
, prefixName: "감경"
, keymapper: info => info ? info.RDCT_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "lg"
, formats: {
RDCT_YMD: dateFormat
, CRDN_YMD_TM: datetimeFormat
, FFNLG_CRDN_AMT: numberFormat
, RDCT_AMT: numberFormat
, FFNLG_AMT: numberFormat
, SUM_AMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.RDCT_ID;
$("#tbody--${pageName}").setCurrentRow(key);
}
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 삭제 버튼
$("#btnRemove--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 상세정보 dialog
$P.control.getInfo = (params) => {
if (!params) return;
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/020/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("Dialog--${pageName}")
, title: params.title
, content: resp
, size: $P.control.infoSize
, onClose: () => { $P.fnRefreshList(); } // 자료 재조회
});
}
});
}
// 삭제 callback
$P.control.onRemove = (resp) => {
let btnTitle = $("#btnRemove--${pageName}").attr("title");
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, btnTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, onOK: () => { }
});
if (resp.saved) { $P.fnRefreshList(); } // 자료 재조회
}
// 삭제
$P.control.remove = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/010/remove.do")
, data: params
, success: resp => $P.control.onRemove(resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let clsForTask = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val().toLowerCase(); // 소문자
// 업무별 DataTables(그리드) tr, td
let foundContent = document.getElementById("${infoPrefix}Row--${pageName}").content;
let foundTr = $(foundContent).find("tr")[0].cloneNode(false);
let foundTds = $(foundContent).find("." + clsForTask + ",.cmn");
foundTds.each(function() {
foundTr.appendChild(this.cloneNode(true));
});
//
let replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("RDCT_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');");
let trs = empty ? [document.getElementById("${infoPrefix}NotFound--${pageName}").content.querySelector("." + clsForTask + ",.cmn").outerHTML]
: ${infoPrefix}List.inStrings(foundTr.outerHTML, replacer);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
// 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// callback 사용자 검색
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
// 삭제 사유 callback
$P.callbackRsn = (obj) => {
// 서버에 전송할 data(파라미터) 생성
let params = {};
let selected = $P.control.dataset.getKeys("selected");
params[$P.control.prefixed("Ids")] = selected.join(","); // IDs
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
params.delRsn = obj.reason; // 삭제 사유
$P.control.remove(params);
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경 이벤트
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content : "검색된 자료가 없습니다."
, onOK : () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 감경 수정 버튼 이벤트
$P.fnUpdate = (title) => {
// 감경 ID
let rdctId = $P.control.dataset.getValue("RDCT_ID");
// 감경 ID 가 없다면.. return
if (typeof rdctId == "undefined" || rdctId == null || rdctId == "") return;
let params = {
title: title
, callPurpose: "update" // 호출용도: 수정
, sggCd: $P.control.dataset.getValue("SGG_CD") // 시군구 코드
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
, rdctId: rdctId // 감경 ID
};
$P.control.getInfo(params);
}
// 감경 삭제 버튼 이벤트
$P.fnRemove = (title) => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) {
dialog.alert({
content: "선택하신 부과제외 정보가 없습니다."
, onOK: () => { }
});
return;
}
// 삭제 메세지 확인
dialog.alert({
content: "선택하신 " + selected.length + "건의 " + $P.control.prefixName + " 정보를 삭제하시겠습니까?"
, onOK: () => {
// 삭제 사유 입력
fetch(wctx.url("/resources/html/inputRsnDialog.html"))
.then(function(resp) { return resp.text(); })
.then(function(template) {
dialog.open({
id: "inputDelRsnDialog"
, title: title
, size: "lg"
, content: template
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.callbackRsn({ reason: $("#reason").val() });
}
});
});
}
});
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList(); 
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 버튼 이벤트
$("#btnUpdate--${pageName}").on("click", function() {
$P.fnUpdate($(this).attr("title")); // 감경 수정
});
$("#btnRemove--${pageName}").on("click", function() {
$P.fnRemove($(this).attr("title")); // 감경 삭제
});
// DataTables width 변경 조정 업무별 그리드가 존재 한다면.. crdn06010-main.jsp 참고
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schRdctYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date); // 감경 일자 시작
$("#schRdctYmdTo--${pageName}").datepicker("setDate", new Date()); // 감경 일자 종료
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/010/list.do"); // 검색
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + taskSeCd.toLowerCase() + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,259 +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>
<!-- inner page html -->
<div class="content-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<input type="hidden" id="crdnId--${pageName}" name="crdnId" data-map="CRDN_ID" />
<input type="hidden" id="rdctId--${pageName}" name="rdctId" data-map="RDCT_ID" />
<div class="row g-1">
<!-- 납부자 명 -->
<div class="col-md-6">
<label for="rtpyrNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">납부자명</label>
<input type="text" class="form-control w-40" id="rtpyrNm--${pageName}" name="rtpyrNm" data-map="RTPYR_NM" />
</div>
<!-- 납부자 번호 -->
<div class="col-md-6">
<label for="rtpyrNo--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">납부자번호</label>
<input type="text" class="form-control w-30" id="rtpyrNo--${pageName}" name="rtpyrNo" data-map="RTPYR_NO" />
</div>
<!-- 과태료 단속 금액 -->
<div class="col-md-6">
<label for="ffnlgCrdnAmt--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">과태료단속원금</label>
<input type="text" class="form-control w-20 text-end" id="ffnlgCrdnAmt--${pageName}" name="ffnlgCrdnAmt" data-map="FFNLG_CRDN_AMT" data-fmt-type="number" /> *
<input type="text" class="form-control w-10 text-end" id="wksnRdcrt--${pageName}" name="wksnRdcrt" data-map="WKSN_RDCRT" data-fmt-type="number" /> %
</div>
<!-- 감경 금액 -->
<div class="col-md-6">
<label for="rdctAmt--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">감경금액</label>
<input type="text" class="form-control w-30 text-end" id="rdctAmt--${pageName}" name="rdctAmt" data-map="RDCT_AMT" data-fmt-type="number" />
</div>
<!-- 감경 일자 -->
<div class="col-md-6">
<label for="rdctYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">감경일자</label>
<input type="text" class="form-control form-date" id="rdctYmd--${pageName}" name="rdctYmd" data-map="RDCT_YMD"
data-fmt-type="day" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<!-- 감경 사유 코드 -->
<div class="col-md-6">
<label for="rdctRsnCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">감경사유</label>
<select class="form-select" id="rdctRsnCd--${pageName}" name="rdctRsnCd" data-map="RDCT_RSN_CD" required>
<c:forEach items="${FIM019List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 기타 내용 -->
<div class="col-md-12">
<label for="etcCn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">기타 내용</label>
<textarea type="text" class="form-control w-85" id="etcCn--${pageName}" name="etcCn" data-map="ETC_CN" rows="3" data-maxlengthb="1000"></textarea>
</div>
</div>
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-80" id="btnSave--${pageName}" title="저장">
저장
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
</div> <!-- <div class="card"> -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "rdct"
, prefixName: "감경"
, keymapper: info => info ? info.RDCT_ID : ""
, dataGetter: obj => obj.${infoPrefix}Info
, formats: {
FFNLG_CRDN_AMT: numberFormat // 과태료 단속 금액
, WKSN_RDCRT: numberFormat // 사회적약자 감경율
, RDCT_AMT: numberFormat // 감경 금액
}
});
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
// Dataset 셋팅
$P.formFields.set($P.control,item);
// 업무구분에 따른 URL 변경
$P.fnSetURL(item.data.TASK_SE_CD);
}
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
let create = ($P.callPurpose == "create");
ajax.post({
url: !create ? $P.control.urls.update : $P.control.urls.create
, data: info || {}
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 업무구분에 따른 URL 설정
$P.fnSetURL = (taskSeCd) => {
$P.control.urls.create = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/020/create.do"); // 등록
$P.control.urls.update = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/020/update.do"); // 수정
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 저장 버튼 클릭 이벤트
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
// 감경 사유
let rdctRsnCd = $("#rdctRsnCd--${pageName} option:selected").val();
let rdctRsnNm = $("#rdctRsnCd--${pageName} option:selected").text();
// 감경 사유 확인
if (rdctRsnCd == "00") {
dialog.alert({
content : "감경사유가 '" + rdctRsnNm + "' 입니다."
+ "</br>" + $P.control.prefixName + " 저장 실행이 취소되었습니다."
, onOK : () => { }
});
return;
}
dialog.alert({
content : "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.control.save($P.formFields.get()); // formFields
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmEdit--${pageName}").find(".form-date").each(function() {
$(this).on("input",function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장
}
// 초기 화면 설정
$P.initForm = () => {
// 달력 초기화
initDatepicker("frmEdit--${pageName}");
$("#rdctYmd--${pageName}").datepicker("setDate", new Date());
// 화면 활성화 설정
$("#rtpyrNm--${pageName}").prop("readonly", true); // 납부자 이름
$("#rtpyrNo--${pageName}").prop("readonly", true); // 납부자 번호
$("#ffnlgCrdnAmt--${pageName}").prop("readonly", true); // 단속 원금
$("#wksnRdcrt--${pageName}").prop("readonly", true); // 감경율
$("#rdctAmt--${pageName}").prop("readonly", true); // 감경 금액
// View로 호출
if ($P.callPurpose == "view") {
// input 요소들을 disabled
$("#frmEdit--${pageName}").find("input,textarea,select").prop("disabled", true);
// button 요소들을 disabled
$("#rdctYmd--${pageName}").prop("disabled", true); // 감경 일자 달력 버튼
$("#btnSave--${pageName}").prop("disabled", true); // 저장 버튼
}
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. Dataset 설정
$P.control.setData([${rdctInfo}]);
});
</script>

@ -1,311 +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="pageKorName" scope="request">공지사항 관리</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<div class="container-page-btn">
<button type="button" id="btnReset--${pageName}" class="btn btn-outline-dark w-px-120" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" id="btnSearch--${pageName}" class="btn btn-search w-px-120" title="검색">
검색
</button>
</span>
</div>
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-12">
<select id="by--${pageName}" name="by" class="form-select">
<option value="NTC_TTL">제목</option>
<option value="NTC_CN">내용</option>
</select>
<input type="text" id="term--${pageName}" name="term" class="form-control" />
</div>
</div>
</div>
</form>
<div>
<div id="gridbuttonArea--${pageName}" class="container-page-btn">
<div class="d-flex flex-row justify-content-between">
<span id="ntcPaging--${pageName}PagingInfo" class="dataTables_info" role="status" aria-live="polite"></span>
<ul id="ntcPaging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
<span class="container-window-btn-right">
<span>
<button type="button" class="btn btn-primary w-px-120"
id="btnAdd--${pageName}" title="추가">
추가
</button>
</span>
</span>
</div>
</div>
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-500">
<table id="DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr id="ntcThead--${pageName}">
<th style="width: 80px;" class="cmn">No.</th>
<th style="width: 180px;">시군구명</th>
<th style="width: 800px;">제목</th>
<th style="width: 180px;">작성일시</th>
<th class="dummy-th"></th>
</tr>
</thead>
<tbody id="ntcTbody--${pageName}">
</tbody>
<template id="ntcRow--${pageName}">
<tr data-key="{NTC_ID}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{ROW_NUM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{SGG_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{NTC_TTL}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{REG_DT}</td>
<td class="dummy-td"></td>
</tr>
</template>
<template id="ntcNotFound--${pageName}">
<tr>
<td valign="top" colspan="5" class="dataTables_empty text-center">
공지사항 정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<div class="toast-container position-fixed bottom-0 end-0 p-3">
<div id="divToast--${pageName}" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
<div class="toast-body bg-black text-white">
삭제 되었습니다.
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
$P.toast = new bootstrap.Toast(document.getElementById('divToast--${pageName}'), {
animation: true,
autohide: true,
delay: 2000
});
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.ntcControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData:true,
keymapper : info => info ? info.NTC_ID : "",
urls : {
load : wctx.url("/mngt/mngt01/010/list.do"),
getInfo : wctx.url("/mngt/mngt01/020/info.do")
},
formats: {
REG_DT : datetimeFormat,
MDFCN_DT : datetimeFormat
}
});
$P.ntcControl.defaultFetchSize = FETCH_XS;
$P.ntcControl.query = { pageNum : 1, fetchSize : $P.ntcControl.defaultFetchSize };
$P.ntcControl.beforeCurrent = null;
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.ntcControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate();
var trs = Apply.fromDataset.getTbody($P.ntcControl.dataset, t.found, t.notFound, t.replacer);
$P.renderNtcList(obj["Total"], $P.ntcControl.dataset.length, trs, option);
Apply.fromDataset.paging($P.ntcControl.dataset, obj, "ntcPaging--${pageName}");
};
$P.ntcControl.dataset.onCurrentChange = (dataItem) => {
Apply.fromDataset.currentRow($P.ntcControl.dataset, dataItem, $("#ntcTbody--${pageName}")[0]);
}
$P.ntcControl.dataset.onSelectionChange = (selectedArr) => {
};
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnReset = () => {
var searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='hidden']").val("");
searchForm.find("input[type='text']").val("");
searchForm.find("select[name='sggCd']").val(MY_INFO.info.sggCd);
$P.ntcControl.dataset.setData([]);
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
data.fetchSize = $P.ntcControl.defaultFetchSize;
return data;
}
$P.searchNtcList = () => {
$P.ntcControl.query = $P.getParams();
$P.ntcControl.load(1);
}
$P.scrollNtcList = () => {
$P.ntcControl.load($P.ntcControl.query.pageNum + 1);
}
$P.refreshNtcList = () => {
if($P.ntcControl.query.pageNum == null){
return;
}
$P.ntcControl.reload({all : true});
}
$P.getGridTemplate = () => {
var notFound = [document.getElementById("ntcNotFound--${pageName}").innerHTML];
var found = document.getElementById("ntcRow--${pageName}").innerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickNtcList('" + dataItem.getValue("NTC_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].dblclickNtcList('" + dataItem.getValue("NTC_ID") + "');");
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
$P.renderNtcList = (total, listLength, trs, option) => {
let noMore = (listLength >= total);
var initScroll = ($P.ntcControl.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs, initScroll, noMore);
fn_securityModeToggle($("#securityMode--top").is(":checked")); //보안모드
}
$P.clickNtcList = (dataKey) => {
if(dataKey == ""){
return;
}
$("#ntcTbody--${pageName}").setCurrentRow(dataKey);
Apply.toDataset.current($P.ntcControl.dataset, dataKey);
}
$P.dblclickNtcList = (dataKey) => {
$P.getInfo(dataKey);
}
$P.createNtc = () => {
$P.getInfo();
}
$P.getInfo = (ntcId) => {
var params = {};
if(ntcId != null){
params.ntcId = ntcId;
}
ajax.get({
url : $P.ntcControl.urls.getInfo,
data : params,
success : (resp) => {
dialog.open({
id : "ntcInfoDialog",
title : "공지사항 상세",
size : "xl",
content : resp,
init : () => {
var parentRes = new Object();
var childReq = pageObject.childReq.pop();
for(var reqKey in childReq) {
if($P.provide[reqKey]){
parentRes[reqKey] = $P.provide[reqKey];
} else {
parentRes[reqKey] = function(){};
}
}
pageObject.parentRes.push(parentRes);
}
});
}
});
}
$P.provide = {
"refreshList" : function(){
$P.refreshNtcList();
},
};
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
$('#btnSearch--${pageName}').on('click', () => $P.searchNtcList());
$('#btnAdd--${pageName}').on('click', () => $P.createNtc());
/**************************************************************************
* 초기화
**************************************************************************/
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollNtcList);
$P.fnReset();
fn_securityModeToggle($("#securityMode--top").is(":checked")); //보안모드
if(MY_INFO.institute != "ADMIN00"){
$("#btnAdd--${pageName}").attr("hidden","hidden");
}
});
</script>

@ -1,183 +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="pageKorName" scope="request">공지사항 상세</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card">
<form id="frmEdit--${pageName}" name="frmEdit">
<input type="text" id="ntcId--${pageName}" name="ntcId" data-map="NTC_ID" hidden />
<div class="row g-1">
<div class="col-md-12">
<label for="sggCd--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
시군구
</label>
<select id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" class="form-select">
<option value="">전체</option>
<c:forEach items="${sggList}" var="item">
<c:if test="${item.SGG_CD ne 'ADMIN'}">
<option value="${item.SGG_CD}">${item.SGG_NM}</option>
</c:if>
</c:forEach>
</select>
</div>
<div class="col-md-12">
<label for="ntcTtl--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">
제목
</label>
<input type="text" id="ntcTtl--${pageName}" name="ntcTtl" data-map="NTC_TTL"
class="form-control w-px-800" required />
</div>
<div class="col-md-12">
<label for="ntcCn--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end align-top required">
내용
</label>
<textarea type="text" id="ntcCn--${pageName}" name="ntcCn" data-map="NTC_CN"
rows="15"
class="form-control w-px-800" required></textarea>
</div>
</div>
<div class="row m-3">
<div class="col-md-12">
<span class="float-end">
<button type="button" id="btnSave--${pageName}" class="btn btn-primary">저장</button>
<button type="button" id="btnRemove--${pageName}" class="btn btn-primary">삭제</button>
</span>
</div>
</div>
</form>
</div>
</div>
</div>
<script>
pageObject["${pageName}"] = {};
pageObject["${pageName}"].provided = {};
pageObject.childReq = [];
pageObject.childReq.push({
refreshList : function(){ },
});
$(document).ready(function(){
var $P = pageObject["${pageName}"];
if(pageObject.parentRes.length > 0){
$P.provided = pageObject.parentRes.pop();
} else {
$P.provided = pageObject.childReq.pop();
}
/**************************************************************************
* DatasetControl, Dataset, FormFields
**************************************************************************/
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
$P.ntcControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData : true,
keymapper : info => info ? info.NTC_ID : "",
urls : {
create : wctx.url("/mngt/mngt01/020/create.do"),
update : wctx.url("/mngt/mngt01/020/update.do"),
remove : wctx.url("/mngt/mngt01/020/remove.do")
},
formats: {
}
});
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.ntcControl.dataset.onCurrentChange = (dataItem) => {
if(!dataItem){
return;
}
$P.formFields.set($P.ntcControl,dataItem);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnSave = () => {
if(!customValidate($("#frmEdit--${pageName} input"))) return;
var info = $P.formFields.get();
var create = $P.ntcControl.dataset.empty;
ajax.post({
url : create ? $P.ntcControl.urls.create : $P.ntcControl.urls.update,
data : info,
success : (resp) => {
if(resp.saved){
dialog.close("ntcInfoDialog");
dialog.alert({
content:"저장되었습니다.",
onOK : () => $P.provided.refreshList()
});
}
}
});
}
$P.fnRemove = () => {
var info = $P.formFields.get();
ajax.post({
url : $P.ntcControl.urls.remove,
data : info,
success : (resp) => {
if(resp.saved){
dialog.close("ntcInfoDialog");
dialog.alert({
content:"삭제되었습니다.",
onOK : () => $P.provided.refreshList()
});
}
}
});
}
/**************************************************************************
* element.on
**************************************************************************/
$("#btnSave--${pageName}").on('click', () => $P.fnSave());
$("#btnRemove--${pageName}").on('click', () => $P.fnRemove());
/**************************************************************************
* 초기화
**************************************************************************/
var ntcInfo = ${ntcInfo};
if(ntcInfo == null){
$P.ntcControl.dataset.setData([]);
$("#btnRemove--${pageName}").attr("hidden","hidden");
} else {
$P.ntcControl.dataset.setData([ntcInfo]);
$("#sggCd--${pageName}").attr("disabled","disabled");
if(MY_INFO.institute != "ADMIN00"){
$("#btnSave--${pageName}").attr("hidden","hidden");
$("#btnRemove--${pageName}").attr("hidden","hidden");
}
}
});
</script>

@ -1,135 +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="pageKorName" scope="request">일정관리</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<div id="calendar--${pageName}" class="m-4 px-4 w-px-1500 h-px-700">
</div>
</div>
</div>
</div>
<script>
LoadScript("fullCalendarScript","/webjars/3rd-party/sneat/libs/fullcalendar/fullcalendar.js");
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
$P.calendar = new Calendar(document.getElementById("calendar--${pageName}"), {
initialView: 'dayGridMonth',
plugins : [dayGridPlugin, interactionPlugin],
locale: 'ko',
editable: false,
selectable: true,
height: '700px',
handleWindowResize : false,
eventColor: '#ffeecc',
select: function(arg) {
$P.getInfo("", arg.startStr.replaceAll("-",""), getPrevDay(arg.endStr.replaceAll("-",""),1));
},
eventClick:function(obj, element) {
$P.getInfo(obj.event.id, "", "");
}
});
$P.getInfo = (schdlId, schdlBgngYmd, schdlEndYmd) => {
ajax.get({
url : wctx.url("/mngt/mngt02/020/info.do"),
data : {
schdlId : schdlId,
schdlBgngYmd : schdlBgngYmd,
schdlEndYmd : schdlEndYmd
},
success : (resp) => {
dialog.open({
id : "scheduleInfoDialog",
title : "일정 정보",
size : "xl",
content : resp,
init : () => {
var parentRes = new Object();
var childReq = pageObject.childReq.pop();
for(var reqKey in childReq) {
if($P.provide[reqKey]){
parentRes[reqKey] = $P.provide[reqKey];
} else {
parentRes[reqKey] = function(){};
}
}
pageObject.parentRes.push(parentRes);
}
});
}
});
}
$P.add = (info) => {
$P.calendar.addEvent({
title : info.schdlCn,
start : dateFormat.format(info.schdlBgngYmd),
end : dateFormat.format(getNextDay(info.schdlEndYmd,1)),
allDay : true
});
}
$P.modify = (info) => {
var ev = $P.calendar.getEventById(info.schdlId);
ev.setProp("title", info.schdlCn);
ev.setDates(dateFormat.format(info.schdlBgngYmd), dateFormat.format(getNextDay(info.schdlEndYmd,1)), { allDay : true });
};
$P.del = (info) => {
$P.calendar.getEventById(info.schdlId).remove();
};
$P.provide = {
"refresh" : function(type, info){
if(type == "add"){
$P.add(info);
} else if(type == "modify"){
$P.modify(info);
} else if(type == "del"){
$P.del(info);
}
}
};
//
$P.calendar.render();
//
ajax.get({
url : wctx.url("/mngt/mngt02/010/list.do"),
data : {},
success : (resp) => {
if(resp.list != null && resp.list.length > 0){
for(var i=0; i < resp.list.length; i++){
var info = resp.list[i];
$P.calendar.addEvent({
id : info.SCHDL_ID,
title : info.SCHDL_CN,
start : dateFormat.format(info.SCHDL_BGNG_YMD),
end : dateFormat.format(getNextDay(info.SCHDL_END_YMD,1)),
allDay : true
});
}
}
}
});
});
</script>

@ -1,213 +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="pageKorName" scope="request">일정 상세</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card">
<form id="frmEdit--${pageName}" name="frmEdit">
<input type="text" id="schdlId--${pageName}" name="schdlId" data-map="SCHDL_ID" hidden />
<div class="row g-1">
<div class="col-md-6">
<label for="schdlBgngYmd--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">
시작일
</label>
<input type="text" id="schdlBgngYmd--${pageName}" name="schdlBgngYmd" data-map="SCHDL_BGNG_YMD"
class="form-control form-date" required
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<div class="col-md-6">
<label for="schdlEndYmd--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">
종료일
</label>
<input type="text" id="schdlEndYmd--${pageName}" name="schdlEndYmd" data-map="SCHDL_END_YMD"
class="form-control form-date" required
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<div class="col-md-12">
<label for="schdlCn--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end align-top required">
내용
</label>
<input type="text" id="schdlCn--${pageName}" name="schdlCn" data-map="SCHDL_CN"
class="form-control w-px-500" required />
</div>
</div>
<div class="row m-3">
<div class="col-md-12">
<span class="float-end">
<button type="button" id="btnSave--${pageName}" class="btn btn-primary">저장</button>
<button type="button" id="btnRemove--${pageName}" class="btn btn-primary">삭제</button>
</span>
</div>
</div>
</form>
</div>
</div>
</div>
<script>
pageObject["${pageName}"] = {};
pageObject["${pageName}"].provided = {};
pageObject.childReq = [];
pageObject.childReq.push({
refresh : function(){ },
});
$(document).ready(function(){
var $P = pageObject["${pageName}"];
if(pageObject.parentRes.length > 0){
$P.provided = pageObject.parentRes.pop();
} else {
$P.provided = pageObject.childReq.pop();
}
/**************************************************************************
* DatasetControl, Dataset, FormFields
**************************************************************************/
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
$P.schdlControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData : false,
keymapper : info => info ? info.SCHDL_ID : "",
urls : {
create : wctx.url("/mngt/mngt02/020/create.do"),
update : wctx.url("/mngt/mngt02/020/update.do"),
remove : wctx.url("/mngt/mngt02/020/remove.do")
},
formats: {
}
});
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.schdlControl.dataset.onCurrentChange = (dataItem) => {
if(!dataItem){
return;
}
$P.formFields.set($P.schdlControl,dataItem);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnSave = () => {
if(!customValidate($("#frmEdit--${pageName} input"))) return;
var info = $P.formFields.get();
if(info.schdlBgngYmd > info.schdlEndYmd){
alert("시작일자가 종료일자 보다 큽니다.");
return;
}
var create = ($("#schdlId--${pageName}").val() == "");
if(create){
ajax.post({
url : $P.schdlControl.urls.create,
data : info,
success : (resp) => {
if(resp.saved){
dialog.close("scheduleInfoDialog");
dialog.alert({
content:"저장되었습니다.",
init : function() {
setDialogZindex();
focusClose();
},
onClose : () => {
info.schdlId = resp.schdlId;
$P.provided.refresh("add", info);
}
});
}
}
});
} else {
ajax.post({
url : $P.schdlControl.urls.update,
data : info,
success : (resp) => {
if(resp.saved){
dialog.close("scheduleInfoDialog");
dialog.alert({
content:"저장되었습니다.",
init : function() {
setDialogZindex();
focusClose();
},
onClose : () => {
$P.provided.refresh("modify", info);
}
});
}
}
});
}
}
$P.fnRemove = () => {
var info = $P.formFields.get();
ajax.post({
url : $P.schdlControl.urls.remove,
data : info,
success : (resp) => {
if(resp.saved){
dialog.close("scheduleInfoDialog");
dialog.alert({
content:"삭제되었습니다.",
init : function() {
setDialogZindex();
focusClose();
},
onClose : () => {
$P.provided.refresh("del", { schdlId : info.schdlId });
}
});
}
}
});
}
/**************************************************************************
* element.on
**************************************************************************/
$("#btnSave--${pageName}").on('click', () => $P.fnSave());
$("#btnRemove--${pageName}").on('click', () => $P.fnRemove());
/**************************************************************************
* 초기화
**************************************************************************/
initDatepicker("frmEdit--${pageName}"); //달력 초기화
var schdlInfo = ${schdlInfo};
if(schdlInfo != null){
$P.schdlControl.dataset.setData([schdlInfo]);
} else {
$P.schdlControl.dataset.setData([{ SCHDL_BGNG_YMD : "${schdlBgngYmd}", SCHDL_END_YMD : "${schdlEndYmd}" }]);
$("#btnRemove--${pageName}").attr("hidden","hidden");
}
});
</script>

@ -1,577 +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="pageKorName" scope="request">시군구관리</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<form id="mainForm--${pageName}" method="post" enctype="multipart/form-data">
<div class="card my-2">
<div class="mx-3 my-2 d-block">
<span class="h3">
시군구 정보
</span>
<span>
<button type="button" id="btnSaveSgg--${pageName}" class="btn btn-primary w-px-100 float-end">저장</button>
</span>
</div>
<div class="row g-3 mt-1 mb-3">
<div class="col-md-6">
<label class="w-px-140 col-form-label text-sm-end pe-2" for="">시군구명</label>
<input name="sggID" type="hidden" />
<input name="sggNm" type="text" class="form-control" readonly />
</div>
<div class="col-md-6">
<label class="w-px-140 col-form-label text-sm-end pe-2" for="">기관명</label>
<input name="instCd" type="hidden" />
<input name="instNm" type="text" class="form-control" readonly />
</div>
<div class="col-md-4 d-flex align-items-center">
<label class="w-px-140 col-form-label text-sm-end pe-2">
직인
</label>
<img id="offcsImage--${pageName}" alt="" src="" data-orgn-path="" data-orgn-name=""
class="mw-px-100 mh-px-100 fit-contain" />
<input id="offcs--${pageName}" name="offcs" type="file" hidden />
</div>
<div class="col-md-4 d-flex align-items-center">
<label class="w-px-140 col-form-label text-sm-end pe-2">
심볼
</label>
<img id="symbolImage--${pageName}" alt="" src="" data-orgn-path="" data-orgn-name=""
class="mw-px-100 mh-px-100 fit-contain" />
<input id="symbol--${pageName}" name="symbol" type="file" hidden />
</div>
<div class="col-md-4 d-flex align-items-center">
<label class="w-px-140 col-form-label text-sm-end pe-2">
로고
</label>
<img id="logoImage--${pageName}" alt="" src="" data-orgn-path="" data-orgn-name=""
class="mw-px-100 mh-px-100 fit-contain" />
<input id="logo--${pageName}" name="logo" type="file" hidden />
</div>
</div>
</div>
</form>
<div class="card my-2">
<div class="mx-3 my-2 d-block">
<span class="h3">
시군구 업무 정보
</span>
</div>
<div class="nav-align-top my-2 mx-2 flex-row">
<ul class="nav nav-tabs" role="tablist" id="tabButtonContainer--${pageName}">
</ul>
<button type="button" id="btnOpenSelectTaskDialog--${pageName}"
class="btn btn-darkgray ms-1 superadmin">+ 새 과태료업무 추가</button>
</div>
<span class="tab-content" id="tabContentContainer--${pageName}">
</span>
</div>
</div>
</div>
</div>
<template id="taskTabButtonTemplate--${pageName}">
<li class="nav-item">
<button type="button" class="nav-link {active} w-px-150"
role="tab" data-bs-toggle="tab" data-bs-target="#tab{task}--${pageName}"
onclick="">
{taskNm}
</button>
</li>
</template>
<template id="taskTabContentsTemplate--${pageName}">
<span id="tab{task}--${pageName}" class="tab-pane {activeshow}" role="tabpanel">
<div class="mx-3 my-2 d-flex flex-column">
<div class="float-end">
<button type="button" data-task="{task}"
onclick="pageObject['${pageName}'].fnSaveForTask(this);"
class="btn btn-primary w-px-100 float-end"
>저장</button>
</div>
</div>
<form id="{task}Form--${pageName}">
<div class="row g-3 mt-1 mb-3">
<div class="col-md-3">
<label class="w-px-140 col-form-label text-sm-end" for="">업무명</label>
<input name="taskSeNm" type="text" class="form-control w-px-150" />
</div>
<div class="col-md-3">
<label class="w-px-140 col-form-label text-sm-end" for="">사전통지일수</label>
<input name="advntceDayCnt" type="text" class="form-control w-px-50" />
</div>
<div class="col-md-3">
<label class="w-px-140 col-form-label text-sm-end" for="">사전통지감경율</label>
<input name="advntceRdcrt" type="text" class="form-control w-px-50" />
</div>
<div class="col-md-3">
<label class="w-px-140 col-form-label text-sm-end" for="">사회적약자감경율</label>
<input name="wksnRdcrt" type="text" class="form-control w-px-50" />
</div>
<div class="col-md-3">
<label class="w-px-140 col-form-label text-sm-end" for="">과태료가산일자</label>
<input name="ffnlgAdtnYmd" type="text" class="form-control w-px-100" />
</div>
<div class="col-md-3">
<label class="w-px-140 col-form-label text-sm-end" for="">과태료가산율</label>
<input name="ffnlgAdtnRt" type="text" class="form-control w-px-50" />
</div>
<div class="col-md-3">
<label class="w-px-140 col-form-label text-sm-end" for="">과태료중가산율</label>
<input name="ffnlgInadtnRt" type="text" class="form-control w-px-50" />
</div>
<div class="col-md-3">
<label class="w-px-140 col-form-label text-sm-end" for="">과태료중가산최대수</label>
<input name="ffnlgInadtnMxmmCnt" type="text" class="form-control w-px-50" />
</div>
</div>
<div class="row g-3 mt-1 mb-3 superadmin">
<div class="col-md-3">
<label class="w-px-140 col-form-label text-sm-end text-red" for="">세외수입연계<br/>구분코드</label>
<input name="nxrpLinkSeCd" type="text" class="form-control w-px-50" />
</div>
<div class="col-md-3">
<label class="w-px-140 col-form-label text-sm-end text-red" for="">세외수입연계<br/>구분상세순번</label>
<input name="nxrpLinkSeDtlSn" type="text" class="form-control w-px-50" />
</div>
<div class="col-md-6"></div>
</div>
</form>
<div class="card-datatable text-nowrap area-photoinspection mx-2 mt-2 mb-3">
<div id="{task}Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="{task}table-responsive--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-300">
<table id="{task}Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr>
<th style="width: 90px;">위반코드</th>
<th style="width: 160px;">위반항목</th>
<th style="width: 360px;">위반법명</th>
<th style="width: 160px;">위반법1</th>
<th style="width: 160px;">위반법2</th>
<th style="width: 160px;">위반법기타</th>
<th style="width: 120px;">회계구분코드</th>
<th style="width: 120px;">회계구분명</th>
<th style="width: 120px;">세목코드</th>
<th style="width: 300px;">세목명</th>
<th style="width: 120px;">운영항목코드</th>
<th style="width: 300px;">운영항목명</th>
<th style="width: 160px;">특별회계사업코드</th>
<th style="width: 300px;">특별회계사업명</th>
<th class="dummy-th"></th>
</tr>
</thead>
<tbody id="{task}tbody--${pageName}"></tbody>
</table>
</div>
</div>
</div>
</span>
</template>
<template id="taskTbodyTemplate--${pageName}">
<tr data-key="{VLTN_ID}">
<td>{VLTN_CD}</td>
<td data-col="vltnArtcl">
<input type="text" class="form-control w-100" value="{VLTN_ARTCL}" />
</td>
<td data-col="vltnLawNm">
<input type="text" class="form-control w-100" value="{VLTN_LAW_NM}" />
</td>
<td data-col="vltnLaw1">
<input type="text" class="form-control w-100" value="{VLTN_LAW1}" />
</td>
<td data-col="vltnLaw2">
<input type="text" class="form-control w-100" value="{VLTN_LAW2}" />
</td>
<td data-col="vltnLawEtc">
<input type="text" class="form-control w-100" value="{VLTN_LAW_ETC}" />
</td>
<td data-col="acntgSeCd">
<input type="text" class="form-control w-100" value="{ACNTG_SE_CD}" />
</td>
<td data-col="acntgSeNm">
<input type="text" class="form-control w-100" value="{ACNTG_SE_NM}" />
</td>
<td data-col="txitmCd">
<input type="text" class="form-control w-100" value="{TXITM_CD}" />
</td>
<td data-col="txitmNm">
<input type="text" class="form-control w-100" value="{TXITM_NM}" />
</td>
<td data-col="operItemCd">
<input type="text" class="form-control w-100" value="{OPER_ITEM_CD}" />
</td>
<td data-col="operItemNm">
<input type="text" class="form-control w-100" value="{OPER_ITEM_NM}" />
</td>
<td data-col="spclBizCd">
<input type="text" class="form-control w-100" value="{SPCL_BIZ_CD}" />
</td>
<td data-col="spclBizNm">
<input type="text" class="form-control w-100" value="{SPCL_BIZ_NM}" />
</td>
</tr>
</template>
<script>
pageObject["${pageName}"] = {};
$(document).ready(function(){
if(MY_INFO.institute != "ADMIN00"){
$(".superadmin").attr("hidden","hidden");
}
var $P = pageObject["${pageName}"];
$P.sggInfo = {};
$P.taskList = [];
$P.curSggCd = "";
if("${sggCd}" == ""){
$P.curSggCd = MY_INFO.info.sggCd;
} else {
$P.curSggCd = "${sggCd}";
}
$P.taskDatasets = {};
var taskCodes = Object.keys(ALL_TASK);
for(var i=0; i < taskCodes.length; i++){
$P.taskDatasets[taskCodes[i]+"Dataset"] = new Dataset({
keymapper : info => info ? info.VLTN_ID : ""
});
}
$P.getSggInfo = async function(){
return new Promise((resolve, reject) => {
ajax.get({
url: wctx.url("/ogdp/getSggStngInfo.do"),
data: {
sggCd : $P.curSggCd
},
success : function(resp, textStatus, jqXHR) {
$P.sggInfo = resp.sggInfo;
$("#mainForm--${pageName}").find("[name='sggID']").val($P.sggInfo.SGG_CD);
$("#mainForm--${pageName}").find("[name='sggNm']").val($P.sggInfo.SGG_NM);
$("#mainForm--${pageName}").find("[name='instCd']").val($P.sggInfo.INST_CD);
$("#mainForm--${pageName}").find("[name='instNm']").val($P.sggInfo.INST_NM);
$("#offcsImage--${pageName}")
.attr("data-orgn-name", $P.sggInfo.OFFCS_FILE_NM)
.attr("data-orgn-path", $P.sggInfo.OFFCS_FILE_PATH);
$("#offcs--${pageName}").val("");
$("#offcs--${pageName}").trigger("change");
$("#symbolImage--${pageName}")
.attr("data-orgn-name", $P.sggInfo.SYMBOL_FILE_NM)
.attr("data-orgn-path", $P.sggInfo.SYMBOL_FILE_PATH);
$("#symbol--${pageName}").val("");
$("#symbol--${pageName}").trigger("change");
$("#logoImage--${pageName}")
.attr("data-orgn-name", $P.sggInfo.LOGO_FILE_NM)
.attr("data-orgn-path", $P.sggInfo.LOGO_FILE_PATH);
$("#logo--${pageName}").val("");
$("#logo--${pageName}").trigger("change");
resolve({resp, textStatus, jqXHR});
},
error: function(jqXHR, textStatus, error) {
}
});
});
};
$P.getSggTaskInfo = async function(){
return new Promise((resolve, reject) => {
ajax.get({
url: wctx.url("/ogdp/getTasks.do"),
data: {
useYn : "Y",
sggCd : $P.curSggCd
},
success : function(resp, textStatus, jqXHR) {
$P.taskList = resp.taskList;
var tabs = [];
var contents = [];
for(var i=0; i < $P.taskList.length; i++){
var task = $P.taskList[i];
var taskSeCd = task.TASK_SE_CD;
var taskSeNm = task.TASK_SE_NM;
var tabButtonTemplate = document.getElementById("taskTabButtonTemplate--${pageName}").innerHTML;
var tabContentsTemplate = document.getElementById("taskTabContentsTemplate--${pageName}").innerHTML;
tabButtonTemplate = tabButtonTemplate.replace(/{task}/gi, taskSeCd);
tabButtonTemplate = tabButtonTemplate.replace(/{taskNm}/gi, taskSeNm);
if(i==0){
tabButtonTemplate = tabButtonTemplate.replace(/{active}/gi, "active");
} else {
tabButtonTemplate = tabButtonTemplate.replace(/{active}/gi, "");
}
tabContentsTemplate = tabContentsTemplate.replace(/{task}/gi, taskSeCd);
if(i==0){
tabContentsTemplate = tabContentsTemplate.replace(/{activeshow}/gi, "active show");
} else {
tabContentsTemplate = tabContentsTemplate.replace(/{activeshow}/gi, "");
}
tabs.push(tabButtonTemplate);
contents.push(tabContentsTemplate);
}
$("#tabButtonContainer--${pageName}").html(tabs.join(""));
$("#tabContentContainer--${pageName}").html(contents.join(""));
if(MY_INFO.institute != "ADMIN00"){
$(".superadmin").attr("hidden","hidden");
}
for(var i=0; i < $P.taskList.length; i++){
var task = $P.taskList[i];
var taskSeCd = task.TASK_SE_CD;
var taskSeNm = task.TASK_SE_NM;
$("#"+taskSeCd+"Form--${pageName}").find("[name='taskSeNm']").val(taskSeNm);
$("#"+taskSeCd+"Form--${pageName}").find("[name='advntceDayCnt']").val(task.ADVNTCE_DAY_CNT);
$("#"+taskSeCd+"Form--${pageName}").find("[name='advntceRdcrt']").val(task.ADVNTCE_RDCRT);
$("#"+taskSeCd+"Form--${pageName}").find("[name='wksnRdcrt']").val(task.WKSN_RDCRT);
$("#"+taskSeCd+"Form--${pageName}").find("[name='ffnlgAdtnYmd']").val(task.FFNLG_ADTN_YMD);
$("#"+taskSeCd+"Form--${pageName}").find("[name='ffnlgAdtnRt']").val(task.FFNLG_ADTN_RT);
$("#"+taskSeCd+"Form--${pageName}").find("[name='ffnlgInadtnRt']").val(task.FFNLG_INADTN_RT);
$("#"+taskSeCd+"Form--${pageName}").find("[name='ffnlgInadtnMaxCnt']").val(task.FFNLG_INADTN_MAX_CNT);
$("#"+taskSeCd+"Form--${pageName}").find("[name='nxrpLinkSeCd']").val(task.NXRP_LINK_SE_CD);
$("#"+taskSeCd+"Form--${pageName}").find("[name='nxrpLinkSeDtlSn']").val(task.NXRP_LINK_SE_DTL_SN);
}
resolve({resp, textStatus, jqXHR});
},
error: function(jqXHR, textStatus, error) {
}
});
});
};
$P.getVltnInfo = async function(){
return new Promise((resolve, reject) => {
ajax.get({
url: wctx.url("/ogdp/getVltns.do"),
data: {
useYN : "Y",
sggCd : $P.curSggCd
},
success : function(resp, textStatus, jqXHR) {
var datasetNames = Object.keys($P.taskDatasets);
for(var i=0; i < datasetNames.length; i++){
var filtered = resp.vltnList.filter(item => item.TASK_SE_CD == datasetNames[i].substr(0,3));
$P.taskDatasets[datasetNames[i]].setData(filtered);
}
for(var i=0; i < datasetNames.length; i++){
var taskSeCd = datasetNames[i].substr(0,3);
var template = document.getElementById("taskTbodyTemplate--${pageName}").innerHTML;
var taskDataset = $P.taskDatasets[taskSeCd+"Dataset"];
var trs = taskDataset.empty ? [""] : taskDataset.inStrings(template);
$("#"+taskSeCd+"tbody--${pageName}").html(trs.join());
}
resolve({resp, textStatus, jqXHR});
},
error: function(jqXHR, textStatus, error) {
}
});
});
};
//이미지 뷰어
fnMakeSingleImageViewer($("#offcsImage--${pageName}")[0] , $("#offcs--${pageName}")[0], "orgn-path", "orgn-name");
fnMakeSingleImageViewer($("#symbolImage--${pageName}")[0] , $("#symbol--${pageName}")[0], "orgn-path", "orgn-name");
fnMakeSingleImageViewer($("#logoImage--${pageName}")[0] , $("#logo--${pageName}")[0], "orgn-path", "orgn-name");
//시군구 기본 설정 저장 버튼
$("#btnSaveSgg--${pageName}").on("click", function(){
var formData = new FormData($("#mainForm--${pageName}")[0]);
ajax.post({
url: wctx.url("/ogdp/updateSggStng.do"),
data: formData,
contentType : false, processData : false,
success: (resp) => {
dialog.alert({
content : "저장됐습니다.",
init : function(){
setDialogZindex();
focusClose();
},
onClose : () => {
$P.getSggInfo();
}
});
}
});
});
//업무 추가 버튼
$("#btnOpenSelectTaskDialog--${pageName}").on("click", function(){
$("#selectTaskButtons").html("");
var keys = Object.keys(ALL_TASK);
var ableKeys = [];
for(var i=0; i < keys.length; i++){
if($("#tabContentContainer--${pageName}").find("#tab"+keys[i]+"--${pageName}").length < 1){
ableKeys.push(keys[i]);
}
}
if(ableKeys.length < 1){
alert("추가 가능한 과태료 업무가 없습니다.");
return;
}
var pn = "${pageName}";
for(var i=0; i < ableKeys.length; i++){
var button = `<button type="button" class="btn btn-xl btn-primary" onclick="pageObject['`
+pn
+`'].fnCreateTaskStng('`
+ableKeys[i]
+`');">`
+ALL_TASK[ableKeys[i]]
+`</button>`;
$("#selectTaskButtons").append(button);
}
$("#selectTaskModal").modal("show");
});
$P.fnCreateTaskStng = (taskSeCd) => {
$("#selectTaskModal").modal("hide");
ajax.post({
url: wctx.url("/ogdp/createTaskStng.do"),
data: {
sggCd : $("#mainForm--${pageName}").find("[name='sggID']").val(),
taskSeCd : taskSeCd
},
success: (resp) => {
dialog.alert({
content : "저장됐습니다.",
init : function(){
setDialogZindex();
focusClose();
},
onClose : () => {
$P.getSggTaskInfo().then(()=>{ $P.getVltnInfo(); });
}
});
}
});
};
$P.fnSaveForTask = (el) => {
var taskSeCd = el.dataset.task;
var sggCd = $("#mainForm--${pageName}").find("[name='sggID']").val();
var formData = new FormData($("#"+taskSeCd+"Form--${pageName}")[0]);
formData.append("taskSeCd",taskSeCd);
formData.append("sggCd", sggCd);
var rowArr = $P.getRowData(taskSeCd+"tbody--${pageName}", formData);
var vltnStngList = fnJsonArrayToFormData(rowArr,"vltnStngList");
var keys = Object.keys(vltnStngList);
for(var i=0; i < keys.length; i++){
formData.append(keys[i], vltnStngList[keys[i]]);
}
ajax.post({
url: wctx.url("/ogdp/updateTaskStng.do"),
data: formData,
contentType : false, processData : false,
success: (resp) => {
dialog.alert({
content : "저장됐습니다.",
init : function(){
setDialogZindex();
focusClose();
},
onClose : () => {
$P.getSggTaskInfo().then(()=>{ $P.getVltnInfo(); });
}
});
}
});
};
$P.getRowData = (tbodyId, formData) => {
var rowArr = [];
$("#"+tbodyId+" tr").each(function(){
var row = {};
row.vltnId = this.dataset.key;
row.vltnArtcl = $($P.fnGetElement(this,"vltnArtcl")).val();
row.vltnLawNm = $($P.fnGetElement(this,"vltnLawNm")).val();
row.vltnLaw1 = $($P.fnGetElement(this,"vltnLaw1")).val();
row.vltnLaw2 = $($P.fnGetElement(this,"vltnLaw2")).val();
row.vltnLawEtc = $($P.fnGetElement(this,"vltnLawEtc")).val();
row.acntgSeCd = $($P.fnGetElement(this,"acntgSeCd")).val();
row.acntgSeNm = $($P.fnGetElement(this,"acntgSeNm")).val();
row.txitmCd = $($P.fnGetElement(this,"txitmCd")).val();
row.txitmNm = $($P.fnGetElement(this,"txitmNm")).val();
row.operItemCd = $($P.fnGetElement(this,"operItemCd")).val();
row.operItemNm = $($P.fnGetElement(this,"operItemNm")).val();
row.spclBizCd = $($P.fnGetElement(this,"spclBizCd")).val();
row.spclBizNm = $($P.fnGetElement(this,"spclBizNm")).val();
row.sggCd = formData.get("sggID");
row.taskSeCd = formData.get("taskSeCd");
rowArr.push(row);
});
return rowArr;
};
$P.fnGetElement = (tableRow, colName) => {
return $(tableRow).find("td[data-col='"+colName+"']").children("input, select").first()[0];
}
/**************************************************************************
* 초기화
**************************************************************************/
$P.getSggInfo()
.then(() => {
return $P.getSggTaskInfo();
})
.then(() => {
return $P.getVltnInfo();
});
});
</script>

@ -1,338 +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="pageKorName" scope="request">부서관리</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<div class="container-page-btn">
<button type="button" id="btnReset--${pageName}" class="btn btn-outline-dark w-px-120" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" id="btnSearch--${pageName}" class="btn btn-search w-px-120" title="검색">
검색
</button>
</span>
</div>
<form id="frmSearch--${pageName}" name="frmSearch">
<div class="container-search">
<div class="row g-1">
<div class="col-3">
<label class="form-label fw-bold form-search-title" for="sggCd--${pageName}">시군구</label>
<select id="sggCd--${pageName}" name="sggCd" class="form-select" disabled>
<option value="">전체</option>
<c:forEach items="${sggList}" var="item">
<option value="${item.SGG_CD}">${item.SGG_NM}</option>
</c:forEach>
</select>
</div>
<div class="col-3">
<label class="form-label fw-bold form-search-title" for="instNm--${pageName}">기관명</label>
<input type="text" id="instNm--${pageName}" name="instNm" class="form-control" />
</div>
<div class="col-3">
<label class="form-label fw-bold form-search-title" for="instCd--${pageName}">기관코드</label>
<input type="text" id="instCd--${pageName}" name="instCd" class="form-control" maxlength="7" />
</div>
</div>
<div class="row g-1">
<div class="col-3">
<label class="form-label fw-bold form-search-title" for="deptNm--${pageName}">부서명</label>
<input type="text" id="deptNm--${pageName}" name="deptNm" class="form-control" />
</div>
<div class="col-3">
<label class="form-label fw-bold form-search-title" for="deptCd--${pageName}">부서코드</label>
<input type="text" id="deptCd--${pageName}" name="deptCd" class="form-control" maxlength="7" />
</div>
<div class="col-6">
</div>
</div>
</div>
</form>
<div>
<div id="gridbuttonArea--${pageName}" class="container-page-btn">
<div class="d-flex flex-row justify-content-between">
<span id="deptPaging--${pageName}PagingInfo" class="dataTables_info" role="status" aria-live="polite"></span>
<ul id="deptPaging--${pageName}" class="pagination pagination-primary">
</ul>
</div>
</div>
</div>
<div class="card-datatable text-nowrap">
<div id="DataTables_Table_0_wrapper--${pageName}" class="dataTables_wrapper dt-bootstrap5 no-footer">
<div id="table-responsive--${pageName}" class="table-responsive ox-scroll oy-scroll h-px-500">
<table id="DataTables_Table_0--${pageName}"
class="table-layout-fixed datatables-ajax table table-bordered dataTable no-footer">
<thead class="sticky-thead">
<tr id="deptThead--${pageName}">
<th style="width: 80px;" class="cmn">No.</th>
<th class="cmn" style="width: 56px;">
<input type="checkbox" class="form-check-input"
onchange="pageObject['${pageName}'].deptControl.dataset.select(this.checked);" />
</th>
<th style="width: 200px;">시군구명</th>
<th style="width: 200px;">시군구코드</th>
<th style="width: 200px;">기관명</th>
<th style="width: 200px;">기관코드</th>
<th style="width: 200px;">부서명</th>
<th style="width: 200px;">부서코드</th>
<th style="width: 200px;">사용여부</th>
<th class="dummy-th"></th>
</tr>
</thead>
<tbody id="deptTbody--${pageName}">
</tbody>
<template id="deptRow--${pageName}">
<tr data-key="{DEPT_CD}">
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-end">{ROW_NUM}</td>
<td class="text-center">
<input type="checkbox" class="form-check-input" name="gridCheckbox" value="{DEPT_CD}"
onchange="pageObject['${pageName}'].deptControl.dataset.select('{DEPT_CD}', this.checked);">
</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{SGG_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{SGG_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{INST_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{INST_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-start">{DEPT_NM}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{DEPT_CD}</td>
<td onclick="{onclick}" ondblclick="{ondblclick}" class="text-center">{USE_YN_NM}</td>
<td class="dummy-td"></td>
</tr>
</template>
<template id="deptNotFound--${pageName}">
<tr>
<td valign="top" colspan="10" class="dataTables_empty text-center">
부서 정보를 찾지 못했습니다.
</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<div class="toast-container position-fixed bottom-0 end-0 p-3">
<div id="divToast--${pageName}" class="toast" role="alert" aria-live="assertive" aria-atomic="true">
<div class="toast-body bg-black text-white">
삭제 되었습니다.
</div>
</div>
</div>
</div>
</div>
<div class="content-backdrop fade"></div>
</div>
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
$(document).ready(function(){
var $P = pageObject["${pageName}"];
$P.toast = new bootstrap.Toast(document.getElementById('divToast--${pageName}'), {
animation: true,
autohide: true,
delay: 2000
});
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.deptControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData:true,
keymapper : info => info ? info.DEPT_CD : "",
urls : {
load : wctx.url("/ogdp/getDeptStngList.do"),
getInfo : wctx.url("/ogdp/getDeptStngInfo.do")
},
formats: {
REG_DT : datetimeFormat,
MDFCN_DT : datetimeFormat
}
});
$P.deptControl.defaultFetchSize = FETCH_XS;
$P.deptControl.query = { pageNum : 1, fetchSize : $P.deptControl.defaultFetchSize };
$P.deptControl.beforeCurrent = null;
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.deptControl.dataset.onDatasetChange = (obj, option) => {
var t = $P.getGridTemplate();
var trs = Apply.fromDataset.getTbody($P.deptControl.dataset, t.found, t.notFound, t.replacer);
$P.renderDeptList(obj["Total"], $P.deptControl.dataset.length, trs, option);
Apply.fromDataset.paging($P.deptControl.dataset, obj, "deptPaging--${pageName}");
};
$P.deptControl.dataset.onCurrentChange = (dataItem) => {
Apply.fromDataset.currentRow($P.deptControl.dataset, dataItem, $("#deptTbody--${pageName}")[0]);
}
$P.deptControl.dataset.onSelectionChange = (selectedArr) => {
Apply.fromDataset.gridCheckbox($P.deptControl.dataset, document.getElementById("deptTbody--${pageName}"), 1, selectedArr);
};
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnReset = () => {
var searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='hidden']").val("");
searchForm.find("input[type='text']").val("");
searchForm.find("select[name='sggCd']").val(MY_INFO.info.sggCd);
$P.deptControl.dataset.setData([]);
}
$P.getParams = () => {
var formFields = new FimsFormFields("#frmSearch--${pageName}");
var data = formFields.get();
data.fetchSize = $P.deptControl.defaultFetchSize;
return data;
}
$P.searchDeptList = () => {
$P.deptControl.query = $P.getParams();
$P.deptControl.load(1);
}
$P.scrollDeptList = () => {
$P.deptControl.load($P.deptControl.query.pageNum + 1);
}
$P.refreshDeptList = () => {
if($P.deptControl.query.pageNum == null){
return;
}
$P.deptControl.reload({all : true});
}
$P.getGridTemplate = () => {
var notFound = [document.getElementById("deptNotFound--${pageName}").innerHTML];
var found = document.getElementById("deptRow--${pageName}").innerHTML;
var replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].clickDeptList('" + dataItem.getValue("DEPT_CD") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].dblclickDeptList('" + dataItem.getValue("DEPT_CD") + "');");
return {
found : found,
notFound : notFound,
replacer : replacer
};
}
$P.renderDeptList = (total, listLength, trs, option) => {
let noMore = (listLength >= total);
var initScroll = ($P.deptControl.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs, initScroll, noMore);
fn_securityModeToggle($("#securityMode--top").is(":checked")); //보안모드
}
$P.clickDeptList = (dataKey) => {
if(dataKey == ""){
return;
}
$("#deptTbody--${pageName}").setCurrentRow(dataKey);
Apply.toDataset.current($P.deptControl.dataset, dataKey);
}
$P.dblclickDeptList = (dataKey) => {
$P.getInfo(dataKey);
}
$P.getInfo = (deptCd) => {
var params = {};
params.deptCd = deptCd;
ajax.get({
url : $P.deptControl.urls.getInfo,
data : params,
success : (resp) => {
dialog.open({
id : "deptInfoDialog",
title : "부서 정보",
size : "xl",
content : resp,
init : () => {
var parentRes = new Object();
var childReq = pageObject.childReq.pop();
for(var reqKey in childReq) {
if($P.provide[reqKey]){
parentRes[reqKey] = $P.provide[reqKey];
} else {
parentRes[reqKey] = function(){};
}
}
pageObject.parentRes.push(parentRes);
}
});
}
});
}
$P.provide = {
"refreshList" : function(){
$P.refreshDeptList();
},
};
/**************************************************************************
* element.on
**************************************************************************/
$('#btnReset--${pageName}').on('click', () => $P.fnReset());
$('#btnSearch--${pageName}').on('click', () => $P.searchDeptList());
/**************************************************************************
* 초기화
**************************************************************************/
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDeptList);
$P.fnReset();
fn_securityModeToggle($("#securityMode--top").is(":checked")); //보안모드
if(MY_INFO.institute == "ADMIN00"){
$("#sggCd--${pageName}").removeAttr("disabled");
}
});
</script>

@ -1,361 +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="pageKorName" scope="request">부서 정보</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card">
<form id="frmEdit--${pageName}" name="frmEdit">
<div class="row g-1" id="forRootAdmin--${pageName}" hidden>
<div class="col-md-6">
<label for="sggID--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">
시군구코드
</label>
<input type="text" id="sggID--${pageName}" name="sggID" data-map="SGG_CD"
class="form-control" required maxlength="7" readonly />
</div>
<div class="col-md-6">
<label for="instCode--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">
기관코드
</label>
<input type="text" id="instCode--${pageName}" name="instCode" data-map="INST_CD"
class="form-control" required maxlength="7" readonly />
</div>
</div>
<div class="row g-1">
<div class="col-md-6">
<label for="deptID--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">
부서코드
</label>
<input type="text" id="deptID--${pageName}" name="deptID" data-map="DEPT_CD"
class="form-control" required maxlength="7" readonly />
</div>
<div class="col-md-6">
<label for="name--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">
부서명
</label>
<input type="text" id="name--${pageName}" name="name" data-map="DEPT_NM"
class="form-control" required readonly />
</div>
<div class="col-md-12" hidden>
<input type="text" id="telno--${pageName}" name="telno" data-map="DEPT_TELNO"
class="form-control" />
<input type="text" id="faxno--${pageName}" name="faxno" data-map="DEPT_FXNO"
class="form-control" />
</div>
</div>
<div class="row g-1">
<div class="col-md-6">
<label for="cvlcptLinkSeCd--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
민원연계구분
</label>
<input type="text" id="cvlcptLinkSeCd--${pageName}" name="cvlcptLinkSeCd" data-map="CVLCPT_LINK_SE_CD"
class="form-control" />
</div>
<div class="col-md-6">
<label for="vrbacntLinkSeCd--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
가상계좌연계구분
</label>
<input type="text" id="vrbacntLinkSeCd--${pageName}" name="vrbacntLinkSeCd" data-map="VRBACNT_LINK_SE_CD"
class="form-control" />
</div>
<div class="col-md-6">
<label for="pstofcNm--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
우체국명
</label>
<input type="text" id="pstofcNm--${pageName}" name="pstofcNm" data-map="PSTOFC_NM"
class="form-control" />
</div>
<div class="col-md-6">
<label for="rgNoHeader--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
등기번호 헤더
</label>
<input type="text" id="rgNoHeader--${pageName}" name="rgNoHeader" data-map="RG_NO_HEADER"
class="form-control" />
</div>
<div class="col-md-6">
<label for="sndngLinkSeCd--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
발송연계구분
</label>
<input type="text" id="sndngLinkSeCd--${pageName}" name="sndngLinkSeCd" data-map="SNDNG_LINK_SE_CD"
class="form-control" />
</div>
<div class="col-md-6">
<label for="egpConOrg--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
E그린 외부기관구분
</label>
<input type="text" id="egpConOrg--${pageName}" name="egpConOrg" data-map="EGP_CON_ORG"
class="form-control" />
</div>
<div class="col-md-6">
<label for="egpRceptId--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
E그린 접수수체국기호
</label>
<input type="text" id="egpRceptId--${pageName}" name="egpRceptId" data-map="EGP_RCEPT_ID"
class="form-control" />
</div>
<div class="col-md-6">
<label for="egpApvlNb--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
E그린 후납계약승인번호
</label>
<input type="text" id="egpApvlNb--${pageName}" name="egpApvlNb" data-map="EGP_APVL_NB"
class="form-control" />
</div>
<div class="col-md-6">
<label for="egpEsbPath--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
E그린 ESB경로
</label>
<input type="text" id="egpEsbPath--${pageName}" name="egpEsbPath" data-map="EGP_ESB_PATH"
class="form-control" />
</div>
<div class="col-md-6">
<label for="egpPostInstId--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
E그린 우정정보센터 기관ID
</label>
<input type="text" id="egpPostInstId--${pageName}" name="egpPostInstId" data-map="EGP_POST_INST_ID"
class="form-control" />
</div>
<div class="col-md-6">
<label for="egpCertCn--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
E그린 인증서CN
</label>
<input type="text" id="egpCertCn--${pageName}" name="egpCertCn" data-map="EGP_CERT_CN"
class="form-control" />
</div>
<div class="col-md-6">
<label for="ensInterfaceId--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
세외수입인터페이스ID
</label>
<input type="text" id="ensInterfaceId--${pageName}" name="ensInterfaceId" data-map="ENS_INTERFACE_ID"
class="form-control" />
</div>
<div class="col-md-6">
<label for="ensSourceCd--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
세외수입소스코드
</label>
<input type="text" id="ensSourceCd--${pageName}" name="ensSourceCd" data-map="ENS_SOURCE_CD"
class="form-control" />
</div>
<div class="col-md-6">
<label for="ensTargetCd--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
세외수입타겟코드
</label>
<input type="text" id="ensTargetCd--${pageName}" name="ensTargetCd" data-map="ENS_TARGET_CD"
class="form-control" />
</div>
<div class="col-md-6">
<label for="ensUrl--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
세외수입URL
</label>
<input type="text" id="ensUrl--${pageName}" name="ensUrl" data-map="ENS_URL"
class="form-control" />
</div>
<div class="col-md-6">
<label for="nxrpLinkYn--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
세외수입 연계 여부
</label>
<input type="text" id="nxrpLinkYn--${pageName}" name="nxrpLinkYn" data-map="NXRP_LINK_YN"
class="form-control" />
</div>
<div class="col-md-6">
<label for="nxrpLinkSrvcUrl--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
세외수입연계서비스URL
</label>
<input type="text" id="nxrpLinkSrvcUrl--${pageName}" name="nxrpLinkSrvcUrl" data-map="NXRP_LINK_SRVC_URL"
class="form-control" />
</div>
<div class="col-md-6">
<label for="nxrpRgnSeCd--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
세외수입지역구분코드
</label>
<input type="text" id="nxrpRgnSeCd--${pageName}" name="nxrpRgnSeCd" data-map="NXRP_RGN_SE_CD"
class="form-control" />
</div>
<div class="col-md-6">
<label for="dtbnBankNm--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
교부은행명
</label>
<input type="text" id="dtbnBankNm--${pageName}" name="dtbnBankNm" data-map="DTBN_BANK_NM"
class="form-control" />
</div>
<div class="col-md-6">
<label for="dtbnActno--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
교부계좌번호
</label>
<input type="text" id="dtbnActno--${pageName}" name="dtbnActno" data-map="DTBN_ACTNO"
class="form-control" />
</div>
<div class="col-md-6">
<label for="docHeader--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
문서머릿말
</label>
<input type="text" id="docHeader--${pageName}" name="docHeader" data-map="DOC_HEADER"
class="form-control" />
</div>
<div class="col-md-6">
<label for="srvrOs--${pageName}"
class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">
서버OS
</label>
<input type="text" id="srvrOs--${pageName}" name="srvrOs" data-map="SRVR_OS"
class="form-control" />
</div>
</div>
<div class="row m-3">
<div class="col-md-12">
<span class="float-end">
<button type="button" id="btnSave--${pageName}" class="btn btn-primary">저장</button>
</span>
</div>
</div>
</form>
</div>
</div>
</div>
<script>
pageObject["${pageName}"] = {};
pageObject["${pageName}"].provided = {};
pageObject.childReq = [];
pageObject.childReq.push({
refreshList : function(){ },
});
$(document).ready(function(){
var $P = pageObject["${pageName}"];
if(pageObject.parentRes.length > 0){
$P.provided = pageObject.parentRes.pop();
} else {
$P.provided = pageObject.childReq.pop();
}
/**************************************************************************
* DatasetControl, Dataset, FormFields
**************************************************************************/
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
$P.deptControl = new DatasetControl({
dataGetter : obj => obj["List"], appendData : true,
keymapper : info => info ? info.DEPT_CD : "",
urls : {
update : wctx.url("/ogdp/updateDeptStng.do")
},
formats: {
}
});
/**************************************************************************
* Dataset.on
**************************************************************************/
$P.deptControl.dataset.onCurrentChange = (dataItem) => {
if(!dataItem){
return;
}
$P.formFields.set($P.deptControl,dataItem);
}
/**************************************************************************
* pageObject.function
**************************************************************************/
$P.fnSave = () => {
if(!customValidate($("#frmEdit--${pageName} input"))) return;
var info = $P.formFields.get();
if(info.deptID.length != 7){
alert("부서코드는 7자리 숫자이여야 합니다.");
return;
}
var create = $P.deptControl.dataset.empty;
ajax.post({
url : create ? $P.deptControl.urls.create : $P.deptControl.urls.update,
data : info,
success : (resp) => {
if(resp.saved){
dialog.close("deptInfoDialog");
dialog.alert({
content:"저장되었습니다.",
onOK : () => $P.provided.refreshList()
});
}
}
});
}
/**************************************************************************
* element.on
**************************************************************************/
$("#btnSave--${pageName}").on('click', () => $P.fnSave());
/**************************************************************************
* 초기화
**************************************************************************/
if(MY_INFO.institute == 'ADMIN00') {
$("#forRootAdmin--${pageName}").removeAttr("hidden");
}
var deptInfo = ${deptInfo};
$("#deptID--${pageName}").attr("disabled","disabled");
$("#name--${pageName}").attr("disabled","disabled");
$P.deptControl.dataset.setData([deptInfo]);
if(deptInfo.USE_YN == "N"){
$("#btnSave--${pageName}").attr("disabled","disabled");
}
});
</script>

@ -1,37 +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="pageKorName" scope="request">시군구 목록</c:set>
<div class="content-wrapper">
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<h1>시군구 선택</h1>
<div id="btnsGoToEditSgg--${pageName}">
<c:forEach items="${sggList}" var="item">
<c:if test="${item.SGG_CD ne 'ADMIN'}">
<button type="button" data-value="${item.SGG_CD}" class="w-px-200"
onclick="fnGoToEditSgg('${item.SGG_CD}')">
${item.SGG_NM}(${item.SGG_CD})
</button>
</c:if>
</c:forEach>
</div>
</div>
</div>
</div>
<script>
function fnGoToEditSgg(selected){
let menuUrl = wctx.url("/ogdp/sggStngMain.do");
let curTabId = getActiveRootTabArea().id;
ajax.get({
url: menuUrl,
data : { sggCd : selected },
success:(resp) => {
$("#main-tab-content").find("div[id='"+curTabId+"']").html(resp);
}
});
}
</script>

@ -1,435 +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>
<!-- inner page html -->
<div class="content-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<input type="hidden" id="crdnId--${pageName}" name="crdnId" data-map="CRDN_ID" />
<input type="hidden" id="rtpyrId--${pageName}" name="rtpyrId" data-map="RTPYR_ID" />
<input type="hidden" id="addrSn--${pageName}" name="addrSn" data-map="ADDR_SN" />
<input type="hidden" id="rtpyrInptSeCd--${pageName}" name="rtpyrInptSeCd" data-map="RTPYR_INPT_SE_CD" />
<input type="hidden" id="addrInptSeCd--${pageName}" name="addrInptSeCd" data-map="ADDR_INPT_SE_CD" />
<div class="row g-1">
<!-- 단속일시 -->
<div class="col-md-6">
<label for="crdnYmdTm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">단속일시</label>
<input type="text" class="form-control w-35" id="crdnYmdTm--${pageName}" name="crdnYmdTm" data-map="CRDN_YMD_TM" readonly />
</div>
<!-- 차량번호 -->
<div class="col-md-6">
<label for="vhrno--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">차량번호</label>
<input type="text" class="form-control w-25" id="vhrno--${pageName}" name="vhrno" data-map="VHRNO" readonly />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnVehicle--${pageName}" title="차량 검색"">
검색
</button>
</div>
<!-- 납부자 구분 코드 -->
<div class="col-md-6">
<label for="rtpyrSeCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">납부자 구분</label>
<select class="form-select" id="rtpyrSeCd--${pageName}" name="rtpyrSeCd" data-map="RTPYR_SE_CD" required>
<option value="">선택하세요</option>
<c:forEach items="${FIM011List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 납부자 상태 코드 -->
<div class="col-md-6">
<label for="rtpyrSttsCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">납부자 상태</label>
<select class="form-select" id="rtpyrSttsCd--${pageName}" name="rtpyrSttsCd" data-map="RTPYR_STTS_CD">
<option value="">선택하세요</option>
<c:forEach items="${FIM014List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 납부자 명 -->
<div class="col-md-6">
<label for="rtpyrNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">납부자 성명</label>
<input type="text" class="form-control w-35" id="rtpyrNm--${pageName}" name="rtpyrNm" data-map="RTPYR_NM" required />
</div>
<!-- 납부자 번호 -->
<div class="col-md-6">
<label for="rtpyrNo--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">납부자 번호</label>
<input type="text" class="form-control w-30" id="rtpyrNo--${pageName}" name="rtpyrNo" data-map="RTPYR_NO" required />
</div>
<!-- 납부자 전화번호 -->
<div class="col-md-6">
<label for="rtpyrTelno--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">전화번호</label>
<input type="text" class="form-control w-35" id="rtpyrTelno--${pageName}" name="rtpyrTelno" data-map="RTPYR_TELNO" />
</div>
<!-- 납부자 휴대전화번호 -->
<div class="col-md-6">
<label for="rtpyrMblTelno--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">휴대전화번호</label>
<input type="text" class="form-control w-35" id="rtpyrMblTelno--${pageName}" name="rtpyrMblTelno" data-map="RTPYR_MBL_TELNO" />
</div>
<!-- 납부자 이메일 -->
<div class="col-md-12">
<label for="rtpyrEml--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">이메일</label>
<input type="text" class="form-control w-30" id="rtpyrEml--${pageName}" name="rtpyrEml" data-map="RTPYR_EML" />
</div>
<!-- 주소 --><!-- 우편번호 -->
<div class="col-md-12">
<label for="addr--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">주소</label>
<input type="text" class="form-control w-70" id="addr--${pageName}" name="addr" data-map="ADDR" required />
<input type="text" class="form-control w-px-75" id="zip--${pageName}" name="zip" data-map="ZIP" required />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnZipCode--${pageName}" title="우편번호검색">
검색
</button>
</div>
<!-- 상세주소 -->
<div class="col-md-12">
<label for="dtlAddr--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">상세주소</label>
<input type="text" class="form-control w-78" id="dtlAddr--${pageName}" name="dtlAddr" data-map="DTL_ADDR" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnEditAddr--${pageName}" title="주소수정">
주소수정
</button>
</div>
<!-- 도로명 코드 -->
<div class="col-md-12">
<label for="roadNmCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">도로명코드</label>
<input type="text" class="form-control w-px-120" id="roadNmCd--${pageName}" name="roadNmCd" data-map="ROAD_NM_CD" readonly />
<input type="text" class="form-control w-px-30" id="udgdSeCd--${pageName}" name="udgdSeCd" data-map="UDGD_SE_CD" readonly />
<input type="text" class="form-control w-px-60" id="bmno--${pageName}" name="bmno" data-map="BMNO" readonly />
<input type="text" class="form-control w-px-60" id="bsno--${pageName}" name="bsno" data-map="BSNO" readonly />
<input type="text" class="form-control w-px-230" id="bldgMngNo--${pageName}" name="bldgMngNo" data-map="BLDG_MNG_NO" readonly />
</div>
<!-- 법정동 코드 -->
<div class="col-md-6">
<label for="stdgCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">법정동코드</label>
<input type="text" class="form-control w-30" id="stdgCd--${pageName}" name="stdgCd" data-map="STDG_CD" readonly />
<input type="text" class="form-control w-px-30" id="mtnSeCd--${pageName}" name="mtnSeCd" data-map="MTN_SE_CD" readonly />
<input type="text" class="form-control w-px-50" id="mno--${pageName}" name="mno" data-map="MNO" readonly />
<input type="text" class="form-control w-px-50" id="sno--${pageName}" name="sno" data-map="SNO" readonly />
</div>
<!-- 행정동 코드 -->
<div class="col-md-6">
<label for="dongCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">행정동코드</label>
<input type="text" class="form-control w-30" id="dongCd--${pageName}" name="dongCd" data-map="DONG_CD" readonly />
</div>
</div>
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-80" id="btnSave--${pageName}" title="저장">저장</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
</div> <!-- <div class="card"> -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "payer"
, prefixName: "납부자"
, keymapper: info => info ? info.RTPYR_ID : ""
, dataGetter: obj => obj.${infoPrefix}Info
, formats: {
CRDN_YMD_TM: datetimeFormat
}
});
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
// Dataset 셋팅
$P.formFields.set($P.control, item);
// 업무구분에 따른 URL 변경
$P.fnSetURL(item.data.TASK_SE_CD);
}
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, onOK: () => { }
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
if ($("#rtpyrInptSeCd--${pageName}").val() == "") {
info.rtpyrInptSeCd = "01"; // 납부자 입력 구분 코드(FIM015) 01:수기입력
}
if ($("#addrInptSeCd--${pageName}").val() == "") {
info.addrInptSeCd = "01"; // 주소 입력 구분 코드(FIM087) 01:수기입력
}
if (info.rtpyrSeCd == "01") {
info.rtpyrBrdt = info.rtpyrNo.substr(0, 6); // 생년월일
}
info.wholAddr = info.addr + ", " + info.dtlAddr // 전체 주소
ajax.post({
url: $P.control.urls.create
, data: info || {}
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 업무구분에 따른 URL 설정
$P.fnSetURL = (taskSeCd) => {
$P.control.urls.create = wctx.url("/" + taskSeCd + "/payer" + "/createCrdnPayer.do"); // 등록
}
//
$P.callbackVehicle = (info) => {
let pyrSeCd = "";
switch (info.mber_se_code) {
case "11": pyrSeCd = "01"; break;
case "12": pyrSeCd = "02"; break;
case "13": pyrSeCd = "03"; break;
case "14": pyrSeCd = "04"; break;
case "15": pyrSeCd = "05"; break;
}
$("#rtpyrSeCd--${pageName}").val(pyrSeCd); // 납부자 구분 코드
$("#rtpyrNm--${pageName}").val(info.mber_nm); // 납부자 성명
$("#rtpyrNo--${pageName}").val(info.mber_se_no); // 납부자 번호
$("#addr--${pageName}").val(info.road_nm_adres); // 주소
$("#zip--${pageName}").val(info.zip_code); // 우편번호
$("#dtlAddr--${pageName}").val(info.use_strnghld_adres_nm); // 사용본거지 상세주소
$("#roadNmCd--${pageName}").val(info.use_strnghld_road_nm_code); // 사용본거지 도로명 코드
$("#udgdSeCd--${pageName}").val(info.usgsrhld_undgrnd_buld_se_code); // 사용본거지 지하 구분 코드
$("#bmno--${pageName}").val(info.use_strnghld_buld_main_no); // 사용본거지 건물 본번
$("#bsno--${pageName}").val(info.use_strnghld_buld_sub_no); // 사용본거지 건물 부번
$("#bldgMngNo--${pageName}").val(""); // 건물 관리 번호
$("#stdgCd--${pageName}").val(info.use_strnghld_legaldong_code); // 사용본거지 법정동 코드
$("#mtnSeCd--${pageName}").val(info.use_strnghld_mntn); // 사용본거지 산
$("#mno--${pageName}").val(info.use_strnghld_lnbr); // 사용본거지 번지
$("#sno--${pageName}").val(info.use_strnghld_ho); // 사용본거지 호
$("#dongCd--${pageName}").val(info.use_strnghld_adstrd_code); // 사용본거지 행정동 코드
$("#rtpyrInptSeCd--${pageName}").val("02"); // 납부자 입력 구분 코드(FIM015) 02:자동차관리정보시스템
$("#addrInptSeCd--${pageName}").val("02"); // 주소 입력 구분 코드(FIM087) 02:자동차관리정보시스템
}
// 우편번호 검색 결과
$P.callbackSearchAddr = (obj) => {
$("#addr--${pageName}").val(obj.ADDR); // 주소
$("#zip--${pageName}").val(obj.ZIP); // 우편번호
$("#dtlAddr--${pageName}").val(obj.DTL_ADDR); // 상세 주소
$("#roadNmCd--${pageName}").val(obj.ROAD_NM_CD); // 도로명 코드
$("#udgdSeCd--${pageName}").val(obj.UDGD_SE_CD); // 지하 구분 코드
$("#bmno--${pageName}").val(obj.BMNO); // 건물 본번
$("#bsno--${pageName}").val(obj.BSNO); // 건물 부번
$("#bldgMngNo--${pageName}").val(obj.BLDG_MNG_NO); // 건물 관리 번호
$("#stdgCd--${pageName}").val(obj.STDG_CD); // 법정동 코드
$("#mtnSeCd--${pageName}").val(obj.MTN_SE_CD); // 산
$("#mno--${pageName}").val(obj.MNO); // 번지
$("#sno--${pageName}").val(obj.SNO); // 호
$("#dongCd--${pageName}").val(obj.DONG_CD); // 행정동
$("#rtpyrInptSeCd--${pageName}").val("01"); // 납부자 입력 구분 코드(FIM015) 01:수기입력
$("#addrInptSeCd--${pageName}").val("01"); // 주소 입력 구분 코드(FIM087) 01:수기입력
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 차적 검색
$P.fnGetVehicle = () => {
let crdnYmd = $P.control.getValue("CRDN_YMD");
let vhrno = $("#vhrno--${pageName}").val();
if (crdnYmd == "") {
dialog.alert({
content: "단속일자를 입력하세요."
});
return;
}
if (vhrno == "") {
dialog.alert({
content: "차량번호를 입력하세요.",
onClose: function() {
$("#vhrno--${pageName}").focus();
}
});
return;
}
let params = {
inqire_se_code: "3"
, sggCd: $("#sggCd--${pageName}").val()
, levy_stdde: crdnYmd
, vhrno: vhrno
}
json.post({
url: wctx.url("/payer/vehicle.do")
, data: params || {}
, success: resp => {
if (!resp.found) {
$("#rtpyrId--${pageName}").val(""); // 납부자 ID
$("#rtpyrSeCd--${pageName}").val(""); // 납부자 입력 구분 코드
$("#rtpyrNm--${pageName}").val(""); // 납부자 성명
$("#rtpyrNo--${pageName}").val(""); // 납부자 번호
$("#rtpyrTelno--${pageName}").val(""); // 납부자 전화번호
$("#rtpyrMblTelno--${pageName}").val(""); // 납부자 휴대 전화번호
$("#rtpyrEml--${pageName}").val(""); // 납부자 이메일
$("#zip--${pageName}").val(""); // 우편번호
$("#addr--${pageName}").val(""); // 주소
$("#dtlAddr--${pageName}").val(""); // 상세 주소
$("#roadNmCd--${pageName}").val(""); // 도로명 코드
$("#udgdSeCd--${pageName}").val(""); // 지하 구분 코드
$("#bmno--${pageName}").val(""); // 건물 본번
$("#bsno--${pageName}").val(""); // 건물 부번
$("#bldgMngNo--${pageName}").val(""); // 건물 관리 번호
$("#stdgCd--${pageName}").val(""); // 법정동 코드
$("#mtnSeCd--${pageName}").val(""); // 산
$("#mno--${pageName}").val(""); // 번지
$("#sno--${pageName}").val(""); // 호
$("#dongCd--${pageName}").val(""); // 행정동 코드
dialog.alert("차량 정보가 없습니다.");
} else {
$("#rtpyrId--${pageName}").val(resp.rtpyrId); // 납부자 ID
$("#addr--${pageName}").attr("readonly", true); // 주소
$("#zip--${pageName}").attr("readonly", true); // 우편번호
$("#dtlAddr--${pageName}").attr("readonly", true); // 상세 주소
$P.callbackVehicle(resp.vehicle);
}
}
});
}
// 우편번호 검색
$P.fnZipCode = async() => {
let resp = await fetch(wctx.url("/resources/html/searchAddr.html"));
let template = await resp.text();
dialog.open({
id: "searchAddrDialog"
, title: "주소검색"
, size: "lg"
, content: template
, init: () => {
$("#searchAddrCallback").val("pageObject['${pageName}'].callbackSearchAddr");
setDialogZindex();
}
});
}
// 화면에서 보여주는 주소입력 부분 수정
$P.fnEditAddr = () => {
$("#addr--${pageName}").prop("readonly", false); // 주소
$("#zip--${pageName}").prop("readonly", false); // 우편번호
$("#dtlAddr--${pageName}").prop("readonly", false); // 상세 주소
// 도로명 주소
$("#roadNmCd--${pageName}").val(""); // 도로명 코드
$("#udgdSeCd--${pageName}").val(""); //
$("#bmno--${pageName}").val(""); //
$("#bsno--${pageName}").val(""); //
$("#bldgMngNo--${pageName}").val(""); //
// 법정동
$("#stdgCd--${pageName}").val(""); // 법정동 코드
$("#mtnSeCd--${pageName}").val(""); // 산
$("#mno--${pageName}").val(""); // 본번
$("#sno--${pageName}").val(""); // 부번
// 행정동
$("#dongCd--${pageName}").val(""); // 행정동 코드
$("#rtpyrInptSeCd--${pageName}").val("01"); // 납부자 입력 구분 코드(FIM015) 01:수기입력
$("#addrInptSeCd--${pageName}").val("01"); // 주소 입력 구분 코드(FIM087) 01:수기입력
}
// 저장 버튼 클릭 이벤트
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, onOK: () => {
$P.control.save($P.formFields.get()); // formFields
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
$("#btnVehicle--${pageName}").on("click", () => $P.fnGetVehicle()); // 차적 검색 버튼 이벤트
$("#btnZipCode--${pageName}").on("click", () => $P.fnZipCode()); // 우편번호 검색 버튼 이벤트
$("#btnEditAddr--${pageName}").on("click", () => $P.fnEditAddr()); // 주소 수정 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장 버튼 이벤트
}
// 초기 화면 설정
$P.initForm = () => {
$("#addr--${pageName}").prop("readonly", true); // 주소
$("#zip--${pageName}").prop("readonly", true); // 우편번호
$("#dtlAddr--${pageName}").prop("readonly", true); // 상세 주소
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. Dataset 설정
$P.control.setData([${payerInfo}]);
});
</script>

@ -1,69 +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="card" id="photoMainWrapper--${pageName}">
<form id="frmFile--${pageName}" method="post" enctype="multipart/form-data">
<input type="file" id="newFileList--${pageName}" name="newFileList"
multiple accept="image/*" hidden />
<input type="file" id="modifyFile--${pageName}" name="modifyFile"
multiple accept="image/*" hidden />
</form>
<div class="col-md-12 d-flex justify-content-between">
<div class="my-1">
<button type="button" id="btnOpenVideoCapture--${pageName}" class="btn btn-primary">
동영상 캡쳐
</button>
<button type="button" id="btnAddFile--${pageName}" class="btn btn-primary">
사진 추가
</button>
<button type="button" id="btnEditPhoto--${pageName}" class="btn btn-primary">
사진 편집
</button>
<button type="button" id="btnDeleteExistPhoto--${pageName}" class="btn btn-primary">
사진 삭제
</button>
</div>
</div>
<div id="displayForExist--${pageName}" class="border-default">
<ul id="dragAndDrop--${pageName}" class="oy-scroll d-flex flex-wrap mh-px-580">
</ul>
</div>
<form id="frmUploadSet--${pageName}" method="post" enctype="multipart/form-data">
<input type="file" id="inputUploadSet--${pageName}" name="inputUploadSet"
multiple accept="image/*" hidden />
</form>
</div>
<template id="imgRadioTemplate--${pageName}">
<li class="d-flex">
<label class='mx-1 d-flex flex-row'>
<input type="radio" name="{name}" class="form-check-input" value="{value}" checked="" />
<div class="position-relative">
<img src="{src}" width='200' height='200'
data-crdn-photo-id="{crdnPhotoId}"
data-mosaic="{mosaic}"
onload='fn_photoMask($("#photoMask--top").is(":checked"),this);' />
</div>
</label>
</li>
</template>
<template id="imgRadioTemplateTotalInfo--${pageName}">
<li class="d-flex">
<label class="mx-1 d-flex flex-row">
<input type="radio" name="{name}" class="form-check-input" value="{value}" checked="" />
<div class="position-relative">
<img src="{src}" width="240" height="150"
data-crdn-photo-id="{crdnPhotoId}"
data-mosaic="{mosaic}"
onload='fn_photoMask($("#photoMask--top").is(":checked"),this);' />
</div>
</label>
</li>
</template>
<script>
LoadScript("photoMainJspScript","/resources/js/fims/photo-main.js");
</script>

@ -1,771 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 회계 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schAcntgYmdFrom--${pageName}">회계일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schAcntgYmdFrom--${pageName}" name="schAcntgYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schAcntgYmdTo--${pageName}" name="schAcntgYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 수납 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRcvmtYmdFrom--${pageName}">수납일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRcvmtYmdFrom--${pageName}" name="schRcvmtYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRcvmtYmdTo--${pageName}" name="schRcvmtYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 이체 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schTsfYmdFrom--${pageName}">이체일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schTsfYmdFrom--${pageName}" name="schTsfYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schTsfYmdTo--${pageName}" name="schTsfYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 수납 구분 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRcvmtSeCd--${pageName}">수납구분</label>
<select class="form-select w-px-120" id="schRcvmtSeCd--${pageName}" name="schRcvmtSeCd">
<option value="">전체</option>
<c:forEach items="${FIM041List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 납부 방법 구분 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schPayMthdSeCd--${pageName}">납부방법</label>
<select class="form-select w-px-200" id="schPayMthdSeCd--${pageName}" name="schPayMthdSeCd">
<option value="">전체</option>
<c:forEach items="${FIM045List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 동적검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 단속일자 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCrdnYmdFrom--${pageName}">단속일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schCrdnYmdFrom--${pageName}" name="schCrdnYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schCrdnYmdTo--${pageName}" name="schCrdnYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 차량번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVhrno--${pageName}">차량번호</label>
<input type="text" class="form-control w-px-160" id="schVhrno--${pageName}" name="schVhrno" autocomplete="off" />
</div>
<!-- 납부자번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNm--${pageName}">납부자번호</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNm--${pageName}" name="schRtpyrNm" autocomplete="off" />
</div>
<!-- 납부자명 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNo--${pageName}">납부자명</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNo--${pageName}" name="schRtpyrNo" autocomplete="off" />
</div>
<!-- 등록일자, 수정일자 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;">업무구분</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('RCVMT_RTRCN_YN', this.innerText, 'codeValue', 'CMN005');">수납취소</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCVMT_INPT_SE_CD', this.innerText, 'codeValue', 'FIM044');">수납입력구분</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('FYR', this.innerText, 'match', 'part');">회계연도</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('ACNTG_SE_CD', this.innerText, 'codeValue', 'FIM074');">회계구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('TXITM_CD', this.innerText, 'codeValue', 'FIM075');">세목코드</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('TXITM_CD', this.innerText, 'codeValue', 'FIM075');">세목명</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('LEVY_NO', this.innerText, 'match', 'part');">부과번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('ISPY_SN', this.innerText, 'match', 'part');">분납일련번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('LAST_PCPTAX', this.innerText, 'match', 'part');">최종본세</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('LAST_ADAMT', this.innerText, 'match', 'part');">최종가산금</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCVMT_SN', this.innerText, 'match', 'part');">수납일련번호</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('RCVMT_SE_CD', this.innerText, 'codeValue', 'FIM041');">수납구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCVMT_YMD', this.innerText, 'ymd', '');">수납일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('ACNTG_YMD', this.innerText, 'ymd', '');">회계일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('TSF_YMD', this.innerText, 'ymd', '');">이체일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCVMT_AMT', this.innerText, 'match', 'part');">수납금액</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCVMT_PCPTAX', this.innerText, 'match', 'part');">수납본세</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCVMT_ADAMT', this.innerText, 'match', 'part');">수납가산금</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RCVMT_INT', this.innerText, 'match', 'part');">수납이자</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('RCVMT_BANK_NM', this.innerText, 'match', 'part');">수납은행</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('PAY_MTHD_SE_CD', this.innerText, 'codeValue', 'FIM045');">납부방법</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RCVMT_STTS_CD', this.innerText, 'codeValue', 'FIM020');">수납상태</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('LEVY_YMD', this.innerText, 'ymd', '');">부과일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FRST_DUDT_YMD', this.innerText, 'ymd', '');">최초납기일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('DUDT_YMD', this.innerText, 'ymd', '');">납기일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SZR_YMD', this.innerText, 'ymd', '');">압류일자</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('SZR_THING', this.innerText, 'match', 'part');">압류물건</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RPM_SZR_VHRNO', this.innerText, 'match', 'part');">대체압류차량</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SZR_RMV_YMD', this.innerText, 'ymd', '');">압류해제일자</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CRDN_YMD', this.innerText, 'ymd', '');">단속일시</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VHRNO', this.innerText, 'match', 'part');">차량번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RTPYR_SE_CD', this.innerText, 'codeValue', 'FIM011');">납부자구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RTPYR_NO', this.innerText, 'ymd', '');">납부자번호</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RTPYR_NM', this.innerText, 'match', 'part');">납부자명</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('CRDN_STDG_NM', this.innerText, 'match', 'part');">단속법정동</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('CRDN_PLC', this.innerText, 'match', 'part');">단속장소</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STTS_CD', this.innerText, 'codeValue', 'FIM010');">처리상태</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{RCVMT_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{RCVMT_ID}" onchange="pageObject['${pageName}'].control.select('{RCVMT_ID}', this.checked);"></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center text-red" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_RTRCN_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_INPT_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{FYR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ACNTG_SE_CD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TXITM_CD}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{TXITM_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ISPY_SN}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{LAST_PCPTAX}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{LAST_ADAMT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_SN}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ACNTG_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TSF_YMD}</td>
<td class="cmn text-end fw-bold text-blue" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_PCPTAX}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_ADAMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_INT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_BANK_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{PAY_MTHD_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCVMT_STTS_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{FRST_DUDT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DUDT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SZR_YMD}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{SZR_THING}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RPM_SZR_VHRNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SZR_RMV_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_YMD_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_SE_NM}</td>
<td class="cmn text-center privacy-cell" onclick="{onclick}" ondblclick="{ondblclick}">
<span>{RTPYR_NO}</span>
<span>*************</span>
</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STTS_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="bpv">
<td valign="top" colspan="45" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="dpv">
<td valign="top" colspan="45" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="eca">
<td valign="top" colspan="45" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pvs">
<td valign="top" colspan="45" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pes">
<td valign="top" colspan="45" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "rcvmt"
, prefixName: "수납"
, keymapper: info => info ? info.RCVMT_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "lg"
, formats: {
RCVMT_YMD: dateFormat
, ACNTG_YMD: dateFormat
, PSTMRK_YMD: dateFormat
, RCVMT_AMT: numberFormat
, LAST_PCPTAX: numberFormat
, LAST_ADAMT: numberFormat
, RCVMT_PCPTAX: numberFormat
, RCVMT_ADAMT: numberFormat
, RCVMT_INT: numberFormat
, LEVY_YMD: dateFormat
, FRST_DUDT_YMD: dateFormat
, DUDT_YMD: dateFormat
, FFNLG_AMT: numberFormat
, SZR_YMD: dateFormat
, CRDN_YMD_TM: datetimeFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.RCVMT_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = selected => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 삭제 버튼
// $("#btnRemove--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 삭제 callback
$P.control.onRemove = (resp) => {
let btnTitle = $("#btnRemove--${pageName}").attr("title");
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, btnTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, onOK: () => { }
});
if (resp.saved) { $P.fnRefreshList(); } // 자료 재조회
}
// 삭제
$P.control.remove = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/010/remove.do")
, data: params || {}
, success: resp => $P.control.onRemove(resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let clsForTask = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val().toLowerCase(); // 소문자
// 업무별 DataTables(그리드) tr, td
let foundContent = document.getElementById("${infoPrefix}Row--${pageName}").content;
let foundTr = $(foundContent).find("tr")[0].cloneNode(false);
let foundTds = $(foundContent).find("." + clsForTask + ",.cmn");
foundTds.each(function() {
foundTr.appendChild(this.cloneNode(true));
});
//
let replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("RCVMT_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');");
let trs = empty ? [document.getElementById("${infoPrefix}NotFound--${pageName}").content.querySelector("." + clsForTask + ",.cmn").outerHTML]
: ${infoPrefix}List.inStrings(foundTr.outerHTML, replacer);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
// 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
// 삭제사유 callback
$P.callbackRsn = (obj) => {
// 서버에 전송할 data(파라미터) 생성
let params = {};
let selected = $P.control.dataset.getKeys("selected");
params[$P.control.prefixed("Ids")] = selected.join(","); // IDs
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
params.delRsn = obj.reason; // 삭제 사유
$P.control.remove(params);
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경 이벤트
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content : "검색된 자료가 없습니다."
, onOK : () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 부과제외 삭제 버튼 클릭 이벤트
$P.fnRemove = (title) => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) {
dialog.alert({
content: "선택하신 " + $P.control.prefixName + " 정보가 없습니다."
, onOK: () => { }
});
return;
}
// 삭제 메세지 확인
dialog.alert({
content: "선택하신 " + selected.length + "건의 " + $P.control.prefixName + " 정보를 삭제하시겠습니까?"
, onOK: async() => {
// 삭제 사유 입력
let resp = await fetch(wctx.url("/resources/html/inputRsnDialog.html"));
let template = await resp.text();
dialog.open({
id: "inputDelRsnDialog"
, title: title
, size: "lg"
, content: template
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.callbackRsn({ reason : $("#reason").val() });
}
});
}
});
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// DataTables width 변경 조정 업무별 그리드가 존재 한다면.. crdn06010-main.jsp 참고
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schAcntgYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date); // 회계 일자 시작
$("#schAcntgYmdTo--${pageName}").datepicker("setDate", new Date()); // 회계 일자 종료
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/010/list.do"); // 검색
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + taskSeCd.toLowerCase() + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,362 +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>
<!-- inner page html -->
<div class="content-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<input type="hidden" id="rcvmtId--${pageName}" name="rcvmtId" data-map="RCVMT_ID" />
<input type="hidden" id="levyId--${pageName}" name="levyId" data-map="LEVY_ID" />
<input type="hidden" id="crdnId--${pageName}" name="crdnId" data-map="CRDN_ID" />
<div class="row g-1">
<!-- 단속일시 -->
<div class="col-md-4">
<label for="crdnYmdTm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">단속일시</label>
<input type="text" class="form-control w-50" id="crdnYmdTm--${pageName}" name="crdnYmdTm" data-map="CRDN_YMD_TM" />
</div>
<!-- 차량번호 -->
<div class="col-md-4">
<label for="vhrno--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">차량번호</label>
<input type="text" class="form-control w-40" id="vhrno--${pageName}" name="vhrno" data-map="VHRNO" />
</div>
<!-- 단속 상태 명 -->
<div class="col-md-4">
<label for="crdnSttsNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">단속상태</label>
<input type="text" class="form-control w-50" id="crdnSttsNm--${pageName}" name="crdnSttsNm" data-map="CRDN_STTS_NM" />
</div>
<!-- 부서 코드 -->
<div class="col-md-4">
<label for="deptCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">부서코드</label>
<input type="text" class="form-control w-30" id="deptCd--${pageName}" name="deptCd" data-map="DEPT_CD" />
<input type="text" class="form-control w-20" id="spclBizCd--${pageName}" name="spclBizCd" data-map="SPCL_BIZ_CD" />
</div>
<!-- 회계 구분 코드 -->
<div class="col-md-4">
<label for="acntgSeCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">회계구분코드</label>
<input type="text" class="form-control w-15" id="acntgSeCd--${pageName}" name="acntgSeCd" data-map="ACNTG_SE_CD" />
</div>
<!-- 세목 코드 -->
<div class="col-md-4">
<label for="txitmCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">세목코드</label>
<input type="text" class="form-control w-30" id="txitmCd--${pageName}" name="txitmCd" data-map="TXITM_CD" />
</div>
<!-- 회계연도 -->
<div class="col-md-4">
<label for="fyr--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">회계연도</label>
<input type="text" class="form-control w-20" id="fyr--${pageName}" name="fyr" data-map="FYR" />
</div>
<!-- 부과 번호 -->
<div class="col-md-4">
<label for="levyNo--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">부과번호</label>
<input type="text" class="form-control w-30" id="levyNo--${pageName}" name="levyNo" data-map="LEVY_NO" />
</div>
<!-- 분납 번호 -->
<div class="col-md-4">
<label for="ispySn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">분납일련번호</label>
<input type="text" class="form-control w-15" id="ispySn--${pageName}" name="ispySn" data-map="ISPY_SN" />
</div>
<!-- 부과 본세 -->
<div class="col-md-4">
<label for="levyPcptax--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">부과본세</label>
<input type="text" class="form-control w-30 text-end" id="levyPcptax--${pageName}" name="levyPcptax" data-map="LEVY_PCPTAX" />
</div>
<!-- 부과 가산금 -->
<div class="col-md-4">
<label for="levyAdamt--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">부과가산금</label>
<input type="text" class="form-control w-30 text-end" id="levyAdamt--${pageName}" name="levyAdamt" data-map="LEVY_ADAMT" />
</div>
<!-- 분납 이자 -->
<div class="col-md-4">
<label for="ispyInt--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">분납이자</label>
<input type="text" class="form-control w-30 text-end" id="ispyInt--${pageName}" name="ispyInt" data-map="ISPY_INT" />
</div>
<p></p>
<!-- 수납 일자 -->
<div class="col-md-4">
<label for="rcvmtYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">수납일자</label>
<input type="text" class="form-control form-date" id="rcvmtYmd--${pageName}" name="rcvmtYmd" data-map="RCVMT_YMD"
data-fmt-type="day" autocomplete="off" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<!-- 회계 일자 -->
<div class="col-md-4">
<label for="acntgYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">회계일자</label>
<input type="text" class="form-control form-date" id="acntgYmd--${pageName}" name="acntgYmd" data-map="ACNTG_YMD"
data-fmt-type="day" autocomplete="off" title="날짜 선택" maxlength="10" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<!-- 이체 일자 -->
<div class="col-md-4">
<label for="tsfYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">이체일자</label>
<input type="text" class="form-control form-date" id="tsfYmd--${pageName}" name="tsfYmd" data-map="TSF_YMD"
data-fmt-type="day" autocomplete="off" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<!-- 수납 구분 코드 -->
<div class="col-md-4">
<label for="rcvmtSeCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">수납구분</label>
<select class="form-select" id="rcvmtSeCd--${pageName}" name="rcvmtSeCd" data-map="RCVMT_SE_CD" required>
<c:forEach items="${FIM041List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 수납 금액 -->
<div class="col-md-4">
<label for="rcvmtAmt--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">수납금액</label>
<input type="text" class="form-control w-35 text-end" id="rcvmtAmt--${pageName}" name="rcvmtAmt" data-map="RCVMT_AMT"
data-fmt-type="number" autocomplete="off" required />
</div>
<!-- 수납 이자 -->
<div class="col-md-4">
<label for="rcvmtInt--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">수납이자</label>
<input type="text" class="form-control w-35 text-end" id="rcvmtInt--${pageName}" name="rcvmtInt" data-map="RCVMT_INT"
data-fmt-type="number" autocomplete="off" required />
</div>
<!-- 수납 은행 -->
<div class="col-md-4">
<label for="rcvmtBankNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">수납은행</label>
<input type="text" class="form-control w-45" id="rcvmtBankNm--${pageName}" name="rcvmtBankNm" data-map="RCVMT_BANK_NM" autocomplete="off" />
</div>
<!-- 납부 방식 구분 코드 -->
<div class="col-md-8">
<label for="payMthdSeCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">납부매체</label>
<select class="form-select" id="payMthdSeCd--${pageName}" name="payMthdSeCd" data-map="PAY_MTHD_SE_CD">
<c:forEach items="${FIM045List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
</div>
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-80" id="btnSave--${pageName}" title="저장" onclick="fnSave${pageName}()">
저장
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
</div> <!-- <div class="card"> -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "rcvmt"
, prefixName: "수납"
, keymapper: info => info ? info.RCVMT_ID : ""
, dataGetter: obj => obj.${infoPrefix}Info
, formats: {
CRDN_YMD_TM: datetimeFormat
, LEVY_PCPTAX: numberFormat
, LEVY_ADAMT: numberFormat
, ISPY_INT: numberFormat
, RCVMT_PCPTAX: numberFormat
, RCVMT_ADAMT: numberFormat
, RCVMT_INT: numberFormat
}
});
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
// Dataset 셋팅
$P.formFields.set($P.control, item);
// 업무구분에 따른 URL 변경
$P.fnSetURL(item.data.TASK_SE_CD);
// 호출용도가 등록 이라면..
if ($P.callPurpose == "create") {
$("#rcvmtYmd--${pageName}").datepicker("setDate", new Date()); // 수납 일자
$("#acntgYmd--${pageName}").datepicker("setDate", new Date()); // 회계 일자
$("#tsfYmd--${pageName}").datepicker("setDate", new Date()); // 이체 일자
$("#rcvmtInt--${pageName}").val("0"); // 수납 이자
}
}
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
let create = ($P.callPurpose == "create");
if (create) {
info.rcvmtInptSeCd = "03"; // 수납 입력 구분 코드(FIM044) : 03 수기
}
ajax.post({
url: !create ? $P.control.urls.update : $P.control.urls.create
, data: info || {}
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* 사용자 함수
**************************************************************************/
// 업무구분에 따른 URL 설정
$P.fnSetURL = (taskSeCd) => {
$P.control.urls.create = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/020/create.do"); // 등록
$P.control.urls.update = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/020/update.do"); // 수정
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 저장 버튼 클릭 이벤트
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
// 수납금액 확인
let rcvmtAmt = $("#rcvmtAmt--${pageName}").val();
if (rcvmtAmt == "" || Number(rcvmtAmt) < 10) {
dialog.alert({
content: "수납금액은 10원 이상으로 입력되어야 합니다."
, onOK: () => { }
});
return;
}
dialog.alert({
content: "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.control.save($P.formFields.get()); // formFields
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmEdit--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-","");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장
}
// 초기 화면 설정
$P.initForm = () => {
// 달력 초기화
initDatepicker("frmEdit--${pageName}");
$("#rcvmtYmd--${pageName}").datepicker("setDate", new Date()); // 수납 일자
$("#pstmrkYmd--${pageName}").datepicker("setDate", new Date()); // 소인 일자
$("#acntgYmd--${pageName}").datepicker("setDate", new Date()); // 회계 일자
// 화면 활성화 설정
$("#crdnYmdTm--${pageName}").prop("readonly", true); // 단속 일시
$("#vhrno--${pageName}").prop("readonly", true); // 차량번호
$("#crdnSttsNm--${pageName}").prop("readonly", true); // 단속 상태
$("#acntgSeCd--${pageName}").prop("readonly", true); // 회계 구분 코드
$("#txitmCd--${pageName}").prop("readonly", true); // 세목 코드
$("#fyr--${pageName}").prop("readonly", true); // 회계연도
$("#levyNo--${pageName}").prop("readonly", true); // 부과 번호
$("#ispySn--${pageName}").prop("readonly", true); // 분납 순번
$("#levyPcptax--${pageName}").prop("readonly", true); // 부과 본세
$("#levyAdamt--${pageName}").prop("readonly", true); // 부과 가산금
$("#ispyInt--${pageName}").prop("readonly", true); // 분납이자
// View로 호출
if ($P.callPurpose == "view") {
// input 요소들을 disabled
$("#frmEdit--${pageName}").find("input,textarea,select").prop("disabled", true);
// button 요소들을 disabled
$("#rcvmtYmd--${pageName}").prop("disabled", true); // 수납 일자 달력 버튼
$("#pstmrkYmd--${pageName}").prop("disabled", true); // 소인 일자 달력 버튼
$("#acntgYmd--${pageName}").prop("disabled", true); // 회계 일자 달력 버튼
$("#btnSave--${pageName}").prop("disabled", true); // 저장 버튼
}
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. Dataset 설정
$P.control.setData([${rcvmtInfo}]);
});
</script>

@ -1,783 +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 html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<c:set var="prefixName" scope="request">감액 관리</c:set>
<!-- Page Body -->
<div class="card">
<div class="wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- / 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무 구분 코드 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 감액 일자 -->
<div class="col-6">
<span class="form-label fw-bold form-search-title text-end">감액일자</span>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRdcamtYmdFrom--${pageName}" name="schRdcamtYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRdcamtYmdTo--${pageName}" name="schRdcamtYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 감액 구분 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title text-end" for="schRdcamtSeCd--${pageName}">감액구분</label>
<select class="form-select w-px-100" id="schRdcamtSeCd--${pageName}" name="schRdcamtSeCd">
<option value="">전체</option>
<c:forEach items="${FIM085List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 감액 사유 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title text-end" for="schRdcamtRsnCd--${pageName}">감액사유</label>
<select class="form-select w-px-100" id="schRdcamtRsnCd--${pageName}" name="schRdcamtRsnCd">
<option value="">전체</option>
<c:forEach items="${FIM085List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 단속 일자 -->
<div class="col-6">
<span class="form-label fw-bold form-search-title text-end">단속일자</span>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schCrdnYmdFrom--${pageName}" name="schCrdnYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schCrdnYmdTo--${pageName}" name="schCrdnYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 차량번호 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title text-end" for="schVhrno--${pageName}">차량번호</label>
<input type="text" class="form-control w-px-160" id="schVhrno--${pageName}" name="schVhrno" autocomplete="off" />
</div>
<!-- 납부자명 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title text-end" for="schRtpyrNm--${pageName}">납부자명</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNm--${pageName}" name="schRtpyrNm" autocomplete="off" />
</div>
<!-- -->
<div class="col-6">
</div>
<!-- 동적검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-320" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- / 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 등록일자, 수정일자 -->
<div class="col-6">
<select class="form-select text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-6">
<select class="form-select text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">
검색
</button>
</div>
</div>
</div> <!-- / 상세 조건 -->
</form> <!-- / 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<span class="container-window-btn-right">
<!-- 업무 버튼 -->
<button type="button" class="btn btn-primary w-px-120" id="btnUpdateRdcamt--${pageName}" title="감액 수정">
감액 수정
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnRemoveRdcamt--${pageName}" title="감액 삭제">
감액 삭제
</button>
</span>
</span>
</div>
<!-- / 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;">업무구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('LEVY_EXCL_YMD', this.innerText, 'ymd', '');">부과제외일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('LEVY_EXCL_SE_CD', this.innerText, 'codeValue', 'FIM021');">부과제외구분</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('LEVY_EXCL_RSN_CD', this.innerText, 'codeValue', 'FIM022');">부과제외사유</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ETC_CN', this.innerText, 'match', 'part');">기타내용</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CVLCPT_APLY_NO', this.innerText, 'match', 'part');">민원신청번호</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CVLCPT_RCPT_NO', this.innerText, 'match', 'part');">민원접수번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('CVLCPT_RCPT_YMD', this.innerText, 'ymd', '');">민원접수일자</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CRDN_YMD', this.innerText, 'ymd', '');">단속일시</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VHRNO', this.innerText, 'match', 'part');">차량번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RTPYR_SE_CD', this.innerText, 'codeValue', 'FIM011');">납부자구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RTPYR_NO', this.innerText, 'ymd', '');">납부자번호</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('RTPYR_NM', this.innerText, 'match', 'part');">납부자명</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('CRDN_STDG_NM', this.innerText, 'match', 'part');">단속법정동</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('CRDN_PLC', this.innerText, 'match', 'part');">단속장소</th>
<th class="bpv" style="width: 280px;" onclick="searchFromGridTitle('DTL_CRDN_PLC', this.innerText, 'match', 'part');">상세단속장소</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VLTN_ARTCL', this.innerText, 'match', 'part');">위반항목</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_CRDN_AMT', this.innerText, 'match', 'part');">단속원금</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STTS_CD', this.innerText, 'codeValue', 'FIM010');">처리상태</th>
<th class="pvs" style="width: 140px;" onclick="searchFromGridTitle('CRDN_SPAREA_CD', this.innerText, 'codeValue', 'FIM007');">단속특별구역</th>
<th class="eca" style="width: 140px;" onclick="searchFromGridTitle('USE_FUEL_CD', this.innerText, 'codeValue', 'LVS005');">사용연료</th>
<th class="dpv" style="width: 140px;" onclick="searchFromGridTitle('PRK_PSBLTY_RSLT_CD', this.innerText, 'codeValue', 'FIM034');">주차가능여부</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('ZIP', this.innerText, 'match', 'part');">우편번호</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ADDR', this.innerText, 'match', 'part');">주소</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('DTL_ADDR', this.innerText, 'match', 'part');">상세주소</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{LEVY_EXCL_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{LEVY_EXCL_ID}" onchange="pageObject['${pageName}'].control.select('{LEVY_EXCL_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_EXCL_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_EXCL_SE_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_EXCL_RSN_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ETC_CN}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_APLY_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_YMD_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="bpv text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_CRDN_PLC}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_CRDN_AMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STTS_NM}</td>
<td class="pvs text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_SPAREA_NM}</td>
<td class="eca text-center" onclick="{onclick}" ondblclick="{ondblclick}">{USE_FUEL_NM}</td>
<td class="dpv text-center" onclick="{onclick}" ondblclick="{ondblclick}">{PRK_PSBLTY_RSLT_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="bpv">
<td valign="top" colspan="29" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="dpv">
<td valign="top" colspan="29" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="eca">
<td valign="top" colspan="29" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pvs">
<td valign="top" colspan="29" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pes">
<td valign="top" colspan="29" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- / DataTables(그리드) -->
</div> <!-- <div class="wrapper-list"> -->
</div> <!-- <div class="card"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- / Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
var $P = pageObject["${pageName}"];
// URL
$P.PrefixUrl = "/rdca/rdca01";
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix : "rdcamt"
, prefixName : "감액"
, infoSize : "md"
, keymapper : info => info ? info.RDAMT_ID : ""
, dataGetter : obj => obj.${infoPrefix}List
, appendData : true
, formats : {
LEVY_EXCL_YMD : dateFormat
, CRDN_YMD_TM : datetimeFormat
, CVLCPT_RCPT_YMD : dateFormat
, FFNLG_CRDN_AMT : numberFormat
, REG_DT : datetimeFormat
, MDFCN_DT : datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list : $P.control.dataset
, prefix : "paging--${pageName}"
, start : obj.${infoPrefix}Start
, totalSize : obj.${infoPrefix}Total
, fetchSize : obj.${infoPrefix}Fetch
, func : "$P.control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = item => {
if (!item) return;
let key = item.data.LEVY_EXCL_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = selected => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
$("#btnRemoveRdcamt--${pageName}").prop("disabled", keys.length < 1);
};
// 수정 dialog
$P.control.getInfo = (params) => {
if (!params) return;
ajax.get({
url : $P.control.urls.getInfo
, data : params || {}
, success : resp => {
dialog.open({
id : $P.control.prefixed("Dialog")
, title : dialogTitle
, content : resp
, size : $P.control.infoSize
, onClose : () => { $P.refreshList(); }
});
}
});
}
// 삭제 callback
$P.control.onRemove = (resp) => {
let btnTitle = $("#btnRemoveRdcamt--${pageName}").attr("title");
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, btnTitle);
// 메시지 출력
dialog.alert({
content : showMessage
, onOK : () => { }
});
if (resp.saved) {
$P.refreshList(); // 자료 재조회
}
}
// 삭제
$P.control.remove = (params) => {
if (!params) return;
ajax.post({
url : $P.control.urls.remove
, data : params
, success : resp => $P.control.onRemove(resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let clsForTask = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val().toLowerCase(); // 소문자
// 업무별 DataTables(그리드) tr, td
let foundContent = document.getElementById("${infoPrefix}Row--${pageName}").content;
let foundTr = $(foundContent).find("tr")[0].cloneNode(false);
let foundTds = $(foundContent).find("." + clsForTask + ",.cmn");
foundTds.each(function() {
foundTr.appendChild(this.cloneNode(true));
});
//
let replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("LEVY_EXCL_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');");
let trs = empty ? [document.getElementById("${infoPrefix}NotFound--${pageName}").content.querySelector("." + clsForTask + ",.cmn").outerHTML]
: ${infoPrefix}List.inStrings(foundTr.outerHTML, replacer);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
// 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// callback 사용자 검색
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
// 사용자 검색
$P.getFindUser = () => {
let params = {
openerPageName : "${pageName}"
, callbackFuncName : "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url : wctx.url("/user/user02/010/main.do")
, data : params || {}
, success : resp => {
dialog.open({
id : "userDialog"
, title : "사용자 검색"
, content : resp
, size : "lg"
});
}
});
}
// 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $("#sggCd--${pageName}").val() // 시군구 코드
, taskSeCd: $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val() // 업무 구분 코드
, crdnId: crdnId
}
ajax.get({
url : wctx.url("/" + params.taskSeCd + "/sprt/sprt02/010/main.do")
, data : params
, success : resp => {
dialog.open({
id : "totalInfoMainDialog"
, title : "개별총정보"
, content : resp
, size : "xxl"
, init : () => { }
, onClose : () => { }
});
}
});
}
// 사유 callback
$P.callbackRsn = (obj) => {
// 서버에 전송할 data(파라미터) 생성
let params = {};
params[$P.control.prefixed("IDs")] = selected.join(","); // IDs
params.delRsn = obj.reason; // 삭제 사유
$P.control.remove(params);
}
// 검색 자료 재조회
$P.refreshList = () => {
$P.control.reload({all : true});
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm();
// 기본 데이터 설정
$P.initData(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get();
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content : "검색된 자료가 없습니다."
, onOK : () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 사용자 조회 버튼 이벤트
$P.fnFindUser = () => {
$P.getFindUser();
}
// 수정 버튼 이벤트
$P.fnUpdateRdcamt = () => {
// 감액 ID
let rdamtId = $P.control.dataset.getValue("RDAMT_ID");
// 감액 ID 가 없다면.. return
if (typeof rdamtId == "undefined" || rdamtId == null || rdamtId == "") return;
let params = {
title : title
, callPurpose : "update"
, rdamtId : rdamtId // 감액 ID
, sggCd : $P.control.dataset.getValue("SGG_CD") // 시군구 코드
, taskSeCd : $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
, rdcamtSeCd : $P.control.dataset.getValue("RDCAMT_SE_CD") // 감액 구분 코드
, rdcamtRsnCd : $P.control.dataset.getValue("RDCAMT_RSN_CD") // 감액 사유 코드
};
$P.control.getInfo(params);
}
// 삭제 버튼 이벤트
$P.fnRemoveRdcamt = () => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) return;
// 삭제 메세지 확인
dialog.alert({
content : "선택하신 " + selected.length + "건의 " + $P.control.prefixName + " 정보를 삭제하시겠습니까?"
, onOK : async() => {
// 삭제 사유 입력
var resp = await fetch(wctx.url("/resources/html/inputRsnDialog.html"));
var template = await resp.text();
dialog.open({
id : "inputDelRsnDialog",
title: "삭제",
size : "lg",
content: template,
init : () => {
setDialogZindex();
},
onOK : () => {
$P.callbackRsn({ reason : $("#reason").val() });
}
});
}
});
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 감액 수정 버튼 이벤트
$("#btnUpdateRdcamt--${pageName}").on("click", function() {
$P.fnUpdateRdcamt($(this).attr("title"));
});
// 감액 삭제 버튼 이벤트
$("#btnRemoveRdcamt--${pageName}").on("click", function() {
$P.fnRemoveRdcamt($(this).attr("title"));
});
// DataTables width 변경 조정 업무별 그리드가 존재 한다면.. crdn06010-main.jsp 참고
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = () => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 달력 초기화
initDatepicker("frmSearch--${pageName}");
$("#schRdcamtYmdFrom--${pageName}").datepicker("setDate", new Date());
$("#schRdcamtYmdTo--${pageName}").datepicker("setDate", new Date());
// 동적 검색
$("#byOutput--${pageName}").val("동적 검색");
// 사용자 이름
$("#schRgtrNm--${pageName}").prop("readonly", true);
}
// 기본 데이터 설정
$P.initData = (taskSeCd) => {
// 시군구 코드
$("#sggCd--${pageName}").val("${sggCd}");
// 업무 구분 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true);
// 일자
$("#schRdcamtYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date);
$("#schRdcamtYmdTo--${pageName}").datepicker("setDate", new Date());
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
let clsForTask = taskSeCd.toLowerCase();
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", clsForTask);
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + clsForTask + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
// URL 설정
$P.setURL(taskSeCd);
}
// 업무구분에 따른 URL 설정
$P.setURL = (taskSeCd) => {
$P.control.urls.load = wctx.url("/" + taskSeCd + $P.PrefixUrl + "/010/list.do"); // 조회
$P.control.urls.remove = wctx.url("/" + taskSeCd + $P.PrefixUrl + "/010/remove.do"); // 삭제
$P.control.urls.getInfo = wctx.url("/" + taskSeCd + $P.PrefixUrl + "/020/info.do"); // 수정
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,274 +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 html -->
<div class="content-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<c:set var="prefixName" scope="request">감액 정보</c:set>
<!-- Page Body -->
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<!-- hidden -->
<input type="hidden" id="crdnId--${pageName}" name="crdnId" data-map="CRDN_ID" />
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<input type="hidden" id="levyExclId--${pageName}" name="levyExclId" data-map="LEVY_EXCL_ID" />
<div class="row g-1">
<!-- 단속일시 -->
<div class="col-md-12">
<label for="crdnYmdTm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">단속일시</label>
<input type="text" class="form-control w-35" id="crdnYmdTm--${pageName}" name="crdnYmdTm" data-map="CRDN_YMD_TM" data-fmt-type="dt" />
</div>
<!-- 차량번호 -->
<div class="col-md-12">
<label for="vhrno--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">차량번호</label>
<input type="text" class="form-control w-px-120" id="vhrno--${pageName}" name="vhrno" data-map="VHRNO" autocomplete="off" />
</div>
<!-- 부과 제외 구분 -->
<div class="col-md-12">
<label for="levyExclSeNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">부과제외구분</label>
<input type="text" class="form-control w-px-120" id="levyExclSeNm--${pageName}" autocomplete="off" />
<input type="hidden" id="levyExclSeCd--${pageName}" name="levyExclSeCd" data-map="LEVY_EXCL_SE_CD" />
</div>
<!-- 부과 제외 일자 -->
<div class="col-md-12">
<label for="levyExclYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">부과제외일자</label>
<input type="text" class="form-control form-date" id="levyExclYmd--${pageName}" name="levyExclYmd" data-map="LEVY_EXCL_YMD"
data-fmt-type="day" autocomplete="off" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white" id="btnLevyExclYmd--${pageName}"></button>
</div>
<!-- 부과 제외 사유 -->
<div class="col-md-12">
<label for="levyExclRsnCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">부과제외사유</label>
<select class="form-select" id="levyExclRsnCd--${pageName}" name="levyExclRsnCd" data-map="LEVY_EXCL_RSN_CD" required>
<option value="">선택하세요</option>
<c:forEach items="${FIM022List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 기타 내용 -->
<div class="col-md-12">
<label for="etcCn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">기타 내용</label>
<textarea type="text" class="form-control w-70" id="etcCn--${pageName}" name="etcCn" data-map="ETC_CN" autocomplete="off" rows="3" data-maxlengthb="1000"></textarea>
</div>
</div>
</form> <!-- /입력 영역 -->
</div> <!-- <div class="card"> -->
<!-- 업무 버튼 표시 -->
<div>
<span class="container-page-btn">
<span class="container-window-btn-right">
<!-- 업무 버튼 -->
<button type="button" class="btn btn-primary w-px-80" id="btnSave--${pageName}" title="저장">
저장
</button>
</span>
</span>
</div>
<!-- / 업무 버튼 표시 -->
</div> <!-- / Content <div class="container flex-grow-1 px-0"> -->
</div> <!-- / inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
var ${pageName}CallPurpose = "${callPurpose}";
// 공통 코드
var FIM021 = new CommonCodes(${FIM021}, true);
var FIM022 = new CommonCodes(${FIM022}, true);
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
var $P = pageObject["${pageName}"];
// URL
$P.PrefixUrl = "/excl/excl01";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix : "levyExcl"
, prefixName : "부과제외"
, keymapper : info => info ? info.LEVY_EXCL_ID : ""
, dataGetter : obj => obj.levyExclInfo
, urls : {
create : wctx.url("/" + $P.PrefixUrl + "/020/create.do") // 등록
, update : wctx.url("/" + $P.PrefixUrl + "/020/update.do") // 수정
}
});
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
$P.control.onCurrentChange = item => {
if (!item) return;
// Dataset 셋팅
$P.formFields.set($P.control,item);
// 업무구분에 따른 URL 변경
$P.setURL(item.data.TASK_SE_CD);
// 부과제외구분에 따른 부과제외사유 설정
$P.setFim021(item.data.LEVY_EXCL_SE_CD, item.data.LEVY_EXCL_RSN_CD);
// 호출용도가 등록 이라면..
if (${pageName}CallPurpose = "create") {
$("#levyExclYmd--${pageName}").datepicker("setDate", new Date());
}
}
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content : showMessage
, onOK : () => { }
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog");
if ("${savedCallbackFuncName}" != "") {
${savedCallbackFuncName}(resp.saved);
}
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
let create = isEmpty(info.levyExclId);
// 민원 접수 관리에서 호출했다면..
if (create && "${saveCallbackFuncName}" != "") {
${saveCallbackFuncName}(info);
} else {
ajax.post({
url : !create ? $P.control.urls.update : $P.control.urls.create
, data : info
, success : resp => $P.control.onSave(resp)
});
}
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 부과제외 구분에 따른 부과제외 사유 코드 설정
$P.setFim021 = (seCode, rsnCode) => {
let cmnCode = FIM021[seCode];
$("#levyExclSeCd--${pageName}").val(cmnCode.code);
$("#levyExclSeNm--${pageName}").val(cmnCode.value);
let reasons = FIM022.list().filter(reason => "2" == seCode ? reason.code > "200" : reason.code < "200");
$("#levyExclRsnCd--${pageName}").html(reasons.map(reason => "<option value='" + reason.code + "'>" + reason.value + "</option>").join());
if (typeof rsnCode != "undefined" && rsnCode != "") {
$("#levyExclRsnCd--${pageName}").val(rsnCode);
}
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 저장 버튼 클릭 이벤트
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content : "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, onOK : () => {
$P.control.save($P.formFields.get());
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmEdit--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-","");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 업무 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장
}
// 초기 화면 설정
$P.initForm = () => {
// 달력 초기화
initDatepicker("frmEdit--${pageName}");
$("#levyExclYmd--${pageName}").datepicker("setDate", new Date());
// 화면 활성화 설정
$("#crdnYmdTm--${pageName}").prop("readonly", true); // 단속 일시
$("#vhrno--${pageName}").prop("readonly", true); // 차량번호
$("#levyExclSeNm--${pageName}").prop("readonly", true); // 부과 제외 구분
if (${pageName}CallPurpose == "view") {
// input 요소들을 disabled
$("#frmEdit--${pageName}").find("input,textarea,select").prop("disabled", true);
// button 요소들을 disabled
$("#btnLevyExclYmd--${pageName}").prop("disabled", true); // 부과제외 일자 달력 버튼
$("#btnSave--${pageName}").prop("disabled", true); // 저장 버튼
}
}
// 업무구분에 따른 URL 설정
$P.setURL = (taskSeCd) => {
$P.control.urls.create = wctx.url("/" + taskSeCd + $P.PrefixUrl + "/020/create.do"); // 등록
$P.control.urls.update = wctx.url("/" + taskSeCd + $P.PrefixUrl + "/020/update.do"); // 수정
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. Dataset 설정
$P.control.setData([${levyExclInfo}]);
});
</script>

@ -1,464 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<input type="hidden" id="userId--${pageName}" name="userId" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 사용자 계정 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schUserAcnt--${pageName}">사용자계정</label>
<input type="text" class="form-control w-px-160" id="schUserAcnt--${pageName}" name="schUserAcnt" readonly autocomplete="off" />
</div>
</div>
</div> <!-- 메인 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnCreate--${pageName}" title="대여기업 등록">
대여기업 등록
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnRemove--${pageName}" title="대여기업 삭제">
대여기업 삭제
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('ENT_SE_CD', this.innerText, 'codeValue', 'FIM088');">기업구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('ENT_NM', this.innerText, 'ymd', '');">기업명</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('ENT_NO', this.innerText, 'match', 'part');">법인(사업자)번호</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('ENT_TELNO', this.innerText, 'match', 'part');">전화번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('ENT_FXNO', this.innerText, 'match', 'part');">팩스번호</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ENT_EML_ADDR', this.innerText, 'match', 'part');">이메일주소</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('ENT_ZIP', this.innerText, 'match', 'part');">우편번호</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ENT_ADDR', this.innerText, 'match', 'part');">주소</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('ENT_DTL_ADDR', this.innerText, 'match', 'part');">상세주소</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{ENT_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{ENT_ID}" onchange="pageObject['${pageName}'].control.select('{ENT_ID}', this.checked);"></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ENT_SE_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ENT_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ENT_NO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ENT_TELNO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ENT_FXNO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ENT_EML_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ENT_ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ENT_ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ENT_DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="14" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "rentEnt"
, prefixName: "임대기업"
, keymapper: info => info ? info.ENT_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "md"
, formats: {
REG_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.ENT_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 삭제 버튼
$("#btnRemove--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 상세정보 dialog
$P.control.getInfo = (gdntcId) => {
let dialogTitle = "";
let params = {};
if (typeof gdntcId == "undefined" || gdntcId == null || gdntcId == "") {
dialogTitle = $P.control.prefixName + " 등록";
params.callPurpose = "create";
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
} else {
dialogTitle = $P.control.prefixName + " 수정";
params.callPurpose = "update";
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
params.gdntcId = gdntcId;
}
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/020/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("Dialog--${pageName}")
, title: dialogTitle
, content: resp
, size: $P.control.infoSize
, onClose : () => { $P.fnRefreshList(); } // 자료 재조회
});
}
});
}
// 삭제 callback
$P.control.onRemove = (resp) => {
let btnTitle = $("#btnRemove--${pageName}").attr("title");
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, btnTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) { $P.fnRefreshList(); } // 자료 재조회
}
// 삭제
$P.control.remove = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/010/remove.do")
, data: params || {}
, success: resp => $P.control.onRemove(resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("ENT_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].control.getInfo('" + dataItem.getValue("ENT_ID") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경 이벤트
$P.fnResetAndChangeBiz = () => {
// 초기 기본 설정
$P.initForm();
// 업무 구분별 설정
$P.setTask();
// dataset 초기화
$P.control.dataset.clear();
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 전자우편 안내문 등록 버튼 이벤트
$P.fnCreate = (title) => {
$P.control.getInfo();
}
// 삭제 버튼 이벤트
$P.fnRemove = (title) => {
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) return;
let params = {};
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
params.gdntcIds = selected.join(","); // params[$P.control.prefixed("IDs")] = selected.join(",");
dialog.alert({
content: "선택한 " + $P.control.prefixName + " 정보를 삭제하시겠습니까?"
, onOK: () => {
$P.control.remove(params);
}
});
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 버튼 이벤트
$("#btnCreate--${pageName}").on("click", function() {
$P.fnCreate($(this).attr("title")); // 등록
});
$("#btnRemove--${pageName}").on("click", function() {
$P.fnRemove($(this).attr("title")); // 삭제
});
// DataTables width 변경 조정 업무별 그리드가 존재 한다면.. crdn06010-main.jsp 참고
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = () => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#userId--${pageName}").val("${userId}"); // 사용자 ID
$("#schUserAcnt--${pageName}").val("${userAcnt}"); // 사용자 계정
}
// 업무 구분별 설정
$P.setTask = () => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("${infoPrefixUrl}" + "/010/list.do"); // 검색
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz();
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,811 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무 구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 계고 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schLevyExclYmdFrom--${pageName}">계고일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schLevyExclYmdFrom--${pageName}" name="schLevyExclYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schLevyExclYmdTo--${pageName}" name="schLevyExclYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 계고 사유 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schLevyExclRsnCd--${pageName}">계고사유</label>
<select class="form-select w-px-200" id="schLevyExclRsnCd--${pageName}" name="schLevyExclRsnCd">
<option value="">전체</option>
<c:forEach items="${FIM022List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 위반 항목 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVltnCd--${pageName}">위반항목</label>
<select class="form-select w-px-160" id="schVltnCd--${pageName}" name="schVltnCd">
<option value="">전체</option>
<c:forEach items="${FIM004List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 동적검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 단속일자 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCrdnYmdFrom--${pageName}">단속일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schCrdnYmdFrom--${pageName}" name="schCrdnYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schCrdnYmdTo--${pageName}" name="schCrdnYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 차량번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVhrno--${pageName}">차량번호</label>
<input type="text" class="form-control w-px-160" id="schVhrno--${pageName}" name="schVhrno" autocomplete="off" />
</div>
<!-- 납부자번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNm--${pageName}">납부자번호</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNm--${pageName}" name="schRtpyrNm" autocomplete="off" />
</div>
<!-- 납부자명 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNo--${pageName}">납부자명</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNo--${pageName}" name="schRtpyrNo" autocomplete="off" />
</div>
<!-- 등록일자, 수정일자 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnUpdateWrng--${pageName}" title="계고 수정">
계고 수정
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnCreateSlctnTrgtInfo--${pageName}" title="선택 발송대상 등록">
선택 대상 등록
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnCreateWholTrgtInfo--${pageName}" title="선택 발송대상 등록">
전체 대상 등록
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('TASK_SE_CD', this.innerText, 'codeValue', 'FIM054');">업무구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('LEVY_EXCL_YMD', this.innerText, 'ymd', '');">계고일자</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('LEVY_EXCL_RSN_CD', this.innerText, 'codeValue', 'FIM022');">계고사유</th>
<th class="cmn" style="width: 240px;" onclick="searchFromGridTitle('ETC_CN', this.innerText, 'match', 'part');">기타내용</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CVLCPT_APLY_NO', this.innerText, 'match', 'part');">민원신청번호</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CVLCPT_RCPT_NO', this.innerText, 'match', 'part');">민원접수번호</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('CVLCPT_RCPT_YMD', this.innerText, 'ymd', '');">민원접수일자</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CVLCPT_PRCS_PIC_NM', this.innerText, 'match', 'part');">민원처리담당자</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('CVLCPT_PRCS_CD', this.innerText, 'codeValue', 'FIM017');">민원처리결과</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CRDN_YMD', this.innerText, 'ymd', '');">단속일시</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('VHRNO', this.innerText, 'match', 'part');">차량번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RTPYR_SE_CD', this.innerText, 'codeValue', 'FIM011');">납부자구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RTPYR_NO', this.innerText, 'ymd', '');">납부자번호</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('RTPYR_NM', this.innerText, 'match', 'part');">납부자명</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VLTN_ARTCL', this.innerText, 'match', 'part');">위반항목</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STDG_NM', this.innerText, 'match', 'part');">단속법정동</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('CRDN_PLC', this.innerText, 'match', 'part');">단속장소</th>
<th class="bpv" style="width: 280px;" onclick="searchFromGridTitle('DTL_CRDN_PLC', this.innerText, 'match', 'part');">상세단속장소</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_CRDN_AMT', this.innerText, 'match', 'part');">단속원금</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STTS_CD', this.innerText, 'codeValue', 'FIM010');">처리상태</th>
<th class="pvs" style="width: 140px;" onclick="searchFromGridTitle('CRDN_SPAREA_CD', this.innerText, 'codeValue', 'FIM007');">단속특별구역</th>
<th class="eca" style="width: 140px;" onclick="searchFromGridTitle('USE_FUEL_CD', this.innerText, 'codeValue', 'LVS005');">사용연료</th>
<th class="dpv" style="width: 140px;" onclick="searchFromGridTitle('PRK_PSBLTY_RSLT_CD', this.innerText, 'codeValue', 'FIM034');">주차가능여부</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('ZIP', this.innerText, 'match', 'part');">우편번호</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ADDR', this.innerText, 'match', 'part');">주소</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('DTL_ADDR', this.innerText, 'match', 'part');">상세주소</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{CRDN_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{CRDN_ID}" onchange="pageObject['${pageName}'].control.select('{CRDN_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_EXCL_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_EXCL_RSN_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ETC_CN}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_APLY_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_PRCS_PIC_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_PRCS_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_YMD_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_SE_NM}</td>
<td class="cmn text-center privacy-cell" onclick="{onclick}" ondblclick="{ondblclick}">
<span>{RTPYR_NO}</span>
<span>*************</span>
</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="bpv text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_CRDN_PLC}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_CRDN_AMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STTS_NM}</td>
<td class="pvs text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_SPAREA_NM}</td>
<td class="eca text-center" onclick="{onclick}" ondblclick="{ondblclick}">{USE_FUEL_NM}</td>
<td class="dpv text-center" onclick="{onclick}" ondblclick="{ondblclick}">{PRK_PSBLTY_RSLT_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="bpv">
<td valign="top" colspan="33" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="dpv">
<td valign="top" colspan="33" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="eca">
<td valign="top" colspan="33" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pvs">
<td valign="top" colspan="33" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pes">
<td valign="top" colspan="33" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
// 공통 코드
var FIM022 = new CommonCodes(${FIM022}, true); // 부과 제외 사유 코드
var FIM004 = new CommonCodes(${FIM004}, true); // 주정차위반 내역 코드
var FIM005 = new CommonCodes(${FIM005}, true); // 전용차로위반 내역 코드
var FIM006 = new CommonCodes(${FIM006}, true); // 장애인주차위반 내역 코드
var FIM061 = new CommonCodes(${FIM061}, true); // 전기차 충전구역 및 충전방해 위반 코드
var FIM064 = new CommonCodes(${FIM064}, true); // 화물자동차 밤샘주차 위반 코드
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "wrngTrgt"
, prefixName: "계고장 발송 대상"
, keymapper: info => info ? info.CRDN_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "xl"
, formats: {
CVLCPT_RCPT_YMD: dateFormat
, LEVY_EXCL_YMD: dateFormat
, CRDN_YMD_TM: datetimeFormat
, FFNLG_CRDN_AMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.CRDN_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 선택 대상 등록 버튼
$("#btnCreateSlctnTrgtInfo--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 계고장 발송 등록 dialog
$P.control.getInfo = (params) => {
if (!params) return;
let dialogTitle = "";
if (params.callPurpose == "create") {
dialogTitle = $P.control.prefixName + " 등록";
} else if (params.callPurpose == "update") {
dialogTitle = $P.control.prefixName + " 수정";
} else {
dialogTitle = $P.control.prefixName + " 정보";
}
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/020/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("Dialog--${pageName}")
, title: dialogTitle
, content: resp
, size: $P.control.infoSize
, onClose: () => { $P.fnRefreshList(); }
});
}
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let clsForTask = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val().toLowerCase(); // 소문자
// 업무별 그리드 td
let foundContent = document.getElementById("${infoPrefix}Row--${pageName}").content;
let foundTr = $(foundContent).find("tr")[0].cloneNode(false);
let foundTds = $(foundContent).find("." + clsForTask + ",.cmn");
foundTds.each(function() {
foundTr.appendChild(this.cloneNode(true));
});
//
let replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("CRDN_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');");
let trs = empty ? [document.getElementById("${infoPrefix}NotFound--${pageName}").content.querySelector("." + clsForTask + ",.cmn").outerHTML]
: ${infoPrefix}List.inStrings(foundTr.outerHTML, replacer);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.query.crdnIds = null;
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
// 계고 수정 dialog -> callback 추가
$P.getLevyExclInfo = (params) => {
if (!params) return;
ajax.get({
url: wctx.url("/" + params.taskSeCd + "/excl/excl01/020/info.do?openerPageName=${pageName}")
, data: params || {}
, success: resp => {
dialog.open({
id: "levyExclDialog"
, title: "부과제외 정보"
, content: resp
, size: "md"
, onClose: () => { $P.fnRefreshList(); }
});
}
});
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.crdnSttsCd = "83"; // 단속 처리 상태 - 83:계고
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 계고 수정 버튼 이벤트
$P.fnUpdateWrng = (title) => {
let levyExclId = $P.control.dataset.getValue("LEVY_EXCL_ID");
// 부과제외 ID 가 없다면.. return
if (typeof levyExclId == "undefined" || levyExclId == null || levyExclId == "") return;
let params = {
title: title
, callPurpose: "update"
, sggCd: $P.control.dataset.getValue("SGG_CD") // 시군구 코드
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
, levyExclId: levyExclId // 부과제외 ID
, levyExclSeCd: $P.control.dataset.getValue("LEVY_EXCL_SE_CD") // 부과제외 구분 코드
};
$P.getLevyExclInfo(params);
}
// 선택 발송대상 등록 버튼 이벤트
$P.fnCreateSlctnTrgtInfo = () => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) return;
// 파라미터 설정
let params = $P.control.query; // 검색 조건
params.callPurpose = "create"; // 호출 용도 (등록)
params.crdnIds = selected.join(","); // crdnIds
if (params.taskSeCd == "DPV" && params.schVltnCd == "05") {
params.sndngSeCd = "12"; // 발송 구분 코드 - 12 계고장 구형표지
} else {
params.sndngSeCd = "11"; // 발송 구분 코드 - 11 계고장
}
params.rsndYn = "N"; // 재발송 여부
params.delYn = "N"; // 삭제 여부
$P.control.getInfo(params);
}
// 전체 발송대상 등록 버튼 이벤트
$P.fnCreateWholTrgtInfo = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, onOK: () => { }
});
return;
}
// 파라미터 설정
let params = $P.control.query; // 검색 조건
params.callPurpose = "create"; // 호출 용도 (등록)
if (params.taskSeCd == "DPV" && params.schVltnCd == "05") {
params.sndngSeCd = "12"; // 발송 구분 코드 - 12 계고장 구형표지
} else {
params.sndngSeCd = "11"; // 발송 구분 코드 - 11 계고장
}
params.rsndYn = "N"; // 재발송 여부
params.delYn = "N"; // 삭제 여부
$P.control.getInfo(params);
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 업무 버튼 이벤트
$("#btnUpdateWrng--${pageName}").on("click", function() {
$P.fnUpdateWrng($(this).attr("title")); // 계고 수정
});
$("#btnCreateSlctnTrgtInfo--${pageName}").on("click", function() {
$P.fnCreateSlctnTrgtInfo($(this).attr("title")); // 선택 대상 등록
});
$("#btnCreateWholTrgtInfo--${pageName}").on("click", function() {
$P.fnCreateWholTrgtInfo($(this).attr("title")); // 전체 대상 등록
});
// DataTables width 변경 조정
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schLevyExclYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date);
$("#schLevyExclYmdTo--${pageName}").datepicker("setDate", new Date());
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/010/list.do"); // 조회
// 계고 사유에 "전체" 추가
let reasons = FIM022.list().filter(reason => reason.code > "200");
$("#schLevyExclRsnCd--${pageName}").empty();
$("#schLevyExclRsnCd--${pageName}").append("<option value=''>" + "전체" + "</option>");
$("#schLevyExclRsnCd--${pageName}").append(reasons.map(reason => "<option value='" + reason.code + "'>" + reason.value + "</option>").join());
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무에 따른 위반 내용
let vltnIdCode = [];
if (taskSeCd == "PVS") { // 주정차 위반
vltnIdCode = FIM004.list();
} else if (taskSeCd == "BPV") { // 전용차로 위반
vltnIdCode = FIM005.list();
} else if (taskSeCd == "DPV") { // 장애인 전용
vltnIdCode = FIM006.list();
} else if (taskSeCd == "ECA") { // 전기차 주차 위반
vltnIdCode = FIM061.list();
} else if (taskSeCd == "PES") { // 밤샘 주차 위반
vltnIdCode = FIM064.list();
} else {
return;
}
// 위반 항목
$("#schVltnCd--${pageName}").empty();
$("#schVltnCd--${pageName}").append("<option value=''>" + "전체" + "</option>");
$(vltnIdCode).each(function(index, item) {
$("#schVltnCd--${pageName}").append("<option value='" + vltnIdCode[index].code +"'>" + vltnIdCode[index].value + "</option>");
});
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + taskSeCd.toLowerCase() + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
//# sourceURL=sndb01010-main.jsp
</script>

@ -1,433 +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>
<!-- inner page html -->
<div class="wrapper-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<!-- Page Body -->
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<div class="row g-1">
<!-- 총 건수 -->
<div class="col-md-12 text-end px-2">
<label class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">총건수 / 총금액</label>
<input type="text" class="form-control w-px-80 text-end" id="tnocs--${pageName}" name="tnocs" data-fmt-type="number" readonly />
<input type="text" class="form-control w-px-140 text-end" id="gramt--${pageName}" name="gramt" data-fmt-type="number" readonly />
</div>
<!-- 문서 번호 -->
<div class="col-md-4">
<label for="docNo--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">문서번호</label>
<input type="text" class="form-control w-55" id="docNo--${pageName}" name="docNo" autocomplete="off" />
</div>
<!-- 발송 일자 -->
<div class="col-md-4">
<label for="sndngYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">발송일자</label>
<input type="text" class="form-control form-date" id="sndngYmd--${pageName}" name="sndngYmd"
data-fmt-type="day" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<!-- 발송 종료 일자 -->
<div class="col-md-4" id="divSndngEndYmd--${pageName}">
<label for="sndngEndYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">납기일자</label>
<input type="text" class="form-control form-date" id="sndngEndYmd--${pageName}" name="sndngEndYmd"
data-fmt-type="day" title="날짜 선택" maxlength="10" />
<button type="button" id="btnSndngEndYmd--${pageName}" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<!-- 제목 명 -->
<div class="col-md-12">
<label for="ttlNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">제목</label>
<input type="text" class="form-control w-87" id="ttlNm--${pageName}" name="ttlNm" autocomplete="off" />
</div>
<!-- 기타 내용 -->
<div class="col-md-12">
<label for="etcCn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">기타내용</label>
<textarea type="text" class="form-control w-87" id="etcCn--${pageName}" name="etcCn" rows="2" data-maxlengthb="1000" autocomplete="off"></textarea>
</div>
</div> <!-- <div class="row g-1"> -->
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnSave--${pageName}" title="발송 저장">
저장
</button>
</span>
</span>
</div> <!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-300" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 120px;">계고일자</th>
<th class="cmn" style="width: 160px;">계고사유</th>
<th class="cmn" style="width: 180px;">민원신청번호</th>
<th class="cmn" style="width: 180px;">민원접수번호</th>
<th class="cmn" style="width: 120px;">민원접수일자</th>
<th class="cmn" style="width: 200px;">민원처리결과</th>
<th class="cmn" style="width: 180px;">단속일시</th>
<th class="cmn" style="width: 140px;">차량번호</th>
<th class="cmn" style="width: 160px;">위반항목</th>
<th class="cmn" style="width: 160px;">단속법정동</th>
<th class="cmn" style="width: 280px;">단속장소</th>
<th class="cmn" style="width: 120px;">단속원금</th>
<th class="cmn" style="width: 120px;">처리상태</th>
<th class="cmn" style="width: 200px;">납부자명</th>
<th class="cmn" style="width: 120px;">납부자생일</th>
<th class="cmn" style="width: 100px;">우편번호</th>
<th class="cmn" style="width: 280px;">주소</th>
<th class="cmn" style="width: 320px;">상세주소</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{CRDN_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_EXCL_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_EXCL_RSN_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_APLY_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_PRCS_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_YMD_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_CRDN_AMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STTS_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_BRDT_MASK}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="24" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div> <!-- DataTables(그리드) -->
</div> <!-- <div class="card"> -->
<!-- Page Body -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="content-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
// main 의 검색 조건을 그대로 유지
$P.mainQuery = ${mainQuery};
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "wrngTrgt"
, prefixName: "계고장 발송 대상"
, keymapper: info => info ? info.CRDN_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, formats: {
TNOCS: numberFormat
, GRAMT: numberFormat
, LEVY_EXCL_YMD: dateFormat
, CVLCPT_RCPT_YMD: dateFormat
, CRDN_YMD_TM: datetimeFormat
, FFNLG_CRDN_AMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.CRDN_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
let create = ($P.callPurpose == "create");
ajax.post({
url: !create ? $P.control.urls.update : $P.control.urls.create
, data: info
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("CRDN_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if (option != null && option.reloaded) {
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, callPurpose: "view"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 초기 데이터 설정
$P.initData = () => {
// 총건수 / 총금액
$("#tnocs--${pageName}").val(${wrngTrgtTotal});
$("#gramt--${pageName}").val($P.control.dataset.getValue("GRAMT"));
// 발송 종료 일자
$("#sndngEndYmd--${pageName}").val("");
$("#sndngEndYmd--${pageName}").prop("disabled", true);
$("#divSndngEndYmd--${pageName}").hide();
// 제목
let ttlNm = $P.control.dataset.getValue("TASK_SE_NM");
if ($P.mainQuery.schVltnCd != null && $P.mainQuery.schVltnCd != "") { // 위반항목이 '전체'가 아니라면..
ttlNm = ttlNm + " " + $P.control.dataset.getValue("VLTN_ARTCL");
}
$("#ttlNm--${pageName}").val(ttlNm + " " + "계고장");
// 업무구분에 따른 URL 설정
$P.control.urls.create = wctx.url("/" + $P.mainQuery.taskSeCd + "${infoPrefixUrl}" + "/020/createList.do"); // 등록
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 저장
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, init: () => { setDialogZindex(); }
, onOK: () => {
// 검색조건과 저장 파라미터 객체를 합친다.
let params = $.extend({}, $P.mainQuery, $P.formFields.get());
params.sndngRegSeCd = "01"; // 발송 등록 구분 코드(SNDNG_REG_SE_CD) - 01: 일괄
params.rsndYn = "N"; // 재발송 여부
params.delYn = "N"; // 삭제 여부
$P.control.save(params);
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmEdit--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 업무 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장
// DataTables width 변경 조정
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
/* 출처: https://nowonbun.tistory.com/538 [명월 일지:티스토리]
show.bs.modal : 모달이 열릴 때 바로 실행되는 이벤트입니다.
shown.bs.modal : 모달의 열림이 끝나고 실행되는 이벤트입니다.
hide.bs.modal : 모달이 닫힐 때 바로 실행되는 이벤트입니다.
hidden.bs.modal : 모달의 닫힘이 끝나고 실행되는 이벤트입니다.
*/
// DataTables 스크롤을 위해서 다이얼로그 화면이 생성된 후 Dataset을 설정한다.
$("#${infoPrefix}Dialog--${openerPageName}").on("shown.bs.modal", function (e) {
$P.control.setData({
${infoPrefix}List: ${wrngTrgtList}
, ${infoPrefix}Start: ${wrngTrgtStart}
, ${infoPrefix}Fetch: ${wrngTrgtFetch}
, ${infoPrefix}Total: ${wrngTrgtTotal}
});
// 초기 데이터 설정
$P.initData();
});
}
// 초기 화면 설정
$P.initForm = () => {
// 화면 초기화
$("#frmEdit--${pageName}")[0].reset();
// 달력 초기화
initDatepicker("frmEdit--${pageName}");
$("#sndngYmd--${pageName}").datepicker("setDate", new Date());
$("#sndngEndYmd--${pageName}").datepicker("setDate", new Date());
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,639 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무 구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 발송 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSndngYmdFrom--${pageName}">발송일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schSndngYmdFrom--${pageName}" name="schSndngYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schSndngYmdTo--${pageName}" name="schSndngYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 발송 등록 구분 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSndngRegSeCd--${pageName}">등록구분</label>
<select class="form-select w-px-80" id="schSndngRegSeCd--${pageName}" name="schSndngRegSeCd">
<c:forEach items="${FIM067List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- -->
<div class="col-6">
</div>
<!-- 동적 검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 등록일자, 수정일자 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnRemove--${pageName}" title="계고장 발송 삭제">
발송 삭제
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('TASK_SE_CD', this.innerText, 'codeValue', 'FIM054');">업무구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SNDNG_REG_SE_CD', this.innerText, 'codeValue', 'FIM067');">등록구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('SNDNG_SE_CD', this.innerText, 'codeValue', 'FIM067');">발송구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VLTN_ARTCL', this.innerText, 'match', 'part');">위반항목</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SNDNG_YMD', this.innerText, 'ymd', '');">발송일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SNDNG_END_YMD', this.innerText, 'ymd', '');">납기일자</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('TNOCS', this.innerText, 'match', 'part');">총건수</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('GRAMT', this.innerText, 'match', 'part');">총금액</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('DOC_NO', this.innerText, 'match', 'part');">문서번호</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('TTL_NM', this.innerText, 'match', 'part');">제목</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{SNDNG_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{SNDNG_ID}" onchange="pageObject['${pageName}'].control.select('{SNDNG_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_REG_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_SE_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_END_YMD}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{TNOCS}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{GRAMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DOC_NO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{TTL_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="17" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "wrngSndng"
, prefixName: "계고장 발송 현황"
, keymapper: info => info ? info.SNDNG_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "xxl"
, formats: {
SNDNG_YMD: dateFormat
, SNDNG_END_YMD: dateFormat
, TNOCS: numberFormat
, GRAMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.SNDNG_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 삭제 버튼
$("#btnRemove--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 상세정보 dialog
$P.control.getInfo = (sndngId) => {
if (typeof sndngId == "undefined" || sndngId == null || sndngId == "") return;
let params = {
title: $P.control.prefixName + " 상세 정보" // 타이틀
, callPurpose: "view" // 호출 용도
, fetchSize: $P.control.defaultFetchSize // 한번에 조회되는 자료 건수
, pageNum: 1 // 페이지 번호
, sggCd: $("#sggCd--${pageName}").val() // 시군구 코드
, taskSeCd: $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val() // 업무 구분 코드
, sndngId: sndngId // 발송 ID
}
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/040/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("DtlDialog--${pageName}")
, title: params.title
, content: resp
, size: $P.control.infoSize
});
}
});
}
// 삭제 callback
$P.control.onRemove = (resp) => {
let btnTitle = $("#btnRemove--${pageName}").attr("title");
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, btnTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) { $P.fnRefreshList(); } // 자료 재조회
}
// 삭제
$P.control.remove = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/030/remove.do")
, data: params
, success: resp => $P.control.onRemove(resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("SNDNG_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].control.getInfo('" + dataItem.getValue("SNDNG_ID") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
// 삭제사유 callback
$P.callbackRsn = (obj) => {
// 서버에 전송할 data(파라미터) 생성
let params = {};
let selected = $P.control.dataset.getKeys("selected");
params[$P.control.prefixed("Ids")] = selected.join(","); // IDs
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
params.delRsn = obj.reason; // 삭제 사유
$P.control.remove(params);
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get();
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.sndngSeCdFrom = "11"; // 발송 구분 코드 - 11 계고장
$P.control.query.sndngSeCdTo = "12"; // 발송 구분 코드 - 12 계고장 구형표지
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 삭제 버튼 이벤트
$P.fnRemove = (title) => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) {
dialog.alert({
content: "선택하신 " + $P.control.prefixName + " 정보가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// 삭제 메세지 확인
dialog.alert({
content: "선택하신 " + selected.length + "건의 " + $P.control.prefixName + " 정보를 삭제하시겠습니까?"
, onOK: () => {
// 삭제 사유 입력
fetch(wctx.url("/resources/html/inputRsnDialog.html"))
.then(function(resp) { return resp.text(); })
.then(function(template) {
dialog.open({
id: "inputDelRsnDialog"
, title: title
, size: "lg"
, content: template
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.callbackRsn({ reason: $("#reason").val() });
}
});
});
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 버튼 이벤트
$("#btnRemove--${pageName}").on("click", function() {
$P.fnRemove($(this).attr("title")); // 계고장 발송 삭제
});
// DataTables width 변경 조정
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schSndngYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date);
$("#schSndngYmdTo--${pageName}").datepicker("setDate", new Date());
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/030/list.do"); // 조회
// 업무별 조회 조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + taskSeCd.toLowerCase() + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,372 +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>
<!-- inner page html -->
<div class="wrapper-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<!-- Page Body -->
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" />
<input type="hidden" id="sndngId--${pageName}" name=sndngId />
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnPrintWrng--${pageName}" title="계고장 출력">
계고장 출력
</button>
</span>
</span>
</div> <!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 120px;">발송상태</th>
<th class="cmn" style="width: 160px;">등기번호</th>
<th class="cmn" style="width: 120px;">발송일자</th>
<th class="cmn" style="width: 120px;">납기일자</th>
<th class="cmn" style="width: 200px;">성명</th>
<th class="cmn" style="width: 100px;">우편번호</th>
<th class="cmn" style="width: 280px;">주소</th>
<th class="cmn" style="width: 320px;">상세주소</th>
<th class="cmn" style="width: 120px;">배달일자</th>
<th class="cmn" style="width: 120px;">배달시각</th>
<th class="cmn" style="width: 200px;">미배달사유</th>
<th class="cmn" style="width: 200px;">수령인</th>
<th class="cmn" style="width: 200px;">수령인관계</th>
<th class="cmn" style="width: 180px;">단속일시</th>
<th class="cmn" style="width: 140px;">차량번호</th>
<th class="cmn" style="width: 160px;">단속법정동</th>
<th class="cmn" style="width: 280px;">단속장소</th>
<th class="cmn" style="width: 120px;">과태료금액</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{SNDNG_DTL_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_DTL_STTS_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RG_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DUDT_YMD}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DLVR_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DLVR_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{UNDLVR_RSN_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ACTL_RCPN_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_REL_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_DT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_AMT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="24" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div> <!-- DataTables(그리드) -->
</div> <!-- <div class="card"> -->
<!-- Page Body -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="wrapper-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "wrngSndngDtl"
, prefixName: "계고장 발송 상세"
, keymapper: info => info ? info.SNDNG_DTL_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, formats: {
SNDNG_YMD: dateFormat
, DUDT_YMD: dateFormat
, FFNLG_AMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.SNDNG_DTL_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("SNDNG_DTL_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 출력
$P.print = (params) => {
if (!params) return;
dialog.alert({
content: "작업중입니다"
, onOK: () => {
}
});
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.delYn = "N"; // 삭제 여부
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 계고장출력 버튼 이벤트
$P.fnPrint = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: $P.control.prefixName + " 정보를 출력하시겠습니까?"
, onOK: () => {
$P.print($P.formFields.get());
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
// 업무 버튼 이벤트
$("#btnPrintWrng--${pageName}").on("click", function() {
$P.fnPrint($(this).attr("title")); // 계고장 출력
});
// DataTables width 변경 조정
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
// DataTables 스크롤을 위해서 다이얼로그 화면이 생성된 후 Dataset을 설정한다.
$("#${infoPrefix}Dialog--${openerPageName}").on("shown.bs.modal", function (e) {
$P.control.setData({
${infoPrefix}List: ${wrngSndngDtlList}
, ${infoPrefix}Start: ${wrngSndngDtlStart}
, ${infoPrefix}Fetch: ${wrngSndngDtlFetch}
, ${infoPrefix}Total: ${wrngSndngDtlTotal}
});
});
}
// 초기 화면 설정
$P.initForm = () => {
// 화면 초기화
$("#frmEdit--${pageName}")[0].reset();
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#taskSeCd--${pageName}").val("${taskSeCd}"); // 업무 구분 코드
$("#sndngId--${pageName}").val("${sndngId}"); // 발송 ID
// 업무 구분별 설정
$P.setTask("${taskSeCd}");
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/040/list.do"); // 조회
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,742 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무 구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 단속 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCrdnYmdFrom--${pageName}">단속일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schCrdnYmdFrom--${pageName}" name="schCrdnYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schCrdnYmdTo--${pageName}" name="schCrdnYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 위반 항목 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVltnCd--${pageName}">위반항목</label>
<select class="form-select w-px-160" id="schVltnCd--${pageName}" name="schVltnCd">
<option value="">전체</option>
<c:forEach items="${FIM004List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- -->
<div class="col-6">
</div>
<!-- 동적 검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 차량번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVhrno--${pageName}">차량번호</label>
<input type="text" class="form-control w-px-160" id="schVhrno--${pageName}" name="schVhrno" autocomplete="off" />
</div>
<!-- 납부자번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNm--${pageName}">납부자번호</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNm--${pageName}" name="schRtpyrNm" autocomplete="off" />
</div>
<!-- 납부자명 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNo--${pageName}">납부자명</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNo--${pageName}" name="schRtpyrNo" autocomplete="off" />
</div>
<!-- 등록일자, 수정일자 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnCreateSlctnTrgtInfo--${pageName}" title="선택 발송대상 등록">
선택 대상 등록
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnCreateWholTrgtInfo--${pageName}" title="선택 발송대상 등록">
전체 대상 등록
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;">업무구분</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CVLCPT_APLY_NO', this.innerText, 'match', 'part');">민원신청번호</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CVLCPT_RCPT_NO', this.innerText, 'match', 'part');">민원접수번호</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('CVLCPT_RCPT_YMD', this.innerText, 'ymd', '');">민원접수일자</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CVLCPT_PRCS_PIC_NM', this.innerText, 'match', 'part');">민원처리담당자</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('CVLCPT_PRCS_CD', this.innerText, 'codeValue', 'FIM017');">민원처리결과</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CRDN_YMD', this.innerText, 'ymd', '');">단속일시</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('VHRNO', this.innerText, 'match', 'part');">차량번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RTPYR_SE_CD', this.innerText, 'codeValue', 'FIM011');">납부자구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RTPYR_NO', this.innerText, 'ymd', '');">납부자번호</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('RTPYR_NM', this.innerText, 'match', 'part');">납부자명</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('VLTN_ARTCL', this.innerText, 'match', 'part');">위반항목</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STDG_NM', this.innerText, 'match', 'part');">단속법정동</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('CRDN_PLC', this.innerText, 'match', 'part');">단속장소</th>
<th class="bpv" style="width: 280px;" onclick="searchFromGridTitle('DTL_CRDN_PLC', this.innerText, 'match', 'part');">상세단속장소</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_AMT', this.innerText, 'match', 'part');">과태료금액</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('ADVNTCE_AMT', this.innerText, 'match', 'part');">사전통지금액</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STTS_CD', this.innerText, 'codeValue', 'FIM010');">처리상태</th>
<th class="pvs" style="width: 140px;" onclick="searchFromGridTitle('CRDN_SPAREA_CD', this.innerText, 'codeValue', 'FIM007');">단속특별구역</th>
<th class="eca" style="width: 140px;" onclick="searchFromGridTitle('USE_FUEL_CD', this.innerText, 'codeValue', 'LVS005');">사용연료</th>
<th class="dpv" style="width: 140px;" onclick="searchFromGridTitle('PRK_PSBLTY_RSLT_CD', this.innerText, 'codeValue', 'FIM034');">주차가능여부</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('ZIP', this.innerText, 'match', 'part');">우편번호</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('ADDR', this.innerText, 'match', 'part');">주소</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('DTL_ADDR', this.innerText, 'match', 'part');">상세주소</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{CRDN_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{CRDN_ID}" onchange="pageObject['${pageName}'].control.select('{CRDN_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_APLY_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_PRCS_PIC_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_PRCS_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_YMD_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_SE_NM}</td>
<td class="cmn text-center privacy-cell" onclick="{onclick}" ondblclick="{ondblclick}">
<span>{RTPYR_NO}</span>
<span>*************</span>
</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="bpv text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_CRDN_PLC}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{ADVNTCE_AMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STTS_NM}</td>
<td class="pvs text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_SPAREA_NM}</td>
<td class="eca text-center" onclick="{onclick}" ondblclick="{ondblclick}">{USE_FUEL_NM}</td>
<td class="dpv text-center" onclick="{onclick}" ondblclick="{ondblclick}">{PRK_PSBLTY_RSLT_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="bpv">
<td valign="top" colspan="31" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="dpv">
<td valign="top" colspan="31" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="eca">
<td valign="top" colspan="31" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pvs">
<td valign="top" colspan="31" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pes">
<td valign="top" colspan="31" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- / Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
// 공통 코드
var FIM004 = new CommonCodes(${FIM004}, true); // 주정차위반 내역 코드
var FIM005 = new CommonCodes(${FIM005}, true); // 전용차로위반 내역 코드
var FIM006 = new CommonCodes(${FIM006}, true); // 장애인주차위반 내역 코드
var FIM061 = new CommonCodes(${FIM061}, true); // 전기차 충전구역 및 충전방해 위반 코드
var FIM064 = new CommonCodes(${FIM064}, true); // 화물자동차 밤샘주차 위반 코드
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "advntceTrgt"
, prefixName: "사전통지 발송 대상"
, keymapper: info => info ? info.CRDN_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "xl"
, formats: {
CVLCPT_RCPT_YMD: dateFormat
, CRDN_YMD_TM: datetimeFormat
, FFNLG_AMT: numberFormat
, ADVNTCE_AMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.CRDN_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 선택 대상 등록 버튼
$("#btnCreateSlctnTrgtInfo--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 사전통지 발송 등록 dialog
$P.control.getInfo = (params) => {
if (!params) return;
let dialogTitle = "";
if (params.callPurpose == "create") {
dialogTitle = $P.control.prefixName + " 등록";
} else if (params.callPurpose == "update") {
dialogTitle = $P.control.prefixName + " 수정";
} else {
dialogTitle = $P.control.prefixName + " 정보";
}
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/060/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("Dialog--${pageName}")
, title: dialogTitle
, content: resp
, size: $P.control.infoSize
, onClose: () => { $P.fnRefreshList(); }
});
}
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let clsForTask = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val().toLowerCase(); // 소문자
// 업무별 그리드 td
let foundContent = document.getElementById("${infoPrefix}Row--${pageName}").content;
let foundTr = $(foundContent).find("tr")[0].cloneNode(false);
let foundTds = $(foundContent).find("." + clsForTask + ",.cmn");
foundTds.each(function() {
foundTr.appendChild(this.cloneNode(true));
});
//
let replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("CRDN_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');");
let trs = empty ? [document.getElementById("${infoPrefix}NotFound--${pageName}").content.querySelector("." + clsForTask + ",.cmn").outerHTML]
: ${infoPrefix}List.inStrings(foundTr.outerHTML, replacer);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.query.crdnIds = null;
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get();
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
// 업무 구분 코드(TASK_SE_CD) 에 따른 검색 조건 설정
let taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val();
if (taskSeCd == "BPV" || taskSeCd == "PVS") { // 전용차로위반 , 주정차위반 과태료는 사전부과 후 의견제출 접수도 사전통지 대상
$P.control.query.crdnSttsCdFrom = "21"; // 단속 처리 상태(FIM010) 시작 - 21: 납부자 등록
$P.control.query.crdnSttsCdTo = "31"; // 단속 처리 상태(FIM010) 종료 - 31: 의견제출 접수
} else {
$P.control.query.crdnSttsCdFrom = "21"; // 단속 처리 상태(FIM010) 시작 - 21: 납부자 등록
$P.control.query.crdnSttsCdTo = "23"; // 단속 처리 상태(FIM010) 종료 - 23: 사전부과
}
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 선택 발송대상 등록 버튼 이벤트
$P.fnCreateSlctnTrgtInfo = (title) => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) return;
// 파라미터 설정
let params = $P.control.query; // 검색 조건
params.callPurpose = "create"; // 호출 용도 (등록)
params.crdnIds = selected.join(","); // crdnIds
params.sndngSeCd = "02"; // 발송 구분 코드(FIM047) - 02 사전통지서
params.rsndYn = "N"; // 재발송 여부
params.delYn = "N"; // 삭제 여부
$P.control.getInfo(params);
}
// 전체 발송대상 등록 버튼 이벤트
$P.fnCreateWholTrgtInfo = (title) => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, onOK: () => { }
});
return;
}
// 파라미터 설정
let params = $P.control.query; // 검색 조건
params.callPurpose = "create"; // 호출 용도 (등록)
params.sndngSeCd = "02"; // 발송 구분 코드 - 02 사전통지서
params.rsndYn = "N"; // 재발송 여부
params.delYn = "N"; // 삭제 여부
$P.control.getInfo(params);
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 업무 버튼 이벤트
$("#btnCreateSlctnTrgtInfo--${pageName}").on("click", function() {
$P.fnCreateSlctnTrgtInfo($(this).attr("title")); // 선택 대상 감경부과 등록
});
$("#btnCreateWholTrgtInfo--${pageName}").on("click", function() {
$P.fnCreateWholTrgtInfo($(this).attr("title")); // 전체 대상 감경부과 등록
});
// DataTables width 변경 조정
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schCrdnYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date);
$("#schCrdnYmdTo--${pageName}").datepicker("setDate", new Date());
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/050/list.do"); // 조회
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무에 따른 위반 내용
let vltnCode = [];
if (taskSeCd == "PVS") { // 주정차 위반
vltnCode = FIM004.list();
} else if (taskSeCd == "BPV") { // 전용차로 위반
vltnCode = FIM005.list();
} else if (taskSeCd == "DPV") { // 장애인 전용
vltnCode = FIM006.list();
} else if (taskSeCd == "ECA") { // 전기차 주차 위반
vltnCode = FIM061.list();
} else if (taskSeCd == "PES") { // 밤샘 주차 위반
vltnCode = FIM064.list();
} else {
return;
}
// 위반 항목
$("#schVltnCd--${pageName}").empty();
$("#schVltnCd--${pageName}").append("<option value=''>" + "전체" + "</option>");
$(vltnCode).each(function(index, item) {
$("#schVltnCd--${pageName}").append("<option value='" + vltnCode[index].code +"'>" + vltnCode[index].value + "</option>");
})
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + taskSeCd.toLowerCase() + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,436 +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>
<!-- inner page html -->
<div class="wrapper-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<!-- Page Body -->
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<div class="row g-1">
<!-- 총 건수 -->
<div class="col-md-12 text-end px-2">
<label class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">총건수 / 총금액</label>
<input type="text" class="form-control w-px-80 text-end" id="tnocs--${pageName}" name="tnocs" data-fmt-type="number" readonly />
<input type="text" class="form-control w-px-140 text-end" id="gramt--${pageName}" name="gramt" data-fmt-type="number" readonly />
</div>
<!-- 문서 번호 -->
<div class="col-md-4">
<label for="docNo--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">문서번호</label>
<input type="text" class="form-control w-55" id="docNo--${pageName}" name="docNo" autocomplete="off" />
</div>
<!-- 발송 일자 -->
<div class="col-md-4">
<label for="sndngYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">발송일자</label>
<input type="text" class="form-control form-date" id="sndngYmd--${pageName}" name="sndngYmd"
data-fmt-type="day" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<!-- 발송 종료 일자 -->
<div class="col-md-4" id="divSndngEndYmd--${pageName}">
<label for="sndngEndYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">납기일자</label>
<input type="text" class="form-control form-date" id="sndngEndYmd--${pageName}" name="sndngEndYmd"
data-fmt-type="day" title="날짜 선택" maxlength="10" />
<button type="button" id="btnSndngEndYmd--${pageName}" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<!-- 제목 명 -->
<div class="col-md-12">
<label for="ttlNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">제목</label>
<input type="text" class="form-control w-87" id="ttlNm--${pageName}" name="ttlNm" autocomplete="off" />
</div>
<!-- 기타 내용 -->
<div class="col-md-12">
<label for="etcCn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">기타내용</label>
<textarea type="text" class="form-control w-87" id="etcCn--${pageName}" name="etcCn" rows="2" data-maxlengthb="1000" autocomplete="off"></textarea>
</div>
</div> <!-- <div class="row g-1"> -->
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnSave--${pageName}" title="저장">
저장
</button>
</span>
</span>
</div> <!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-300" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 180px;">민원신청번호</th>
<th class="cmn" style="width: 180px;">민원접수번호</th>
<th class="cmn" style="width: 120px;">민원접수일자</th>
<th class="cmn" style="width: 160px;">민원처리결과</th>
<th class="cmn" style="width: 180px;">단속일시</th>
<th class="cmn" style="width: 140px;">차량번호</th>
<th class="cmn" style="width: 160px;">위반항목</th>
<th class="cmn" style="width: 160px;">단속법정동</th>
<th class="cmn" style="width: 280px;">단속장소</th>
<th class="cmn" style="width: 120px;">과태료금액</th>
<th class="cmn" style="width: 120px;">사전통지금액</th>
<th class="cmn" style="width: 120px;">처리상태</th>
<th class="cmn" style="width: 200px;">납부자명</th>
<th class="cmn" style="width: 120px;">납부자생일</th>
<th class="cmn" style="width: 100px;">우편번호</th>
<th class="cmn" style="width: 280px;">주소</th>
<th class="cmn" style="width: 320px;">상세주소</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{CRDN_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_APLY_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_RCPT_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CVLCPT_PRCS_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_YMD_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{ADVNTCE_AMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STTS_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_BRDT_MASK}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="23" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div> <!-- DataTables(그리드) -->
</div> <!-- <div class="card"> -->
<!-- Page Body -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="wrapper-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
// main 의 검색 조건을 그대로 유지
$P.mainQuery = ${mainQuery};
// 사전통지 일자
$P.advntceYmdInfo = ${advntceYmdInfo};
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "advntceTrgt"
, prefixName: "사전통지 발송 대상"
, keymapper: info => info ? info.CRDN_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, formats: {
TNOCS: numberFormat
, GRAMT: numberFormat
, CVLCPT_RCPT_YMD: dateFormat
, CRDN_YMD_TM: datetimeFormat
, FFNLG_AMT: numberFormat
, ADVNTCE_AMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.CRDN_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
let create = ($P.callPurpose == "create");
ajax.post({
url: !create ? $P.control.urls.update : $P.control.urls.create
, data: info
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("CRDN_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, callPurpose: "view"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 업무구분에 따른 URL 설정
$P.fnSetURL = (taskSeCd) => {
$P.control.urls.create = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/060/createList.do"); // 등록
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 저장
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: "현재 " + $P.control.prefixName + " 정보를 저장하시겠습니까?"
, init: () => { setDialogZindex(); }
, onOK: () => {
// 검색조건과 저장 파라미터 객체를 합친다.
let params = $.extend({}, $P.mainQuery, $P.formFields.get());
params.sndngRegSeCd = "01"; // 발송 등록 구분 코드(SNDNG_REG_SE_CD) - 01: 일괄
params.rsndYn = "N"; // 재발송 여부
params.delYn = "N"; // 삭제 여부
$P.control.save(params);
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmEdit--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 부과 일자 변경 이벤트
$("#sndngYmd--${pageName}").on("change", function() {
let sndngYmd = $("#sndngYmd--${pageName}").val();
$("#sndngEndYmd--${pageName}").val(addDate(sndngYmd, $P.advntceYmdInfo.ADVNTCE_DAY_CNT));
});
// 업무 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장
// DataTables width 변경 조정
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
// DataTables 스크롤을 위해서 다이얼로그 화면이 생성된 후 Dataset을 설정한다.
$("#${infoPrefix}Dialog--${openerPageName}").on("shown.bs.modal", function (e) {
$P.control.setData({
${infoPrefix}List: ${advntceTrgtList}
, ${infoPrefix}Start: ${advntceTrgtStart}
, ${infoPrefix}Fetch: ${advntceTrgtFetch}
, ${infoPrefix}Total: ${advntceTrgtTotal}
});
// 초기 데이터 설정
$P.initData();
});
}
// 화면 초기 설정
$P.initForm = () => {
// 화면 초기화
$("#frmEdit--${pageName}")[0].reset();
// 달력 초기화
initDatepicker("frmEdit--${pageName}");
$("#sndngYmd--${pageName}").datepicker("setDate", new Date());
$("#sndngEndYmd--${pageName}").datepicker("setDate", new Date());
}
// 초기 데이터 설정
$P.initData = () => {
// 총건수 / 총금액
$("#tnocs--${pageName}").val(${advntceTrgtTotal});
$("#gramt--${pageName}").val($P.control.dataset.getValue("GRAMT"));
// 발송 일자 / 발송 종료 일자
$("#sndngYmd--${pageName}").val($P.advntceYmdInfo.LEVY_YMD_MASK);
$("#sndngEndYmd--${pageName}").val($P.advntceYmdInfo.DUDT_YMD_MASK);
// 제목
let ttlNm = $P.control.dataset.getValue("TASK_SE_NM");
if ($P.mainQuery.schVltnCd != null && $P.mainQuery.schVltnCd != "") { // 위반항목이 '전체'가 아니라면..
ttlNm = ttlNm + " " + $P.control.dataset.getValue("VLTN_ARTCL");
}
$("#ttlNm--${pageName}").val(ttlNm + " " + "사전통지");
// 업무구분에 따른 URL 설정
$P.fnSetURL($P.mainQuery.taskSeCd);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,642 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무 구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 발송 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSndngYmdFrom--${pageName}">발송일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schSndngYmdFrom--${pageName}" name="schSndngYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schSndngYmdTo--${pageName}" name="schSndngYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 발송 등록 구분 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSndngRegSeCd--${pageName}">등록구분</label>
<select class="form-select w-px-80" id="schSndngRegSeCd--${pageName}" name="schSndngRegSeCd">
<c:forEach items="${FIM067List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- -->
<div class="col-6">
</div>
<!-- 동적 검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 등록일자, 수정일자 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnRemove--${pageName}" title="사전통지 발송 삭제">
발송 삭제
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('TASK_SE_CD', this.innerText, 'codeValue', 'FIM054');">업무구분</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('SNDNG_REG_SE_CD', this.innerText, 'codeValue', 'FIM067');">등록구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('SNDNG_SE_CD', this.innerText, 'codeValue', 'FIM067');">발송구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VLTN_ARTCL', this.innerText, 'match', 'part');">위반항목</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SNDNG_YMD', this.innerText, 'ymd', '');">발송일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SNDNG_END_YMD', this.innerText, 'ymd', '');">납기일자</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('TNOCS', this.innerText, 'match', 'part');">총건수</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('GRAMT', this.innerText, 'match', 'part');">총금액</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('DOC_NO', this.innerText, 'match', 'part');">문서번호</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('TTL_NM', this.innerText, 'match', 'part');">제목</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{SNDNG_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{SNDNG_ID}" onchange="pageObject['${pageName}'].control.select('{SNDNG_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_REG_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_SE_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_END_YMD}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{TNOCS}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{GRAMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DOC_NO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{TTL_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="17" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "advntceSndng"
, prefixName: "사전통지 발송 현황"
, keymapper: info => info ? info.SNDNG_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "xxl"
, formats: {
SNDNG_YMD: dateFormat
, SNDNG_END_YMD: dateFormat
, TNOCS: numberFormat
, GRAMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.SNDNG_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 삭제 버튼
$("#btnRemove--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 상세정보 dialog
$P.control.getInfo = (sndngId) => {
if (typeof sndngId == "undefined" || sndngId == null || sndngId == "") return;
let params = {
title: $P.control.prefixName + " 상세 정보" // 타이틀
, callPurpose: "view" // 호출 용도
, fetchSize: $P.control.defaultFetchSize // 한번에 조회되는 자료 건수
, pageNum: 1 // 페이지 번호
, sggCd: $("#sggCd--${pageName}").val() // 시군구 코드
, taskSeCd: $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val() // 업무 구분 코드
, sndngId: sndngId // 발송 ID
}
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/080/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("DtlDialog--${pageName}")
, title: params.title
, content: resp
, size: $P.control.infoSize
, init: () => { setDialogZindex(); }
});
}
});
}
// 삭제 callback
$P.control.onRemove = (resp) => {
let btnTitle = $("#btnRemove--${pageName}").attr("title");
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, btnTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) { $P.fnRefreshList(); } // 자료 재조회
}
// 삭제
$P.control.remove = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/070/remove.do")
, data: params
, success: resp => $P.control.onRemove(resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("SNDNG_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].control.getInfo('" + dataItem.getValue("SNDNG_ID") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
// 삭제사유 callback
$P.callbackRsn = (obj) => {
// 서버에 전송할 data(파라미터) 생성
let params = {};
let selected = $P.control.dataset.getKeys("selected");
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
params.sndngIds = selected.join(","); // 발송 Ids
params.delRsn = obj.reason; // 삭제 사유
$P.control.remove(params);
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get();
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.sndngSeCd = "02"; // 발송 구분 코드 - 02 사전통지
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 삭제 버튼 이벤트
$P.fnRemove = (title) => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) {
dialog.alert({
content: "선택하신 " + $P.control.prefixName + " 정보가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// 삭제 메세지 확인
dialog.alert({
content: "선택하신 " + selected.length + "건의 " + $P.control.prefixName + " 정보를 삭제하시겠습니까?"
, onOK: () => {
// 삭제 사유 입력
fetch(wctx.url("/resources/html/inputRsnDialog.html"))
.then(function(resp) { return resp.text(); })
.then(function(template) {
dialog.open({
id: "inputDelRsnDialog"
, title: title
, size: "lg"
, content: template
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.callbackRsn({ reason: $("#reason").val() });
}
});
});
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 업무 버튼 이벤트
$("#btnRemove--${pageName}").on("click", function() {
$P.fnRemove($(this).attr("title")); // 사전통지 발송 삭제
});
// DataTables width 변경 조정
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schSndngYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date);
$("#schSndngYmdTo--${pageName}").datepicker("setDate", new Date());
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/070/list.do"); // 검색
// 업무별 조회 조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + taskSeCd.toLowerCase() + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,666 +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>
<!-- inner page html -->
<div class="wrapper-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<!-- Page Body -->
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" />
<input type="hidden" id="sndngId--${pageName}" name=sndngId />
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnLinkNxrpIndivA01--${pageName}" title="세외수입 과태료대장 등록">
과태료대장 등록
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnLinkNxrpIndivA03--${pageName}" title="세외수입 과태료대장 상세조회">
과태료대장 상세조회
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnCreateSndngLink--${pageName}" title="우편통합 발송">
우편통합 발송
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnPrintAdvntcePdf01--${pageName}" title="사전통지 출력(PDF-A4)">
사전통지 출력(PDF-A4)
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnPrintAdvntcePdf02--${pageName}" title="사전통지 출력(PDF-Letter)">
사전통지 출력(PDF-Letter)
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnPrintAdvntceOutsourcing--${pageName}" title="사전통지 출력(외주파일)">
사전통보서 출력(외주파일)
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnCreateSndbk--${pageName}" title="반송 확인">
반송 확인
</button>
</span>
</span>
</div> <!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 120px;">발송상태</th>
<th class="cmn" style="width: 160px;">등기번호</th>
<th class="cmn" style="width: 120px;">발송일자</th>
<th class="cmn" style="width: 120px;">발송종료일자</th>
<th class="cmn" style="width: 200px;">성명</th>
<th class="cmn" style="width: 100px;">우편번호</th>
<th class="cmn" style="width: 280px;">주소</th>
<th class="cmn" style="width: 320px;">상세주소</th>
<th class="cmn" style="width: 120px;">배달일자</th>
<th class="cmn" style="width: 120px;">배달시각</th>
<th class="cmn" style="width: 200px;">미배달사유</th>
<th class="cmn" style="width: 200px;">수령인</th>
<th class="cmn" style="width: 200px;">수령인관계</th>
<th class="cmn" style="width: 180px;">단속일시</th>
<th class="cmn" style="width: 140px;">차량번호</th>
<th class="cmn" style="width: 160px;">단속법정동</th>
<th class="cmn" style="width: 280px;">단속장소</th>
<th class="cmn" style="width: 100px;">회계연도</th>
<th class="cmn" style="width: 100px;">부과번호</th>
<th class="cmn" style="width: 120px;">부과일자</th>
<th class="cmn" style="width: 120px;">납기일자</th>
<th class="cmn" style="width: 120px;">과태료금액</th>
<th class="cmn" style="width: 120px;">본세</th>
<th class="cmn" style="width: 120px;">가산금</th>
<th class="cmn" style="width: 120px;">미납금액</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{SNDNG_DTL_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_DTL_STTS_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RG_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_END_YMD}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DLVR_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DLVR_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{UNDLVR_RSN_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ACTL_RCPN_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_REL_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_DT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{FYR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DUDT_YMD}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{PCPTAX}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{ADAMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{SUM_AMT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="31" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div> <!-- DataTables(그리드) -->
</div> <!-- <div class="card"> -->
<!-- Page Body -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="wrapper-pop"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "advntceSndngDtl"
, prefixName: "사전통지 발송 상세"
, keymapper: info => info ? info.SNDNG_DTL_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, formats: {
SNDNG_YMD: dateFormat
, SNDNG_END_YMD: dateFormat
, DLVR_YMD: dateFormat
, LEVY_YMD: dateFormat
, DUDT_YMD: dateFormat
, FFNLG_AMT: numberFormat
, PCPTAX: numberFormat
, ADAMT: numberFormat
, SUM_AMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.SNDNG_DTL_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("SNDNG_DTL_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 세외수입 과태료 대장 등록
$P.linkNxrpIndivA01 = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/991/nxrpA01List.do")
, data: params || {}
, success: resp => {
// S 또는 F 를 버튼 title 로 변경하여 메시지 출력
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, params.title);
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { $P.fnRefreshList(); } // 자료 재조회
});
}
});
}
// 세외수입 과태료 대장 상세 조회
$P.linkNxrpIndivA03 = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/991/nxrpA03List.do")
, data: params || {}
, success: resp => {
// S 또는 F 를 버튼 title 로 변경하여 메시지 출력
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, params.title);
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { $P.fnRefreshList(); } // 자료 재조회
});
}
});
}
// 우편통합 발송
$P.callbackDate = (obj) => {
let params = {
title: $("#btnCreateSndngLink--${pageName}").attr("title")
, sggCd: $P.control.dataset.getValue("SGG_CD") // 시군구 코드
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
, sndngId: $P.control.dataset.getValue("SNDNG_ID") // 발송 ID
, sndngSeCd: "02" // 발송 구분 코드
, sndngYmd: obj.sndngYmd // 발송 일자
, sndngEndYmd: obj.sndngEndYmd // 발송 종료 일자
, postSndngSeCd: obj.postSndngSeCd // 우편 발송 구분 코드 0 일반, 1 등기
};
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/080/createSndngLink.do")
, data: params || {}
, success: resp => {
// S 또는 F 를 버튼 title 로 변경하여 메시지 출력
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, params.title);
dialog.alert({
content : showMessage
, init: () => { setDialogZindex(); }
, onOK : () => { $P.fnRefreshList(); } // 자료 재조회
});
}
});
}
// 반송 확인(종적결과 등록)
$P.createSndbk = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/230/createSndbkList.do")
, data: params || {}
, success: resp => {
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, params.title);
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { $P.fnRefreshList(); } // 자료 재조회
});
}
});
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.delYn = "N"; // 삭제 여부
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 세외수입 과태료 대장 단속 정보 등록 버튼 이벤트
$P.fnLinkNxrpIndivA01 = (title) => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: "세외수입 과태료 대장에 단속 정보를 등록하시겠습니까?"
, init: () => { setDialogZindex(); }
, onOK: () => {
let params = {
callPurpose: "create"
, title: title // 타이틀
, sggCd: $P.control.dataset.getValue("SGG_CD") // 시군구 코드
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
, sndngId: $P.control.dataset.getValue("SNDNG_ID") // 발송 ID
, sndngYmd: $P.control.dataset.getValue("SNDNG_YMD") // 발송 일자
};
$P.linkNxrpIndivA01(params);
}
});
}
// 세외수입 과태료 대장 등록 자료 상세 조회 버튼 이벤트
$P.fnLinkNxrpIndivA03 = (title) => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: "세외수입 과태료 대장을 조회하시겠습니까?"
, init: () => { setDialogZindex(); }
, onOK: () => {
let params = {
callPurpose: "update"
, title: title // 타이틀
, sggCd: $P.control.dataset.getValue("SGG_CD") // 시군구 코드
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
, sndngId: $P.control.dataset.getValue("SNDNG_ID") // 발송 ID
, sndngYmd: $P.control.dataset.getValue("SNDNG_YMD") // 발송 일자
};
$P.linkNxrpIndivA03(params);
}
});
}
// 우편통합발송 버튼 이벤트
$P.fnCreateSndngLink = async(title) => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
let resp = await fetch(wctx.url("/resources/html/inputDateDialog.html"));
let template = await resp.text();
dialog.open({
id : "inputEPostDateDialog"
, title: title
, size: "md"
, content: template
, init: () => {
setDialogZindex();
$("#divPostSndng").show();
initDatepicker("frmInputDate");
$("#sndngYmd").datepicker("setDate", $P.control.dataset.getValue("SNDNG_YMD"));
$("#sndngEndYmd").datepicker("setDate", $P.control.dataset.getValue("SNDNG_END_YMD"));
},
onOK: () => {
if (!inputDateComparison($("#sndngYmd").val(), $("#sndngEndYmd").val())) return;
$P.callbackDate({
"sndngYmd": $("#sndngYmd").val()
, "sndngEndYmd": $("#sndngEndYmd").val()
, "postSndngSeCd": $("#frmInputDate").find("[name='postSndngSeCd']:checked").val()
});
}
});
}
// 사전통지 출력 버튼 이벤트
$P.fnMakeFileAdvntce = (title, fileType, paper) => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
let submitParam = {
sggCd: $P.control.dataset.getValue("SGG_CD") // 시군구 코드
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
, sndngId: $P.control.dataset.getValue("SNDNG_ID") // 발송 ID
};
let url = "";
let fileTypeName = "";
if (fileType == "pdf") {
url = wctx.url("/" + submitParam.taskSeCd + "${infoPrefixUrl}" + "/080/makeAdvntcePdf.do");
fileTypeName = "PDF 파일";
} else if (fileType == "outsourcing") {
url = wctx.url("/" + submitParam.taskSeCd + "${infoPrefixUrl}" + "/080/makeAdvntceOutsourcing.do");
fileTypeName = "외주 요청 파일";
}
let inBrowser = false;
if (fileType == "pdf") {
submitParam.paperSeCd = paper;
inBrowser = true;
}
if (inBrowser) {
var parameter = toQuery(submitParam);
var filenameInHeader = "";
fetch(url + "?" + parameter)
.then((response) => {
var header = response.headers.get('Content-Disposition');
if(!header){
response.json().then((responseJson)=>{
dialog.alert({
content: fileTypeName+" 생성 중 오류가 발생하였습니다."
+"<br/>"
+responseJson.description,
init: () => { setDialogZindex(); }
});
});
new Error("");
}
var parts = header.split(';');
filenameInHeader = decodeURIComponent(parts[1].split('=')[1]);
return response.blob();
})
.then((blob) => {
openPDF(blob, filenameInHeader);
})
.catch(()=>{});
} else {
var parameter = toQuery(submitParam);
document.location.href = url + "?" + parameter;
}
}
// 반송확인 버튼 이벤트
$P.fnCreateSndbk = (title) => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: "종적결과를 확인하시겠습니까?"
, onOK: () => {
// 파리미터 설정
let params = $P.formFields.get(); // mainQuery
params.title = title; // 타이틀
$P.createSndbk(params);
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
// 업무 버튼 이벤트
$("#btnLinkNxrpIndivA01--${pageName}").on("click", function() {
$P.fnLinkNxrpIndivA01($(this).attr("title")); // 세외수입 과태료 대장 단속 정보 등록
});
$("#btnLinkNxrpIndivA03--${pageName}").on("click", function() {
$P.fnLinkNxrpIndivA03($(this).attr("title")); // 세외수입 과태료 대장 등록 자료 상세
});
$("#btnCreateSndngLink--${pageName}").on("click", function() {
$P.fnCreateSndngLink($(this).attr("title")); // 우편통합 발송
});
$("#btnPrintAdvntcePdf01--${pageName}").on("click", function() {
$P.fnMakeFileAdvntce($(this).attr("title"), "pdf", "01"); // 사전통지 출력(PDF-A4)
});
$("#btnPrintAdvntcePdf02--${pageName}").on("click", function() {
$P.fnMakeFileAdvntce($(this).attr("title"), "pdf", "02"); // 사전통지 출력(PDF-Letter)
});
$("#btnPrintAdvntceOutsourcing--${pageName}").on("click", function() {
$P.fnMakeFileAdvntce($(this).attr("title"), "outsourcing"); // 사전통지 출력(외주파일)
});
$("#btnCreateSndbk--${pageName}").on("click", function() {
$P.fnCreateSndbk($(this).attr("title")); // 반송 등록
});
// DataTables width 변경 조정
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
/* 출처: https://nowonbun.tistory.com/538 [명월 일지:티스토리]
show.bs.modal : 모달이 열릴 때 바로 실행되는 이벤트입니다.
shown.bs.modal : 모달의 열림이 끝나고 실행되는 이벤트입니다.
hide.bs.modal : 모달이 닫힐 때 바로 실행되는 이벤트입니다.
hidden.bs.modal : 모달의 닫힘이 끝나고 실행되는 이벤트입니다.
*/
// DataTables 스크롤을 위해서 다이얼로그 화면이 생성된 후 Dataset을 설정한다.
$("#${infoPrefix}Dialog--${openerPageName}").on("shown.bs.modal", function (e) {
$P.control.setData({
${infoPrefix}List: ${advntceSndngDtlList}
, ${infoPrefix}Start: ${advntceSndngDtlStart}
, ${infoPrefix}Fetch: ${advntceSndngDtlFetch}
, ${infoPrefix}Total: ${advntceSndngDtlTotal}
});
});
}
// 초기 화면 설정
$P.initForm = () => {
// 화면 초기화
$("#frmEdit--${pageName}")[0].reset();
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#taskSeCd--${pageName}").val("${taskSeCd}"); // 업무 구분 코드
$("#sndngId--${pageName}").val("${sndngId}"); // 발송 ID
// 업무가 주정차위반(PVS) 또는 전용차로위반(BPV) 이라면..
if ("${taskSeCd}" == "PVS" || "${taskSeCd}" == "BPV") {
$("#btnLinkNxrpIndivA01--${pageName}").prop("disabled", true);
$("#btnLinkNxrpIndivA03--${pageName}").prop("disabled", true);
}
// 업무 구분별 설정
$P.setTask("${taskSeCd}");
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/080/list.do"); // 검색
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,680 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무 구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="fnResetAndChangeBiz${pageName}(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 발송 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSndngYmdFrom--${pageName}">발송일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schSndngYmdFrom--${pageName}" name="schSndngYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schSndngYmdTo--${pageName}" name="schSndngYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 동적 검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-300" id="term--${pageName}" name="term" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 등록일자, 수정일자 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnCreateNhtSndng--${pageName}" title="고지서 발송 등록">
발송 등록
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnRemoveNhtSndng--${pageName}" title="고지서 발송 삭제">
발송 삭제
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('TASK_SE_CD', this.innerText, 'codeValue', 'FIM054');">업무구분</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('SNDNG_REG_SE_CD', this.innerText, 'codeValue', 'FIM067');">등록구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VLTN_ARTCL', this.innerText, 'match', 'part');">위반항목</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SNDNG_YMD', this.innerText, 'ymd', '');">발송일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SNDNG_END_YMD', this.innerText, 'ymd', '');">납기일자</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('TNOCS', this.innerText, 'match', 'part');">총건수</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('GRAMT', this.innerText, 'match', 'part');">총금액</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('DOC_NO', this.innerText, 'match', 'part');">문서번호</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('TTL_NM', this.innerText, 'match', 'part');">제목</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{SNDNG_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{SNDNG_ID}" onchange="pageObject['${pageName}'].control.select('{SNDNG_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_REG_SE_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_END_YMD}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{TNOCS}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{GRAMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DOC_NO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{TTL_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="bpv">
<td valign="top" colspan="16" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="dpv">
<td valign="top" colspan="16" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="eca">
<td valign="top" colspan="16" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pvs">
<td valign="top" colspan="16" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pes">
<td valign="top" colspan="16" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
// 공통 코드
var FIM004 = new CommonCodes(${FIM004}, true); // 주정차위반 내역 코드
var FIM005 = new CommonCodes(${FIM005}, true); // 전용차로위반 내역 코드
var FIM006 = new CommonCodes(${FIM006}, true); // 장애인주차위반 내역 코드
var FIM061 = new CommonCodes(${FIM061}, true); // 전기차 충전구역 및 충전방해 위반 코드
var FIM064 = new CommonCodes(${FIM064}, true); // 화물자동차 밤샘주차 위반 코드
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
var $P = pageObject["${pageName}"];
// URL
$P.PrefixUrl = "/sndb/sndb01";
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix : "nhtTrgt"
, prefixName : "고지서 발송 대상"
, infoSize : "xl"
, keymapper : info => info ? info.CRDN_ID : ""
, dataGetter : obj => obj.${infoPrefix}List
, appendData : true
, formats : {
CVLCPT_RCPT_YMD : dateFormat
, CRDN_YMD_TM : datetimeFormat
, FFNLG_AMT : numberFormat
, ADVNTCE_AMT : numberFormat
, REG_DT : datetimeFormat
, MDFCN_DT : datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list : $P.control.dataset
, prefix : "paging--${pageName}"
, start : obj.${infoPrefix}Start
, totalSize : obj.${infoPrefix}Total
, fetchSize : obj.${infoPrefix}Fetch
, func : "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = item => {
if (!item) return;
let key = item.data.SNDNG_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 선택 대상 등록 버튼
$("#btnCreateSlctnTrgt--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 고지서 발송 등록 dialog
$P.control.getInfo = (params) => {
if (!params) return;
let dialogTitle = "";
if (params.callPurpose == "create") {
dialogTitle = $P.control.prefixName + " 등록";
} else if (params.callPurpose == "update") {
dialogTitle = $P.control.prefixName + " 수정";
} else {
dialogTitle = $P.control.prefixName + " 정보";
}
ajax.get({
url : $P.control.urls.getInfo
, data : params || {}
, success : resp => {
dialog.open({
id : $P.control.prefixed("Dialog")
, title : dialogTitle
, content : resp
, size : $P.control.infoSize
, onClose : () => { $P.fnRefreshList(); }
});
}
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let clsForTask = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val().toLowerCase(); // 소문자
// 업무별 그리드 td
let foundContent = document.getElementById("${infoPrefix}Row--${pageName}").content;
let foundTr = $(foundContent).find("tr")[0].cloneNode(false);
let foundTds = $(foundContent).find("." + clsForTask + ",.cmn");
foundTds.each(function() {
foundTr.appendChild(this.cloneNode(true));
});
//
let replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("SNDNG_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].control.getInfo('" + dataItem.getValue("SNDNG_ID") + "');");
let trs = empty ? [document.getElementById("${infoPrefix}NotFound--${pageName}").content.querySelector("." + clsForTask + ",.cmn").outerHTML]
: ${infoPrefix}List.inStrings(foundTr.outerHTML, replacer);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.query.crdnIds = null;
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
// 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName : "pageObject['${pageName}'].control"
, sggCd : $("#sggCd--${pageName}").val()
, taskSeCd : $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val()
, crdnId : crdnId
}
ajax.get({
url : wctx.url("/" + params.taskSeCd + "/sprt/sprt02/010/main.do")
, data : params
, success : resp => {
dialog.open({
id : "totalInfoMainDialog"
, title : "개별총정보"
, content : resp
, size : "xxl"
, init : () => { }
, onClose : () => { }
});
}
});
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm();
// 기본 데이터 설정
$P.initData(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
// 검색조건
$P.control.query = $P.formFields.get();
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.sndngSeCdFrom = "03"; // 발송 구분 코드 - 03 부과고지서
$P.control.query.sndngSeCdTo = "08"; // 발송 구분 코드 - 08 체납고지서
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content : "검색된 자료가 없습니다."
, onOK : () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 선택 발송대상 등록 버튼 이벤트
$P.fnCreateSlctnTrgt = (title) => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) return;
// 파라미터 설정
let params = $P.control.query; // 검색 조건
params.callPurpose = "create"; // 호출 용도 (등록)
params.title = title; // 타이틀
params.crdnIds = selected.join(","); // Ids
params.sndngSeCd = "03"; // 발송 구분 코드(FIM047) - 03 부과고지서
params.rsndYn = "N"; // 재발송 여부
params.delYn = "N"; // 삭제 여부
$P.control.getInfo(params);
}
// 전체 발송대상 등록 버튼 이벤트
$P.fnCreateWholTrgt = (title) => {
if ($P.control.dataset.empty) {
dialog.alert({
content : "검색된 자료가 없습니다."
, onOK : () => { }
});
return;
}
// 파라미터 설정
let params = $P.control.query; // 검색 조건
params.callPurpose = "create"; // 호출 용도 (등록)
params.title = title; // 타이틀
params.sndngSeCd = "03"; // 발송 구분 코드 - 03 부과고지서
params.rsndYn = "N"; // 재발송 여부
params.delYn = "N"; // 삭제 여부
$P.control.getInfo(params);
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 선택 대상 등록 버튼 이벤트
$("#btnCreateSlctnTrgt--${pageName}").on("click", function() {
$P.fnCreateSlctnTrgt($(this).attr("title"));
});
// 전체 대상 등록 버튼 이벤트
$("#btnCreateWholTrgt--${pageName}").on("click", function() {
$P.fnCreateWholTrgt($(this).attr("title"));
});
// DataTables width 변경 조정
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = () => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 달력 초기화
initDatepicker("frmSearch--${pageName}");
$("#schSndngYmdFrom--${pageName}").datepicker("setDate", new Date());
$("#schSndngYmdTo--${pageName}").datepicker("setDate", new Date());
// 동적 검색
$("#byOutput--${pageName}").val("동적 검색");
// 사용자 이름
$("#schRgtrNm--${pageName}").prop("readonly", true);
}
// 기본 데이터 설정
$P.initData = (taskSeCd) => {
// 시군구 코드
$("#sggCd--${pageName}").val("${sggCd}");
// 업무 구분 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true);
// 일자
$("#schSndngYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date);
$("#schSndngYmdTo--${pageName}").datepicker("setDate", new Date());
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
let clsForTask = taskSeCd.toLowerCase();
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", clsForTask);
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + clsForTask + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
// URL 설정
$P.setURL(taskSeCd);
}
// 업무구분에 따른 URL 설정
$P.setURL = (taskSeCd) => {
$P.control.urls.load = wctx.url("/" + taskSeCd + $P.PrefixUrl + "/090/list.do"); // 검색
$P.control.urls.remove = wctx.url("/" + taskSeCd + $P.PrefixUrl + "/090/remove.do"); // 삭제
$P.control.urls.getInfo = wctx.url("/" + taskSeCd + $P.PrefixUrl + "/100/info.do"); // 고지서 세부 내용
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,425 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<!-- Page Body -->
<div class="card">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnLinkNxrpSpclB01--${pageName}" title="세외수입 체납상세 조회">
세외수입 조회
</button>
</span>
</div> <!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 총건수 / 총금액 -->
<div class="col-md-12 text-end">
<label class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">총건수 / 총금액</label>
<input type="text" class="form-control w-px-80" id="tnocs--${pageName}" name="tnocs" autocomplete="off" readonly />
<input type="text" class="form-control w-px-140" id="gramt--${pageName}" name="gramt" autocomplete="off" readonly />
</div>
<!-- 부과 일자 -->
<div class="col-md-6">
<label for="schLevyYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">부과일자</label>
<input type="text" class="form-control form-date" id="schLevyYmd--${pageName}" name="schLevyYmd"
data-fmt-type="day" autocomplete="off" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<!-- 최초 납기 일자 -->
<div class="col-md-6">
<label for="schFrstDudtYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">최초납기일자</label>
<input type="text" class="form-control form-date" id="schFrstDudtYmd--${pageName}" name="schFrstDudtYmd"
data-fmt-type="day" autocomplete="off" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<!-- 회계연도 -->
<div class="col-md-6">
<label for="schFyr--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">회계연도</label>
<input type="text" class="form-control w-px-80" id="schFyr--${pageName}" name="schFyr" maxlength="4" autocomplete="off" required />
</div>
<!-- 부과 번호 -->
<div class="col-md-6">
<label for="schLevyNoFrom--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">부과번호</label>
<input type="text" class="form-control w-px-80" id="schLevyNoFrom--${pageName}" name="schLevyNoFrom" maxlength="6" value="000000" autocomplete="off" required /> ~
<input type="text" class="form-control w-px-80" id="schLevyNoTo--${pageName}" name="schLevyNoTo" maxlength="6" value="999999" autocomplete="off" required />
</div>
<!-- 위반항목 -->
<div class="col-12">
<label for="schVltnId--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">위반항목</label>
<select class="form-select w-px-160" id="schVltnId--${pageName}" name="schVltnId">
<option value="">전체</option>
<c:forEach items="${FIM004List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
</div> <!-- <div class="row g-1"> -->
</div> <!-- <div class="container-search"> -->
</form>
<!-- 검색 조건 영역 -->
</div> <!-- <div class="card"> -->
<p></p>
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<div class="row g-1">
<!-- 발송 구분 -->
<div class="col-4">
<label for="sndngSeCd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">발송구분</label>
<select class="form-select w-px-160" id="sndngSeCd--${pageName}" name="sndngSeCd">
<c:forEach items="${FIM047List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 발송 일자 -->
<div class="col-md-4">
<label for="sndngYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">발송일자</label>
<input type="text" class="form-control form-date" id="sndngYmd--${pageName}" name="sndngYmd"
data-fmt-type="day" autocomplete="off" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<!-- 발송 종료 일자 -->
<div class="col-md-4">
<label for="sndngEndYmd--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end required">납기일자</label>
<input type="text" class="form-control form-date" id="sndngEndYmd--${pageName}" name="sndngEndYmd"
data-fmt-type="day" autocomplete="off" title="날짜 선택" maxlength="10" required />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</div>
<!-- 문서 번호 -->
<div class="col-md-12">
<label for="docNo--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">문서번호</label>
<input type="text" class="form-control w-30" id="docNo--${pageName}" name="docNo" />
</div>
<!-- 제목 명 -->
<div class="col-md-12">
<label for="ttlNm--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">제목</label>
<input type="text" class="form-control w-85" id="ttlNm--${pageName}" name="ttlNm" />
</div>
<!-- 기타 내용 -->
<div class="col-md-12">
<label for="etcCn--${pageName}" class="w-px-120 bg-lighter pe-2 col-form-label text-sm-end">기타내용</label>
<textarea type="text" class="form-control w-85" id="etcCn--${pageName}" name="etcCn" rows="2" data-maxlengthb="1000"></textarea>
</div>
</div>
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnSave--${pageName}" title="저장">
저장
</button>
</span>
</span>
</div> <!-- 업무 버튼 및 건수 표시 -->
</div> <!-- <div class="card"> -->
<!-- Page Body -->
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div> <!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
// 공통 코드
var FIM004 = new CommonCodes(${FIM004}, true); // 주정차위반 내역 코드
var FIM005 = new CommonCodes(${FIM005}, true); // 전용차로위반 내역 코드
var FIM006 = new CommonCodes(${FIM006}, true); // 장애인주차위반 내역 코드
var FIM061 = new CommonCodes(${FIM061}, true); // 전기차 충전구역 및 충전방해 위반 코드
var FIM064 = new CommonCodes(${FIM064}, true); // 화물자동차 밤샘주차 위반 코드
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
$P.formEditFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "nhtTrgt"
, prefixName: "고지서 발송 대상"
, infoSize: "xxl"
, keymapper: info => info ? info.CRDN_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
let create = ($P.callPurpose == "create");
ajax.post({
url: !create ? $P.control.urls.update : $P.control.urls.create
, data: info || {}
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 세외수입 과태료 대장 상세 조회
$P.linkNxrpSpclB01 = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/991/nxrpB01List.do")
, data: params || {}
, success: resp => {
// 연계 성공이면 저장 버튼 활성화
if (resp.saved) {
$("#schLevyYmd--${pageName}").prop("disabled", true); // 부과일자
$("#schFrstDudtYmd--${pageName}").prop("disabled", true); // 최초납기일자
$("#schFyr--${pageName}").prop("disabled", true); // 회계연도
$("#schLevyNoFrom--${pageName}").prop("disabled", true); // 시작 부과번호
$("#schLevyNoTo--${pageName}").prop("disabled", true); // 종료 부과번호
$("#schVltnId--${pageName}").prop("disabled", true); // 위반항목
// enabled
$("#btnSave--${pageName}").prop("disabled", false); // 저장 버튼
}
// S 또는 F 를 버튼 title 로 변경하여 메시지 출력
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, params.title);
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
}
});
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 제목 변경
$P.fnChangeTitle = () => {
let title = "";
let sndngYmd = $("#sndngYmd--${pageName}").val();
sndngYmd = sndngYmd.replace(/-/g, "");
title = sndngYmd.substring(0, 4) + "년";
title = title + " " + sndngYmd.substring(4, 6) + "월";
title = title + " " + $("#sndngSeCd--${pageName} :selected").text();
$("#ttlNm--${pageName}").val(title);
}
// 세외수입 과태료 대장 등록 자료 상세 조회 버튼 이벤트
$P.fnLinkNxrpSpclB01 = (title) => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: title + "를 조회하시겠습니까?"
, onOK: () => {
// 파라미터(params) 설정
let params = $P.formFields.get();
params.callPurpose = "update";
params.title = title; // 타이틀
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#taskSeCd--${pageName}").val(); // 업무 구분 코드
$P.linkNxrpSpclB01(params);
}
});
}
// 저장 버튼 이벤트
$P.fnSave = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content : $P.control.prefixName + " 정보를 저장하시겠습니까?"
, init: () => { setDialogZindex(); }
, onOK : () => {
// 검색조건과 저장 파라미터 객체를 합친다.
let params = $.extend({}, $P.formEditFields.get(), $P.formFields.get());
params.sndngRegSeCd = "01"; // 발송 등록 구분 코드(SNDNG_REG_SE_CD) - 01: 일괄
params.rsndYn = "N"; // 재발송 여부
params.delYn = "N"; // 삭제 여부
$P.control.save(params);
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmEdit--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 발송일자 변경 이벤트
$("#sndngYmd--${pageName}").on("change", function() {
$P.fnChangeTitle();
// 납기일자 변경
let sndngYmd = $("#sndngYmd--${pageName}").val();
sndngYmd = sndngYmd.replace(/-/g, "");
$("#sndngEndYmd--${pageName}").datepicker("setDate", new Date(sndngYmd.substring(0, 4), sndngYmd.substring(4, 6), 0)); // 납기일자
});
// 발송구분 변경 이벤트
$("#sndngSeCd--${pageName}").on("change", function() {
$P.fnChangeTitle();
});
// 업무 버튼 이벤트
$("#btnLinkNxrpSpclB01--${pageName}").on("click", function() {
$P.fnLinkNxrpSpclB01($(this).attr("title")); // 세외수입 체납상세정보 조회
});
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장 버튼
}
// 초기 화면 설정
$P.initForm = () => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#taskSeCd--${pageName}").val("${taskSeCd}"); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schLevyYmd--${pageName}").datepicker("setDate", new Date()); // 부과일자
$("#schFrstDudtYmd--${pageName}").datepicker("setDate", new Date()); // 최초납기일자
$("#schFyr--${pageName}").val(new Date().getFullYear()); // 회계연도
$("#schLevyNoFrom--${pageName}").val("000001"); // 시작 부과번호
$("#schLevyNoTo--${pageName}").val("999999"); // 종료 부과번호
initDatepicker("frmEdit--${pageName}"); // 달력 초기화
$("#sndngYmd--${pageName}").datepicker("setDate", new Date()); // 발송 일자
$("#sndngEndYmd--${pageName}").datepicker("setDate", new Date()); // 발송 종료 일자
$("#sndngSeCd--${pageName}").val("03").prop("selected", true); // 발송구분
$("#sndngYmd--${pageName}").datepicker("setDate", new Date()); // 발송일자
$("#btnSave--${pageName}").prop("disabled", true); // 저장
// 업무 구분별 설정
$P.setTask("${taskSeCd}");
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.create = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/100/createList.do"); // 등록
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무에 따른 위반 내용
let vltnIdCode = [];
if (taskSeCd == "PVS") { // 주정차 위반
vltnIdCode = FIM004.list();
} else if (taskSeCd == "BPV") { // 전용차로 위반
vltnIdCode = FIM005.list();
} else if (taskSeCd == "DPV") { // 장애인 전용
vltnIdCode = FIM006.list();
} else if (taskSeCd == "ECA") { // 전기차 주차 위반
vltnIdCode = FIM061.list();
} else if (taskSeCd == "PES") { // 밤샘 주차 위반
vltnIdCode = FIM064.list();
} else {
return;
}
// 위반 항목
$("#schVltnId--${pageName}").empty();
$("#schVltnId--${pageName}").append("<option value=''>" + "전체" + "</option>");
$(vltnIdCode).each(function(index, item) {
$("#schVltnId--${pageName}").append("<option value='" + vltnIdCode[index].code +"'>" + vltnIdCode[index].value + "</option>");
});
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,699 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무 구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 발송일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSndngYmdFrom--${pageName}">발송일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schSndngYmdFrom--${pageName}" name="schSndngYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schSndngYmdTo--${pageName}" name="schSndngYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 발송 등록 구분 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSndngRegSeCd--${pageName}">등록구분</label>
<select class="form-select w-px-80" id="schSndngRegSeCd--${pageName}" name="schSndngRegSeCd">
<option value="">전체</option>
<c:forEach items="${FIM067List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 발송 구분 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSndngSeCd--${pageName}">발송구분</label>
<select class="form-select w-px-160" id="schSndngSeCd--${pageName}" name="schSndngSeCd">
<option value="">전체</option>
<c:forEach items="${FIM047List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 동적검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div> <!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 등록일자, 수정일자 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-6">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnCreate--${pageName}" title="고지서 발송 등록">
발송 등록
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnRemove--${pageName}" title="고지서 발송 삭제">
발송 삭제
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('TASK_SE_CD', this.innerText, 'codeValue', 'FIM054');">업무구분</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('SNDNG_REG_SE_CD', this.innerText, 'codeValue', 'FIM067');">등록구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('SNDNG_SE_CD', this.innerText, 'codeValue', 'FIM067');">발송구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VLTN_ARTCL', this.innerText, 'match', 'part');">위반항목</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SNDNG_YMD', this.innerText, 'ymd', '');">발송일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SNDNG_END_YMD', this.innerText, 'ymd', '');">납기일자</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('TNOCS', this.innerText, 'match', 'part');">총건수</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('GRAMT', this.innerText, 'match', 'part');">총금액</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('DOC_NO', this.innerText, 'match', 'part');">문서번호</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('TTL_NM', this.innerText, 'match', 'part');">제목</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{SNDNG_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{SNDNG_ID}" onchange="pageObject['${pageName}'].control.select('{SNDNG_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_REG_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_SE_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_END_YMD}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{TNOCS}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{GRAMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{DOC_NO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{TTL_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="17" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
// 공통 코드
var FIM047 = new CommonCodes(${FIM047}, true);
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "nhtSndng"
, prefixName: "고지서 발송 현황"
, keymapper: info => info ? info.SNDNG_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "xxl"
, formats: {
SNDNG_YMD: dateFormat
, SNDNG_END_YMD: dateFormat
, TNOCS: numberFormat
, GRAMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.SNDNG_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 삭제 버튼
$("#btnRemove--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 상세정보 dialog
$P.control.getInfo = (sndngId) => {
if (typeof sndngId == "undefined" || sndngId == null || sndngId == "") return;
let params = {
title: $P.control.prefixName + " 상세 정보" // 타이틀
, callPurpose: "view" // 호출 용도
, fetchSize: $P.control.defaultFetchSize // 한번에 조회되는 자료 건수
, pageNum: 1 // 페이지 번호
, sggCd: $("#sggCd--${pageName}").val() // 시군구 코드
, taskSeCd: $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val() // 업무 구분 코드
, sndngId: sndngId // 발송 ID
}
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/120/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("DtlDialog--${pageName}")
, title: params.title
, content: resp
, size: $P.control.infoSize
, init: () => { setDialogZindex(); }
});
}
});
}
// 삭제 callback
$P.control.onRemove = (resp) => {
let btnTitle = $("#btnRemove--${pageName}").attr("title");
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, btnTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) { $P.fnRefreshList(); } // 자료 재조회
}
// 삭제
$P.control.remove = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/110/remove.do")
, data: params
, success: resp => $P.control.onRemove(resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("SNDNG_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].control.getInfo('" + dataItem.getValue("SNDNG_ID") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
// 발송 등록 dialog -> callback 추가
$P.getNhtSndngInfo = (params) => {
if (!params) return;
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/100/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "nhtTrgtDialog--${pageName}"
, title: "고지서 발송 대상"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 삭제사유 callback
$P.callbackRsn = (obj) => {
// 서버에 전송할 data(파라미터) 생성
let params = {};
let selected = $P.control.dataset.getKeys("selected");
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
params.sndngIds = selected.join(","); // 발송 Ids
params.delRsn = obj.reason; // 삭제 사유
$P.control.remove(params);
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get();
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.delYn = "N"; // 삭제 여부
// 발송구분이 "전체"로 선택 되었다면..
if ($P.control.query.schSndngSeCd == "") {
$P.control.query.sndngSeCdFrom = "03"; // 발송 구분 코드(FIM047) - 03: 고지서
$P.control.query.sndngSeCdTo = "08"; // 발송 구분 코드(FIM047) - 08: 체납고지서
}
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 등록 버튼 이벤트
$P.fnCreate = (title) => {
let params = {
callPurpose: "create"
, title: title // 타이틀
, sggCd: $("#sggCd--${pageName}").val() // 시군구 코드
, taskSeCd: $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val() // 업무 구분 코드
};
$P.getNhtSndngInfo(params);
}
// 발송 삭제 버튼 이벤트
$P.fnRemove = (title) => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) {
dialog.alert({
content: "선택하신 " + $P.control.prefixName + " 정보가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// 삭제 메세지 확인
dialog.alert({
content: "선택하신 " + selected.length + "건의 " + $P.control.prefixName + " 정보를 삭제하시겠습니까?"
, onOK: () => {
// 삭제 사유 입력
fetch(wctx.url("/resources/html/inputRsnDialog.html"))
.then(function(resp) { return resp.text(); })
.then(function(template) {
dialog.open({
id: "inputDelRsnDialog"
, title: title
, size: "lg"
, content: template
, init: () => { setDialogZindex(); }
, onOK: () => {
$P.callbackRsn({ reason: $("#reason").val() });
}
});
});
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 업무 버튼 이벤트
$("#btnCreate--${pageName}").on("click", function() {
$P.fnCreate($(this).attr("title")); // 고지서 발송 등록
});
$("#btnRemove--${pageName}").on("click", function() {
$P.fnRemove($(this).attr("title")); // 고지서 발송 삭제
});
// DataTables width 변경 조정
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schSndngYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date);
$("#schSndngYmdTo--${pageName}").datepicker("setDate", new Date());
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/110/list.do"); // 검색
// 발송 구분에 "전체" 추가
let reasons = FIM047.list().filter(reason => reason.code >= "03" && reason.code <= "08");
$("#schSndngSeCd--${pageName}").empty();
$("#schSndngSeCd--${pageName}").append("<option value=''>" + "전체" + "</option>");
$("#schSndngSeCd--${pageName}").append(reasons.map(reason => "<option value='" + reason.code + "'>" + reason.value + "</option>").join());
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + taskSeCd.toLowerCase() + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,494 +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>
<!-- inner page html -->
<div class="content-pop">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<!-- Page Body -->
<div class="card">
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" />
<input type="hidden" id="sndngId--${pageName}" name="sndngId" />
</form>
<!-- 입력 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀 저장">
엑셀 저장
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnPrintNhtPdf01--${pageName}" title="고지서 출력(PDF-A4)">
고지서 출력(PDF-A4)
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnPrintNhtPdf02--${pageName}" title="고지서 출력(PDF-Letter)">
고지서 출력(PDF-Letter)
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnPrintNhtOutsourcing--${pageName}" title="고지서 출력(외주파일)">
고지서 출력(외주파일)
</button>
<button type="button" class="btn btn-primary w-px-120" id="btnCreateSndbk--${pageName}" title="반송 등록">
반송 확인
</button>
</span>
</span>
</div> <!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 120px;">발송상태</th>
<th class="cmn" style="width: 160px;">등기번호</th>
<th class="cmn" style="width: 120px;">발송일자</th>
<th class="cmn" style="width: 120px;">발송종료일자</th>
<th class="cmn" style="width: 200px;">성명</th>
<th class="cmn" style="width: 100px;">우편번호</th>
<th class="cmn" style="width: 280px;">주소</th>
<th class="cmn" style="width: 320px;">상세주소</th>
<th class="cmn" style="width: 120px;">배달일자</th>
<th class="cmn" style="width: 120px;">배달시각</th>
<th class="cmn" style="width: 200px;">미배달사유</th>
<th class="cmn" style="width: 200px;">수령인</th>
<th class="cmn" style="width: 200px;">수령인관계</th>
<th class="cmn" style="width: 180px;">단속일시</th>
<th class="cmn" style="width: 160px;">차량번호</th>
<th class="cmn" style="width: 160px;">단속법정동</th>
<th class="cmn" style="width: 280px;">단속장소</th>
<th class="cmn" style="width: 100px;">회계연도</th>
<th class="cmn" style="width: 100px;">부과번호</th>
<th class="cmn" style="width: 120px;">부과일자</th>
<th class="cmn" style="width: 120px;">납기일자</th>
<th class="cmn" style="width: 120px;">과태료금액</th>
<th class="cmn" style="width: 120px;">본세</th>
<th class="cmn" style="width: 120px;">가산금</th>
<th class="cmn" style="width: 120px;">미납금액</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{SNDNG_DTL_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_DTL_STTS_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RG_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_END_YMD}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DLVR_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DLVR_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{UNDLVR_RSN_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ACTL_RCPN_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_REL_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_DT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{FYR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DUDT_YMD}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{PCPTAX}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{ADAMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{SUM_AMT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="31" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div> <!-- DataTables(그리드) -->
</div> <!-- <div class="card"> -->
<!-- Page Body -->
<span id="tempArea--${pageName}" hidden></span>
</div> <!-- <div class="container flex-grow-1 px-0"> -->
<!-- Content -->
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "nhtSndngDtl"
, prefixName: "고지서 발송 상세"
, keymapper: info => info ? info.SNDNG_DTL_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, formats: {
SNDNG_YMD: dateFormat
, SNDNG_END_YMD: dateFormat
, DLVR_YMD: dateFormat
, LEVY_YMD: dateFormat
, DUDT_YMD: dateFormat
, FFNLG_AMT: numberFormat
, PCPTAX: numberFormat
, ADAMT: numberFormat
, SUM_AMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경 이벤트
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.SNDNG_DTL_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("SNDNG_DTL_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 반송 확인(종적결과 등록)
$P.createSndbk = (params) => {
if (!params) return;
ajax.post({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/230/createSndbkList.do")
, data: params || {}
, success: resp => {
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, params.title);
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { $P.fnRefreshList(); } // 자료 재조회
});
}
});
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.delYn = "N"; // 삭제 여부
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 고지서 출력 버튼 이벤트
$P.fnMakeFileNht = (title, fileType, paper) => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
let submitParam = {
sggCd: $P.control.dataset.getValue("SGG_CD") // 시군구 코드
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
, sndngId: $P.control.dataset.getValue("SNDNG_ID") // 발송 ID
};
let url = "";
let fileTypeName = "";
if (fileType == "pdf") {
url = wctx.url("/" + submitParam.taskSeCd + "${infoPrefixUrl}" + "/120/makeNhtPdf.do");
fileTypeName = "PDF 파일";
} else if (fileType == "outsourcing") {
url = wctx.url("/" + submitParam.taskSeCd + "${infoPrefixUrl}" + "/120/makeNhtOutsourcing.do");
fileTypeName = "외주 요청 파일";
}
let inBrowser = false;
if (fileType == "pdf") {
submitParam.paperSeCd = paper;
inBrowser = true;
}
if (inBrowser) {
var parameter = toQuery(submitParam);
var filenameInHeader = "";
fetch(url + "?" + parameter)
.then((response) => {
var header = response.headers.get('Content-Disposition');
if(!header){
response.json().then((responseJson)=>{
dialog.alert({
content: fileTypeName+" 생성 중 오류가 발생하였습니다."
+"<br/>"
+responseJson.description,
init: () => { setDialogZindex(); }
});
});
new Error("");
}
var parts = header.split(';');
filenameInHeader = decodeURIComponent(parts[1].split('=')[1]);
return response.blob();
})
.then((blob) => {
openPDF(blob, filenameInHeader);
})
.catch(()=>{});
} else {
var parameter = toQuery(submitParam);
document.location.href = url + "?" + parameter;
}
}
// 중복자료 삭제
$P.fnRemoveDpcnData = () => {
//
}
// 반송(종적결과) 확인
$P.fnCreateSndbk = () => {
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
dialog.alert({
content: "종적결과를 확인하시겠습니까?"
, onOK: () => {
// 파리미터 설정
let params = $P.formFields.get(); // mainQuery
params.title = title; // 타이틀
$P.createSndbk(params);
}
});
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
// 업무 버튼 이벤트
$("#btnPrintNhtPdf01--${pageName}").on("click", function() {
$P.fnMakeFileNht($(this).attr("title"), "pdf", "01"); // 고지서 출력(PDF-A4)
});
$("#btnPrintNhtPdf02--${pageName}").on("click", function() {
$P.fnMakeFileNht($(this).attr("title"), "pdf", "01"); // 고지서 출력(PDF-Letter)
});
$("#btnPrintNhtOutsourcing--${pageName}").on("click", function() {
$P.fnMakeFileNht($(this).attr("title"), "outsourcing") // 고지서 출력(외주파일)
});
$("#btnCreateSndbk--${pageName}").on("click", function() {
$P.fnCreateSndbk($(this).attr("title")); // 반송 등록
});
// DataTables width 변경 조정
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
// DataTables 스크롤을 위해서 다이얼로그 화면이 생성된 후 Dataset을 설정한다.
$("#${infoPrefix}Dialog--${openerPageName}").on("shown.bs.modal", function (e) {
$P.control.setData({
${infoPrefix}List: ${nhtSndngDtlList}
, ${infoPrefix}Start: ${nhtSndngDtlStart}
, ${infoPrefix}Fetch: ${nhtSndngDtlFetch}
, ${infoPrefix}Total: ${nhtSndngDtlTotal}
});
});
}
// 초기 화면 설정
$P.initForm = () => {
// 화면 초기화
$("#frmEdit--${pageName}")[0].reset();
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#taskSeCd--${pageName}").val("${taskSeCd}"); // 업무 구분 코드
$("#sndngId--${pageName}").val("${sndngId}"); // 발송 ID
// 업무 구분별 설정
$P.setTask("${taskSeCd}");
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/120/list.do"); // 검색
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 화면 설정
$P.initForm();
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,632 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container flex-grow-1 px-0">
<!-- Page Body -->
<div class="card">
<div class="wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div> <!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" data-map="SGG_CD" />
<input type="hidden" id="taskSeCd--${pageName}" name="taskSeCd" data-map="TASK_SE_CD" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 발송 구분 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSndngSeCd--${pageName}">발송구분</label>
<select class="form-select w-px-160" id="schSndngSeCd--${pageName}" name="schSndngSeCd">
<option value="">전체</option>
<c:forEach items="${FIM047List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 발송 일자 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSndngYmd--${pageName}">발송일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schSndngYmd--${pageName}" name="schSndngYmd"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 발송 상세 ID -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="sndngDtlId--${pageName}">발송번호</label>
<input type="text" class="form-control w-px-200" id="sndngDtlId--${pageName}" name="sndngDtlId" autocomplete="off" />
</div>
<!-- 회계연도 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schFyr--${pageName}">회계연도</label>
<input type="text" class="form-control w-px-60" id="schFyr--${pageName}" name="schFyr" maxlength="4" autocomplete="off" />
</div>
<!-- 고지 번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schLevyNoFrom--${pageName}">고지번호</label>
<input type="text" class="form-control w-px-80" id="schLevyNoFrom--${pageName}" name="schLevyNoFrom" maxlength="6" autocomplete="off" />
~
<input type="text" class="form-control w-px-80" id="schLevyNoTo--${pageName}" name="schLevyNoTo" maxlength="6" autocomplete="off" />
</div>
<!-- 수령인 명 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRcpnNm--${pageName}">수령인명</label>
<input type="text" class="form-control w-px-200" id="schRcpnNm--${pageName}" name="schRcpnNm" autocomplete="off" />
</div>
<!-- 차량번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVhrno--${pageName}">차량번호</label>
<input type="text" class="form-control w-px-160" id="schVhrno--${pageName}" name="schVhrno" autocomplete="off" />
</div>
<!-- 등기 번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRgNo--${pageName}">등기번호</label>
<input type="text" class="form-control w-px-160" id="schRgNo--${pageName}" name="schRgNo" autocomplete="off" />
</div>
</div> <!-- <div class="row g-1"> -->
</div> <!-- <div class="container-search"> -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
</span>
</div> <!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-400" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 200px;">발송번호</th>
<th class="cmn" style="width: 200px;">발송구분</th>
<th class="cmn" style="width: 120px;">발송일자</th>
<th class="cmn" style="width: 120px;">발송종료일자</th>
<th class="cmn" style="width: 160px;">등기번호</th>
<th class="cmn" style="width: 120px;">수납</th>
<th class="cmn" style="width: 160px;">발송상세상태</th>
<th class="cmn" style="width: 200px;">수령인</th>
<th class="cmn" style="width: 120px;">수령인생일</th>
<th class="cmn" style="width: 100px;">우편번호</th>
<th class="cmn" style="width: 280px;">주소</th>
<th class="cmn" style="width: 320px;">상세주소</th>
<th class="cmn" style="width: 180px;">단속일시</th>
<th class="cmn" style="width: 140px;">차량번호</th>
<th class="cmn" style="width: 160px;">법정동</th>
<th class="cmn" style="width: 280px;">단속장소</th>
<th class="cmn" style="width: 100px;">회계연도</th>
<th class="cmn" style="width: 100px;">부과번호</th>
<th class="cmn" style="width: 120px;">부과일자</th>
<th class="cmn" style="width: 120px;">납기일자</th>
<th class="cmn" style="width: 120px;">과태료금액</th>
<th class="cmn" style="width: 120px;">본세</th>
<th class="cmn" style="width: 120px;">가산금</th>
<th class="cmn" style="width: 200px;">전자납부번호</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{SNDNG_DTL_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{SNDNG_DTL_ID}" onchange="pageObject['${pageName}'].control.select('{SNDNG_DTL_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_DTL_ID}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_END_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RG_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_RCVMT_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_DTL_STTS_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_BRDT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_DT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{FYR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{LEVY_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DUDT_YMD}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{PCPTAX}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{ADAMT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{EPAYNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="odd">
<td valign="top" colspan="31" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div> <!-- DataTables(그리드) -->
<p></p>
<!-- 입력 영역 -->
<form id="frmEdit--${pageName}" name="frmEdit">
<div class="container-search-detail">
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<!-- 배달 일자 -->
<label class="form-label fw-bold form-search-title w-px-120 text-end required" for="dlvrYmd--${pageName}">발송일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="dlvrYmd--${pageName}" name="dlvrYmd"
data-fmt-type="day" title="시작 날짜 선택" required />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
<!-- 미배달 사유 코드 -->
<label class="form-label fw-bold form-search-title w-px-120 text-end required" for="undlvrRsnCd--${pageName}">미배달사유</label>
<select class="form-select w-px-160" id="undlvrRsnCd--${pageName}" name="undlvrRsnCd" required>
<option value="">선택하세요</option>
<c:forEach items="${FIM081List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-120" id="btnSave--${pageName}" title="반송 등록">
반송 등록
</button>
</span>
</span>
</div> <!-- 업무 버튼 및 건수 표시 -->
</div>
</form>
<!-- 입력 영역 -->
</div> <!-- <div class="wrapper-list"> -->
</div> <!-- <div class="card"> -->
<!-- Page Body -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// infoDialog 호출 용도(view 조회(편집불가), create 등록, update 수정)
$P.callPurpose = "${callPurpose}";
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
$P.formEditFields = new FimsFormFields("#frmEdit--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "sndbkTrgt"
, prefixName: "반송 대상"
, keymapper: info => info ? info.SNDNG_DTL_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, formats: {
SNDNG_YMD: dateFormat
, SNDNG_END_YMD: dateFormat
, LEVY_YMD: dateFormat
, DUDT_YMD: dateFormat
, FFNLG_AMT: numberFormat
, PCPTAX: numberFormat
, ADAMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.SNDNG_DTL_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
// 저장 callback
$P.control.onSave = (resp) => {
let dialogTitle = $("#" + $P.control.prefix + "Dialog--${openerPageName}").find("h5.modal-title").html();
let showMessage = resp.rtnMsg.replace(/[S]|[F]/g, dialogTitle);
// 메시지 출력
dialog.alert({
content: showMessage
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
if (resp.saved) {
dialog.close($P.control.prefix + "Dialog--${openerPageName}");
}
}
// 저장
$P.control.save = (info) => {
if (!info) return;
let create = ($P.callPurpose == "create");
ajax.post({
url: !create ? $P.control.urls.update : $P.control.urls.create
, data: info || {}
, success: resp => $P.control.onSave(resp)
});
}
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let trs = empty ?
[document.getElementById("${infoPrefix}NotFound--${pageName}").innerHTML] : <%-- from template#${infoPrefix}NotFound --%>
${infoPrefix}List.inStrings(
document.getElementById("${infoPrefix}Row--${pageName}").innerHTML, <%-- from template#${infoPrefix}Row --%>
(str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("SNDNG_DTL_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');")
);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경 이벤트
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get(); // 검색 조건
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
content: "검색된 자료가 없습니다."
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 반송 등록 버튼 이벤트
$P.fnSave = () => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) {
dialog.alert({
content: "선택하신 " + $P.control.prefixName + " 정보가 없습니다."
, init: () => { setDialogZindex(); }
, onOK: () => { }
});
return;
}
// validate 확인
if (!customValidate($("#frmEdit--${pageName}").find("input, select, textarea"))) return;
let params = $P.formEditFields.get(); // formFields
params.sggCd = $("#sggCd--${pageName}").val() // 시군구 코드
params.taskSeCd = $("#taskSeCd--${pageName}").val() // 업무 구분 코드
params.sndngDtlIds = selected.join(","); // 발송 상세 Ids
params.undlvrRsnNm = $("#undlvrRsnCd--${pageName} option:selected").text(); // 미배달 사유 명
params.sndngDtlSttsCd = "05"; // 발송 상세 상태 코드(FIM050) - 05: 반송
dialog.alert({
content: "선택하신 " + selected.length + "건의 " + $P.control.prefixName + " 정보를 등록하시겠습니까?"
, onOK: () => {
$P.control.save(params);
}
});
}
/**************************************************************************
* 초기 설정
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 버튼 이벤트
$("#btnSave--${pageName}").on("click", () => $P.fnSave()); // 저장
// DataTables width 변경 조정 업무별 그리드가 존재 한다면.. crdn06010-main.jsp 참고
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#taskSeCd--${pageName}").val("${taskSeCd}"); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schSndngYmd--${pageName}").datepicker("setDate", new Date()); // 발송 일자
$("#dlvrYmd--${pageName}").datepicker("setDate", new Date()); // 배달 일자
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/210/list.do"); // 검색
$P.control.urls.create = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/230/create.do"); // 반송 등록
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

@ -1,810 +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>
<!-- inner page html -->
<div class="content-wrapper">
<!-- Content -->
<div class="container-xxl flex-grow-1 px-0">
<div class="card wrapper-list">
<!-- 상단 버튼 -->
<div class="container-page-btn">
<button type="button" class="btn btn-outline-dark w-px-120" id="btnReset--${pageName}" title="초기화">
초기화
</button>
<span class="container-window-btn-right">
<button type="button" class="btn btn-search w-px-120" id="btnSearch--${pageName}" title="검색">
검색
</button>
<button type="button" class="btn btn-excel w-px-120" id="btnExcel--${pageName}" title="엑셀">
엑셀
</button>
</span>
</div>
<!-- 상단 버튼 -->
<!-- 검색 조건 영역 -->
<form id="frmSearch--${pageName}" name="frmSearch">
<!-- hidden -->
<input type="hidden" id="sggCd--${pageName}" name="sggCd" />
<!-- 메인 조건 -->
<div class="container-search">
<div class="row g-1">
<!-- 업무 구분 -->
<div class="col-12">
<span class="form-label fw-bold form-search-title w-px-120 text-end">업무구분</span>
<span class="form-search-linebox">
<c:forEach items="${taskListForSgg}" var="item">
<label>
<input type="radio" class="form-check-input" name="taskSeCd" alt="업무구분"
value="${item.code}" onchange="pageObject['${pageName}'].fnResetAndChangeBiz(this.value);">
${item.value}
</label>
</c:forEach>
</span>
</div>
<!-- 배달 일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schDlvrYmdFrom--${pageName}">배달일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schDlvrYmdFrom--${pageName}" name="schDlvrYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schDlvrYmdTo--${pageName}" name="schDlvrYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 미배달 사유 코드 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schUndlvrRsnCd--${pageName}">미배달사유</label>
<select class="form-select w-px-160" id="schUndlvrRsnCd--${pageName}" name="schUndlvrRsnCd">
<option value="">전체</option>
<c:forEach items="${FIM081List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 발송일자 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSndngYmdFrom--${pageName}">발송일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schSndngYmdFrom--${pageName}" name="schSndngYmdFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schSndngYmdTo--${pageName}" name="schSndngYmdTo"
data-fmt-type="day" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 발송 구분 -->
<div class="col-6">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schSndngSeCd--${pageName}">발송구분</label>
<select class="form-select w-px-160" id="schSndngSeCd--${pageName}" name="schSndngSeCd">
<option value="">전체</option>
<c:forEach items="${FIM047List}" var="item">
<option value="${item.code}">${item.value}</option>
</c:forEach>
</select>
</div>
<!-- 선택등기 표시 -->
<div class="col-6 form-check">
<input type="checkbox" class="form-check-input" id="schChcRgIndct--${pageName}" name="schChcRgIndct" value="Y" />
<label class="form-check-label" for="schChcRgIndct--${pageName}">선택등기표시</label>
</div>
<!-- 동적검색 -->
<div class="col-6">
<input type="hidden" id="by--${pageName}" name="by" />
<input type="text" class="form-control fw-bold w-px-120 text-end" id="byOutput--${pageName}" value="동적 검색" readonly />
<input type="hidden" id="mainOption--${pageName}" name="mainOption" />
<input type="hidden" id="subOption--${pageName}" name="subOption" />
<input type="text" class="form-control w-px-400" id="term--${pageName}" name="term" autocomplete="off" />
<!-- 상세 검색조건 버튼 -->
<span class="flr">
<button type="button" class="btn btn-open-detail" data-bs-toggle="collapse" data-bs-target="#searchDetail--${pageName}">
<i class="bx bx-chevron-down"></i>
상세검색
</button>
</span>
</div>
</div>
</div>
<!-- 메인 조건 -->
<!-- 상세 조건 -->
<div id="searchDetail--${pageName}" class="container-search container-search-detail collapse">
<div class="row g-1">
<!-- 단속일자 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schCrdnYmdFrom--${pageName}">단속일자</label>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schCrdnYmdFrom--${pageName}" name="schCrdnYmdFrom"
data-fmt-type="day" autocomplete="off" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schCrdnYmdTo--${pageName}" name="schCrdnYmdTo"
data-fmt-type="day" autocomplete="off" title="종료 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 차량번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schVhrno--${pageName}">차량번호</label>
<input type="text" class="form-control w-px-160" id="schVhrno--${pageName}" name="schVhrno" autocomplete="off" />
</div>
<!-- 납부자번호 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNm--${pageName}">납부자번호</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNm--${pageName}" name="schRtpyrNm" autocomplete="off" />
</div>
<!-- 납부자명 -->
<div class="col-4">
<label class="form-label fw-bold form-search-title w-px-120 text-end" for="schRtpyrNo--${pageName}">납부자명</label>
<input type="text" class="form-control w-px-160" id="schRtpyrNo--${pageName}" name="schRtpyrNo" autocomplete="off" />
</div>
<!-- 등록일자, 수정일자 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRegDateOpt--${pageName}" name="schRegDateOpt">
<option value="regDt">등록일자</option>
<option value="mdfcnDt">수정일자</option>
</select>
<span class="form-search-linebox">
<input type="text" class="form-control form-date" id="schRegDateFrom--${pageName}" name="schRegDateFrom"
data-fmt-type="day" title="시작 날짜 선택" />
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
~
<input type="text" class="form-control form-date" id="schRegDateTo--${pageName}" name="schRegDateTo"
data-fmt-type="day" title="종료 날짜 선택">
<button type="button" class="bx bx-lg bx-calendar bg-white"></button>
</span>
</div>
<!-- 등록자명, 수정자명 -->
<div class="col-4">
<select class="form-select w-px-120 text-center" id="schRgtrOpt--${pageName}" name="schRgtrOpt">
<option value="rgtr">등록자</option>
<option value="mdfr">수정자</option>
</select>
<input type="hidden" id="schRgtrCd--${pageName}" name="schRgtrCd" />
<input type="text" class="form-control w-px-160" id="schRgtrNm--${pageName}" name="schRgtrNm" />
<button type="button" class="btn btn-sm btn-outline-dark" id="btnFindUser--${pageName}" title="사용자 검색">검색</button>
</div>
</div>
</div> <!-- 상세 조건 -->
</form>
<!-- 검색 조건 영역 -->
<!-- 업무 버튼 및 건수 표시 -->
<div>
<span class="container-page-btn">
<!-- 건수, 페이지 표시 -->
<div class="d-flex flex-row justify-content-between">
<span class="dataTables_info" id="paging--${pageName}PagingInfo" role="status" aria-live="polite"></span>
<ul class="pagination pagination-primary" id="paging--${pageName}">
</ul>
</div>
<!-- 업무 버튼 -->
<span class="container-window-btn-right">
<button type="button" class="btn btn-primary w-px-160" id="btnCreateSndbk--${pageName}" title="반송 등록">
수기 반송 등록
</button>
<button type="button" class="btn btn-primary w-px-160" id="btnCreateWholSvbtc--${pageName}" title="전체 공시송달 등록">
전체 공시송달 등록
</button>
<button type="button" class="btn btn-primary w-px-160" id="btnCreateSlctnSndngLink--${pageName}" title="선택 통합우편 발송">
선택 통합우편 발송
</button>
<button type="button" class="btn btn-primary w-px-160" id="btnCreateWholSndngLink--${pageName}" title="전체 통합우편 발송">
전체 통합우편 발송
</button>
</span>
</span>
</div>
<!-- 업무 버튼 및 건수 표시 -->
<!-- DataTables(그리드) -->
<div class="card-datatable text-nowrap">
<div class="dataTables_wrapper dt-bootstrap5 no-footer" id="DataTables_Table_0_wrapper--${pageName}">
<div class="table-responsive ox-scroll oy-scroll h-px-500" id="table-responsive--${pageName}">
<table class="table-layout-fixed dataTable datatables-ajax table table-bordered no-footer" id="DataTables_Table_0--${pageName}" aria-describedby="DataTables_Table_0_info">
<thead class="sticky-thead">
<tr id="theadTr--${pageName}"
data-by="by--${pageName}" data-by-output="byOutput--${pageName}" data-main-option="mainOption--${pageName}" data-sub-option="subOption--${pageName}">
</tr>
</thead>
<tbody id="tbody--${pageName}">
</tbody>
<template id="${infoPrefix}Col--${pageName}">
<th class="cmn" style="width: 72px;">No.</th>
<th class="cmn" style="width: 56px;"><input type="checkbox" class="form-check-input" id="gridAllCheckbox--${pageName}" onchange="pageObject['${pageName}'].control.select(this.checked);" /></th>
<th class="cmn" style="width: 160px;">업무구분</th>
<th class="cmn" style="width: 140px;">고지번호</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RG_NO', this.innerText, 'match', 'part');">등기번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('DLVR_YMD', this.innerText, 'ymd', '');">배달일자</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('DLVR_TM', this.innerText, 'time', '');">배달시간</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('UNDLVR_RSN_NM', this.innerText, 'match', 'part');">미배달사유</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('ACTL_RCPN_NM', this.innerText, 'match', 'part');">수령인</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RCPN_REL_NM', this.innerText, 'match', 'part');">수령인관계</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('SNDNG_SE_CD', this.innerText, 'codeValue', 'FIM047');">발송구분</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('SNDNG_YMD', this.innerText, 'ymd', '');">발송일자</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('FFNLG_AMT', this.innerText, 'match', 'part');">과태료금액</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('PCPTAX', this.innerText, 'match', 'part');">본세</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('ADAMT', this.innerText, 'match', 'part');">가산금</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('RCPN_NM', this.innerText, 'match', 'part');">수령인명</th>
<th class="cmn" style="width: 100px;" onclick="searchFromGridTitle('RCPN_ZIP', this.innerText, 'match', 'part');">우편번호</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('RCPN_ADDR', this.innerText, 'match', 'part');">수령인주소</th>
<th class="cmn" style="width: 320px;" onclick="searchFromGridTitle('RCPN_DTL_ADDR', this.innerText, 'match', 'part');">수령인상세주소</th>
<th class="cmn" style="width: 180px;" onclick="searchFromGridTitle('CRDN_YMD', this.innerText, 'ymd', '');">단속일시</th>
<th class="cmn" style="width: 140px;" onclick="searchFromGridTitle('VHRNO', this.innerText, 'match', 'part');">차량번호</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('RTPYR_SE_CD', this.innerText, 'codeValue', 'FIM011');">납부자구분</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('RTPYR_NO', this.innerText, 'ymd', '');">납부자번호</th>
<th class="cmn" style="width: 200px;" onclick="searchFromGridTitle('RTPYR_NM', this.innerText, 'match', 'part');">납부자명</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('VLTN_ARTCL', this.innerText, 'match', 'part');">위반항목</th>
<th class="cmn" style="width: 120px;" onclick="searchFromGridTitle('CRDN_STDG_NM', this.innerText, 'match', 'part');">단속법정동</th>
<th class="cmn" style="width: 280px;" onclick="searchFromGridTitle('CRDN_PLC', this.innerText, 'match', 'part');">단속장소</th>
<th class="cmn" style="width: 160px;" onclick="searchFromGridTitle('CRDN_STTS_CD', this.innerText, 'codeValue', 'FIM010');">처리상태</th>
<th class="cmn" style="width: 180px;">등록일시</th>
<th class="cmn" style="width: 140px;">등록사용자</th>
<th class="cmn" style="width: 180px;">수정일시</th>
<th class="cmn" style="width: 140px;">수정사용자</th>
<th class="cmn dummy-th"></th>
</template>
<template id="${infoPrefix}Row--${pageName}">
<tr data-key="{SNDNG_DTL_ID}">
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{ROW_NUM}</td>
<td class="cmn text-center"><input type="checkbox" class="form-check-input" name="gridCheckbox" value="{SNDNG_DTL_ID}" onchange="pageObject['${pageName}'].control.select('{SNDNG_DTL_ID}', this.checked);" /></td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{TASK_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{GOJI_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RG_NO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DLVR_YMD}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{DLVR_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{UNDLVR_RSN_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{ACTL_RCPN_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_REL_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_SE_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{SNDNG_YMD}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{FFNLG_AMT}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{PCPTAX}</td>
<td class="cmn text-end" onclick="{onclick}" ondblclick="{ondblclick}">{ADAMT}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_ZIP}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_ADDR}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RCPN_DTL_ADDR}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_YMD_TM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VHRNO}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_SE_NM}</td>
<td class="cmn text-center privacy-cell" onclick="{onclick}" ondblclick="{ondblclick}">
<span>{RTPYR_NO}</span>
<span>*************</span>
</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{RTPYR_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{VLTN_ARTCL}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STDG_NM}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_PLC}</td>
<td class="cmn text-start" onclick="{onclick}" ondblclick="{ondblclick}">{CRDN_STTS_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{REG_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{RGTR_NM}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFCN_DT}</td>
<td class="cmn text-center" onclick="{onclick}" ondblclick="{ondblclick}">{MDFR_NM}</td>
<td class="cmn dummy-td"></td>
</tr>
</template>
<template id="${infoPrefix}NotFound--${pageName}">
<tr class="bpv">
<td valign="top" colspan="33" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="dpv">
<td valign="top" colspan="33" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="eca">
<td valign="top" colspan="33" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pvs">
<td valign="top" colspan="33" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
<tr class="pes">
<td valign="top" colspan="33" class="dataTables_empty text-center">${prefixName} 정보를 찾지 못했습니다.</td>
</tr>
</template>
</table>
</div>
</div>
</div>
<!-- DataTables(그리드) -->
</div> <!-- <div class="card wrapper-list"> -->
</div> <!-- <div class="container-xxl flex-grow-1 px-0"> -->
<!-- Content -->
<div class="content-backdrop fade"></div>
</div>
<!-- / inner page html <div class="content-wrapper"> -->
<script>
/**************************************************************************
* Global Variable
**************************************************************************/
pageObject["${pageName}"] = {};
/**************************************************************************
* script 진입
**************************************************************************/
$(document).ready(function() {
// pageObject
let $P = pageObject["${pageName}"];
// FormFields
$P.formFields = new FimsFormFields("#frmSearch--${pageName}");
/**************************************************************************
* DatasetControl
**************************************************************************/
$P.control = new DatasetControl({
prefix: "sndbk"
, prefixName: "반송"
, keymapper: info => info ? info.SNDNG_DTL_ID : ""
, dataGetter: obj => obj.${infoPrefix}List
, appendData: true
, infoSize: "md"
, formats: {
DLVR_YMD: dateFormat
, DLVR_TM: timeFormat
, SNDNG_YMD: dateFormat
, CRDN_YMD_TM: datetimeFormat
, FFNLG_AMT: numberFormat
, PCPTAX: numberFormat
, ADAMT: numberFormat
, REG_DT: datetimeFormat
, MDFCN_DT: datetimeFormat
}
});
// $P.control 설정
$P.control.defaultFetchSize = FETCH_XS; // 1 페이지당 조회되는 자료 건수 index.jsp에서 확인 FETCH_XS = 30
$P.control.query = { pageNum : 1, fetchSize : $P.control.defaultFetchSize };
$P.control.beforeCurrent = null;
/**************************************************************************
* DatasetControl 이벤트
**************************************************************************/
// Dataset 변경
$P.control.onDatasetChange = (obj, option) => {
$P.renderList(obj.${infoPrefix}Total, option);
$("#paging--${pageName}").setPagingInfo({
list: $P.control.dataset
, prefix: "paging--${pageName}"
, start: obj.${infoPrefix}Start
, totalSize: obj.${infoPrefix}Total
, fetchSize: obj.${infoPrefix}Fetch
, func: "pageObject['${pageName}'].control.load({index})"
});
};
// 현재 선택 자료 변경 이벤트
$P.control.onCurrentChange = (item) => {
if (!item) return;
let key = item.data.SNDNG_DTL_ID;
$("#tbody--${pageName}").setCurrentRow(key);
};
// 선택(체크) 변경 이벤트
$P.control.onSelectionChange = (selected) => {
let ${infoPrefix}List = $P.control.dataset;
let keys = selected.map(e => ${infoPrefix}List.getKey(e));
$("#tbody--${pageName} input[type='checkbox']").each(function() {
let checkbox = $(this);
checkbox.prop("checked", keys.includes(checkbox.val()));
});
// 선택 대상 통합우편 발송 버튼
$("#btnCreateSlctnSndngLink--${pageName}").prop("disabled", keys.length < 1);
// DataTables(그리드) 전체 선택(checkbox)
if (keys.length < 1) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
} else if (keys.length == ${infoPrefix}List.length) {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", true); // 체크 설정
} else {
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false); // 체크 해제
}
};
/**************************************************************************
* DataTables 이벤트
**************************************************************************/
// DataTables에 click, dbclick 이벤트
$P.renderList = (totalSize, option) => {
let ${infoPrefix}List = $P.control.dataset;
let empty = ${infoPrefix}List.empty;
let clsForTask = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val().toLowerCase(); // 소문자
// 업무별 그리드 td
let foundContent = document.getElementById("${infoPrefix}Row--${pageName}").content;
let foundTr = $(foundContent).find("tr")[0].cloneNode(false);
let foundTds = $(foundContent).find("." + clsForTask + ",.cmn");
foundTds.each(function() {
foundTr.appendChild(this.cloneNode(true));
});
//
let replacer = (str, dataItem) => str
.replace(/{onclick}/gi, "pageObject['${pageName}'].control.setCurrent('" + dataItem.getValue("SNDNG_DTL_ID") + "');")
.replace(/{ondblclick}/gi, "pageObject['${pageName}'].getTotalInfo('" + dataItem.getValue("CRDN_ID") + "');");
let trs = empty ? [document.getElementById("${infoPrefix}NotFound--${pageName}").content.querySelector("." + clsForTask + ",.cmn").outerHTML]
: ${infoPrefix}List.inStrings(foundTr.outerHTML, replacer);
let noMore = (${infoPrefix}List.length >= totalSize);
let initScroll = ($P.control.query.pageNum < 2);
if(option != null && option.reloaded){
initScroll = false;
}
$("#table-responsive--${pageName}")[0].changeContent(trs.join(), initScroll, noMore);
// checkbox 체크 해제
$("#DataTables_Table_0--${pageName} th input[type='checkbox']").prop("checked", false);
//보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
}
// DataTables에 스크롤이 맨 밑으로 이동했을 때 이벤트
$P.scrollDataList = () => {
$P.control.load($P.control.query.pageNum + 1);
}
// DataTables에 더블 클릭시 개별총정보 dialog
$P.getTotalInfo = (crdnId) => {
if (typeof crdnId == "undefined" || crdnId == null || crdnId == "") return;
let params = {
callControlName: "pageObject['${pageName}'].control"
, sggCd: $P.control.dataset.getValue("SGG_CD")
, taskSeCd: $P.control.dataset.getValue("TASK_SE_CD")
, crdnId: crdnId
}
ajax.get({
url: wctx.url("/sprt/sprt02/010/main.do")
, data: params
, success: resp => {
dialog.open({
id: "totalInfoMainDialog"
, title: "개별총정보"
, content: resp
, size: "xxl"
});
}
});
}
/**************************************************************************
* 사용자 함수(function)
**************************************************************************/
// 검색 자료 재조회
$P.fnRefreshList = () => {
$P.control.query.crdnIds = null;
$P.control.reload({all : true});
}
// 사용자검색 callback
$P.callbackFindUser = (userId, userNm) => {
$("#schRgtrCd--${pageName}").val(userId); // 사용자 ID
$("#schRgtrNm--${pageName}").val(userNm); // 사용자 명
}
// 수기 반송 등록
$P.getSndbkInfo = (params) => {
if (!params) return;
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/210/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: $P.control.prefixed("TrgtDialog--${pageName}")
, title: params.title
, content: resp
, size: "xxl"
, onClose: () => {}
});
}
});
}
// 공시송달 등록
$P.getSvbtcInfo = (params) => {
if (!params) return;
ajax.get({
url: wctx.url("/" + params.taskSeCd + "${infoPrefixUrl}" + "/260/info.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "svbtcDialog--${pageName}"
, title: params.title
, content: resp
, size: $P.control.infoSize
, onClose: () => { $P.fnRefreshList(); } // 자료 재조회
});
}
});
}
/**************************************************************************
* 버튼 clickEvent
**************************************************************************/
// 업무 구분 변경
$P.fnResetAndChangeBiz = (taskSeCd) => {
// 업무 구분 코드
if (typeof taskSeCd == "undefined" || taskSeCd == null || taskSeCd == "") {
taskSeCd = $("#layout-navbar input[name='taskSeCd']:checked").val();
}
// 초기 기본 설정
$P.initForm(taskSeCd);
// 업무 구분별 설정
$P.setTask(taskSeCd);
// dataset 초기화
$P.control.dataset.clear();
}
// 사용자검색 버튼 클릭 이벤트
$P.fnGetFindUser = () => {
let params = {
openerPageName: "${pageName}"
, callbackFuncName: "pageObject['${pageName}']['callbackFindUser']"
}
ajax.get({
url: wctx.url("/user/user02/010/main.do") + "?openerPageName=${pageName}"
, data: params || {}
, success: resp => {
dialog.open({
id: "userDialog--${pageName}"
, title: "사용자 검색"
, content: resp
, size: "lg"
, init: () => { setDialogZindex(); }
});
}
});
}
// 검색 버튼 이벤트
$P.fnSearchList = () => {
// 검색조건
$P.control.query = $P.formFields.get();
$P.control.query.fetchSize = $P.control.defaultFetchSize; // 한번에 조회되는 자료 건수
$P.control.query.sndngDtlSttsCd = "05"; // FIM050 - 05 반송
$P.control.query.rcpnRelNm1 = "무인배달"; // 13
$P.control.query.rcpnRelNm2 = "우편수취함"; // 14
$P.control.query.rcpnRelNm3 = "전자수취함배달"; // 15
$P.control.query.rcpnRelNm4 = "수령희망장소배달"; // 16
$P.control.query.delYn = "N"; // 삭제 여부
$P.control.load(1);
}
// 엑셀 버튼 이벤트
$P.fnExcel = () => {
if ($P.control.dataset.empty) {
dialog.alert({
conten : "검색된 자료가 없습니다."
, onOK: () => { }
});
return;
}
// DataTables(그리드)
let cellDefs = getCellDefs($("#theadTr--${pageName} th").not(".dummy-th").not(":eq(0)")
, $($("#${infoPrefix}Row--${pageName}")[0].content).find("td").not(".dummy-td").not(":eq(0)")
, getCellDefsForPrivacyCell);
$P.control.query.cellDefs = cellDefs;
$P.control.download();
}
// 수기 반송 등록 버튼 이벤트
$P.fnCreateSndbk = (title) => {
// 파라미터 설정
let params = $P.control.query; // 검색 조건
params.title = title; // 타이틀
params.callPurpose = "create"; // 호출 용도 (등록)
params.sggCd = $("#sggCd--${pageName}").val(); // 시군구 코드
params.taskSeCd = $("#frmSearch--${pageName} input[name='taskSeCd']:checked").val(); // 업무 구분 코드
$P.getSndbkInfo(params);
}
// 공시송달 등록 버튼 이벤트
$P.fnCreateWholSvbtc = (title) => {
if ($P.control.dataset.empty) {
dialog.alert({
content : "검색된 자료가 없습니다."
, onOK : () => { }
});
return;
}
// 파라미터 설정
let params = $P.control.query; // 검색 조건
params.title = title; // 타이틀
params.callPurpose = "create"; // 호출 용도 (등록)
params.sggCd = $P.control.dataset.getValue("SGG_CD") // 시군구 코드
params.taskSeCd = $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
params.sndngSeCd = $P.control.dataset.getValue("SNDNG_SE_CD") // 발송 구분 코드
params.tnocs = $P.control.dataset.getValue("TOT_CNT") // 총건수
$P.getSvbtcInfo(params);
}
// 선택 통합우편 발송 버튼 이벤트
$P.fnCreateSlctnSndngLink = (title) => {
// 선택 자료
let selected = $P.control.dataset.getKeys("selected");
if (selected.length < 1) return;
// 파라미터 설정
let params = $P.control.query; // 검색 조건
params.title = title; // 타이틀
params.callPurpose = "create"; // 호출 용도 (등록)
params.sndngDtlIds = selected.join(","); // 발송 상세 Ids
params.sggCd = $P.control.dataset.getValue("SGG_CD") // 시군구 코드
params.deptCd = $P.control.dataset.getValue("DEPT_CD") // 부서코드
params.taskSeCd = $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
params.sndngSeCd = $P.control.dataset.getValue("SNDNG_SE_CD") // 발송 구분 코드
params.tnocs = $P.control.dataset.getValue("TOT_CNT") // 총건수
}
// 전체 통합우편 발송 버튼 이벤트
$P.fnCreateWholSndngLink = (title) => {
if ($P.control.dataset.empty) {
dialog.alert({
content : "검색된 자료가 없습니다."
, onOK : () => { }
});
return;
}
// 파라미터 설정
let params = $P.control.query; // 검색 조건
params.title = title; // 타이틀
params.callPurpose = "create"; // 호출 용도 (등록)
params.sggCd = $P.control.dataset.getValue("SGG_CD") // 시군구 코드
params.deptCd = $P.control.dataset.getValue("DEPT_CD") // 부서코드
params.taskSeCd = $P.control.dataset.getValue("TASK_SE_CD") // 업무 구분 코드
params.sndngSeCd = $P.control.dataset.getValue("SNDNG_SE_CD") // 발송 구분 코드
params.tnocs = $P.control.dataset.getValue("TOT_CNT") // 총건수
}
/**************************************************************************
* 초기 셋팅
**************************************************************************/
// 이벤트 설정
$P.setEvent = () => {
// 기본 버튼 이벤트
$("#btnReset--${pageName}").on("click", () => $P.fnResetAndChangeBiz()); // 초기화
$("#btnSearch--${pageName}").on("click", () => $P.fnSearchList()); // 검색
$("#btnExcel--${pageName}").on("click", () => $P.fnExcel()); // 엑셀
$("#btnFindUser--${pageName}").on("click", () => $P.fnGetFindUser()); // 사용자 검색
// 동적검색에서 엔터(Enter) 키를 누르면 검색한다.
$("#term--${pageName}").onEnterPress(function() {
$P.fnSearchList();
});
// form-date 항목에서 키보드로 입력시 날짜 포맷팅 적용
$("#frmSearch--${pageName}").find(".form-date").each(function() {
$(this).on("input", function() {
let value = this.value.replaceAll("-", "");
if (value.length > 7) {
this.value = value.substring(0, 4) + "-" + value.substring(4, 6) + "-" + value.substring(6);
} else if(value.length > 5) {
this.value = value.substring(0, 4) + "-" + value.substring(4);
}
});
});
// 업무 버튼 이벤트
$("#btnCreateSndbk--${pageName}").on("click", function() {
$P.fnCreateSndbk($(this).attr("title")); // 수기 반송 등록
});
$("#btnCreateWholSvbtc--${pageName}").on("click", function() {
$P.fnCreateWholSvbtc($(this).attr("title")); // 전체 공시송달 등록
});
$("#btnCreateSlctnSndngLink--${pageName}").on("click", function() {
$P.fnCreateSlctnSndngLink($(this).attr("title")); // 선택 통합우편 발송
});
$("#btnCreateWholSndngLink--${pageName}").on("click", function() {
$P.fnCreateWholSndngLink($(this).attr("title")); // 전체 통합우편 발송
});
// DataTables width 변경 조정
fnMakeResizableTable($("#table-responsive--${pageName}")[0]);
// DataTables 스크롤 이벤트 생성
fnMakeScrollableTable($("#table-responsive--${pageName}")[0], $P.scrollDataList);
}
// 초기 화면 설정
$P.initForm = (taskSeCd) => {
// 화면 초기화
$("#frmSearch--${pageName}")[0].reset();
// input, select 초기화
let searchForm = $("#frmSearch--${pageName}");
searchForm.find("input[type='radio']").not("[name='taskSeCd']").prop("checked", false);
searchForm.find("input[type='checkbox']").prop("checked", false);
searchForm.find("input[type='text']").val("");
searchForm.find("input[type='hidden']").val("");
searchForm.find("select").each(function() { $(this).find("option:eq(0)").prop("selected", true); });
// 최고 관리자 경우 업무구분을 선택할 수 있도록 하자.
$("#frmSearch--${pageName} input[name='taskSeCd']").each(function(i) {
$(this).prop("disabled", "true");
});
// 기본 데이터 설정
$("#sggCd--${pageName}").val("${sggCd}"); // 시군구 코드
$("#frmSearch--${pageName} input[name='taskSeCd'][value='" + taskSeCd + "']").prop("checked", true); // 업무 구분 코드
initDatepicker("frmSearch--${pageName}"); // 달력 초기화
$("#schDlvrYmdFrom--${pageName}").datepicker("setDate", DateUtil.getDateDay(-7).date);
$("#schDlvrYmdTo--${pageName}").datepicker("setDate", new Date());
$("#schChcRgIndct--${pageName}").prop("checked", true); // 선택등기표시
$("#byOutput--${pageName}").val("동적 검색"); // 동적 검색
$("#schRgtrNm--${pageName}").prop("readonly", true); // 사용자 이름
}
// 업무 구분별 설정
$P.setTask = (taskSeCd) => {
// 업무구분에 따른 URL 설정
$P.control.urls.load = wctx.url("/" + taskSeCd + "${infoPrefixUrl}" + "/220/list.do"); // 검색
// 업무별 조회조건
renderForTask("frmSearch--${pageName}", taskSeCd.toLowerCase());
// 업무별 그리드 th
let colContent = document.getElementById("${infoPrefix}Col--${pageName}").content;
let cols = $(colContent).find("." + taskSeCd.toLowerCase() + ",.cmn");
let colsOuterHTML = "";
cols.each(function() {
colsOuterHTML += this.outerHTML;
});
$("#table-responsive--${pageName}")[0].changeColumn(colsOuterHTML);
}
/**************************************************************************
* 최초 실행 함수
**************************************************************************/
// 1. 이벤트 설정
$P.setEvent();
// 2. 초기 설정 및 업무 구분 변경
$P.fnResetAndChangeBiz($("#layout-navbar input[name='taskSeCd']:checked").val());
// 3. 보안모드
fn_securityModeToggle($("#securityMode--top").is(":checked"));
});
</script>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save