init
This commit is contained in:
@@ -0,0 +1,283 @@
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
|
||||
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/jquery-ui.css"/>"/>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/jquery-ui.theme.css"/>"/>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/ui.jqgrid.css"/>"/>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/jquery.contextMenu.css"/>"/>
|
||||
<%-- <link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/common.css"/>" /> --%>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/Nwagon.css"/>"/>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/web_ui.css"/>"/>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/jexcel.css"/>"></link>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/jsuites.css"/>"></link>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/theme_${themeColor}.css"/>"/>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/select2.min.css"/>"></link>
|
||||
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/addon/codemirror/lib/codemirror.css"/>"/>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/addon/codemirror/theme/dracula.css"/>"/>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/addon/codemirror/addon/lint/lint.css"/>"/>
|
||||
|
||||
<link rel="stylesheet" type="text/css" media="screen"
|
||||
href="<c:url value="/addon/summernote/summernote-lite.min.css"/>"/>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/addon/summernote/summernote-lite.css"/>"/>
|
||||
|
||||
<jsp:include page="/jsp/common/include/fonts.jsp"/>
|
||||
|
||||
<c:choose>
|
||||
<c:when test="${messageLocale eq 'en'}">
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/elink_components_en.css"/>"/>
|
||||
</c:when>
|
||||
<c:otherwise>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/elink_components.css"/>"/>
|
||||
</c:otherwise>
|
||||
</c:choose>
|
||||
|
||||
|
||||
<style type="text/css">
|
||||
.ajax_wait_modal {
|
||||
display: none;
|
||||
position: fixed;
|
||||
z-index: 300;
|
||||
padding-top: 100px;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
background-color: rgb(0, 0, 0);
|
||||
background-color: rgba(0, 0, 0, 0.4);
|
||||
}
|
||||
|
||||
|
||||
.cssbtn {
|
||||
border: 1px solid rgba(0, 128, 128, 0.6);
|
||||
background-color: rgba(0, 0, 0, 0);
|
||||
color: rgb(100, 100, 100);
|
||||
border-radius: 5px;
|
||||
box-shadow: 0px 2px 3px rgba(0, 128, 128, 0.15);
|
||||
min-width: 100px;
|
||||
padding: 3px;
|
||||
height: 28px;
|
||||
font-family: var(--css-btn-font-family);
|
||||
vertical-align: middle;
|
||||
font-size: var(--css-btn-font-size);
|
||||
}
|
||||
|
||||
.cssbtn:hover {
|
||||
color: rgba(0, 128, 128, 1);
|
||||
background-color: rgba(0, 128, 128, 0.3);
|
||||
}
|
||||
|
||||
.cssbtn:disabled {
|
||||
cursor: not-allowed;
|
||||
color: rgb(230, 230, 230);
|
||||
background-color: rgb(150, 150, 150);
|
||||
}
|
||||
|
||||
.logoText {
|
||||
font-family: 'Limelight';
|
||||
font-size: 40px;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.logoTextLarge {
|
||||
font-family: 'Limelight';
|
||||
font-size: 70px;
|
||||
color: black;
|
||||
}
|
||||
|
||||
.material-icons {
|
||||
font-family: 'Material Icons';
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
vertical-align: sub;
|
||||
color: rgb(65 125 200);
|
||||
font-size: var(--css-btn-icon-font-size); /* Preferred icon size */
|
||||
/*display: inline-block;*/
|
||||
line-height: 1;
|
||||
/*text-transform: none;*/
|
||||
/*letter-spacing: normal;*/
|
||||
/*word-wrap: normal;*/
|
||||
/*white-space: nowrap;*/
|
||||
direction: ltr;
|
||||
|
||||
/* Support for all WebKit browsers. */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
/* Support for Safari and Chrome. */
|
||||
text-rendering: optimizeLegibility;
|
||||
|
||||
/* Support for Firefox. */
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
|
||||
/* Support for IE. */
|
||||
font-feature-settings: 'liga';
|
||||
}
|
||||
|
||||
.material-icons-outlined {
|
||||
font-family: 'Material Icons Outlined';
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
vertical-align: middle;
|
||||
color: rgb(65 125 200);
|
||||
font-size: var(--css-btn-icon-font-size); /* Preferred icon size */
|
||||
line-height: 1;
|
||||
letter-spacing: normal;
|
||||
text-transform: none;
|
||||
display: inline-block;
|
||||
white-space: nowrap;
|
||||
word-wrap: normal;
|
||||
direction: ltr;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
}
|
||||
|
||||
.smallBtn > .material-icons {
|
||||
font-size: calc(var(--css-btn-icon-font-size) - 5px) !important;
|
||||
}
|
||||
|
||||
.smallBtn > .material-icons-outlined {
|
||||
font-size: calc(var(--css-btn-icon-font-size) - 5px) !important;
|
||||
}
|
||||
|
||||
.smallBtn {
|
||||
width: 70px;
|
||||
height: 20px;
|
||||
padding: 0;
|
||||
font-size: calc(var(--css-btn-font-size) - 2px);
|
||||
border-radius: 4px;
|
||||
box-shadow: none;
|
||||
background-color: rgb(245, 255, 250);
|
||||
color: rgb(0, 139, 139);
|
||||
}
|
||||
|
||||
.smallBtn2 > .material-icons {
|
||||
font-size: calc(var(--css-btn-icon-font-size) - 5px) !important;
|
||||
}
|
||||
|
||||
.smallBtn2 > .material-icons-outlined {
|
||||
font-size: calc(var(--css-btn-icon-font-size) - 5px) !important;
|
||||
}
|
||||
|
||||
.smallBtn2 {
|
||||
min-width: 50px;
|
||||
height: 23px;
|
||||
padding: 0;
|
||||
font-size: calc(var(--css-btn-font-size) - 2px);
|
||||
border-radius: 4px;
|
||||
box-shadow: none;
|
||||
background-color: rgb(245, 255, 250);
|
||||
color: rgb(0, 139, 139);
|
||||
}
|
||||
|
||||
.jexcel > tbody > tr > td.readonly {
|
||||
color: rgb(0, 0, 0);
|
||||
background: rgb(255, 255, 255);
|
||||
}
|
||||
|
||||
.CodeMirror-matchingbracket {
|
||||
color: #b46914 !important;
|
||||
background-color: #fef4e8 !important;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.cm-string:not(.cm-property) {
|
||||
color: #0451A5 !important;
|
||||
}
|
||||
|
||||
.cm-property {
|
||||
color: #A31515 !important;
|
||||
}
|
||||
|
||||
.CodeMirror-wrap pre {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
.CodeMirror-lint-tooltip {
|
||||
z-index: 500;
|
||||
}
|
||||
|
||||
|
||||
fieldset.groupbox-border {
|
||||
border: 1px groove #ddd !important;
|
||||
border-radius: 5px;
|
||||
background-color: rgb(251, 253, 251);
|
||||
padding: 0.3em 1.4em 1.4em 1.4em !important;
|
||||
margin: 1em 0 0.5em 0 !important;
|
||||
-webkit-box-shadow: 0px 0px 0px 0px #000;
|
||||
box-shadow: 0px 0px 0px 0px #000;
|
||||
}
|
||||
|
||||
legend.groupbox-border {
|
||||
font-size: 1em !important;
|
||||
font-weight: bold !important;
|
||||
color: rgb(60, 70, 110);
|
||||
text-align: left !important;
|
||||
width: auto;
|
||||
padding: 0px 10px 0px 10px;
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.toggle.ios, .toggle-on.ios, .toggle-off.ios {
|
||||
border-radius: 20rem;
|
||||
}
|
||||
|
||||
.toggle.ios .toggle-handle {
|
||||
border-radius: 20rem;
|
||||
}
|
||||
|
||||
.toggle.disabled {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.disabled-select {
|
||||
background-color: #d5d5d5;
|
||||
opacity: 0.5;
|
||||
border-radius: 3px;
|
||||
cursor: not-allowed;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
select[readonly].select2-hidden-accessible + .select2-container {
|
||||
pointer-events: none;
|
||||
touch-action: none;
|
||||
}
|
||||
|
||||
select[readonly].select2-hidden-accessible + .select2-container .select2-selection {
|
||||
background: #eee;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
select[readonly].select2-hidden-accessible + .select2-container .select2-selection__arrow,
|
||||
select[readonly].select2-hidden-accessible + .select2-container .select2-selection__clear {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.input-group {
|
||||
display: flex;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.input-group input {
|
||||
flex-grow: 1;
|
||||
min-width: 0;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.input-group button {
|
||||
flex-shrink: 0;
|
||||
margin-left: 10px;
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.input-group.readonly input {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.input-group.readonly button {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
@@ -0,0 +1,15 @@
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/jquery-ui.css"/>" />
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/jquery-ui.theme.css"/>" />
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/ui.jqgrid_custom.css"/>" />
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/jquery.contextMenu.css"/>" />
|
||||
<%-- <link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/common.css"/>" /> --%>
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/Nwagon.css"/>" />
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/web_ui.css"/>" />
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/theme_${themeColor}.css"/>" />
|
||||
|
||||
<style type="text/css">
|
||||
</style>
|
||||
@@ -0,0 +1,98 @@
|
||||
<%--
|
||||
Created by IntelliJ IDEA.
|
||||
User: yunjy
|
||||
Date: 2022-10-13
|
||||
Time: 오전 10:29
|
||||
To change this template use File | Settings | File Templates.
|
||||
--%>
|
||||
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<style>
|
||||
@font-face {
|
||||
font-family: 'Material Icons';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
background-position: center left 5px, center left 5px;
|
||||
src: url(<c:url value="/iconfonts/MaterialIconsOutlined-Regular.otf"/>); /* For IE6-8 */
|
||||
src: local('Material Icons'),
|
||||
local('MaterialIcons-Regular'),
|
||||
url(<c:url value="/iconfonts/MaterialIcons-Regular.woff2"/>) format('woff2'),
|
||||
url(<c:url value="/iconfonts/MaterialIcons-Regular.woff"/>) format('woff'),
|
||||
url(<c:url value="/iconfonts/MaterialIconsOutlined-Regular.otf"/>) format('opentype');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Material Icons Outlined';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url(<c:url value="/iconfonts/MaterialIconsOutlined-Regular.woff2"/>) format('woff2');
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Asap Condensed";
|
||||
src: url(<c:url value="/fonts/AsapCondensed-Regular.ttf"/>) format("truetype");
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: "Nato Sans";
|
||||
src: url(<c:url value="/fonts/NotoSansKR-Regular.otf"/>) format("opentype");
|
||||
font-weight: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Nato Sans";
|
||||
src: url(<c:url value="/fonts/NotoSansKR-Bold.otf"/>) format("opentype");
|
||||
font-weight: bold;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Passion One";
|
||||
src: url(<c:url value="/fonts/PassionOne-Regular.ttf"/>) format("opentype");
|
||||
font-weight: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Passion One";
|
||||
src: url(<c:url value="/fonts/PassionOne-Bold.ttf"/>) format("opentype");
|
||||
font-weight: bold;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Limelight";
|
||||
src: url(<c:url value="/fonts/Limelight-Regular.ttf"/>) format("opentype");
|
||||
font-weight: bold;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Righteous";
|
||||
src: url(<c:url value="/fonts/Righteous-Regular.ttf"/>) format("opentype");
|
||||
font-weight: bold;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Staatliches";
|
||||
src: url(<c:url value="/fonts/Staatliches-Regular.ttf"/>) format("opentype");
|
||||
font-weight: bold;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Jost";
|
||||
src: url(<c:url value="/fonts/Jost-Regular.ttf"/>) format("opentype");
|
||||
font-weight: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Jost";
|
||||
src: url(<c:url value="/fonts/Jost-Bold.ttf"/>) format("opentype");
|
||||
font-weight: bold;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Jost";
|
||||
src: url(<c:url value="/fonts/Jost-Medium.ttf"/>) format("opentype");
|
||||
font-weight: 500;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "MICE Gothic";
|
||||
src: url(<c:url value="/fonts/MICEGothic.woff2"/>) format("woff2");
|
||||
font-weight: normal;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "MICE Gothic";
|
||||
src: url(<c:url value="/fonts/MICEGothic Bold.woff2"/>) format("woff2");
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
</style>
|
||||
@@ -0,0 +1,17 @@
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
|
||||
<!-- Chart Include -->
|
||||
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/css/jquery.jqplot.min.css"/>" />
|
||||
|
||||
<style type="text/css">
|
||||
.jqplot-point-label{
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
.ui-widget : active {
|
||||
outline:none;
|
||||
}
|
||||
|
||||
</style>
|
||||
@@ -0,0 +1,499 @@
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
|
||||
|
||||
<!-- Chart Include -->
|
||||
<script language="javascript" src="<c:url value="/js/jquery.jqplot.min.js"/>"></script>
|
||||
<!--[if IE]><script type="text/javascript" src="<c:url value="/js/excanvas.min.js"/>"></script><![endif]-->
|
||||
|
||||
<script language="javascript" src="<c:url value="/js/jqplot.cursor.min.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/jqplot.categoryAxisRenderer.min.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/jqplot.barRenderer.min.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/jqplot.pointLabels.min.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/jqplot.enhancedLegendRenderer.min.js"/>"></script>
|
||||
|
||||
|
||||
<script type="text/javascript">
|
||||
var maxVal = 0; // Line 차트의 Y축 Max값 저장.
|
||||
var setMaxVal = 0; // Line 차트의 Y축 Max값 결과 저장.
|
||||
|
||||
function getIeVersion()
|
||||
{
|
||||
var userAgent = navigator.userAgent;
|
||||
var msieIdx = userAgent.indexOf("MSIE");
|
||||
var ie_v = "";
|
||||
|
||||
// msieIdx check.
|
||||
// msieIdx : userAgent문자열에서 MSIE가 없으면 -1이 저장됩니다.
|
||||
|
||||
// navigator.userAgent문자열에서 IE 11버전부터 MSIE는 없습니다.
|
||||
if(msieIdx != -1)
|
||||
{
|
||||
ie_v = userAgent.substr(msieIdx+5, 3);
|
||||
return parseInt(ie_v, 10);
|
||||
}
|
||||
}
|
||||
|
||||
// Internet Explorer version check.
|
||||
function ieV8Chk()
|
||||
{
|
||||
var ie_v = getIeVersion();
|
||||
|
||||
return ie_v <= 8 ? true : false;
|
||||
}
|
||||
|
||||
|
||||
// from ~ to Date check
|
||||
function isFromToDate(frDt, toDt, dtType)
|
||||
{
|
||||
var returnFlag = true;
|
||||
var strFrDt = "";
|
||||
var strToDt = "";
|
||||
var numChck;
|
||||
|
||||
if(dtType == "" || dtType == null || dtType == undefined)
|
||||
{
|
||||
numChck = /^(19|20)\d{2}/;
|
||||
}
|
||||
else
|
||||
{
|
||||
numChck = /^(19|20)\d{2}(0[0-9]|1[0-2])(0[1-9]|[12][0-9]|3[0-1])*$/;
|
||||
}
|
||||
|
||||
if(frDt == "" || frDt == undefined || frDt == null)
|
||||
{
|
||||
returnFlag = false;
|
||||
}
|
||||
else if(toDt == "" || toDt == undefined || toDt == null)
|
||||
{
|
||||
returnFlag = false;
|
||||
}
|
||||
else{
|
||||
strFrDt = frDt.replace(/\-/g, "");
|
||||
strToDt = toDt.replace(/\-/g, "");
|
||||
|
||||
if(!numChck.test(strFrDt))
|
||||
{
|
||||
returnFlag = false;
|
||||
}
|
||||
else if(!numChck.test(strToDt))
|
||||
{
|
||||
returnFlag = false;
|
||||
}
|
||||
else if(parseInt(strFrDt, 10) > parseInt(strToDt, 10))
|
||||
{
|
||||
returnFlag = false;
|
||||
}
|
||||
}
|
||||
|
||||
return returnFlag;
|
||||
}
|
||||
|
||||
|
||||
// Set Date Format
|
||||
function setDateFormat(strDate)
|
||||
{
|
||||
var dateLen = 0;
|
||||
var resultDate = "";
|
||||
|
||||
if(strDate != null)
|
||||
{
|
||||
dateLen = strDate.length;
|
||||
|
||||
if(dateLen == 6)
|
||||
{
|
||||
resultDate += strDate.substr(0, 4) + "-" + strDate.substr(4, 2);
|
||||
}
|
||||
else if(dateLen == 8)
|
||||
{
|
||||
resultDate += strDate.substr(0, 4) + "-" + strDate.substr(4, 2) + "-" + strDate.substr(6, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
resultDate += strDate;
|
||||
}
|
||||
}
|
||||
|
||||
return resultDate;
|
||||
}
|
||||
|
||||
|
||||
|
||||
// jqplot Line 차트 그리는 함수.
|
||||
function jqLineChart(chartId, rows, axisInt, prefix, topTitle)
|
||||
{
|
||||
var returnPlot; // plot Object 저장.
|
||||
|
||||
// 차트 그리기.
|
||||
returnPlot = $.jqplot(chartId, getLines(rows, axisInt, prefix), setChartOptinos(rows, axisInt, topTitle));
|
||||
|
||||
return returnPlot;
|
||||
}
|
||||
|
||||
// jqplot Bar 차트 그리는 함수.
|
||||
function jqBarchart(chartId, rows, prefix1, prefix2, topTitle)
|
||||
{
|
||||
var returnPlot; // plot Object 저장.
|
||||
|
||||
// 차트 그리기.
|
||||
returnPlot = $.jqplot(chartId, getBars(rows, prefix1, prefix2), setBarChartOptinos(rows, topTitle));
|
||||
|
||||
return returnPlot;
|
||||
}
|
||||
|
||||
|
||||
// Bar Chart의 Legend Label 셋팅.
|
||||
function getLegendLabels(rows)
|
||||
{
|
||||
var labels = [];
|
||||
var idx = 0;
|
||||
|
||||
for(var i = 0; i < rows.length; i++)
|
||||
{
|
||||
if(labels[idx-1] == undefined || labels[idx-1] != rows[i]["STATCY"])
|
||||
{
|
||||
labels[idx++] = rows[i]["STATCY"];
|
||||
}
|
||||
}
|
||||
|
||||
return labels;
|
||||
}
|
||||
|
||||
|
||||
/* Cahrt y축 tick value 설정.*/
|
||||
function getTickInterval()
|
||||
{
|
||||
var tickInt = 1;
|
||||
var tickVal = 0;
|
||||
|
||||
// Browser 체크.
|
||||
// if(ieV8Chk())
|
||||
// {
|
||||
// // IE 8이하
|
||||
// tickVal = setMaxVal;
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// // IE 9이상
|
||||
// tickVal = maxVal;
|
||||
// }
|
||||
|
||||
tickVal = setMaxVal;
|
||||
|
||||
if(tickVal > 10)
|
||||
{
|
||||
tickInt = tickVal * 0.1;
|
||||
}
|
||||
|
||||
return parseInt(tickInt, 10);
|
||||
}
|
||||
|
||||
|
||||
// 차트(jqplot)의 Line 생성.
|
||||
// DB에서 조회된 값으로 차트에서 사용 할 Line 생성.
|
||||
function getLines(rows, colCnt, prefix)
|
||||
{
|
||||
var rowCnt = rows.length; // row Count.
|
||||
var fields = []; // x축, y축 값을 저장.
|
||||
var values = []; // x축, y축 Array 저장.
|
||||
var lines = []; // values Array 저장.
|
||||
|
||||
maxVal = 0; // y축 MaxVal 초기화.
|
||||
|
||||
// Grid의 데이터가 없으면 차트 이미지만 Rendering
|
||||
if(rowCnt == 0)
|
||||
{
|
||||
return lines[0] = [[0,0]];
|
||||
}
|
||||
|
||||
// IE 8버전 이하일 때 차트 이미지만 Rendering => rowData 1건 이상인경우 기본값 셋팅
|
||||
// if(ieV8Chk() == true && rowCnt > 1)
|
||||
if(rowCnt > 1)
|
||||
{
|
||||
return lines[0] = [[0,0]];
|
||||
}
|
||||
|
||||
// 차트 데이터 생성.
|
||||
// 1차 Loop (row Count)
|
||||
for(var i = 0; i < rowCnt; i++)
|
||||
{
|
||||
values= [];
|
||||
|
||||
// 2차 Loop (row Column Count)
|
||||
for(var j = 1; j <= colCnt; j ++)
|
||||
{
|
||||
fields = [];
|
||||
|
||||
fields[0] = j;
|
||||
fields[1] = rows[i][prefix + fields[0]];
|
||||
|
||||
values[j-1] = fields;
|
||||
|
||||
if(parseInt(maxVal, 10) < parseInt(fields[1], 10))
|
||||
{
|
||||
maxVal = fields[1];
|
||||
}
|
||||
}
|
||||
|
||||
lines[i] = values;
|
||||
}
|
||||
|
||||
return lines;
|
||||
}
|
||||
|
||||
// 차트(jqplot) 설정값 셋팅 함수.
|
||||
function setChartOptinos(rows, xAxisInt, topTitle)
|
||||
{
|
||||
var rowCnt = rows.length; // row Count.
|
||||
var arrTicks = []; // x축 일자 저장.
|
||||
var returnOptions; // plot Option 저장.
|
||||
var yAxis;
|
||||
|
||||
// 차트 X 축 일자 표시 data.
|
||||
for(var i = 1; i <= xAxisInt; i++)
|
||||
{
|
||||
arrTicks[i-1] = i;
|
||||
}
|
||||
|
||||
// start y축 옵션 설정.
|
||||
if(rowCnt == 1)
|
||||
{
|
||||
var maxLen = maxVal.length;
|
||||
var divisionVal = 1;
|
||||
var addVal = 0;
|
||||
|
||||
setMaxVal = 0;
|
||||
|
||||
for(var i = 0; i < (maxLen-1); i++)
|
||||
{
|
||||
divisionVal *= 10;
|
||||
}
|
||||
|
||||
addVal = divisionVal * parseInt(maxVal / divisionVal , 10);
|
||||
setMaxVal = (parseInt(maxVal / divisionVal , 10) * divisionVal) + (addVal);
|
||||
|
||||
yAxis = {
|
||||
min: 0,
|
||||
max: setMaxVal,
|
||||
numberticks: 11,
|
||||
tickInterval: getTickInterval(),
|
||||
tickOptions: {
|
||||
formatString:"%'d",
|
||||
// fontString:"%'d",
|
||||
fontSize: "8pt"
|
||||
},
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
yAxis = {
|
||||
min: 0,
|
||||
numberticks: 11,
|
||||
tickInterval: getTickInterval(),
|
||||
tickOptions: {
|
||||
formatString:"%'d",
|
||||
// fontString:"%`d",
|
||||
fontSize: "8pt"
|
||||
},
|
||||
};
|
||||
}
|
||||
// end y축 옵션 설정.
|
||||
|
||||
returnOptions = {
|
||||
title: topTitle,
|
||||
|
||||
grid: {background: 'white', drawBorder: true, shadow: false},
|
||||
seriesDefaults: {rendererOptions: {smooth: true}},
|
||||
series:[{lineWidth:2, color:'#ff6384', shadow:false}],
|
||||
axes:{
|
||||
xaxis:{
|
||||
min:0,
|
||||
max:xAxisInt,
|
||||
numberTicks:1,
|
||||
renderer:$.jqplot.CategoryAxisRenderer,
|
||||
ticks:arrTicks,
|
||||
tickOptions:{
|
||||
formatString:"%d",
|
||||
fontSize: "10pt"
|
||||
}
|
||||
},
|
||||
|
||||
yaxis: yAxis,
|
||||
},
|
||||
|
||||
// cursor:{
|
||||
// show:true,
|
||||
// zoom:true
|
||||
// },
|
||||
};
|
||||
/* SAMPLES 170210
|
||||
animate: true,
|
||||
title:{text:'전송건수',fontFamily:'Malgun Gothic, dotum, sans-serif', fontSize: '16px', textColor: '#000000'},
|
||||
grid: {background: 'white', drawBorder: true, shadow: false},
|
||||
seriesDefaults: {rendererOptions: {smooth: true}},
|
||||
series:[
|
||||
{lineWidth:3, color:'#009ce5', shadow:false},
|
||||
{lineWidth:3, color:'#1cc799', shadow:false},
|
||||
{lineWidth:3, color:'#7fc80b', shadow:false},
|
||||
{lineWidth:3, color:'#ffc600', shadow:false},
|
||||
{lineWidth:3, color:'#ff8839', shadow:false},
|
||||
{lineWidth:3, color:'#ff4239', shadow:false},
|
||||
{lineWidth:3, color:'#ff8aa8', shadow:false},
|
||||
{lineWidth:3, color:'#b569f5', shadow:false},
|
||||
{lineWidth:3, color:'#737373', shadow:false},
|
||||
],
|
||||
axes: {xaxis: {pad: 2.0, tickOptions: {showGridline: false}}, yaxis: {pad: 1.05}} */
|
||||
return returnOptions;
|
||||
}
|
||||
|
||||
|
||||
/* Bar Cahrt */
|
||||
// 차트(jqplot)의 Bar 생성.
|
||||
// DB에서 조회된 값으로 차트에서 사용 할 Bar 생성.
|
||||
function getBars(rows, prefix1, prefix2)
|
||||
{
|
||||
var rowCnt = rows.length; // row Count.
|
||||
var fields = []; // x축, y축 값을 저장.
|
||||
var values = []; // values Array 저장.
|
||||
var bars = []; // values Array 저장.
|
||||
var groupStatcy = 0;
|
||||
var groupIdx = 0;
|
||||
var j = 0;
|
||||
|
||||
maxVal = 0; // y축 MaxVal 초기화.
|
||||
|
||||
// Grid의 데이터가 없으면 차트 이미지만 Rendering
|
||||
if(rowCnt == 0)
|
||||
{
|
||||
return bars[0] = [[0,0]];
|
||||
}
|
||||
|
||||
// 차트 데이터 생성.
|
||||
// Loop (row Count)
|
||||
groupStatcy = rows[0]["STATCY"];
|
||||
values = [];
|
||||
for(var i = 0; i < rowCnt; i++)
|
||||
{
|
||||
if(groupStatcy != rows[i]["STATCY"])
|
||||
{
|
||||
groupStatcy = rows[i]["STATCY"];
|
||||
bars[groupIdx++] = values;
|
||||
j = 0;
|
||||
values = [];
|
||||
}
|
||||
|
||||
fields = [];
|
||||
|
||||
fields[0] = rows[i][prefix1];
|
||||
fields[1] = rows[i][prefix2];
|
||||
|
||||
values[j] = fields;
|
||||
|
||||
if(parseInt(maxVal, 10) < parseInt(fields[1], 10))
|
||||
{
|
||||
maxVal = fields[1];
|
||||
}
|
||||
|
||||
if(i == (rowCnt-1))
|
||||
{
|
||||
bars[groupIdx] = values;
|
||||
}
|
||||
|
||||
j++;
|
||||
}
|
||||
|
||||
return bars;
|
||||
}
|
||||
|
||||
// 차트(jqplot) 설정값 셋팅 함수.
|
||||
function setBarChartOptinos(rows, topTitle)
|
||||
{
|
||||
var rowCnt = rows.length; // row Count.
|
||||
var returnOptions; // plot chart Option 저장.
|
||||
var yAxis;
|
||||
var legendLabels = getLegendLabels(rows);
|
||||
|
||||
// start y축 옵션 설정.
|
||||
if(rowCnt == 1)
|
||||
{
|
||||
var maxLen = maxVal.length;
|
||||
var divisionVal = 1;
|
||||
var addVal = 0;
|
||||
|
||||
setMaxVal = 0;
|
||||
|
||||
for(var i = 0; i < (maxLen-1); i++)
|
||||
{
|
||||
divisionVal *= 10;
|
||||
}
|
||||
|
||||
addVal = divisionVal * parseInt(maxVal / divisionVal , 10);
|
||||
setMaxVal = (parseInt(maxVal / divisionVal , 10) * divisionVal) + (addVal);
|
||||
|
||||
yAxis = {
|
||||
min: 0,
|
||||
max: setMaxVal,
|
||||
numberticks: 11,
|
||||
tickInterval: getTickInterval(),
|
||||
tickOptions: {
|
||||
// formatString:"%d"
|
||||
fontString:"%d",
|
||||
fontSize: "12px"
|
||||
}
|
||||
};
|
||||
}
|
||||
else
|
||||
{
|
||||
yAxis = {
|
||||
min: 0,
|
||||
numberticks: 11,
|
||||
tickOptions: {
|
||||
// formatString:"%d"
|
||||
fontString:"%d",
|
||||
fontSize: "12px"
|
||||
}
|
||||
};
|
||||
}
|
||||
// end y축 옵션 설정.
|
||||
|
||||
returnOptions = {
|
||||
title: topTitle,
|
||||
seriesDefaults:{
|
||||
renderer: $.jqplot.BarRenderer,
|
||||
rendererOptions:{
|
||||
barWidth: 20
|
||||
, barPadding: 10
|
||||
, barMargin: 0
|
||||
},
|
||||
pointLabels: { show: true}
|
||||
},
|
||||
legend:{
|
||||
renderer: $.jqplot.EnhancedLegendRenderer,
|
||||
show: true,
|
||||
location: "n",
|
||||
labels: legendLabels,
|
||||
rendererOptions:{numberRows: 1, placement: "outsideGrid", disableIEFading:true, paddingLeft:"8"},
|
||||
marginTop: '10px',
|
||||
fontSize: "1.2em"
|
||||
},
|
||||
axesDefaults: {
|
||||
tickRenderer: $.jqplot.CanvasAxisTickRenderer,
|
||||
tickOptions:{
|
||||
fontSize: "9pt"
|
||||
}
|
||||
},
|
||||
axes:{
|
||||
xaxis:{
|
||||
renderer:$.jqplot.CategoryAxisRenderer
|
||||
},
|
||||
yaxis: yAxis
|
||||
},
|
||||
cursor:{
|
||||
show:false,
|
||||
zoom:false
|
||||
}
|
||||
};
|
||||
|
||||
return returnOptions;
|
||||
}
|
||||
</script>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,10 @@
|
||||
<%@ page import="
|
||||
org.springframework.web.context.*,
|
||||
org.springframework.web.context.support.*,
|
||||
com.eactive.eai.rms.common.spring.LocaleMessage" %>
|
||||
<%
|
||||
ServletContext ctx = pageContext.getServletContext();
|
||||
WebApplicationContext wac =
|
||||
WebApplicationContextUtils.getRequiredWebApplicationContext(ctx);
|
||||
LocaleMessage localeMessage = (LocaleMessage) wac.getBean("localeMessage");
|
||||
%>
|
||||
@@ -0,0 +1,262 @@
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
|
||||
<link href="<c:url value="/addon/bootstrap-5.3.2/css/bootstrap.min.css"/>" rel="stylesheet" />
|
||||
<script src="<c:url value="/addon/bootstrap-5.3.2/js/bootstrap.bundle.min.js"/>"></script>
|
||||
<link href="<c:url value="/addon/select2-4.1.0/css/select2.min.css"/>" rel="stylesheet" />
|
||||
<link href="<c:url value="/addon/select2-4.1.0/css/select2-bootstrap.min.css"/>" rel="stylesheet" />
|
||||
<script src="<c:url value="/addon/select2-4.1.0/js/select2.min.js"/>"></script>
|
||||
<link href="<c:url value="/addon/gridjs/theme/mermaid.min.css"/>" rel="stylesheet" />
|
||||
<script src="<c:url value="/addon/gridjs/gridjs.production.min.js"/>"></script>
|
||||
<link href="<c:url value="/addon/bootstrap-icons-1.11.3/bootstrap-icons.min.css"/>" rel="stylesheet" />
|
||||
<link href="<c:url value="/addon/bootstrap-datepicker/css/bootstrap-datepicker.min.css"/>" rel="stylesheet" />
|
||||
<script src="<c:url value="/addon/bootstrap-datepicker/js/bootstrap-datepicker.min.js"/>"></script>
|
||||
<script src="<c:url value="/addon/bootstrap-datepicker/locales/bootstrap-datepicker.ko.min.js"/>"></script>
|
||||
|
||||
<style>
|
||||
.card {
|
||||
border: none;
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
.card:hover {
|
||||
transform: translateY(-5px);
|
||||
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
.card-icon {
|
||||
font-size: 2.5rem;
|
||||
margin-bottom: 0.5rem;
|
||||
}
|
||||
.card-title {
|
||||
font-size: 1.25rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
.card-text {
|
||||
font-size: 1.5rem;
|
||||
font-weight: 700;
|
||||
}
|
||||
.search-panel {
|
||||
background-color: #f8f9fa;
|
||||
border-radius: 10px;
|
||||
padding: 20px;
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
.gridjs-wrapper {
|
||||
border-radius: 10px;
|
||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
||||
border: none !important;
|
||||
font-size: 14px;
|
||||
}
|
||||
.gridjs-table {
|
||||
border: none !important;
|
||||
}
|
||||
.gridjs-thead {
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
.gridjs-th {
|
||||
background-color: #f8f9fa !important;
|
||||
color: #495057 !important;
|
||||
border-top: none !important;
|
||||
text-align: center !important;
|
||||
padding: 15px !important;
|
||||
font-size: 16px !important;
|
||||
}
|
||||
.gridjs-td {
|
||||
border: none !important;
|
||||
padding: 15px !important;
|
||||
font-size: 14px !important;
|
||||
}
|
||||
.gridjs-tr:nth-child(even) {
|
||||
background-color: #f8f9fa;
|
||||
}
|
||||
.gridjs-tr:hover {
|
||||
background-color: #e9ecef;
|
||||
}
|
||||
.gridjs-search {
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
.gridjs-search-input {
|
||||
border-radius: 5px;
|
||||
border: 1px solid #ced4da;
|
||||
padding: 10px 15px;
|
||||
width: 100%;
|
||||
}
|
||||
/* Datepicker 스타일 추가 */
|
||||
.datepicker {
|
||||
border-radius: 0.375rem;
|
||||
border: 1px solid #ced4da;
|
||||
}
|
||||
.datepicker-dropdown {
|
||||
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.btn-date-range.active {
|
||||
background-color: #6c757d;
|
||||
color: white;
|
||||
}
|
||||
.required-mark {
|
||||
color: red;
|
||||
margin-left: 2px;
|
||||
font-weight: bold;
|
||||
}
|
||||
</style>
|
||||
|
||||
<script>
|
||||
// 현재 페이지 타입을 결정하는 함수
|
||||
function getPageType() {
|
||||
if (window.location.href.includes('portalStatisticsApiTableMan')) {
|
||||
return 'API';
|
||||
} else if (window.location.href.includes('portalStatisticsAppTableMan')) {
|
||||
return 'APP';
|
||||
} else if (window.location.href.includes('portalStatisticsOrgTableMan')) {
|
||||
return 'ORG';
|
||||
} else if (window.location.href.includes('portalStatisticsDailyApiTableMan')) {
|
||||
return 'DAILY_API';
|
||||
} else if (window.location.href.includes('portalStatisticsDailyAppTableMan')) {
|
||||
return 'DAILY_APP';
|
||||
} else if (window.location.href.includes('portalStatisticsDailyOrgTableMan')) {
|
||||
return 'DAILY_ORG';
|
||||
}
|
||||
return 'UNKNOWN'; // 기본값
|
||||
}
|
||||
|
||||
// 선택된 날짜 범위를 가져오는 함수
|
||||
function getDateRange() {
|
||||
var startDate = document.querySelector('input[name=startDate]').value;
|
||||
var endDate = document.querySelector('input[name=endDate]').value;
|
||||
return { startDate: startDate, endDate: endDate };
|
||||
}
|
||||
|
||||
// CSV 내보내기 함수
|
||||
function exportToCSV(grid) {
|
||||
if (!grid) {
|
||||
alert('데이터를 먼저 조회해주세요.');
|
||||
return;
|
||||
}
|
||||
|
||||
var pageType = getPageType();
|
||||
var dateRange = getDateRange();
|
||||
|
||||
// 날짜 형식을 YYYYMMDD로 변경
|
||||
var formattedStartDate = dateRange.startDate.replace(/-/g, '');
|
||||
var formattedEndDate = dateRange.endDate.replace(/-/g, '');
|
||||
|
||||
var fileName = pageType + '_' + formattedStartDate + '_' + formattedEndDate + '.csv';
|
||||
|
||||
var csvContent = "data:text/csv;charset=utf-8,\uFEFF"; // BOM 추가로 한글 깨짐 방지
|
||||
|
||||
// 헤더 추가
|
||||
var headers = grid.config.columns.map(function(col) { return col.name; });
|
||||
csvContent += headers.join(",") + "\r\n";
|
||||
|
||||
// 데이터 추가
|
||||
grid.config.data.forEach(function(row) {
|
||||
var dataRow = headers.map(function(header) {
|
||||
var column = grid.config.columns.find(function(col) { return col.name === header; });
|
||||
var cellValue = row[column.id];
|
||||
// 큰따옴표로 감싸고 콤마를 이스케이프
|
||||
return '"' + (cellValue ? cellValue.toString().replace(/"/g, '""') : '') + '"';
|
||||
});
|
||||
csvContent += dataRow.join(",") + "\r\n";
|
||||
});
|
||||
|
||||
var encodedUri = encodeURI(csvContent);
|
||||
var link = document.createElement("a");
|
||||
link.setAttribute("href", encodedUri);
|
||||
link.setAttribute("download", fileName);
|
||||
document.body.appendChild(link);
|
||||
link.click();
|
||||
document.body.removeChild(link);
|
||||
}
|
||||
|
||||
// addExportButton 함수 수정
|
||||
function addExportButton(grid) {
|
||||
var gridContainer = grid.config.container;
|
||||
var gridHead = gridContainer.querySelector('.gridjs-head');
|
||||
|
||||
if (gridHead) {
|
||||
var headerContainer = document.createElement('div');
|
||||
headerContainer.style.display = 'flex';
|
||||
headerContainer.style.justifyContent = 'space-between';
|
||||
headerContainer.style.alignItems = 'center';
|
||||
headerContainer.style.marginBottom = '10px';
|
||||
|
||||
var searchInput = gridHead.querySelector('.gridjs-search');
|
||||
if (searchInput) {
|
||||
headerContainer.appendChild(searchInput);
|
||||
}
|
||||
|
||||
var exportButton = document.createElement('button');
|
||||
exportButton.className = 'btn btn-sm btn-success gridjs-export-btn';
|
||||
exportButton.innerHTML = '<i class="bi bi-download"></i> CSV 내보내기';
|
||||
|
||||
// 명시적인 스타일 적용
|
||||
exportButton.style.backgroundColor = '#198754';
|
||||
exportButton.style.color = '#ffffff';
|
||||
exportButton.style.border = '1px solid #198754';
|
||||
exportButton.style.borderRadius = '4px';
|
||||
exportButton.style.padding = '5px 10px';
|
||||
exportButton.style.fontSize = '14px';
|
||||
exportButton.style.cursor = 'pointer';
|
||||
exportButton.style.marginLeft = '10px';
|
||||
exportButton.style.outline = 'none';
|
||||
exportButton.style.boxShadow = 'none';
|
||||
|
||||
exportButton.onmouseover = function() {
|
||||
this.style.backgroundColor = '#157347';
|
||||
this.style.borderColor = '#146c43';
|
||||
};
|
||||
exportButton.onmouseout = function() {
|
||||
this.style.backgroundColor = '#198754';
|
||||
this.style.borderColor = '#198754';
|
||||
};
|
||||
|
||||
exportButton.onclick = function() { exportToCSV(grid); };
|
||||
|
||||
headerContainer.appendChild(exportButton);
|
||||
gridHead.insertBefore(headerContainer, gridHead.firstChild);
|
||||
|
||||
// 스타일 태그 추가
|
||||
var style = document.createElement('style');
|
||||
style.textContent = '.gridjs-export-btn { display: inline-block !important; visibility: visible !important; opacity: 1 !important; }';
|
||||
document.head.appendChild(style);
|
||||
}
|
||||
}
|
||||
function getRequiredLabel(label) {
|
||||
return label + ' <span class="required-mark">*</span>';
|
||||
}
|
||||
// 사업자등록번호 포맷팅
|
||||
function formatCompanyRegNo(value) {
|
||||
return value.replace(/(\d{3})(\d{2})(\d{5})/, "$1-$2-$3");
|
||||
}
|
||||
// 법인등록번호 포맷팅
|
||||
function formatCorpRegNo(value) {
|
||||
return value.replace(/(\d{6})(\d{7})/, "$1-$2");
|
||||
}
|
||||
function removeHyphen(text) {
|
||||
return text.replace(/-/g, '');
|
||||
}
|
||||
// 전화번호 포맷팅 (일반전화, 휴대폰, 대표번호 등)
|
||||
function formatPhoneNumber(phoneNumber) {
|
||||
if (!phoneNumber) return '';
|
||||
|
||||
phoneNumber = phoneNumber.replace(/[^0-9]/g, ''); // 숫자만 추출
|
||||
|
||||
if (phoneNumber.length <= 4) {
|
||||
return phoneNumber;
|
||||
} else if (phoneNumber.length <= 7) {
|
||||
return phoneNumber.replace(/(\d{4})(\d{1,3})/, '$1-$2');
|
||||
} else if (phoneNumber.startsWith('02')) { // 서울 지역번호
|
||||
return phoneNumber.replace(/(\d{2})(\d{3,4})(\d{4})/, '$1-$2-$3');
|
||||
} else if (phoneNumber.startsWith('1')) { // 1588, 1566 등
|
||||
if (phoneNumber.length <= 8) {
|
||||
return phoneNumber.replace(/(\d{4})(\d{4})/, '$1-$2');
|
||||
} else {
|
||||
return phoneNumber.replace(/(\d{4})(\d{3,4})(\d{4})/, '$1-$2-$3');
|
||||
}
|
||||
} else { // 그 외 지역번호 또는 휴대전화
|
||||
return phoneNumber.replace(/(\d{3})(\d{3,4})(\d{4})/, '$1-$2-$3');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,365 @@
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
|
||||
<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
|
||||
<%@ include file="/jsp/common/include/localemessage.jsp" %>
|
||||
|
||||
<c:set var="locale" value="<%= localeMessage.getLocale() %>"/>
|
||||
|
||||
<script language="javascript" src="<c:url value="/js/jquery-1.12.1.min.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/jquery-ui.js"/>"></script>
|
||||
<%-- <script language="javascript" src="<c:url value="/js/jquery-ui.min.js"/>"></script> --%>
|
||||
<script language="javascript" src="<c:url value="/js/grid.locale-${locale}.js"/>" charset="utf-8"></script>
|
||||
<script language="javascript" src="<c:url value="/js/prefixfree.min.js"/>"></script>
|
||||
|
||||
<script type="text/javascript">
|
||||
jQuery.browser = {};
|
||||
(function () {
|
||||
jQuery.browser.msie = false;
|
||||
jQuery.browser.version = 0;
|
||||
if (navigator.userAgent.match(/MSIE ([0-9]+)\./)) {
|
||||
jQuery.browser.msie = true;
|
||||
jQuery.browser.version = RegExp.$1;
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
|
||||
|
||||
<script language="javascript" src="<c:url value="/js/jquery.jqGrid.min.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/jquery.form.min.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/jquery.contextMenu.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/custom.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/common-${locale}.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/jquery.inputmask.bundle.min.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/jquery.searchabledropdown-1.0.8.min.js"/>"></script>
|
||||
<%-- <script language="javascript" src="<c:url value="/js/jquery.searchable-1.1.0.min.js"/>"></script> --%>
|
||||
<script language="javascript" src="<c:url value="/js/jexcel.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/jsuites.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/jsuites.webcomponents.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/custom.component.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/Nwagon.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/vkbeautify.js"/>"></script>
|
||||
<script language="javascript" src="<c:url value="/js/select2.min.js"/>"></script>
|
||||
|
||||
<script src="<c:url value="/addon/codemirror/lib/codemirror.js"/>"></script>
|
||||
<script src="<c:url value="/addon/codemirror/mode/javascript/javascript.js"/>"></script>
|
||||
<script src="<c:url value="/addon/codemirror/mode/xml/xml.js"/>"></script>
|
||||
<script src="<c:url value="/addon/codemirror/addon/edit/matchbrackets.js"/>"></script>
|
||||
<script src="<c:url value="/addon/codemirror/addon/edit/closebrackets.js"/>"></script>
|
||||
<script src="<c:url value="/addon/codemirror/addon/comment/comment.js"/>"></script>
|
||||
<script src="<c:url value="/addon/codemirror/addon/comment/continuecomment.js"/>"></script>
|
||||
|
||||
<script src="<c:url value="/addon/codemirror/lint/jsonlint.js"/>"></script>
|
||||
<script src="<c:url value="/addon/codemirror/addon/lint/lint.js"/>"></script>
|
||||
<script src="<c:url value="/addon/codemirror/addon/lint/javascript-lint.js"/>"></script>
|
||||
<script src="<c:url value="/addon/codemirror/addon/lint/html-lint.js"/>"></script>
|
||||
<script src="<c:url value="/addon/codemirror/addon/lint/json-lint.js"/>"></script>
|
||||
<script src="<c:url value="/addon/codemirror/addon/lint/css-lint.js"/>"></script>
|
||||
|
||||
<script src="<c:url value="/addon/summernote/summernote-lite.min.js"/>"></script>
|
||||
<script src="<c:url value="/addon/summernote/summernote-cleaner.js"/>"></script>
|
||||
<script src="<c:url value="/addon/summernote/lang/summernote-ko-KR.js"/>"></script>
|
||||
|
||||
<script language="javascript">
|
||||
|
||||
function buttonControl() {
|
||||
if (arguments.length == 0) {
|
||||
$("img[level], button[level]").hide();
|
||||
if ("${rmsMenuAuth}" == "W") {
|
||||
$("img[level='W']").show();
|
||||
$("img[level='R']").show();
|
||||
$("button[level='W']").show();
|
||||
$("button[level='R']").show();
|
||||
} else if ("${rmsMenuAuth}" == "R") {
|
||||
$("img[level='R']").show();
|
||||
$("button[level='R']").show();
|
||||
}
|
||||
} else if (arguments.length == 1) {
|
||||
var status = arguments[0];
|
||||
if (arguments[0]) {
|
||||
status = 'DETAIL';
|
||||
} else {
|
||||
status = 'NEW';
|
||||
}
|
||||
|
||||
if (arguments[0] == 'DETAIL') {
|
||||
status = 'DETAIL';
|
||||
} else if (arguments[0] == 'NEW') {
|
||||
status = 'NEW';
|
||||
} else if (arguments[0] == 'TEMP') {
|
||||
status = 'TEMP';
|
||||
}
|
||||
|
||||
$("img[level]").hide();
|
||||
$("button[level]").hide();
|
||||
if ("${rmsMenuAuth}" == "W") {
|
||||
$("img[level='W'][status*=" + status + "]").show();
|
||||
$("img[level='R'][status*=" + status + "]").show();
|
||||
$("button[level='W'][status*=" + status + "]").show();
|
||||
$("button[level='R'][status*=" + status + "]").show();
|
||||
} else if ("${rmsMenuAuth}" == "R") {
|
||||
$("img[level='R'][status*=" + status + "]").show();
|
||||
$("button[level='R'][status*=" + status + "]").show();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
function buttonControl(){
|
||||
if (arguments.length == 0){
|
||||
$("img[level]").hide();
|
||||
if ("${rmsMenuAuth}" =="W"){
|
||||
$("img[level='W']").show();
|
||||
$("img[level='R']").show();
|
||||
}else if ("${rmsMenuAuth}" =="R"){
|
||||
$("img[level='R']").show();
|
||||
$("tr[level='W']").hide();
|
||||
}
|
||||
} else if (arguments.length == 1){
|
||||
var isStatus = false;
|
||||
if (isBoolean(arguments[0])){
|
||||
isStatus = arguments[0];
|
||||
}else{
|
||||
if (arguments[0] != "" && arguments[0] !="null"){
|
||||
isStatus = true;
|
||||
}else{
|
||||
isStatus = false;
|
||||
}
|
||||
}
|
||||
var sel = "";
|
||||
if (isStatus){
|
||||
//detail
|
||||
sel = "DETAIL";
|
||||
}else{
|
||||
//new
|
||||
sel = "NEW";
|
||||
$("#btn_modify").attr('src',"<c:url value='/img/btn_regist.png'/>");
|
||||
}
|
||||
$("img[level]").hide();
|
||||
if ("${rmsMenuAuth}" =="W"){
|
||||
$("img[level='W'][status*="+sel+"]").show();
|
||||
$("img[level='R'][status*="+sel+"]").show();
|
||||
}else if ("${rmsMenuAuth}" =="R"){
|
||||
$("img[level='R'][status*="+sel+"]").show();
|
||||
$("tr[level='W']").hide();
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
function getSearchUrlForReturn() {
|
||||
var array = [];
|
||||
<c:forEach var="pageParameter" items="${param}"><c:if test="${fn:startsWith(pageParameter.key,'search')}">
|
||||
array.push('<c:out value="${pageParameter.key}" />' + "=" + '<c:out value="${pageParameter.value}" />'.replace(/%23/g, '#'));
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
<c:forEach var="pageParameter" items="${param}"><c:if test="${fn:startsWith(pageParameter.key,'like')}">
|
||||
array.push('<c:out value="${pageParameter.key}" />' + "=" + '<c:out value="${pageParameter.value}" />'.replace(/%23/g, '#'));
|
||||
</c:if></c:forEach>
|
||||
return array.join("&");
|
||||
}
|
||||
|
||||
function getSearchUrlForReturnArray() {
|
||||
var array = [];
|
||||
<c:forEach var="pageParameter" items="${param}"><c:if test="${fn:startsWith(pageParameter.key,'search')}">
|
||||
array.push('<c:out value="${pageParameter.key}" />' + "=" + '<c:out value="${pageParameter.value}" />'.replace(/%23/g, '#'));
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
<c:forEach var="pageParameter" items="${param}"><c:if test="${fn:startsWith(pageParameter.key,'like')}">
|
||||
array.push('<c:out value="${pageParameter.key}" />' + "=" + '<c:out value="${pageParameter.value}" />'.replace(/%23/g, '#'));
|
||||
</c:if></c:forEach>
|
||||
return array;
|
||||
}
|
||||
|
||||
function getReturnUrlForReturn(search) {
|
||||
var returnUrl = '${param.returnUrl}';
|
||||
returnUrl = returnUrl + '?cmd=' + 'LIST';
|
||||
returnUrl = returnUrl + '&page=' + '${param.page}';
|
||||
returnUrl = returnUrl + '&menuId=' + '${param.menuId}';
|
||||
returnUrl = returnUrl + '&sortName=' + '${param.sortName}';
|
||||
returnUrl = returnUrl + '&sortOrder=' + '${param.sortOrder}';
|
||||
//검색조건
|
||||
returnUrl = returnUrl + '&' + getSearchUrlForReturn();
|
||||
return returnUrl;
|
||||
}
|
||||
|
||||
function getReloadUrl(cmd) {
|
||||
var returnUrl = '${param.returnUrl}';
|
||||
returnUrl = returnUrl + '?cmd=' + cmd;
|
||||
returnUrl = returnUrl + '&page=' + '${param.pages}';
|
||||
returnUrl = returnUrl + '&menuId=' + '${param.menuId}';
|
||||
//검색조건
|
||||
returnUrl = returnUrl + '&' + getSearchUrlForReturn();
|
||||
return returnUrl;
|
||||
}
|
||||
|
||||
function putSelectFromParam() {
|
||||
var array = [];
|
||||
<c:forEach var="pageParameter" items="${param}">
|
||||
<c:if test="${fn:startsWith(pageParameter.key,'search')}">
|
||||
var name = "${pageParameter.key}";
|
||||
var value = "${pageParameter.value}"
|
||||
|
||||
$("select[name=" + name + "]").val(value);
|
||||
$("input[name=" + name + "]").val(value);
|
||||
</c:if>
|
||||
</c:forEach>
|
||||
|
||||
}
|
||||
|
||||
function getMenuId() {
|
||||
return '${param.menuId}';
|
||||
}
|
||||
|
||||
var $ = jQuery.noConflict();
|
||||
$(document).keydown(function (e) {
|
||||
var element = e.target.nodeName.toLowerCase();
|
||||
if (element != 'input' && element != 'textarea') {
|
||||
if (e.keyCode === 8) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
function camelToSnake(str) {
|
||||
return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`);
|
||||
}
|
||||
|
||||
function snakeToCamel(str) {
|
||||
return str.replace(/[^a-zA-Z0-9]+(.)/g, (m, chr) => chr.toUpperCase());
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* JS 메시지 변수 사용시 포멧팅을 위해 추가 다음과 같이 사용 가능
|
||||
* 인터페이스 삭제시 배포시스템에서도 삭제가 될 수 있습니다. {0}를 삭제하시겠습니까?".formatLocale($("#infId").val())
|
||||
*
|
||||
* 사용 예>
|
||||
* 기존 JS 메시지
|
||||
* 인터페이스 삭제시 배포시스템에서도 삭제가 될 수 있습니다.\n" + $("#infId").val() + "를 삭제하시겠습니까?
|
||||
* format 함수 사용한 JS 메시지
|
||||
* 인터페이스 삭제시 배포시스템에서도 삭제가 될 수 있습니다.\n {0}를 삭제하시겠습니까?".formatLocale($("#infId").val())
|
||||
* Java Locale(ResourceBundle)과 함께 사용한 예시
|
||||
* localeMessage.getString("interface.message.confirmDeleteInterfaceWithDeployedSystem" ) %>".formatLocale($("#infId").val());
|
||||
*/
|
||||
String.prototype.formatLocale = function () {
|
||||
var args = arguments;
|
||||
return this.replace(/{(\d+)}/g, function (match, number) {
|
||||
return typeof args[number] != 'undefined'
|
||||
? args[number]
|
||||
: match
|
||||
;
|
||||
});
|
||||
};
|
||||
|
||||
formatLocale = function (format) {
|
||||
var args = Array.prototype.slice.call(arguments, 1);
|
||||
return format.replace(/{(\d+)}/g, function (match, number) {
|
||||
return typeof args[number] != 'undefined'
|
||||
? args[number]
|
||||
: match
|
||||
;
|
||||
});
|
||||
};
|
||||
|
||||
function prettyJson(jsonText) {
|
||||
if (!jsonText) {
|
||||
return jsonText;
|
||||
}
|
||||
|
||||
var prettyJson = new Array();
|
||||
var depth = 0;
|
||||
var currChar;
|
||||
var prevChar;
|
||||
var doubleQuoteIn = false;
|
||||
|
||||
for (var i = 0; i < jsonText.length; i++) {
|
||||
currChar = jsonText.charAt(i);
|
||||
|
||||
if (currChar == '\"') {
|
||||
if (prevChar != '\\') {
|
||||
doubleQuoteIn = !doubleQuoteIn;
|
||||
}
|
||||
}
|
||||
|
||||
switch (currChar) {
|
||||
case '{':
|
||||
prettyJson.push(currChar);
|
||||
if (!doubleQuoteIn) {
|
||||
prettyJson.push('\n');
|
||||
insertTab(prettyJson, ++depth);
|
||||
}
|
||||
break;
|
||||
case '}':
|
||||
if (!doubleQuoteIn) {
|
||||
prettyJson.push('\n');
|
||||
insertTab(prettyJson, --depth);
|
||||
}
|
||||
prettyJson.push(currChar);
|
||||
break;
|
||||
case ',':
|
||||
prettyJson.push(currChar);
|
||||
if (!doubleQuoteIn) {
|
||||
prettyJson.push('\n');
|
||||
insertTab(prettyJson, depth);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
prettyJson.push(currChar);
|
||||
break;
|
||||
}
|
||||
|
||||
prevChar = currChar;
|
||||
}
|
||||
return prettyJson.join('');
|
||||
}
|
||||
|
||||
const TAB = ' ';
|
||||
|
||||
function insertTab(prettyJson, depth) {
|
||||
for (var i = 0; i < depth; i++) {
|
||||
prettyJson.push(TAB);
|
||||
}
|
||||
}
|
||||
|
||||
async function downloadFiles(url, body) {
|
||||
url += "&serviceType=" + sessionStorage["serviceType"]
|
||||
let headers;
|
||||
if (body instanceof FormData || body instanceof URLSearchParams) {
|
||||
headers = {};
|
||||
} else {
|
||||
headers = {
|
||||
'Content-Type': 'application/json',
|
||||
};
|
||||
}
|
||||
try {
|
||||
const response = await fetch(url, {
|
||||
method: 'POST',
|
||||
headers: headers,
|
||||
body: body
|
||||
});
|
||||
if (!response.ok) throw new Error('Server responded with an error!');
|
||||
|
||||
const blob = await response.blob();
|
||||
const contentDisposition = response.headers.get('Content-Disposition');
|
||||
let filename = "downloaded_file"; // 기본 파일 이름
|
||||
if (contentDisposition) {
|
||||
const filenameMatch = contentDisposition.match(/filename="?([^"]+)"?/);
|
||||
if (filenameMatch.length > 1) {
|
||||
filename = filenameMatch[1];
|
||||
filename = decodeURI(filename);
|
||||
}
|
||||
}
|
||||
const downloadUrl = window.URL.createObjectURL(blob);
|
||||
const a = document.createElement('a');
|
||||
a.href = downloadUrl;
|
||||
a.download = filename; // 압축 파일 이름, 서버에서 설정 가능
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
document.body.removeChild(a);
|
||||
window.URL.revokeObjectURL(downloadUrl);
|
||||
} catch (error) {
|
||||
console.error('Download failed:', error);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
Reference in New Issue
Block a user