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
@@ -0,0 +1,236 @@
<%@ 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" %>
<%@ page import="com.eactive.eai.rms.common.login.SessionManager"%>
<%@ page import="com.eactive.eai.common.util.SystemUtil"%>
<%@ page import="com.eactive.eai.rms.common.context.MonitoringContext"%>
<%@ page import="com.eactive.eai.rms.common.util.CommonUtil"%>
<%
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Expires", "0");
MonitoringContext monitoringContext = (MonitoringContext)CommonUtil.getBean(request, "monitoringContext");
String deployYnStr = monitoringContext.getStringProperty(MonitoringContext.IOMAP_DEPLOY_YN_BY_RMS, "N");
boolean deployYn = "Y".equalsIgnoreCase(deployYnStr);
%>
<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"/>
<script language="javascript" >
var url ='<c:url value="/onl/admin/adapter/adapterAuditMan.json" />';
var url_view ='<c:url value="/onl/admin/adapter/adapterAuditMan.view" />';
var url_excel='<c:url value="/onl/admin/adapter/adapterAuditMan.excel"/>';
var roleString = "<%=SessionManager.getRoleIdString(request)%>";
var devSvr = <%=SystemUtil.isDevServer()%>;
var stageSvr = <%=SystemUtil.isStagingServer()%>;
var selectName = "searchEaiBzwkDstcd";
var select_useYn = new Array();
var select_adptrMsgPtrnCdRows = new Array();
var select_testMasterYnRows = new Array();
function init(callback) {
return $.ajax({
type : "POST",
url:url,
dataType:"json",
data:{cmd: 'LIST_SEARCH_INIT_COMBO'},
success:function(json){
new makeOptions("CODE","NAME").setObj($("select[name=searchEaiBzwkDstcd]")).setNoValueInclude(true).setNoValue("", "<%=localeMessage.getString("combo.all")%>").setData(json.bzwkCodeRows).setFormat(codeName3OptionFormat).rendering();
setSearchable(selectName);
putSelectFromParam();
if (typeof callback === 'function') {
callback();
}
},
error:function(e){
alert(e.responseText);
}
});
}
function list(_page)
{
var page = "${param.page}";
if(_page) page = _page;
var postData = getSearchForJqgrid("cmd","LIST"); //jqgrid에서는 object 로
postData["sortName"] ='${param.sortName}';
postData["sortOrder"]="${param.sortOrder}";
$("#grid").setGridParam({ url:url, postData: postData ,sortName:'${param.sortName}', sortOrder:"${param.sortOrder}",page : page }).trigger("reloadGrid");
}
$(document).ready(function() {
init().done(function(result) {
jqGridInit();
});
$("#btn_search").click(function(){
list("1");
});
$("input[name^=search]").keydown(function(key){
if (key.keyCode == 13){
$("#btn_search").click();
}
});
buttonControl();
});
function jqGridInit() {
$('#grid').jqGrid({
datatype:"json",
mtype: 'POST',
colNames:['변경번호',
'변경일자',
/* '타입', */
'작업자ID',
'<%= localeMessage.getString("adapter.adptrBzwkGroupName")%>',
'<%= localeMessage.getString("adapter.adptrBzwkGroupDesc")%>',
'<%= localeMessage.getString("adapter.adptrIoDstCd")%>',
'<%= localeMessage.getString("adapter.adptrMsgpTrnCdType")%>',
'<%= localeMessage.getString("adapter.eaiBzwkDstCd")%>',
<%-- '<%= localeMessage.getString("adapter.adptrCd")%>', --%>
'<%= localeMessage.getString("adapter.adptrMsgDstCd")%>',
'<%= localeMessage.getString("adapter.adptrUseYn")%>',
<%-- '<%= localeMessage.getString("adapter.kesauseyn")%>', --%>
<%-- '<%= localeMessage.getString("adapter.testmasteryn")%>', --%>
'<%= localeMessage.getString("adapter.adptrnickname")%>'
<%-- '<%= localeMessage.getString("adapterDetail.eaisevrdstcd")%>', --%>
<%-- '<%= localeMessage.getString("adapterDetail.dradptryn")%>' --%>
],
colModel:[
{ name : 'revNo' , align:'left' ,width:80},
{ name : 'revTstmp' , align:'left' ,width:140},
{ name : 'revUserId' , align:'left' ,width:80},
{ name : 'adptrbzwkgroupname' , align:'left' ,width:120},
{ name : 'adptrbzwkgroupdesc' , align:'left' ,width:250 },
{ name : 'adptriodstcd' , align:'center' ,width:100, edittype:'select',editoptions:{value : "I:INBOUND;O:OUTBOUND"}, formatter:"select"},
{ name : 'adptrmsgptrncd' , align:'center' ,width:70, edittype:'select' , editoptions:{value : "K:표준;N:비표준;B:은행표준"}, formatter:"select"},
{ name : 'eaibzwkdstcd' , align:'center' ,width:70},
// { name : 'ADPTRCD' , align:'center' ,width:70},
{ name : 'adptrmsgdstcd' , align:'center' ,width:70},
{ name : 'adptruseyn' , align:'center' ,width:80, edittype:'select', editoptions:{value : "0:사용안함;1:사용"}, formatter:"select"},
// { name : 'KESAUSEYN' , align:'center' ,width:100},
// { name : 'testmasteryn' , align:'center' ,width:100, edittype:'select', editoptions:select_testMasterYnRows, formatter:"select"},
{ name : 'adptrnickname' , align:'center' ,width:100},
// { name : 'EAISEVRDSTCD' , align:'center' ,width:80 ,formatter : formatter},
// { name : 'DRADPTRYN' , align:'center' ,width:100}
],
jsonReader: {
repeatitems:false
},
pager : $('#pager'),
page : '${param.page}',
rowNum : '${rmsDefaultRowNum}',
autoheight: true,
height: $("#container").height(),
autowidth: true,
viewrecords: true,
multiselect: false,
multiboxonly: false,
sortname : '${param.sortName}',
sortorder : '${param.sortOrder}',
rowList : eval('[${rmsDefaultRowList}]'),
loadComplete:function (d){
//$(this).setGridParam({datatype:'local'});
},
loadError: function (jqXHR, textStatus, errorThrown) {
if(jqXHR.status == 401) {
alert('HTTP status code: ' + jqXHR.status + '\n' +
'에러: 세션이 종료되었습니다. ');
parent.location.href='<%=request.getContextPath()%>/';
}
},
ondblClickRow: function(rowId) {
var rowData = $(this).getRowData(rowId);
var url2 = url_view;
url2 += '?cmd=DETAIL';
url2 += '&page='+$(this).getGridParam("page");
url2 += '&returnUrl='+getReturnUrl();
url2 += '&menuId='+'${param.menuId}';
url2 += '&sortName='+$("#grid").getGridParam("sortname");
url2 += '&sortOrder='+$("#grid").getGridParam("sortorder");
//검색값
url2 += '&'+getSearchUrl();
//key값
url2 += '&adptrBzwkGroupName='+encodeURIComponent(rowData['adptrbzwkgroupname']);
url2 += '&revNo='+encodeURIComponent(rowData['revNo']);
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");
}
});
resizeJqGridWidth('grid','content_middle','1000');
list();
}
</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_search" level="R" ><i class="material-icons">search</i> <%= localeMessage.getString("button.search") %></button>
</div>
<div class="title"><%= localeMessage.getString("adapter.title")%>(변경이력)</div>
<form id = "ajaxForm">
<table class="search_condition" cellspacing=0;>
<tbody>
<tr>
<th width="13%"><%= localeMessage.getString("adapter.adptrBzwkGroupName")%></th>
<td width="20%"> <input type="text" name="searchAdptrBzwkGroupName" value="${param.searchAdptrBzwkGroupName}"></td>
<th width="13%"><%= localeMessage.getString("adapter.adptrBzwkGroupDesc")%></th>
<td width="20%"><input type="text" name="searchAdptrBzwkGroupDesc" value="${param.searchAdptrBzwkGroupDesc}"></td>
<th><%= localeMessage.getString("adapterDetail.eaibzwkdstcd")%></th>
<td>
<div class="select-style">
<select name="searchEaiBzwkDstcd" value="${param.searchEaiBzwkDstcd}">
</select>
</div>
</td>
</tr>
</tbody>
</table>
</form>
<table id="grid" ></table>
<div id="pager"></div>
</div><!-- end content_middle -->
</div><!-- end right_box -->
</body>
</html>
@@ -0,0 +1,407 @@
<%@ 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">
<!-- css -->
<jsp:include page="/jsp/common/include/css.jsp"/>
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/jsondiffpatch/formatters-styles/annotated.css"/>" />
<link rel="stylesheet" type="text/css" media="screen" href="<c:url value="/jsondiffpatch/formatters-styles/html.css"/>" />
<style>
.pre_container {
width: 100%; /* 원하는 너비로 설정 */
}
.pre_container pre {
white-space: pre-wrap; /* 줄 바꿈을 허용하는 설정 */
}
.display_none {
display: none; /* pre 태그 안의 내용을 숨김 */
}
.border-right_solid {
border-right: 1px solid #a3a9b1 !important;
text-align: center !important;
}
</style>
<!-- script -->
<jsp:include page="/jsp/common/include/script.jsp"/>
<script language="javascript" src="<c:url value="/jsondiffpatch/jsondiffpatch.umd.slim.js"/>"></script>
<script language="javascript" >
var url ='<c:url value="/onl/admin/adapter/adapterAuditMan.json" />';
var url_view ='<c:url value="/onl/admin/adapter/adapterAuditMan.view" />';
var isDetail = false;
function init(key,revNo,callback){
$.ajax({
type : "POST",
url:url,
dataType:"json",
data:{cmd: 'LIST_INIT_COMBO'},
success:function(json){
new makeOptions("CODE","NAME").setObj($("select[name=eaibzwkdstcd]")).setFormat(codeName3OptionFormat).setData(json.bizRows).rendering(); // 업무구분코드
new makeOptions("CODE","NAME").setObj($("select[name=adptrcd]")).setFormat(codeName3OptionFormat).setNoValueInclude(true).setData(json.adapterTypeRows).rendering(); // 어댑터 유형
new makeOptions("CODE","NAME").setObj($("select[name=adptrmsgdstcd]")).setFormat(codeName3OptionFormat).setData(json.msgTypeRows).rendering(); // 메시지타입
new makeOptions("CODE","NAME").setObj($("select[name=msgencode]")).setFormat(codeName3OptionFormat).setNoValueInclude(true).setData(json.msgEncodeRows).rendering(); // 메시지문자셋
new makeOptions("CODE","NAME").setObj($("select[name=adptriodstcd]")).setData(json.adptrIoDstcdRows).setFormat(codeName3OptionFormat).rendering(); // IN/OUT 구분
new makeOptions("CODE","NAME").setObj($("select[name=adptrmsgptrncd]")).setData(json.adptrMsgPtrnCdRows).setFormat(codeName3OptionFormat).rendering(); // 표준/비표준 구분
new makeOptions("CODE","NAME").setObj($("select[name=adptruseyn]")).setData(json.ynNumRows).setFormat(codeName3OptionFormat).rendering(); // 어댑터 사용구분
new makeOptions("CODE","NAME").setObj($("select[name=sndrcvhmslogyn]")).setData(json.ynNumRows).setFormat(codeName3OptionFormat).rendering(); // 송수신 로그여부
new makeOptions("CODE","NAME").setObj($("select[name=spcfcluuseyn]")).setData(json.ynNumRows).setFormat(codeName3OptionFormat).rendering(); // 특정LU 사용여부
new makeOptions("CODE","NAME").setObj($("select[name=osidinstiyn]")).setData(json.ynTypeRows).setFormat(codeName3OptionFormat).rendering(); // 대외기관 여부
new makeOptions("CODE","NAME").setObj($("select[name=moniuseyn]")).setData(json.ynRows).setFormat(codeName3OptionFormat).rendering(); // 모니터링 사용 여부
new makeOptions("CODE","NAME").setObj($("select[name=testmasteryn]")).setData(json.testMasterYnRows).setFormat(codeName3OptionFormat).rendering(); //TAS참조대표어댑터여부
if(typeof callback === 'function') {
callback(key,revNo,'DETAIL');
}
},
error:function(e){
alert(e.responseText);
}
});
}
function detail(key,revNo,cmd){
if (!isDetail) return ;
$.ajax({
type : "POST",
url:url,
dataType:"json",
data:{cmd: cmd
, adptrbzwkgroupname : key
, revNo : revNo
},
success:function(json){
const detail = json;
//adapterGroup
$("input[name=revNo]").attr('readonly',true);
$("input[name=revTstmp]").attr('readonly',true);
$("input[name=userId]").attr('readonly',true);
$("input[name=adptrbzwkgroupname]").attr('readonly',true);
$("select[name=eaibzwkdstcd]").prop('disabled',true);
$("select[name=adptrmsgptrncd]").prop('disabled',true);
$("select[name=adptruseyn]").prop('disabled',true);
$("select[name=sndrcvhmslogyn]").prop('disabled',true);
$("select[name=adptriodstcd]").prop('disabled',true);
$("select[name=adptrcd]").prop('disabled',true);
$("select[name=adptrmsgdstcd]").prop('disabled',true);
$("select[name=msgencode]").prop('disabled',true);
$("input[name=refclsname]").attr('readonly',true);
$("#detail input,#detail select").each(function(){
const name = $(this).attr('name');
$(this).val(detail[name]);
});
//requestCurrentJson('CHANGE');
//setJsonTitle('변경분(현재)');
document.getElementById("json").textContent = JSON.stringify(json, undefined, 2);
document.getElementById("json_snapshot").textContent = JSON.stringify(json, undefined, 2);
setJsonTitle('[현재 Revision 스냅샷]');
requestPrevJson(diffJsonDisplay);// 현재와 이전 json 비교
},
error:function(e){
if(e.responseText == '')
alert('데이터 없음');
else
alert(e.responseText);
}
});
}
$(document).ready(function() {
const key ="${param.adptrBzwkGroupName}";
if (key != "" && key !="null"){
isDetail = true;
}
init(decodeURIComponent(key),"${param.revNo}",detail);
const returnUrl = getReturnUrlForReturn();
$("#btn_previous").click(function(){
goNav(returnUrl);//LIST로 이동
});
// 변경분 보기
$("#btn_modifiedparts").click(function(){
requestCurrentJson('CHANGE');
setJsonTitle('[현재 Revision 변경분]');
});
// 스냅샷 보기
$("#btn_snapshot").click(function(){
requestCurrentJson('DETAIL');
setJsonTitle('[현재 Revision 스냅샷]');
});
$("#btn_jsoncopy").click(function(){
window.navigator.clipboard.writeText(document.getElementById("json").textContent).then(() => {
alert($("#json_title").text() + " 복사완료");
});
});
$("#btn_prevjsoncopy").click(function(){
window.navigator.clipboard.writeText(document.getElementById("prev_json").textContent).then(() => {
alert($("#pre_json_title").text() + " 복사완료");
});
});
// 이전 Revision
$("#btn_prevrevision").click(function(){
detail($("input[name=adptrbzwkgroupname]").val(), $("input[name=revNo]").val(), 'PREV');
});
// 다음 Revision
$("#btn_nextrevision").click(function(){
detail($("input[name=adptrbzwkgroupname]").val(), $("input[name=revNo]").val(), 'NEXT');
});
// 이전 Revision 스냅샷의 이전
$("#btn_prevsnapshot").click(function(){
requestPrevJsonSnapshot($("input[name=preRevNo]").val(), 'PREV', diffJsonDisplay);
});
// 이전 Revision 스냅샷의 다음
$("#btn_nextsnapshot").click(function(){
if($("input[name=preRevNo]").val() == $("input[name=revNo]").val()) {
alert("더이상의 정보가 없습니다.");
return;
}
requestPrevJsonSnapshot($("input[name=preRevNo]").val(), 'NEXT', diffJsonDisplay);
});
buttonControl(isDetail);
titleControl(isDetail);
});
function requestCurrentJson(cmd) {
$.ajax({
type : "POST",
url:url,
dataType:"json",
data:{cmd: cmd
, adptrbzwkgroupname : $("input[name=adptrbzwkgroupname]").val()
, revNo : $("input[name=revNo]").val()
},
success:function(json){
document.getElementById("json").textContent = JSON.stringify(json, undefined, 2);
},
error:function(e){
alert(e.responseText);
}
});
}
function requestPrevJson(callback) {
requestPrevJsonSnapshot($("input[name=revNo]").val(), "PREV", callback);
}
// [이전 Revision 스냅샷] 부분의 json을 조회한다.
function requestPrevJsonSnapshot(preRevNo, cmd, callback) {
$.ajax({
type : "POST",
url:url,
dataType:"json",
data:{cmd: cmd
, adptrbzwkgroupname : $("input[name=adptrbzwkgroupname]").val()
, revNo : preRevNo
},
success:function(json){
document.getElementById("prev_json").textContent = JSON.stringify(json, undefined, 2);
$("input[name=preRevNo]").val(json.revNo);
callback();
},
error:function(e){
document.getElementById("prev_json").textContent = '';
document.getElementById("diff_json").textContent = '';
}
});
}
function setJsonTitle(title) {
document.getElementById("json_title").textContent = title;
}
function diffJsonDisplay() {
document.getElementById("diff_json").textContent = '';
const json1 = JSON.parse($('#json_snapshot').text());
const json2 = JSON.parse($('#prev_json').text());
const diff = jsondiffpatch.diff(json2, json1);
if (typeof diff === 'undefined') {
document.getElementById("diff_json").innerHTML = 'no diff';
return;
}
document.getElementById("diff_json").innerHTML = jsondiffpatch.formatters.html.format(diff, json1);
jsondiffpatch.formatters.html.hideUnchanged();
//document.getElementById("diff_json").innerHTML = jsondiffpatch.formatters.annotated.format(diff);
}
</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_previous" level="R" status="DETAIL,NEW"><i class="material-icons">arrow_back</i> <%= localeMessage.getString("button.previous") %></button>
<button type="button" class="cssbtn" id="btn_prevrevision" level="R" status="DETAIL,NEW"><i class="material-icons">arrow_back</i> 이전 Revision</button>
<button type="button" class="cssbtn" id="btn_nextrevision" level="R" status="DETAIL,NEW"><i class="material-icons">arrow_forward</i> 다음 Revision</button>
</div>
<div class="title_adptdetail">어댑터 변경이력 상세</div>
<div class="table_row_title">Revision 정보</div>
<table id="detail" class="table_row" cellspacing="0" >
<tr>
<th width="15%">Revision 번호</th>
<td width="35%" ><input type="text" name="revNo"/></td>
<th width="15%">변경 일자</th>
<td width="35%" ><input type="text" name="revTstmp"/></td>
</tr>
<tr>
<th width="15%">작업자ID</th>
<td width="35%" ><input type="text" name="revUserId"/></td>
<th width="15%"></th>
<td width="35%" ></td>
</tr>
</table>
<div class="table_row_title">어댑터 기본 정보</div>
<table id="detail" class="table_row" cellspacing="0" >
<tr>
<th width="15%"><%=localeMessage.getString("adapterDetail.adptrbzwkgroupname")%></th>
<td width="35%" ><input type="text" name="adptrbzwkgroupname" style="width:calc(100% - 65px);"/>
</td>
<th width="15%"><%=localeMessage.getString("adapterDetail.eaibzwkdstcd")%></th>
<td width="35%">
<div class="select-style">
<select name="eaibzwkdstcd" ></select>
</div>
</td>
</tr>
<tr>
<th><%=localeMessage.getString("adapterDetail.adptrmsgptrncd")%></th>
<td >
<div class="select-style">
<select name="adptrmsgptrncd"></select>
</div>
</td>
<th><%=localeMessage.getString("adapterDetail.adptruseyn")%></th>
<td >
<div class="select-style">
<select name="adptruseyn"></select>
</div>
</td>
</tr>
<tr>
<th><%=localeMessage.getString("adapterDetail.sndrcvhmslogyn")%></th>
<td >
<div class="select-style">
<select name="sndrcvhmslogyn"></select>
</div>
</td>
<th><%=localeMessage.getString("adapterDetail.adptriodstcd")%></th>
<td >
<div class="select-style">
<select name="adptriodstcd"></select>
</div>
</td>
</tr>
<tr>
<th><%=localeMessage.getString("adapterDetail.adptrcd")%></th>
<td >
<div class="select-style">
<select name="adptrcd"></select>
</div>
</td>
<th><%=localeMessage.getString("adapterDetail.adptrmsgdstcd")%></th>
<td >
<div class="select-style">
<select name="adptrmsgdstcd"></select>
</div>
</td>
</tr>
<tr>
<th><%=localeMessage.getString("adapterDetail.msgencode")%></th>
<td>
<div class="select-style">
<select name="msgencode"></select>
</div>
</td>
<th><%=localeMessage.getString("adapterDetail.refclsname")%></th>
<td><input type="text" name="refclsname"/>
</td>
</tr>
</table>
<div class="table_row_title">JSON</div>
<table id="json_compare" class="table_row" cellspacing="0">
<tbody>
<tr height="30px">
<th class="border-right_solid" width="50%" colspan="2">
[스냅샷 비교결과]
</th>
</tr>
<tr>
<td valign="top" colspan="2">
<div id="diff_json"></div>
</td>
</tr>
<tr height="40px">
<th class="border-right_solid" width="50%" >
<span id="pre_json_title" >[이전 Revision 스냅샷]</span>
<button type="button" class="cssbtn" id="btn_prevsnapshot" level="R" status="DETAIL,NEW"><i class="material-icons">arrow_back</i> 이전</button>
<button type="button" class="cssbtn" id="btn_nextsnapshot" level="R" status="DETAIL,NEW"><i class="material-icons">arrow_forward</i> 다음</button>
<button type="button" class="cssbtn" id="btn_prevjsoncopy" level="R" status="DETAIL,NEW"><i class="material-icons">content_copy</i> JSON 복사</button>
<input type="hidden" name="preRevNo"/>
</th>
<th class="border-right_solid" width="50%" >
<span id="json_title" ></span>
<button type="button" class="cssbtn" id="btn_modifiedparts" level="R" status="DETAIL,NEW"><i class="material-icons">search</i> 변경분 보기</button>
<button type="button" class="cssbtn" id="btn_snapshot" level="R" status="DETAIL,NEW"><i class="material-icons">search</i> 스냅샷 보기</button>
<button type="button" class="cssbtn" id="btn_jsoncopy" level="R" status="DETAIL,NEW"><i class="material-icons">content_copy</i> JSON 복사</button>
</th>
</tr>
<tr>
<td valign="top" style="background-color: rgba(255, 187, 187, 0.1);">
<div class="pre_container">
<pre id="prev_json" class="jsondiffpatch-delta"></pre>
</div>
</td>
<td valign="top" style="background-color: rgba( 187, 255, 187, 0.1);">
<div class="pre_container">
<pre id="json" class="jsondiffpatch-delta"></pre>
<pre id="json_snapshot" class="display_none"></pre>
</div>
</td>
</tr>
</tbody>
</table>
</div><!-- end content_middle -->
</div><!-- end right_box -->
</body>
</html>