This commit is contained in:
Rinjae
2025-09-05 17:16:26 +09:00
commit c54ef1903f
4947 changed files with 817291 additions and 0 deletions
+283
View File
@@ -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>
+98
View File
@@ -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");
%>
+262
View File
@@ -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>
+365
View File
@@ -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>