zioinfo-mail/workspace/zioinfo-esn/esn/target/classes/templates/dashboard/dashboard.html
DESKTOP-TKLFCPR\ython 371f77e7ab
Some checks failed
GUARDiA CI / Python Lint & Import Test (push) Has been cancelled
GUARDiA CI / Validate Install Scripts (push) Has been cancelled
GUARDiA CI / PR Validation Summary (push) Has been cancelled
fix(enhance-v4): APK QR 버그 수정 + 웹메일 라우터 수정
2026-06-02 20:23:55 +09:00

659 lines
35 KiB
HTML

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.ultraq.net.nz/web/thymeleaf/layout" layout:decorator="layout/basic">
<head>
<title th:text="#{dashboard_en}"></title>
<meta name="viewport" content="width=device-width, initial-scale=.1" />
<!-- Spinners -->
<link rel="stylesheet" href="/css/spinners.css" th:href="@{/css/spinners.css}"/>
<!-- JS for This Page -->
<script th:inline="javascript" type="text/javascript">
/*<![CDATA[*/
var getBiztpMap = [[${getBiztpMap}]] ;
var i18n_strGOOD = /*[[#{good}]]*/ ;
var i18n_strBAD = /*[[#{bad}]]*/ ;
var i18n_alarm_clear = /*[[#{alarm.clear}]]*/;
var i18n_error = /*[[#{error}]]*/;
var fail = /*[[#{fail}]]*/ '';
var disconnected = /*[[#{disconnected}]]*/ '';
var file = /*[[#{file_en}]]*/ '';
var master_en = /*[[#{master_en}]]*/ '';
var master_core_en = /*[[#{master.core_en}]]*/ '';
var msg_info_connecte_store = /*[[#{msg.info.connecte.store}]]*/ '';
var msg_confirm_connecte_store_ESL_management_system = /*[[#{msg.confirm.connecte.store.ESL.management.system}]]*/;
var strFileType = function(fileType) {
//'HCORE','TE','FW', 'FONT', 'IMAGE', 'HCORE_CFG', 'POS_FILE', 'RVD_FILE', 'EMS', 'HCORE_DB', 'USER', 'SSL', 'ESNTL'
var mapper = {}
, i18n_template = /*[[#{template}]]*/
, i18n_group = /*[[#{group}]]*/;
mapper[ 'HCORE'.toUpperCase() ] = /*[[#{e_core}]]*/;
mapper[ 'TE'.toUpperCase() ] = i18n_template;
mapper[ 'FW'.toUpperCase() ] = /*[[#{firmware.label}]]*/;
mapper[ 'FONT'.toUpperCase() ] = /*[[#{font}]]*/;
mapper[ 'IMAGE'.toUpperCase() ] = /*[[#{image.code}]]*/;
mapper[ 'HCORE_CFG'.toUpperCase()] = /*[[#{hcore_cfg}]]*/;
mapper[ 'POS_FILE'.toUpperCase() ] = /*[[#{pos.file2}]]*/;
mapper[ 'RVD_FILE'.toUpperCase() ] = /*[[#{reservation.send}]]*/;
mapper[ 'EMS'.toUpperCase() ] = /*[[#{ems}]]*/;
mapper[ 'HCORE_DB'.toUpperCase() ] = 'DB' + /*[[#{backup}]]*/;
mapper[ 'USER'.toUpperCase() ] = /*[[#{user}]]*/;
mapper[ 'SSL'.toUpperCase() ] = /*[[#{ssl}]]*/;
mapper[ 'ESNTL'.toUpperCase() ] = i18n_template + ' ' + i18n_group;
return mapper[ fileType && fileType.toUpperCase() ];
}, strWorkType = function(workType) {
var mapper = {};
mapper[ 'Sync_complate'.toUpperCase() ] = '<span class="text-success">' + /*[[#{sync.complete}]]*/ + '</span>';
mapper[ 'Sync_start'.toUpperCase() ] = '<span class="text-primary">' + /*[[#{sync.start}]]*/ + '</span>';
mapper[ 'Sync_fail'.toUpperCase() ] = '<span class="text-danger">' + /*[[#{sync.fail}]]*/ + '</span>';
return mapper[ workType && workType.toUpperCase() ];
}, strAlarmType = function(alarmType){
return {
keep_alive_fail : /*[[#{alarm.status.type.keep_alive_fail}]]*/
, keep_alive_fail_esn : /*[[#{alarm.status.type.keep_alive_fail_esn}]]*/
, network_fail : /*[[#{alarm.status.type.network_fail}]]*/
, file_sync_fail : /*[[#{alarm.status.type.file_sync_fail}]]*/
, gateway_disconnected: /*[[#{alarm.status.type.gateway_disconnected}]]*/
, master_core_fail : /*[[#{alarm.status.type.master_core_fail}]]*/
, database_conn_fail : /*[[#{alarm.status.type.database_conn_fail}]]*/
, web_service_fail : /*[[#{alarm.status.type.web_service_fail}]]*/
, event_reset_fail : /*[[#{alarm.status.type.event_reset_fail}]]*/
, event_info_fail : /*[[#{alarm.status.type.event_info_fail}]]*/
, biztp_info_fail : /*[[#{alarm.status.type.biztp_info_fail}]]*/
, user_info_fail : /*[[#{alarm.status.type.user_info_fail}]]*/
, core_restart_sw : /*[[#{alarm.status.type.core_restart_sw}]]*/
, core_restart_db : /*[[#{alarm.status.type.core_restart_db}]]*/
, gateway_disconnected_storage : /*[[#{alarm.status.type.gateway_disconnected_storage}]]*/
}[ alarmType && alarmType.toLowerCase() ]
};
var activeDeviceTypeObj = new Object();
activeDeviceTypeObj.primary =/*[[#{active.device.type.primary}]]*/ '';
activeDeviceTypeObj.secondary =/*[[#{backup}]]*/ '';
activeDeviceTypeObj.single =/*[[#{active.device.type.single}]]*/ '';
/*]]>*/
</script>
<script src="/js/dashboard/dashboardAjax.js" th:src="@{/js/dashboard/dashboardAjax.js}" charset="UTF-8"></script>
<script src="/js/dashboard/dashboard.js" th:src="@{/js/dashboard/dashboard.js}" charset="UTF-8"></script>
<script src="/js/store/storeAjax.js" th:inline="javascript" th:src="@{/js/store/storeAjax.js}" charset="UTF-8"></script>
</head>
<body>
<div layout:fragment="content">
<input type="hidden" id="isAdmin" name="isAdmin" value="ADMIN" sec:authorize="hasAuthority('ADMIN')" />
<br />
<div class="container-fluid">
<div class="row">
<div id="dashboard_store_div" class="col-8">
<!-- 매장 현황 -->
<div class="card" >
<div class="card-header bg-custom-dark text-light">
<div class="float-left">
<h4 class="m-0 mr-2 fas fa-dice-one text-secondary"></h4>
</div>
<div class="float-left">
<h4 class="m-0" th:text="#{store.present_condition}"></h4>
</div>
<div class="float-right">
<div class="input-group input-group-sm" >
<input
type="text"
class="form-control form-control-sm border border-warning"
style="height:24px"
id="filter0"
th:placeholder="#{business.conditions.store.name}"
th:attr="aria-label=#{business.conditions.store.name}"
aria-describedby="btn-search-store-status" />
<div class="input-group-append">
<button type="button" class="btn btn-sm btn-outline-warning " id="btn-search-store-status">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</div>
<div class="float-right mr-2">
<div class="input-group input-group-sm" >
<div class="input-group-prepend">
<label class="input-group-text border border-warning" for="refreshTimeStoreStatus" th:text="#{refresh.time}" ></label>
</div>
<div class="input-group-append">
<select class="form-control form-control-sm border border-warning" id="refreshTimeStoreStatus">
<option value="" th:text="#{disabled}"></option>
<option value="10" th:text="'10' + #{data.time.second}" selected="selected"></option>
<option value="30" th:text="'30' + #{data.time.second}"></option>
<option value="60" th:text="' 1' + #{data.time.minute}"></option>
<option value="300" th:text="' 5' + #{data.time.minute}"></option>
<option value="600" th:text="'10' + #{data.time.minute}"></option>
<option value="1800" th:text="'30' + #{data.time.minute}"></option>
</select>
</div>
</div>
</div>
</div>
<!-- ADMIN -->
<div class="card-body p-0" style="height: 431px;overflow: hidden;" sec:authorize="hasAuthority('ADMIN')">
<table class="table table-sm table-striped table-bordered text-center m-0" id="storeStatusListHeader" >
<colgroup>
<col id="col_1" width="90px"></col>
<col id="col_2" width="70px"></col>
<col id="col_3" width="165px"></col>
<col id="col_4" width="60px"></col>
<col id="col_5" width="50px"></col>
<col id="col_6" width="50px"></col>
<col id="col_7" width="50px"></col>
<col id="col_8" width="50px"></col>
<col id="col_9" width="70px"></col>
<col id="col_10" width="70px"></col>
<col id="col_11" width="70px"></col>
<!-- <col id="col_12" width="55px"></col> -->
<!-- <col id="col_13" width="55px"></col> -->
<!-- <col id="col_14" width="60px"></col> -->
<col id="col_15" width="*"></col>
</colgroup>
<thead >
<tr >
<th colspan="3" class="border-bottom-0 align-middle" ><span th:text="#{store}"></span></th>
<th rowspan="2" onclick="dashboardSortData('store_status','active_device_type', doStoreSearch)" class="border-bottom-0 align-middle" style="cursor: pointer;"><span class="" th:utext="#{core}+'&lt;br /&gt;'+#{type}"></span><i id="ss_active_device_type_updown" class="sort-updown icon-sort-up-down"></i></th>
<th rowspan="2" onclick="dashboardSortData('store_status','core_status', doStoreSearch)" class="border-bottom-0 align-middle" style="cursor: pointer;"><span class="" th:text="#{status}"></span> <div class="clear-fix"></div> <i id="ss_core_status_updown" class="sort-updown icon-sort-up-down"></i></th>
<th rowspan="2" onclick="dashboardSortData('store_status','gateway_status', doStoreSearch)" class="border-bottom-0 align-middle" style="cursor: pointer;"><span class="" th:text="#{gateway}"></span> <div class="clear-fix"></div> <i id="ss_gateway_status_updown" class="sort-updown icon-sort-up-down"></i></th>
<th rowspan="2" onclick="dashboardSortData('store_status','network_status', doStoreSearch)" class="border-bottom-0 align-middle" style="cursor: pointer;"><span class="" th:text="#{network}"></span> <div class="clear-fix"></div> <i id="ss_network_status_updown" class="sort-updown icon-sort-up-down"></i></th>
<th rowspan="2" onclick="dashboardSortData('store_status','sync_status', doStoreSearch)" class="border-bottom-0 align-middle" style="cursor: pointer;"><span class="" th:text="#{sync}"></span> <div class="clear-fix"></div> <i id="ss_sync_status_updown" class="sort-updown icon-sort-up-down"></i></th>
<th colspan="3" class="border-bottom-0 align-middle" ><div class="" th:text="#{tag}"></div></th>
<!-- <th colspan="3" class="border-bottom-0 align-middle" ><div class="" th:text="#{goods.change}"></div></th> -->
<!-- <th rowspan="2" class="border-bottom-0 align-middle" ><div class="" th:text="#{esl.file}"></div></th> -->
<th rowspan="2" onclick="dashboardSortData('store_status','update_time', doStoreSearch) " class="border-bottom-0 align-middle" style="cursor: pointer;"><span class="" th:text="#{update.date.time}"></span><i id="ss_update_time_updown" class="sort-updown icon-sort-up-down"></i></th>
</tr>
<tr>
<th onclick="dashboardSortData('store_status','biztp_code', doStoreSearch)" class="border-bottom-0 align-middle" style="cursor: pointer;"><span th:text="#{business.conditions}"></span><i id="ss_biztp_code_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('store_status','str_code', doStoreSearch)" class="border-bottom-0 align-middle" style="cursor: pointer;"><span th:text="#{code}"></span><i id="ss_str_code_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('store_status','str_name', doStoreSearch)" class="border-bottom-0 align-middle" style="cursor: pointer;"><span th:text="#{store.name}"></span><i id="ss_str_name_updown" class="sort-updown icon-sort-up-down"></i></th>
<th class="border-bottom-0 align-middle"><div class="" th:text="#{total}"></div></th>
<th class="border-bottom-0 align-middle"><div class="" th:text="#{in_use}"></div></th>
<th class="border-bottom-0 align-middle"><span class="" th:utext="#{onstorage}"></span></th>
<!--
<th class="border-bottom-0 align-middle"><div class="" th:text="#{product}"></div></th>
<th class="border-bottom-0 align-middle"><div class="" th:text="#{event}"></div></th>
<th class="border-bottom-0 align-middle"><span class="" th:utext="#{daliy.middle.sale.price}"></span></th>
-->
</tr>
</thead>
</table>
<div style="height: 380px;overflow-y: auto;">
<table class="table table-sm table-striped table-bordered text-center m-0" id="storeStatusList">
<colgroup >
<col id="col_1" width="90px"></col>
<col id="col_2" width="70px"></col>
<col id="col_3" width="165px"></col>
<col id="col_4" width="60px"></col>
<col id="col_5" width="50px"></col>
<col id="col_6" width="50px"></col>
<col id="col_7" width="50px"></col>
<col id="col_8" width="50px"></col>
<col id="col_9" width="70px"></col>
<col id="col_10" width="70px"></col>
<col id="col_11" width="70px"></col>
<!-- <col id="col_12" width="55px"></col> -->
<!-- <col id="col_13" width="55px"></col> -->
<!-- <col id="col_14" width="60px"></col> -->
<col id="col_15" width="*"></col>
</colgroup>
<tbody id="filterTarget0" class="spinner-1" ></tbody>
</table>
<h4 class="d-none h4 p-3 mt-0 bg-secondary text-center">
<i class="fas fa-exclamation-circle text-warning"></i>
<span class="text-light" th:text="#{msg.data.notfound}"></span>
</h4>
</div>
</div><!-- .card-body, sec:authorize="hasAuthority('ADMIN')" -->
<!-- MANAGER -->
<div class="card-body p-0" sec:authorize="hasAuthority('MANAGER')">
<table class="table table-sm table-striped table-bordered text-center m-0" id="storeStatusList">
<thead>
<tr>
<th colspan="3" class="border-bottom-0 align-middle" ><div class="" th:text="#{store}"></div></th>
<th colspan="6" class="border-bottom-0 align-middle" ><div class="" th:text="#{tag.present.condition}"></div></th>
</tr>
<tr>
<th onclick="dashboardSortData('store_info', 'biztp_code', doStoreSearch)" class="border-bottom-0 align-middle" style="cursor: pointer;"><span class="" th:text="#{business.conditions}"></span><i id="ssm_biztp_code_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('store_info', 'str_code' , doStoreSearch)" class="border-bottom-0 align-middle" style="cursor: pointer;"><span class="" th:text="#{code}"></span><i id="ssm_str_code_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('store_info', 'str_name' , doStoreSearch)" class="border-bottom-0 align-middle" style="cursor: pointer;"><span class="" th:text="#{store.name}"></span><i id="ssm_str_name_updown" class="sort-updown icon-sort-up-down"></i></th>
<!-- tag -->
<th class="border-bottom-0 align-middle" ><div class="" th:text="#{total}"></div></th>
<th class="border-bottom-0 align-middle" ><div class="" th:text="#{in_use}"></div></th>
<th class="border-bottom-0 align-middle" ><div class="" th:text="#{disconnected}"></div></th>
<th class="border-bottom-0 align-middle" ><div class="" th:text="#{unused}"></div></th>
<th class="border-bottom-0 align-middle" ><div class="" th:text="#{onstorage}"></div></th>
<th class="border-bottom-0 align-middle" ><div class="" th:text="#{low_battery}"></div></th>
</tr>
</thead>
<tbody id="filterTarget0" class="spinner-1" ></tbody>
</table>
<h4 class="d-none h4 p-3 mt-0 bg-secondary text-center">
<i class="fas fa-exclamation-circle text-warning"></i>
<span class="text-light" th:text="#{msg.data.notfound}"></span>
</h4>
</div><!-- .card-body -->
<div class="card-footer bg-custom-dark text-light p-1">
<!--
<div class="float-left" sec:authorize="hasAuthority('ADMIN') or hasAuthority('MANAGER')">
<div id="footerGotoEmart"
data-toggle="tooltip"
data-placement="right"
style="cursor: pointer;" >
&nbsp;<span class="badge badge-warning m=0 p-1 pl-5 pr-5 text-custom-light" style="border: 1px solid #C0C0C0;">이마트</span>&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;1092&nbsp;&nbsp;|&nbsp;&nbsp;죽전점
</div>
</div>
-->
<div class="float-right" id="storeStatusGoodBadData"></div>
</div><!-- .card-footer -->
</div><!-- .card -->
<br />
<!-- 알람 현황 -->
<div class="card" sec:authorize="hasAuthority('ADMIN')">
<div class="card-header bg-custom-dark text-light clearfix">
<div class="float-left">
<h4 class="m-0 mr-2 fas fa-dice-two text-secondary"></h4>
</div>
<div class="float-left">
<h4 class="m-0" th:text="#{alarm.present.condition}"></h4>
</div>
<div class="float-right">
<div class="input-group input-group-sm" >
<input
type="text"
class="form-control form-control-sm border border-warning"
style="height:24px"
id="filter1"
th:placeholder="#{search.placeholder.code.store.name}"
th:attr="aria-label=#{search}"
aria-describedby="btn-search-alaram-history" />
<div class="input-group-append">
<button type="button" class="btn btn-sm btn-outline-warning " id="btn-search-alaram-history">
<i class="fas fa-search"></i>
</button>
</div>
</div>
</div>
<div class="float-right mr-2">
<div class="input-group input-group-sm" >
<div class="input-group-prepend">
<label class="input-group-text border border-warning" for="refreshTimeAlarmHistory" th:text="#{refresh.time}" ></label>
</div>
<div class="input-group-append">
<select class="form-control form-control-sm border border-warning" id="refreshTimeAlaramHistory">
<option value="" th:text="#{disabled}"></option>
<option value="10" th:text="'10' + #{data.time.second}" selected="selected"></option>
<option value="30" th:text="'30' + #{data.time.second}"></option>
<option value="60" th:text="' 1' + #{data.time.minute}"></option>
<option value="300" th:text="' 5' + #{data.time.minute}"></option>
<option value="600" th:text="'10' + #{data.time.minute}"></option>
<option value="1800" th:text="'30' + #{data.time.minute}"></option>
</select>
</div>
</div>
</div>
</div><!-- .card-header -->
<div class="card-body p-0" style="height: 212px;overflow: hidden;" >
<table class="table table-sm table-striped table-bordered text-center m-0">
<colgroup>
<col width="150px"></col>
<col width="100px"></col>
<col width="100px"></col>
<col width="220px"></col>
<col width="100px"></col>
<col width="*"></col>
</colgroup>
<thead>
<tr>
<th onclick="dashboardSortData('alarm_history','alarm_occure_time', doAlarmSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span class="" th:text="#{alarm.occure.time}"></span><i id="ah_alarm_occure_time_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('alarm_history','object_type', doAlarmSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span class="" th:text="#{object.type}"></span><i id="ah_object_type_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('alarm_history','object_id' , doAlarmSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span class="" th:text="#{code}"></span><i id="ah_object_id_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('alarm_history','object_name', doAlarmSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span class="" th:text="#{official.name}"></span><i id="ah_object_name_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('alarm_history','alarm_state', doAlarmSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span class="" th:text="#{status}"></span><i id="ah_alarm_state_updown" class="sort-updown icon-sort-up-down"></i></th>
<th class="border-bottom-0 align-middle p-2" ><div class="" th:text="#{message}"></div></th>
</tr>
</thead>
</table>
<div style="height: 180px;overflow-y: auto;">
<table class="table table-sm table-striped table-bordered text-center m-0" id="alarmStatusList" >
<colgroup>
<col width="150px"></col>
<col width="100px"></col>
<col width="100px"></col>
<col width="220px"></col>
<col width="100px"></col>
<col width="*"></col>
</colgroup>
<tbody id="filterTarget1" class="spinner-1" ></tbody>
</table>
<h4 class="d-none h4 p-3 mt-0 bg-secondary text-center">
<i class="fas fa-exclamation-circle text-warning"></i>
<span class="text-light" th:text="#{msg.data.notfound}"></span>
</h4>
</div>
</div>
<div class="card-footer bg-custom-dark text-light text-right p-1"></div>
</div>
<br />
</div><!-- .col-8 -->
<div class="col-4" sec:authorize="hasAuthority('ADMIN')">
<div class="d-none"> 숨김!!
<!-- ESN 동작 현황 -->
<div class="card">
<div class="card-header bg-custom-dark text-light clearfix">
<div class="float-left">
<h4 class="m-0 mr-2 fas fa-dice-three text-secondary"></h4>
</div>
<div class="float-left">
<h4 class="m-0" th:text="#{esn.operation.status}"></h4>
</div>
<div class="float-right">
<div class="input-group input-group-sm" >
<div class="input-group-prepend">
<label class="input-group-text border border-warning" for="refreshTimeOperationStatus" th:text="#{refresh.time}" ></label>
</div>
<select class="form-control form-control-sm border border-warning" id="refreshTimeOperationStatus">
<option value="" th:text="#{disabled}"></option>
<option value="10" th:text="'10' + #{data.time.second}" selected="selected"></option>
<option value="30" th:text="'30' + #{data.time.second}"></option>
<option value="60" th:text="'1' + #{data.time.minute}"></option>
<option value="300" th:text="'5' + #{data.time.minute}"></option>
<option value="600" th:text="'10' + #{data.time.minute}"></option>
<option value="1800" th:text="'30' + #{data.time.minute}"></option>
</select>
<div class="input-group-append">
<button type="button" class="btn btn-sm btn-outline-warning " id="btn-search-operation-status">
<i class="fas fa-redo-alt"></i>
</button>
</div>
</div>
</div>
</div><!-- .card-header -->
<div class="card-body p-0">
<table class="table table-sm table-striped table-bordered text-center m-0">
<colgroup>
<col width="130px" ></col>
<col width="65px" ></col>
<col width="65px" ></col>
<col width="65px" ></col>
<col width="*" ></col>
</colgroup>
<thead>
<tr>
<th onclick="dashboardSortData('poscvt_status', 'poscvt_name', doPosCVTSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span class="" th:text="#{division}"></span><i id="ps_poscvt_name_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('poscvt_status','status', doPosCVTSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span class="" th:text="#{status}"></span><i id="ps_status_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('poscvt_status','version', doPosCVTSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span class="" th:text="#{version}"></span><i id="ps_version_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('poscvt_status','network_status',doPosCVTSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span class="" th:text="#{network}"></span><i id="ps_network_status_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('poscvt_status','last_update_time',doPosCVTSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span class="" th:text="#{update.date.time}"></span><i id="ps_last_update_time_updown" class="sort-updown icon-sort-up-down"></i></th>
</tr>
</thead>
</table>
<div style="height: 51px;overflow-y: auto;">
<table class="table table-sm table-striped table-bordered text-center m-0" id="esnOperationStatusList">
<colgroup>
<col width="130px" ></col>
<col width="65px" ></col>
<col width="65px" ></col>
<col width="65px" ></col>
<col width="*" ></col>
</colgroup>
<tbody class="spinner-1" ></tbody>
</table>
<h4 class="d-none h4 p-3 mt-0 bg-secondary text-center">
<i class="fas fa-exclamation-circle text-warning"></i>
<span class="text-light" th:text="#{msg.data.notfound}"></span>
</h4>
</div>
</div><!-- .card-body -->
<div class="card-footer bg-custom-dark text-light text-right p-1"></div>
</div><!-- .card -->
<br />
</div><!-- .d-none (숨김!!) -->
<!-- ESN 동작 이력 -->
<div class="card">
<div class="card-header bg-custom-dark text-light clearfix">
<div class="float-left">
<h4 class="m-0 mr-2 fas fa-dice-four text-secondary"></h4>
</div>
<div class="float-left">
<h4 class="m-0" th:text="#{esn.operation.history}"></h4>
</div>
<div class="float-right">
<div class="input-group input-group-sm" >
<div class="input-group-prepend">
<label class="input-group-text border border-warning" for="refreshTimeOperationHistory" th:text="#{refresh.time}" ></label>
</div>
<select class="form-control form-control-sm border border-warning" id="refreshTimeOperationHistory">
<option value="" th:text="#{disabled}"></option>
<option value="10" th:text="'10' + #{data.time.second}" selected="selected"></option>
<option value="30" th:text="'30' + #{data.time.second}"></option>
<option value="60" th:text="'1' + #{data.time.minute}"></option>
<option value="300" th:text="'5' + #{data.time.minute}"></option>
<option value="600" th:text="'10' + #{data.time.minute}"></option>
<option value="1800" th:text="'30' + #{data.time.minute}"></option>
</select>
<div class="input-group-append">
<button type="button" class="btn btn-sm btn-outline-warning" id="btn-search-operation-history">
<i class="fas fa-redo-alt"></i>
</button>
</div>
</div>
</div>
</div><!-- .card-header -->
<div class="card-body p-0 " style="height: 536px;overflow: hidden;" >
<table class="table table-sm table-striped table-bordered text-center m-0">
<colgroup>
<col width="110px" ></col>
<col width="65px" ></col>
<col width="90px" ></col>
<col width="100px" ></col>
<col width="*" ></col>
</colgroup>
<thead>
<tr>
<th onclick="dashboardSortData('work_history', 'work_time', doWorkSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span th:text="#{update.date.time}"></span><i id="wh_work_time_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('work_history', 'str_code' , doWorkSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span th:text="#{code}"></span><i id="wh_str_code_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('work_history', 'str_name' , doWorkSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span th:text="#{store}"></span><i id="wh_str_name_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('work_history', 'file_type', doWorkSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span th:text="#{file.type}"></span><i id="wh_file_type_updown" class="sort-updown icon-sort-up-down"></i></th>
<th onclick="dashboardSortData('work_history', 'work_type', doWorkSearch)" class="border-bottom-0 align-middle p-2" style="cursor: pointer;"><span th:text="#{content}"></span><i id="wh_work_type_updown" class="sort-updown icon-sort-up-down"></i></th>
</tr>
</thead>
</table>
<div style="height: 504px;overflow-y: auto;">
<table class="table table-sm table-striped table-bordered text-center m-0" id="esnWorkHistory">
<colgroup>
<col width="110px" ></col>
<col width="65px" ></col>
<col width="90px" ></col>
<col width="100px" ></col>
<col width="*" ></col>
</colgroup>
<tbody class="spinner-1" ></tbody>
</table>
<h4 class="d-none h4 p-3 mt-0 bg-secondary text-center">
<i class="fas fa-exclamation-circle text-warning"></i>
<span class="text-light" th:text="#{msg.data.notfound}"></span>
</h4>
</div>
</div><!-- .card-body -->
<div class="card-footer bg-custom-dark text-light text-right p-1"></div>
</div><!-- .card -->
<br />
<!-- 서버 정보 -->
<div class="card">
<div class="card-header bg-custom-dark text-light clearfix">
<div class="float-left">
<h4 class="m-0 mr-2 fas fa-server text-secondary"></h4>
</div>
<div class="float-left">
<h4 class="m-0" th:text="#{server.info}"></h4>
</div>
<div class="float-right">
<div class="input-group input-group-sm" >
<div class="input-group-prepend">
<label class="input-group-text border border-warning" for="refreshServerInfo" th:text="#{refresh.time}" ></label>
</div>
<select class="form-control form-control-sm border border-warning" id="refreshServerInfo">
<option value="" th:text="#{disabled}" selected="selected"></option>
<option value="10" th:text="'10' + #{data.time.second}"></option>
<option value="30" th:text="'30' + #{data.time.second}"></option>
<option value="60" th:text="'1' + #{data.time.minute}"></option>
<option value="300" th:text="'5' + #{data.time.minute}"></option>
<option value="600" th:text="'10' + #{data.time.minute}"></option>
<option value="1800" th:text="'30' + #{data.time.minute}"></option>
</select>
<div class="input-group-append">
<button type="button" class="btn btn-sm btn-outline-warning" id="btn-search-server-info">
<!-- <i class="fas fa-search"></i> -->
<i class="fas fa-redo-alt"></i>
</button>
</div>
</div>
</div>
</div><!-- .card-header -->
<div class="card-body p-0 " style="height: 125px;overflow: hidden;" >
<table class="table table-sm table-bordered text-center m-0" id="serverInfo">
<tbody class="spinner-1">
<tr>
<th class="align-middle p-2" th:text="#{os}"></th>
<td class="align-middle p-2">-</td>
</tr>
<tr>
<th class="align-middle p-2" th:text="#{number.of.processors}"></th>
<td class="align-middle p-2">-</td>
</tr>
<tr>
<th class="align-middle p-2" th:text="#{cpu.usage}">CPU Usage</th>
<td class="align-middle p-2">-</td>
</tr>
<tr>
<th class="align-middle p-2" th:text="#{memory.usage}"></th>
<td class="align-middle p-2">-</td>
</tr>
</tbody>
</table>
</div><!-- .card-body -->
<div class="card-footer bg-custom-dark text-light text-right p-1"></div>
</div><!-- .card -->
<br />
</div><!-- .col-4 -->
</div><!-- .row -->
<!-- The Modal: 패스워드 변경 필요 안내 메시지 -->
<div class="modal" id="isExpired" th:if="${isExpired}">
<div class="modal-dialog">
<div class="modal-content">
<!-- Modal Header -->
<div class="modal-header">
<h4 class="modal-title" th:text="#{confirm}"></h4>
<button type="button" class="close" data-dismiss="modal">&times;</button>
</div>
<!-- Modal body -->
<div class="modal-body">
<span th:text="#{msg.pwd.90days.passed}"></span>
<br />
<span th:text="#{msg.need.change.password}"></span>
</div>
<!-- Modal footer -->
<div class="modal-footer">
<button type="button" class="btn btn-outline-warning text-bold" data-dismiss="modal" th:text="#{confirm}"></button>
</div>
</div>
</div>
</div><!-- .modal#isExpired -->
<!-- str_code에 관한 동기화 실패 리스트 팝업 -->
<div class="modal" id="syncFailListModal">
<div class="modal-dialog">
<div class="modal-content">
<!-- Modal Header -->
<div class="modal-header bg-custom-dark">
<h4 class="modal-title text-light text-bold" th:text="#{sync.fail.list}"></h4>
<button type="button" class="close text-light text-bold" data-dismiss="modal" style="font-size: 24px;">&times;</button>
</div>
<!-- Modal body -->
<div class="modal-body m-0 p-0" style="width: 460px;">
<table class="table table-sm table-striped table-bordered table-hover text-center m-0">
<colgroup>
<col width="120px" />
<col width="110px" />
<col width="101px" />
<col width="*" />
</colgroup>
<thead>
<tr>
<th class="border-bottom-0 align-middle p-2" th:text="#{update.date.time}"></th>
<th class="border-bottom-0 align-middle p-2" th:text="#{file.type}"></th>
<th class="border-bottom-0 align-middle p-2" th:utext="#{core}+' '+#{file}+#{number}"></th>
<th class="border-bottom-0 align-middle p-2" th:utext="#{esn}+' '+#{file}+#{number}"></th>
</tr>
</thead>
</table>
<div class="" style="max-height: 260px;overflow-y: auto;">
<table class="table table-sm table-striped table-bordered table-hover text-center m-0">
<colgroup>
<col width="120px" />
<col width="110px" />
<col width="101px" />
<col width="*" />
</colgroup>
<tbody id="syncFailList"></tbody>
</table>
</div>
</div>
<!-- Modal footer -->
<div class="modal-footer bg-custom-dark">
<button type="button" class="btn btn-outline-warning text-bold" data-dismiss="modal" th:text="#{confirm}"></button>
</div>
</div>
</div>
</div><!-- .modal str_code에 관한 동기화 실패 -->
</div><!-- .container-fluid -->
</div><!-- fragment -->
</body>
</html>