init
This commit is contained in:
@@ -0,0 +1,343 @@
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" %>
|
||||
<%@ page import="java.io.*" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ include file="/jsp/common/include/localemessage.jsp" %>
|
||||
<%
|
||||
response.setHeader("Pragma", "No-cache");
|
||||
response.setHeader("Cache-Control", "no-cache");
|
||||
response.setHeader("Expires", "0");
|
||||
|
||||
%>
|
||||
<html>
|
||||
<head>
|
||||
<title></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
|
||||
<jsp:include page="/jsp/common/include/css.jsp"/>
|
||||
<jsp:include page="/jsp/common/include/script.jsp"/>
|
||||
<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>
|
||||
<!-- FilePond stylesheet -->
|
||||
<link href="<c:url value="/addon/filepond/filepond.min.css"/>" rel="stylesheet">
|
||||
<!-- FilePond JavaScript library -->
|
||||
<script src="<c:url value="/addon/filepond/filepond.min.js"/>"></script>
|
||||
<!-- FilePond plugin for file validation -->
|
||||
<script src="<c:url value="/addon/filepond/plugin/filepond-plugin-file-validate-type.min.js"/>"></script>
|
||||
<script language="javascript">
|
||||
var url = '<c:url value="/onl/transaction/apim/apiInterfaceMan.json"/>';
|
||||
var url_view = '<c:url value="/onl/transaction/apim/apiInterfaceMan.view"/>';
|
||||
var url_file = '<c:url value="/onl/transaction/apim/apiInterfaceMan.file"/>';
|
||||
|
||||
var selectName = "searchEaiBzwkDstcd"; // selectBox Name
|
||||
function init(callback) {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: url,
|
||||
dataType: "json",
|
||||
data: {cmd: 'LIST_COMBO'},
|
||||
success: function (json) {
|
||||
new makeOptions("BIZCODE", "BIZNAME").setObj($("select[name=searchEaiBzwkDstcd]")).setNoValueInclude(true).setNoValue("", "전체").setData(json.bizList).setFormat(codeName3OptionFormat).rendering();
|
||||
|
||||
setSearchable(selectName); // 콤보에 searchable 설정
|
||||
putSelectFromParam();
|
||||
|
||||
if (typeof callback === 'function') {
|
||||
callback();
|
||||
}
|
||||
},
|
||||
error: function (e) {
|
||||
alert(e.responseText);
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function detail() {
|
||||
var postData = getSearchForJqgrid("cmd", "LIST"); //jqgrid에서는 object 로
|
||||
$("#grid").setGridParam({url: url, postData: postData}).trigger("reloadGrid");
|
||||
}
|
||||
|
||||
function search() {
|
||||
var postData = getSearchForJqgrid("cmd", "LIST"); //jqgrid에서는 object 로
|
||||
$("#grid").setGridParam({url: url, postData: postData, page: 1}).trigger("reloadGrid");
|
||||
}
|
||||
|
||||
function ioFormatter(cellvalue, options, rowObject) {
|
||||
var serviceType = sessionStorage["serviceType"];
|
||||
if (cellvalue == "I") {
|
||||
return "타발";
|
||||
} else if (cellvalue == "O") {
|
||||
return "당발";
|
||||
}
|
||||
}
|
||||
|
||||
function adapterNameShortFormatter(cellvalue, options, rowObject) {
|
||||
if (cellvalue == null || cellvalue == '')
|
||||
return ''
|
||||
return cellvalue.substring(1, 4);
|
||||
}
|
||||
|
||||
function list() {
|
||||
detail()
|
||||
var gridPostData = getSearchForJqgrid("cmd", "LIST"); //jqgrid에서는 object 로
|
||||
$('#grid').jqGrid({
|
||||
datatype: "json",
|
||||
mtype: 'POST',
|
||||
url: url,
|
||||
postData: gridPostData,
|
||||
colNames: ['업무구분',
|
||||
'API 명(*)',
|
||||
'API 설명',
|
||||
'요청',
|
||||
'응답',
|
||||
'작성자',
|
||||
'가상응답여부',
|
||||
'변경일시(*)',
|
||||
'SyncAsyncType',
|
||||
],
|
||||
colModel: [{name: 'eaiBzwkDstcd', align: 'center', width: '40', sortable: false},
|
||||
{name: 'eaiSvcName', align: 'left', width: '100', sortable: true},
|
||||
{name: 'eaiSvcDesc', align: 'left', sortable: false},
|
||||
{name: 'fromAdapter', align: 'center', width: '40', formatter: adapterNameShortFormatter, sortable: false},
|
||||
{name: 'toAdapter', align: 'center', width: '40', formatter: adapterNameShortFormatter, sortable: false},
|
||||
{name: 'author', align: 'center', width: '60', sortable: false},
|
||||
{name : 'simYn', align : 'center' , width:'40', hidden: true },
|
||||
{name : 'lastModifiedDate', align : 'center' , width:'40', sortable: true},
|
||||
{name: 'syncAsyncType', align: 'center', width: '40', hidden: true},
|
||||
],
|
||||
jsonReader: {
|
||||
repeatitems: false
|
||||
},
|
||||
pager: $('#pager'),
|
||||
page: '${param.page}',
|
||||
rowNum: '${rmsDefaultRowNum}',
|
||||
autoheight: true,
|
||||
height: $("#container").height(),
|
||||
autowidth: true,
|
||||
viewrecords: true,
|
||||
multiselect: true,
|
||||
multiboxonly: false,
|
||||
rowList: eval('[${rmsDefaultRowList}]'),
|
||||
ondblClickRow: function (rowId) {
|
||||
var rowData = $(this).getRowData(rowId);
|
||||
let key = rowData['eaiSvcName'];
|
||||
const syncAsyncType = rowData['syncAsyncType'];
|
||||
if (syncAsyncType === 'syncAsync') {
|
||||
const sendRecvType = key.charAt(key.length - 2); // 끝에서 두 번째 문자 추출
|
||||
if (sendRecvType === 'R') {
|
||||
// 문자열의 시작 부분부터 끝에서 세 번째 문자까지 추출
|
||||
var start = key.substring(0, key.length - 2);
|
||||
// 문자열의 마지막 문자 추출
|
||||
var end = key.charAt(key.length - 1);
|
||||
// 시작 부분, 새로운 문자 'S', 그리고 마지막 부분을 결합
|
||||
key = start + 'S' + end;
|
||||
}
|
||||
}
|
||||
|
||||
var url2 = url_view;
|
||||
url2 += '?cmd=DETAIL';
|
||||
url2 += '&page=' + $(this).getGridParam("page");
|
||||
url2 += '&returnUrl=' + getReturnUrl();
|
||||
url2 += '&menuId=' + '${param.menuId}';
|
||||
//검색값
|
||||
url2 += '&' + getSearchUrl();
|
||||
//key값
|
||||
url2 += '&eaiSvcName=' + key;
|
||||
goNav(url2);
|
||||
},
|
||||
onSortCol :function(sidx,colnum,sort_order){
|
||||
var gridPostData = getSearchForJqgrid("cmd","LIST");
|
||||
var sortorder="";
|
||||
if( sort_order == "")
|
||||
sortorder ='asc';
|
||||
else
|
||||
sortorder = sort_order;
|
||||
gridPostData["sortName"] =sidx;
|
||||
gridPostData["sortOrder"]=sortorder;
|
||||
$("#grid").setGridParam({ url:url, postData: gridPostData, sortname:sidx, sortorder:sortorder, page:"1"}).trigger("reloadGrid");
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
|
||||
init(list);
|
||||
|
||||
resizeJqGridWidth('grid', 'content_middle', '1000');
|
||||
|
||||
$("#btn_search").click(function () {
|
||||
search();
|
||||
});
|
||||
$("#btn_new").click(function () {
|
||||
var url2 = url_view;
|
||||
url2 += '?cmd=DETAIL';
|
||||
url2 += '&page=' + $("#grid").getGridParam("page");
|
||||
url2 += '&returnUrl=' + getReturnUrl();
|
||||
url2 += '&menuId=' + '${param.menuId}';
|
||||
//검색값
|
||||
url2 += '&' + getSearchUrl();
|
||||
//key값
|
||||
url2 += '&eaiSvcName=';
|
||||
|
||||
goNav(url2);
|
||||
});
|
||||
|
||||
$("input[name^=search]").keydown(function (key) {
|
||||
if (key.keyCode == 13) {
|
||||
$("#btn_search").click();
|
||||
}
|
||||
});
|
||||
|
||||
function callDownload(interfaceId){
|
||||
const url = '<c:url value="/loader.do" />';
|
||||
const postData = [];
|
||||
postData.push({ name: "cmd" , value: 'interface'});
|
||||
postData.push({ name: "control" , value:"downloadfull"});
|
||||
postData.push({ name: "interfaceId" , value: interfaceId});
|
||||
return new Promise((resolve, reject) => {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: url,
|
||||
data: postData,
|
||||
success: function (response) {
|
||||
resolve(response);
|
||||
},
|
||||
error: function (error) {
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
async function deployDownload(interfaceId){
|
||||
try {
|
||||
let response = await callDownload(interfaceId);
|
||||
return response.trim();
|
||||
} catch (error) {
|
||||
window.alert(interfaceId+' download error '+JSON.stringify(error));
|
||||
}
|
||||
}
|
||||
|
||||
$("#btn_download").click(async function(){
|
||||
const rowIds = $('#grid').jqGrid('getGridParam', 'selarrrow');
|
||||
let successCount = 0;
|
||||
let failedCount = 0;
|
||||
for(let i = 0; i < rowIds.length; i++){
|
||||
const rowData = $("#grid").getRowData(rowIds[i]);
|
||||
const response = await deployDownload(rowData['eaiSvcName']);
|
||||
if(response != null && response.includes('success')){
|
||||
successCount++;
|
||||
}else{
|
||||
failedCount++
|
||||
}
|
||||
}
|
||||
window.alert('이관 대상 API 성공['+successCount+']건, 실패['+failedCount+']건 서버에 다운로드 완료');
|
||||
});
|
||||
|
||||
buttonControl();
|
||||
|
||||
FilePond.registerPlugin(FilePondPluginFileValidateType);
|
||||
// FilePond 인스턴스 생성
|
||||
const pond = FilePond.create(document.querySelector('.filepond'), {
|
||||
instantUpload: false, // 파일을 즉시 업로드하지 않음
|
||||
allowRevert: false,
|
||||
acceptedFileTypes: ['application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/json'],
|
||||
// 서버 설정
|
||||
server: {
|
||||
process: {
|
||||
url: url_file + '?cmd=LIST_IMPORT_FILE&serviceType=' + sessionStorage["serviceType"],
|
||||
method: 'POST',
|
||||
// 필요한 경우 headers나 다른 설정 추가
|
||||
},
|
||||
// revert, load, restore, fetch 설정 (필요한 경우)
|
||||
},
|
||||
// 다른 필요한 옵션 추가
|
||||
});
|
||||
|
||||
pond.on('processfiles', () => {
|
||||
// 여기에 모든 파일 업로드 완료 후 실행할 코드를 작성
|
||||
console.debug('모든 파일의 처리가 완료되었습니다.');
|
||||
$('#btn_search').click();
|
||||
});
|
||||
|
||||
// "업로드 시작" 버튼 클릭 이벤트 핸들러
|
||||
document.getElementById('uploadButton').addEventListener('click', function () {
|
||||
pond.processFiles(); // 선택된 모든 파일을 업로드
|
||||
});
|
||||
|
||||
// 모달 닫기 이벤트 핸들러
|
||||
$('#uploadModal').on('hidden.bs.modal', function (e) {
|
||||
pond.removeFiles(); // 모달이 닫힐 때 파일 목록에서 모든 파일 제거
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="right_box">
|
||||
<div class="content_top">
|
||||
<ul class="path">
|
||||
<li><a href="#">${rmsMenuPath}</a></li>
|
||||
</ul>
|
||||
</div><!-- end content_top -->
|
||||
<div class="content_middle" id="content_middle">
|
||||
<div class="search_wrap">
|
||||
<button type="button" class="cssbtn" id="btn_download" level="W" status="DETAIL"><i class="material-icons">cloud_download</i> 이관</button>
|
||||
<button type="button" class="cssbtn" id="btn_import" level="R" data-bs-toggle="modal"
|
||||
data-bs-target="#uploadModal"><i
|
||||
class="material-icons">upload</i> <%=localeMessage.getString("button.import")%>
|
||||
</button>
|
||||
<button type="button" class="cssbtn" id="btn_new" level="W"><i
|
||||
class="material-icons">add</i> <%= localeMessage.getString("button.new") %>
|
||||
</button>
|
||||
<button type="button" class="cssbtn" id="btn_search" level="R"><i
|
||||
class="material-icons">search</i> <%= localeMessage.getString("button.search") %>
|
||||
</button>
|
||||
</div>
|
||||
<div class="title" id="title">${rmsMenuName}</div>
|
||||
<table class="search_condition" cellspacing=0;>
|
||||
<tbody>
|
||||
<tr>
|
||||
<th style="width:180px;">업무구분명</th>
|
||||
<td>
|
||||
<select name="searchEaiBzwkDstcd" value="${param.searchEaiBzwkDstcd}"></select>
|
||||
</td>
|
||||
<th style="width:180px;">API 명</th>
|
||||
<td>
|
||||
<input type="text" name="searchEaiSvcName" value="${param.searchEaiSvcName}">
|
||||
</td>
|
||||
<th style="width:180px;">API설명</th>
|
||||
<td>
|
||||
<input type="text" name="searchEaiSvcDesc" value="${param.searchEaiSvcDesc}">
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<div class="help-text" style="color:#666; font-size:12px; margin-top:5px;">(*) : 정렬가능항목</div>
|
||||
<table id="grid"></table>
|
||||
<div id="pager"></div>
|
||||
</div><!-- end content_middle -->
|
||||
</div><!-- end right_box -->
|
||||
<!-- Modal -->
|
||||
<div class="modal fade" id="uploadModal" tabindex="-1" aria-labelledby="uploadModalLabel" aria-hidden="true">
|
||||
<!-- 모달 내용 -->
|
||||
<div class="modal-dialog modal-lg">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title"><i class="material-icons"
|
||||
style="vertical-align: sub; font-size: 25px">publish</i> <%=localeMessage.getString("button.import")%>
|
||||
</h5>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<input type="file" class="filepond" name="file" multiple data-allow-reorder="true"
|
||||
data-max-file-size="3MB" data-max-files="10">
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button id="uploadButton" class="btn btn-primary">IMPORT <%=localeMessage.getString("button.execute")%>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,148 @@
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8"%>
|
||||
<%@ page import="java.io.*"%>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
|
||||
<%@ include file="/jsp/common/include/localemessage.jsp" %>
|
||||
<%
|
||||
response.setHeader("Pragma", "No-cache");
|
||||
response.setHeader("Cache-Control", "no-cache");
|
||||
response.setHeader("Expires", "0");
|
||||
%>
|
||||
<html>
|
||||
<head>
|
||||
<title>공개 법인 선택</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<jsp:include page="/jsp/common/include/css_custom.jsp"/>
|
||||
<jsp:include page="/jsp/common/include/css.jsp"/>
|
||||
<jsp:include page="/jsp/common/include/script.jsp"/>
|
||||
<script language="javascript">
|
||||
var url = '<c:url value="/onl/apim/portalorg/portalOrgMan.json" />';
|
||||
|
||||
function search() {
|
||||
var postData = getSearchForJqgrid("cmd", "POPUP_LIST");
|
||||
$("#grid").setGridParam({url: url, postData: postData, page: 1}).trigger("reloadGrid");
|
||||
}
|
||||
|
||||
$(document).ready(function() {
|
||||
var urlParams = new URLSearchParams(window.location.search);
|
||||
var selectedOrgIds = urlParams.get("selectedOrgIds");
|
||||
|
||||
if (selectedOrgIds) {
|
||||
selectedOrgIds = selectedOrgIds.split(','); // 콤마로 구분된 ID들을 배열로 변환
|
||||
} else {
|
||||
selectedOrgIds = [];
|
||||
}
|
||||
|
||||
$('#grid').jqGrid({
|
||||
datatype: "json",
|
||||
mtype: 'POST',
|
||||
url: url,
|
||||
postData: getSearchForJqgrid("cmd", "POPUP_LIST"),
|
||||
colNames: ['법인 ID', '법인명', '제휴기관코드', '법인 상태'],
|
||||
colModel: [
|
||||
{name: 'id', hidden: true},
|
||||
{name: 'orgName', align: 'center', width: "180"},
|
||||
{name: 'orgCode', align: 'center', width: "100"},
|
||||
{name: 'orgStatus', align: 'center', width: "80", formatter: function(cellvalue) {
|
||||
switch(cellvalue) {
|
||||
case 'READY': return '준비';
|
||||
case 'ACTIVE': return '정상';
|
||||
case 'REMOVED': return '탈퇴';
|
||||
case 'INACTIVE': return '휴면';
|
||||
default: return cellvalue;
|
||||
}
|
||||
}}
|
||||
],
|
||||
jsonReader: {
|
||||
repeatitems: false
|
||||
},
|
||||
pager: $('#pager'),
|
||||
page: '${param.page}',
|
||||
rowNum: '${rmsDefaultRowNum}',
|
||||
autoheight: true,
|
||||
height: 'auto',
|
||||
width: 410,
|
||||
autowidth: false,
|
||||
viewrecords: true,
|
||||
shrinkToFit: false,
|
||||
multiselect: true,
|
||||
multiboxonly: false,
|
||||
loadComplete: function(data) {
|
||||
var $grid = $(this);
|
||||
$.each($grid.getDataIDs(), function(_, id) {
|
||||
var rowData = $grid.getRowData(id);
|
||||
if ($.inArray(rowData.id, selectedOrgIds) !== -1) {
|
||||
$grid.jqGrid('setSelection', id, true);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$("#btn_search").click(search);
|
||||
|
||||
$("#btn_save").click(function() {
|
||||
var selectedRows = $('#grid').getGridParam('selarrrow');
|
||||
|
||||
// 7개 초과 선택 체크
|
||||
if (selectedRows.length > 7) {
|
||||
alert('최대 7개의 법인만 선택할 수 있습니다.');
|
||||
return;
|
||||
}
|
||||
|
||||
var selectedOrgs = [];
|
||||
if (selectedRows.length > 0) {
|
||||
selectedOrgs = selectedRows.map(function(rowid) {
|
||||
var rowData = $('#grid').getRowData(rowid);
|
||||
return {
|
||||
id: rowData.id,
|
||||
orgName: rowData.orgName
|
||||
};
|
||||
});
|
||||
}
|
||||
// 부모 창의 selectOrg 함수 호출
|
||||
if (window.parent && typeof window.parent.selectOrg === "function") {
|
||||
window.parent.selectOrg(selectedOrgs);
|
||||
window.close();
|
||||
}
|
||||
});
|
||||
|
||||
$("#btn_close").click(function () {
|
||||
window.close();
|
||||
});
|
||||
|
||||
// 검색어 입력 후 엔터 키 처리
|
||||
$("input[name=searchOrgName]").keydown(function(key) {
|
||||
if (key.keyCode == 13) {
|
||||
search();
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="popup_box">
|
||||
<div class="search_wrap">
|
||||
<button type="button" class="cssbtn" id="btn_save" level="W">
|
||||
<i class="material-icons">save</i> <%= localeMessage.getString("button.save") %>
|
||||
</button>
|
||||
<button type="button" class="cssbtn" id="btn_search" level="R">
|
||||
<i class="material-icons">search</i> <%= localeMessage.getString("button.search") %>
|
||||
</button>
|
||||
<button type="button" class="cssbtn" id="btn_close" level="R" status="DETAIL"><i
|
||||
class="material-icons">close</i> <%= localeMessage.getString("button.close") %>
|
||||
</button>
|
||||
</div>
|
||||
<div class="title"></div>
|
||||
<%-- <div class="title">공개 법인 선택</div>--%>
|
||||
<table class="search_condition" cellspacing="0">
|
||||
<tr>
|
||||
<th style="width:50px;">법인명</th>
|
||||
<td>
|
||||
<input type="text" name="searchOrgName" value="${param.searchOrgName}">
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<table id="grid"></table>
|
||||
<div id="pager"></div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,438 @@
|
||||
<%@ page language="java" contentType="text/html; charset=utf-8" %>
|
||||
<%@ page import="java.io.*" %>
|
||||
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
|
||||
<%@ include file="/jsp/common/include/localemessage.jsp" %>
|
||||
<%
|
||||
response.setHeader("Pragma", "No-cache");
|
||||
response.setHeader("Cache-Control", "no-cache");
|
||||
response.setHeader("Expires", "0");
|
||||
%>
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title></title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||
<jsp:include page="/jsp/common/include/css.jsp"/>
|
||||
<jsp:include page="/jsp/common/include/script.jsp"/>
|
||||
<style>
|
||||
.CodeMirror {
|
||||
border: 1px solid #eee;
|
||||
height: auto;
|
||||
}
|
||||
</style>
|
||||
<script language="javascript">
|
||||
var url = '<c:url value="/onl/transaction/apim/apiSpecMan.json" />';
|
||||
var url_org ='<c:url value="/onl/transaction/apim/apiSpecManPopup.view" />';
|
||||
var isDetail = false;
|
||||
var sampleRequestEditor, sampleResponseEditor, testbedSpecEditor;
|
||||
|
||||
function init() {
|
||||
var key = "${param.eaiSvcName}";
|
||||
// console.log({key});
|
||||
if (key !== "" && key !== null) {
|
||||
isDetail = true;
|
||||
detail(key);
|
||||
} else {
|
||||
buttonControl(false);
|
||||
}
|
||||
initializeCodeMirror();
|
||||
initializeSummernote();
|
||||
}
|
||||
|
||||
function initializeCodeMirror() {
|
||||
var commonOptions = {
|
||||
lineNumbers: true,
|
||||
matchBrackets: true,
|
||||
mode: "application/json",
|
||||
autoCloseBrackets: true,
|
||||
viewportMargin: Infinity, // This allows the editor to expand beyond the default height
|
||||
extraKeys: {"Ctrl-Space": "autocomplete"}
|
||||
};
|
||||
|
||||
sampleRequestEditor = CodeMirror.fromTextArea(document.getElementById('sampleRequest'), commonOptions);
|
||||
sampleResponseEditor = CodeMirror.fromTextArea(document.getElementById('sampleResponse'), commonOptions);
|
||||
testbedSpecEditor = CodeMirror.fromTextArea(document.getElementById('testbedSpec'), commonOptions);
|
||||
|
||||
// Set initial size and add resize capability
|
||||
sampleRequestEditor.setSize(null, 200);
|
||||
sampleResponseEditor.setSize(null, 200);
|
||||
testbedSpecEditor.setSize(null, 200);
|
||||
|
||||
// Refresh editors after initialization to ensure proper rendering
|
||||
setTimeout(function () {
|
||||
sampleRequestEditor.refresh();
|
||||
sampleResponseEditor.refresh();
|
||||
testbedSpecEditor.refresh();
|
||||
}, 1);
|
||||
}
|
||||
|
||||
function initializeSummernote() {
|
||||
var commonOptions = {
|
||||
height: 300,
|
||||
toolbar: [
|
||||
['style', ['style']],
|
||||
['font', ['bold', 'underline', 'clear']],
|
||||
['color', ['color']],
|
||||
['para', ['ul', 'ol', 'paragraph']],
|
||||
['table', ['table']],
|
||||
['insert', ['link', 'picture', 'video']],
|
||||
['view', ['codeview', 'help']]
|
||||
],
|
||||
callbacks: {
|
||||
onInit: function () {
|
||||
$('.note-editable').on('keydown', function (e) {
|
||||
if (e.keyCode === 8) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$('#description').summernote(commonOptions);
|
||||
$('#apiRequestSpec').summernote(commonOptions);
|
||||
$('#apiResponseSpec').summernote(commonOptions);
|
||||
}
|
||||
|
||||
function detail(key) {
|
||||
// console.log('Before AJAX call, key:', key); // Log the key before the AJAX call
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: url,
|
||||
dataType: "json",
|
||||
data: {cmd: 'DETAIL', eaiSvcName: key},
|
||||
success: function (data) {
|
||||
// console.log('AJAX response data:', data);
|
||||
|
||||
$("#ajaxForm input, #ajaxForm textarea, #ajaxForm select").each(function () {
|
||||
var name = $(this).attr("name");
|
||||
|
||||
if (name === 'displayYn') {
|
||||
$('#displayYn').prop('checked', data.displayYn === "Y");
|
||||
return;
|
||||
}
|
||||
|
||||
if (name === 'displayRoleCode') {
|
||||
$('input[name="displayRoleCode"]').prop('checked', false);
|
||||
if (data.displayRoleCode) { // displayRoleCode가 있을 때만 실행
|
||||
var roles = data.displayRoleCode.split(',').map(role => role.trim());
|
||||
roles.forEach(role => {
|
||||
$('input[name="displayRoleCode"][value="' + role + '"]').prop('checked', true);
|
||||
});
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (name === 'displayOrg') {
|
||||
$('#displayOrg').val(data.displayOrg || '');
|
||||
$('#displayOrgName').val(data.orgName || '');
|
||||
return;
|
||||
}
|
||||
|
||||
var tag = $(this).prop("tagName").toLowerCase();
|
||||
var value = data[name] || ''; // Provide a default empty string if the value is null or undefined
|
||||
|
||||
if (name === 'description' || name === 'apiRequestSpec' || name === 'apiResponseSpec') {
|
||||
$('#' + name).summernote('code', value);
|
||||
} else if (name === 'sampleRequest') {
|
||||
sampleRequestEditor.setValue(value);
|
||||
} else if (name === 'sampleResponse') {
|
||||
sampleResponseEditor.setValue(value);
|
||||
} else if (name === 'testbedSpec') {
|
||||
testbedSpecEditor.setValue(value);
|
||||
} else {
|
||||
if (name !== 'apiId')
|
||||
$(tag + "[name=" + name + "]").val(value);
|
||||
}
|
||||
});
|
||||
$("#apiId").val(key);
|
||||
// console.log('After setting apiId, key:', key); // Log the key after setting apiId
|
||||
|
||||
buttonControl(true);
|
||||
},
|
||||
error: function (e) {
|
||||
console.error('AJAX error:', e); // Log any errors
|
||||
alert(e.responseText);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function saveApiSpec() {
|
||||
var postData = $('#ajaxForm').serializeArray();
|
||||
postData.push({name: 'cmd', value: 'INSERT'});
|
||||
postData = postData.filter(item =>
|
||||
!['description', 'apiRequestSpec', 'apiResponseSpec', 'sampleRequest', 'sampleResponse',
|
||||
'testbedSpec', 'displayRoleCode', 'displayYn', 'displayOrg', 'displayOrgName'].includes(item.name)
|
||||
);
|
||||
postData.push({name: 'description', value: $('#description').summernote('code')});
|
||||
postData.push({name: 'apiRequestSpec', value: $('#apiRequestSpec').summernote('code')});
|
||||
postData.push({name: 'apiResponseSpec', value: $('#apiResponseSpec').summernote('code')});
|
||||
postData.push({name: 'testbedSpec', value: testbedSpecEditor.getValue()});
|
||||
postData.push({name: 'sampleRequest', value: sampleRequestEditor.getValue()});
|
||||
postData.push({name: 'sampleResponse', value: sampleResponseEditor.getValue()});
|
||||
|
||||
postData.push({name: 'displayYn', value: $('#displayYn').is(':checked') ? 'Y' : 'N'});
|
||||
|
||||
// displayOrg 값 추가
|
||||
var displayOrgValue = $('#displayOrg').val();
|
||||
if (displayOrgValue) {
|
||||
postData.push({name: 'displayOrg', value: displayOrgValue});
|
||||
}
|
||||
|
||||
// displayRoleCode 값 추가
|
||||
var roleValues = $('input[name="displayRoleCode"]:checked')
|
||||
.map(function() { return $(this).attr('value'); })
|
||||
.get()
|
||||
.join(',');
|
||||
|
||||
if (roleValues) {
|
||||
postData.push({name: 'displayRoleCode', value: roleValues});
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: url,
|
||||
data: postData,
|
||||
success: function () {
|
||||
alert("<%= localeMessage.getString("common.saveMsg") %>");
|
||||
},
|
||||
error: function (e) {
|
||||
alert(e.responseText);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// displayOrg를 선택하고 돌아올 때의 처리
|
||||
window.selectOrg = function(selectedOrgs) {
|
||||
// if (!selectedOrgs || selectedOrgs.length === 0) {
|
||||
// return;
|
||||
// }
|
||||
|
||||
// ID는 hidden input에 저장
|
||||
var orgIds = selectedOrgs.map(org => org.id).join(',');
|
||||
$('#displayOrg').val(orgIds);
|
||||
|
||||
// 화면에는 기관명 표시
|
||||
var orgNames = selectedOrgs.map(org => org.orgName).join(', ');
|
||||
$('#displayOrgName').val(orgNames);
|
||||
};
|
||||
|
||||
function formatDisplayOrg(orgIds) {
|
||||
if (!orgIds) return '';
|
||||
return orgIds.split(',').map(id => id.trim()).join(', ');
|
||||
}
|
||||
|
||||
function openOrgPopup() {
|
||||
var popupUrl = url_org + "?cmd=POPUP_LIST";
|
||||
|
||||
var selectedOrgIds = $('#displayOrg').val() || ''; // 현재 선택된 기관 ID들
|
||||
if (selectedOrgIds) {
|
||||
popupUrl += "&selectedOrgIds=" + encodeURIComponent(selectedOrgIds);
|
||||
}
|
||||
|
||||
var args = { title:'공개 법인 리스트', selectedOrgIds: selectedOrgIds };
|
||||
showModal(popupUrl, args, 450, 550);
|
||||
}
|
||||
|
||||
// 팝업에서 선택한 데이터를 부모창으로 반환하는 함수
|
||||
function selectOrg(selectedOrgs) {
|
||||
if (!selectedOrgs || selectedOrgs.length === 0) {
|
||||
$('#displayOrg').val('');
|
||||
$('#displayOrgName').val('');
|
||||
return;
|
||||
}
|
||||
var orgIds = selectedOrgs.map(org => org.id).join(',');
|
||||
$('#displayOrg').val(orgIds);
|
||||
|
||||
var orgNames = selectedOrgs.map(org => org.orgName).join(', ');
|
||||
$('#displayOrgName').val(orgNames);
|
||||
}
|
||||
|
||||
function deleteApiSpec() {
|
||||
if (!confirm("<%= localeMessage.getString("common.confirmMsg") %>")) {
|
||||
return;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: url,
|
||||
data: { cmd: 'DELETE', apiId: $('#apiId').val() },
|
||||
success: function() {
|
||||
alert("<%= localeMessage.getString("common.deleteMsg") %>");
|
||||
window.close();
|
||||
},
|
||||
error: function(e) {
|
||||
alert(e.responseText);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function generateSpecFromLayout() {
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: url,
|
||||
data: {
|
||||
cmd: 'GENERATE_SPEC',
|
||||
apiId: $('#apiId').val()
|
||||
},
|
||||
success: function(data) {
|
||||
// Update the editors with generated content
|
||||
$('#apiRequestSpec').summernote('code', data.requestSpec);
|
||||
$('#apiResponseSpec').summernote('code', data.responseSpec);
|
||||
sampleRequestEditor.setValue(data.sampleRequest);
|
||||
sampleResponseEditor.setValue(data.sampleResponse);
|
||||
testbedSpecEditor.setValue(data.testbedSpec);
|
||||
|
||||
alert("API 스펙이 성공적으로 생성되었습니다.\n* 필수여부는 직접 입력이 필요합니다.");
|
||||
},
|
||||
error: function(e) {
|
||||
alert("API 스펙 생성 중 오류가 발생했습니다: " + e.responseText);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
init();
|
||||
|
||||
$("#btn_save").click(saveApiSpec);
|
||||
$("#btn_close").click(function () {
|
||||
window.close();
|
||||
});
|
||||
$("#btn_select_org").click(openOrgPopup);
|
||||
$("#btn_delete").click(deleteApiSpec);
|
||||
|
||||
$("#btn_generate_spec").click(generateSpecFromLayout);
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div class="popup_box">
|
||||
<div class="search_wrap">
|
||||
<button type="button" class="cssbtn" id="btn_generate_spec" level="W" status="DETAIL">
|
||||
<i class="material-icons">auto_fix_high</i> SPEC 자동 생성
|
||||
</button>
|
||||
<button type="button" class="cssbtn" id="btn_save" level="W" status="DETAIL"><i
|
||||
class="material-icons">save</i> <%= localeMessage.getString("button.modify") %>
|
||||
</button>
|
||||
<button type="button" class="cssbtn" id="btn_delete" level="W" status="DETAIL">
|
||||
<i class="material-icons">delete</i> <%= localeMessage.getString("button.delete") %>
|
||||
</button>
|
||||
<button type="button" class="cssbtn" id="btn_close" level="R" status="DETAIL"><i
|
||||
class="material-icons">close</i> <%= localeMessage.getString("button.close") %>
|
||||
</button>
|
||||
</div>
|
||||
<div class="title">API 스펙 관리</div>
|
||||
<form id="ajaxForm">
|
||||
<input type="hidden" name="apiId" id="apiId" class="form-control">
|
||||
<table class="table_row" cellspacing="0">
|
||||
<tr>
|
||||
<th>API 이름</th>
|
||||
<td><input type="text" name="apiName" id="apiName" class="form-control"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>간단 설명</th>
|
||||
<td><input type="text" name="apiSimpleDescription" id="apiSimpleDescription" class="form-control"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>API URL</th>
|
||||
<td><input type="text" name="apiUrl" id="apiUrl" class="form-control"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>API 메소드</th>
|
||||
<td>
|
||||
<select name="apiMethod" id="apiMethod" class="form-select">
|
||||
<option value="GET">GET</option>
|
||||
<option value="POST">POST</option>
|
||||
<option value="PUT">PUT</option>
|
||||
<option value="DELETE">DELETE</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>공개 여부</th>
|
||||
<td>
|
||||
<div class="form-check">
|
||||
<input class="form-check-input" type="checkbox" name="displayYn" id="displayYn" value="Y">
|
||||
<label class="form-check-label" for="displayYn">공개</label>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>공개 권한</th>
|
||||
<td>
|
||||
<div id="roleCheckboxes" style="display: flex;">
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="checkbox" name="displayRoleCode" value="ROLE_USER">
|
||||
<label class="form-check-label" style="margin-right: 15px;">개인사용자</label>
|
||||
</div>
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="checkbox" name="displayRoleCode" value="ROLE_CORP_USER">
|
||||
<label class="form-check-label" style="margin-right: 15px;">법인사용자</label>
|
||||
</div>
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" type="checkbox" name="displayRoleCode" value="ROLE_CORP_MANAGER">
|
||||
<label class="form-check-label">법인관리자</label>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>공개 법인</th>
|
||||
<td>
|
||||
<div style="display: flex;">
|
||||
<input type="text" id="displayOrgName" class="form-control" style="margin-right: 5px;" readonly>
|
||||
<input type="hidden" id="displayOrg" name="displayOrg">
|
||||
<button type="button" class="smallBtn2 cssbtn" id="btn_select_org">
|
||||
<i class="material-icons">add</i> 선택
|
||||
</button>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>API Content Type</th>
|
||||
<td><input type="text" name="apiContentType" id="apiContentType" class="form-control"></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>설명</th>
|
||||
<td><textarea name="description" id="description" class="form-control" rows="3"></textarea></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>테스트베드 스펙</th>
|
||||
<td><textarea name="testbedSpec" id="testbedSpec" class="form-control" rows="5"></textarea></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>요청 메시지 스펙</th>
|
||||
<td><textarea name="apiRequestSpec" id="apiRequestSpec" class="form-control" rows="5"></textarea></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>요청 메시지 예제</th>
|
||||
<td><textarea name="sampleRequest" id="sampleRequest" class="form-control" rows="5"></textarea></td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<th>응답 메시지 스펙</th>
|
||||
<td><textarea name="apiResponseSpec" id="apiResponseSpec" class="form-control" rows="5"></textarea></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>응답 메시지 예제</th>
|
||||
<td><textarea name="sampleResponse" id="sampleResponse" class="form-control" rows="5"></textarea></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>응답 유형</th>
|
||||
<td>
|
||||
<select name="responseType" class="form-select">
|
||||
<option value="sample">Sample</option>
|
||||
<option value="mock">Mock</option>
|
||||
</select>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th>Mock URL</th>
|
||||
<td><input type="text" name="mockUrl" class="form-control"></td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user