Merge branch 'master' of https://gitea.mjm-staging.developers-homelab.net/BIMS/BIMS
This commit is contained in:
commit
2c3704f5a6
File diff suppressed because it is too large
Load Diff
@ -25,9 +25,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-xl-7">
|
<div class="col-sm-12 col-xl-7">
|
||||||
<!--<img src="img/clouds.png" class="img-fluid" style="min-height: 520px;">-->
|
|
||||||
<!--<a href="javascript:;" data-toggle="modal" data-target=".default-example-modal-right-lg">
|
|
||||||
<span class="badge border border-light bg-primary-700 position-absolute pos-top pos-left"><i class="fal fa-image fa-3x"></i></span></a>-->
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -38,7 +36,7 @@
|
|||||||
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
var allDevList = [];
|
var allDevList = []; //全設備清單
|
||||||
$(function () {
|
$(function () {
|
||||||
getFloDevList();
|
getFloDevList();
|
||||||
setLightColor();
|
setLightColor();
|
||||||
@ -74,7 +72,7 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
//根據 data-type 設置顏色 (判斷後台是否有設定,若無則帶預設)
|
||||||
function setLightColor() {
|
function setLightColor() {
|
||||||
$("[data-light-type]").each((index, ele) => {
|
$("[data-light-type]").each((index, ele) => {
|
||||||
let type = $(ele).data("light-type");
|
let type = $(ele).data("light-type");
|
||||||
@ -83,24 +81,26 @@
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
case "normal":
|
case "normal":
|
||||||
color = pageAct.sysSubObj.device_normal_color ?? "var(--theme-success)";
|
color = pageAct.sysSubObj.device_normal_color ?? "var(--theme-success)";
|
||||||
isFlashing = pageAct.sysSubObj.device_normal_flashing == "1"
|
isFlashing = pageAct.sysSubObj.device_normal_flashing == "1";
|
||||||
break;
|
break;
|
||||||
case "close":
|
case "close":
|
||||||
color = pageAct.sysSubObj.device_close_color ?? "var(--theme-secondary)";
|
color = pageAct.sysSubObj.device_close_color ?? "var(--theme-secondary)";
|
||||||
isFlashing = pageAct.sysSubObj.device_close_flashing == "1"
|
isFlashing = pageAct.sysSubObj.device_close_flashing == "1";
|
||||||
break;
|
break;
|
||||||
case "error":
|
case "error":
|
||||||
color = pageAct.sysSubObj.device_error_color ?? "var(--theme-danger)";
|
color = pageAct.sysSubObj.device_error_color ?? "var(--theme-danger)";
|
||||||
isFlashing = pageAct.sysSubObj.device_error_flashing == "1"
|
isFlashing = pageAct.sysSubObj.device_error_flashing == "1";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
$(ele).css("background-color", color);
|
$(ele).css("background-color", color);
|
||||||
|
//是否閃爍
|
||||||
if (isFlashing) {
|
if (isFlashing) {
|
||||||
$(ele).parents(".card.device-wrap").addClass("light-flash");
|
$(ele).parents(".card.device-wrap").addClass("light-flash");
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//取得設備列表 並繪製卡片
|
||||||
function getFloDevList() {
|
function getFloDevList() {
|
||||||
let url = baseApiUrl + "/api/Device/GetDeviceList";
|
let url = baseApiUrl + "/api/Device/GetDeviceList";
|
||||||
let sendData = {
|
let sendData = {
|
||||||
@ -148,6 +148,7 @@
|
|||||||
}, null, "POST").send();
|
}, null, "POST").send();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Card 即時狀態
|
||||||
function drawStateTabBlo() {
|
function drawStateTabBlo() {
|
||||||
let strHtml = `<div style="height:15rem">
|
let strHtml = `<div style="height:15rem">
|
||||||
<iframe src="http://localhost:8080/ord?station:%7Cslot:/TPE/B1/EE/E4/R2F/NA/WHT/N1|view:?fullScreen=true" width="100%" height="100%"></iframe>
|
<iframe src="http://localhost:8080/ord?station:%7Cslot:/TPE/B1/EE/E4/R2F/NA/WHT/N1|view:?fullScreen=true" width="100%" height="100%"></iframe>
|
||||||
|
@ -55,6 +55,46 @@ label[id$='-error'].error {
|
|||||||
animation: flashing-c 0.5s linear infinite;
|
animation: flashing-c 0.5s linear infinite;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* checkbox switch */
|
||||||
|
input.toggle:checked::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 2px;
|
||||||
|
left: 24px;
|
||||||
|
display: block;
|
||||||
|
border-radius: 25px;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background: #3f8635;
|
||||||
|
}
|
||||||
|
input.toggle::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 2px;
|
||||||
|
left: 3px;
|
||||||
|
display: block;
|
||||||
|
border-radius: 25px;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
background: #656565;
|
||||||
|
transition: 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
input.toggle {
|
||||||
|
cursor:pointer;
|
||||||
|
appearance: none;
|
||||||
|
position:relative;
|
||||||
|
width: 48px;
|
||||||
|
height: 24px;
|
||||||
|
background: #464646;
|
||||||
|
border-radius: 50px;
|
||||||
|
align-content: center;
|
||||||
|
}
|
||||||
|
input.toggle:checked {
|
||||||
|
background: #97c193;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@keyframes flashing-c {
|
@keyframes flashing-c {
|
||||||
0% {
|
0% {
|
||||||
color: var(--flash-color-1);
|
color: var(--flash-color-1);
|
||||||
|
@ -2531,7 +2531,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
<script src="js/bajascript/bscriptReq.js"></script>
|
<script src="js/bajascript/bscriptReq.js"></script>
|
||||||
<!--<script type='text/javascript' src='/module/js/com/tridium/js/ext/require/require.min.js?version=1496767636459'></script>-->
|
<!--<script type='text/javascript' src='/module/js/com/tridium/js/ext/require/require.min.js?version=1496767636459'></script>-->
|
||||||
<script src='js/bajascript/require.js'></script>
|
<script src='js/bajascript/require.js'></script>
|
||||||
|
|
||||||
|
|
||||||
<script type='text/javascript'>
|
<script type='text/javascript'>
|
||||||
define('niagaraSystemProperties', function () {
|
define('niagaraSystemProperties', function () {
|
||||||
@ -2699,7 +2699,11 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
$("#sysMonBtnList .dropdown-item").removeClass("active");
|
$("#sysMonBtnList .dropdown-item").removeClass("active");
|
||||||
pageAct.sysMainTag = null;
|
pageAct.sysMainTag = null;
|
||||||
}
|
}
|
||||||
|
$.each(tolSubList, (idx, sub) => {
|
||||||
|
console.log("sub",sub,idx)
|
||||||
|
sub.unsubscribeAll();
|
||||||
|
sub.detach();
|
||||||
|
})
|
||||||
$("#app").load(`_${page}.html`, loadCallback);
|
$("#app").load(`_${page}.html`, loadCallback);
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -2722,7 +2726,11 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
// ↓ 系統監控 - 共用 Function ↓
|
||||||
|
//==============================================================================
|
||||||
|
|
||||||
|
// Card - 基本資料 Table
|
||||||
function drawInfoTabBlo(devGuid) {
|
function drawInfoTabBlo(devGuid) {
|
||||||
let tabEle = $(`<table class="table table-bordered table-striped text-center m-0">`);
|
let tabEle = $(`<table class="table table-bordered table-striped text-center m-0">`);
|
||||||
let tbody = tabEle.append("<tbody>");
|
let tbody = tabEle.append("<tbody>");
|
||||||
@ -2753,20 +2761,23 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
return tabEle.prop("outerHTML");
|
return tabEle.prop("outerHTML");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Card - 異常紀錄 block
|
||||||
function drawErrRecTabBlo() {
|
function drawErrRecTabBlo() {
|
||||||
let strHtml = `<table id="errRecTable" class="table table-bordered table-striped text-center m-0 w-100">
|
let strHtml = `<table id="errRecTable" class="table table-bordered table-striped text-center m-0 w-100">
|
||||||
|
|
||||||
</table>`
|
</table>`
|
||||||
return strHtml;
|
return strHtml;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Card - 運維紀錄 block
|
||||||
function drawOpeRecTabBlo() {
|
function drawOpeRecTabBlo() {
|
||||||
let strHtml = `<table id="opeRecTable" class="table table-bordered table-striped text-center m-0 w-100">
|
let strHtml = `<table id="opeRecTable" class="table table-bordered table-striped text-center m-0 w-100">
|
||||||
|
|
||||||
</table>`
|
</table>`
|
||||||
return strHtml;
|
return strHtml;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Card 呈現初始化
|
||||||
function initPopover() {
|
function initPopover() {
|
||||||
$("[name=devItem]").each((index, ele) => {
|
$("[name=devItem]").each((index, ele) => {
|
||||||
let devNum = $(ele).data("number"); //設備編號
|
let devNum = $(ele).data("number"); //設備編號
|
||||||
@ -2774,38 +2785,38 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
let devName = $(ele).data("name"); //full_name
|
let devName = $(ele).data("name"); //full_name
|
||||||
$(ele).YTTooltip({
|
$(ele).YTTooltip({
|
||||||
html: `<div class="card m-1 border device-wrap">
|
html: `<div class="card m-1 border device-wrap">
|
||||||
|
|
||||||
<div class="card-header p-3">
|
|
||||||
|
|
||||||
<div class="position-absolute w-50" style="word-break: break-all;">
|
|
||||||
<label class="m-0 mt-2">${devName}</label>
|
|
||||||
</div>
|
|
||||||
<div id="card-tab" class="row justify-content-end nav nav-tabs" role="tablist">
|
|
||||||
<button type="button" id="state-tab" class="btn btn-icon nav-link active" role="tab" data-tabname="cardTab" data-target="#state"><i class="fa fa-desktop icon"></i></button>
|
|
||||||
<button type="button" id="info-tab" class="btn btn-icon nav-link" role="tab" data-tabname="cardTab" data-target="#info"><i class="fa fa-cog icon"></i></button>
|
|
||||||
<button type="button" id="errRec-tab" class="btn btn-icon nav-link" role="tab" data-tabname="cardTab" data-target="#errRec"><i class="fas fa-exclamation-triangle"></i></button>
|
|
||||||
<button type="button" id="opeRec-tab" class="btn btn-icon nav-link" role="tab" data-tabname="cardTab" data-target="#opeRec"><i class="fa fa-bars icon"></i></button>
|
|
||||||
<button class="btn p-2"><i class="fas fa-times fs-1 text-white-50" data-close="yttooltip"></i></button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-body p-2 tab-content">
|
|
||||||
|
|
||||||
<div id="state" class="show active" data-tabname="cardTab" data-tabrole="child">
|
|
||||||
${drawStateTabBlo()}
|
|
||||||
</div>
|
|
||||||
<div id="info" data-tabname="cardTab" data-tabrole="child">
|
|
||||||
${drawInfoTabBlo(devGuid)}
|
|
||||||
</div>
|
|
||||||
<div id="errRec" data-tabname="cardTab" data-tabrole="child">
|
|
||||||
${drawErrRecTabBlo()}
|
|
||||||
</div>
|
|
||||||
<div id="opeRec" data-tabname="cardTab" data-tabrole="child">
|
|
||||||
${drawOpeRecTabBlo()}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
<div class="card-header p-3">
|
||||||
|
|
||||||
|
<div class="position-absolute w-50" style="word-break: break-all;">
|
||||||
|
<label class="m-0 mt-2">${devName}</label>
|
||||||
</div>
|
</div>
|
||||||
</div>`,
|
<div id="card-tab" class="row justify-content-end nav nav-tabs" role="tablist">
|
||||||
|
<button type="button" id="state-tab" class="btn btn-icon nav-link active" role="tab" data-tabname="cardTab" data-target="#state"><i class="fa fa-desktop icon"></i></button>
|
||||||
|
<button type="button" id="info-tab" class="btn btn-icon nav-link" role="tab" data-tabname="cardTab" data-target="#info"><i class="fa fa-cog icon"></i></button>
|
||||||
|
<button type="button" id="errRec-tab" class="btn btn-icon nav-link" role="tab" data-tabname="cardTab" data-target="#errRec"><i class="fas fa-exclamation-triangle"></i></button>
|
||||||
|
<button type="button" id="opeRec-tab" class="btn btn-icon nav-link" role="tab" data-tabname="cardTab" data-target="#opeRec"><i class="fa fa-bars icon"></i></button>
|
||||||
|
<button class="btn p-2"><i class="fas fa-times fs-1 text-white-50" data-close="yttooltip"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="card-body p-2 tab-content">
|
||||||
|
|
||||||
|
<div id="state" class="show active" data-tabname="cardTab" data-tabrole="child">
|
||||||
|
${drawStateTabBlo(devNum)}
|
||||||
|
</div>
|
||||||
|
<div id="info" data-tabname="cardTab" data-tabrole="child">
|
||||||
|
${drawInfoTabBlo(devGuid)}
|
||||||
|
</div>
|
||||||
|
<div id="errRec" data-tabname="cardTab" data-tabrole="child">
|
||||||
|
${drawErrRecTabBlo()}
|
||||||
|
</div>
|
||||||
|
<div id="opeRec" data-tabname="cardTab" data-tabrole="child">
|
||||||
|
${drawOpeRecTabBlo()}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>`,
|
||||||
group: "device",
|
group: "device",
|
||||||
onShow: function (tooltipEle, oriEle) {
|
onShow: function (tooltipEle, oriEle) {
|
||||||
var tab = new YT.Tab({ tabName: "cardTab" })
|
var tab = new YT.Tab({ tabName: "cardTab" })
|
||||||
@ -2813,10 +2824,13 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
//loadErrRecTable2($(oriEle).data("number"));
|
//loadErrRecTable2($(oriEle).data("number"));
|
||||||
//loadErrRecTable();
|
//loadErrRecTable();
|
||||||
loadErr($(oriEle).data("number"));
|
loadErr($(oriEle).data("number"));
|
||||||
|
subDeviceSetTable ? subDeviceSetTable($(oriEle).data("number")) : ""
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Card - 運維紀錄 Table
|
||||||
function loadOpeRecTable(devGuid) {
|
function loadOpeRecTable(devGuid) {
|
||||||
let url = baseApiUrl + "/api/Device/GetOpeDevice?device_guid=" + devGuid;
|
let url = baseApiUrl + "/api/Device/GetOpeDevice?device_guid=" + devGuid;
|
||||||
let tag = "#opeRecTable";
|
let tag = "#opeRecTable";
|
||||||
@ -2851,60 +2865,10 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
|
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//let callback = function () {
|
|
||||||
// $('#opeRecTable').wrap("<div class='scrolledTable'></div>"); //不採用datatable內建scrollbody,會導致thead跑掉
|
|
||||||
// let api = this.api();
|
|
||||||
// api.columns.adjust();
|
|
||||||
//}
|
|
||||||
|
|
||||||
let opeRecTable = new YourTeam.JqDataTables.getTableByAjax(url, tag, null, columns, column_defs, null, null, null, null, null, null, "tpi");
|
let opeRecTable = new YourTeam.JqDataTables.getTableByAjax(url, tag, null, columns, column_defs, null, null, null, null, null, null, "tpi");
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadErrRecTable() {
|
// Baja 取得異常紀錄
|
||||||
let tag = "#errRecTable";
|
|
||||||
let datas;
|
|
||||||
//getOneDeviceAlarmTop10ByBaja(_devicePath, callback);
|
|
||||||
|
|
||||||
let column_defs = [
|
|
||||||
{ "targets": [0], "width": "15%", "sortable": true },
|
|
||||||
{ "targets": [1], "width": "25%", "sortable": true },
|
|
||||||
{ "targets": [2], "width": "25%", "sortable": true },
|
|
||||||
{ "targets": [3], "width": "35%", "sortable": true },
|
|
||||||
];
|
|
||||||
|
|
||||||
let columns = [
|
|
||||||
{
|
|
||||||
"title": "異常ID",
|
|
||||||
"data": "uuid",
|
|
||||||
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "異常原因",
|
|
||||||
"data": "msgText",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "ACK確認",
|
|
||||||
"data": "ackState",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"title": "發生/賦歸時間",
|
|
||||||
"data": "timestamp",
|
|
||||||
"width": "45%",
|
|
||||||
},
|
|
||||||
|
|
||||||
];
|
|
||||||
|
|
||||||
//let callback = function (result) {
|
|
||||||
// datas = result;
|
|
||||||
//}
|
|
||||||
let result = '{"count": 2,"data":[{ "uuid": "43dc7846-bd96-4be2-ab35-f11aec729c60","msgText": "","ackState": "1","timestamp": "2022-Nov-16 10:30:24.951 AM UTC+08:00"},{"uuid": "7c309846-d862-4a8b-803b-cdc8e0efa092","msgText": "","ackState": "1","timestamp": "2022-Nov-16 10:00:24.893 AM UTC+08:00"}]}';
|
|
||||||
let json_object = JSON.parse(result);
|
|
||||||
datas = json_object['data'];
|
|
||||||
errRecTable = new YourTeam.JqDataTables.getTableByStatic(tag, datas, columns, column_defs, null, null, null, null, "tpi");
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadErr(allPath) {
|
function loadErr(allPath) {
|
||||||
if (allPath != undefined && allPath != null) {
|
if (allPath != undefined && allPath != null) {
|
||||||
let _pathArr = allPath.split("_");//TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1
|
let _pathArr = allPath.split("_");//TPE_B1_ELEV_EL_R2F_NA_ELEV1_N1
|
||||||
@ -2916,6 +2880,7 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Card - 異常紀錄 Table
|
||||||
function callbackForErr(result) {
|
function callbackForErr(result) {
|
||||||
let tag = "#errRecTable";
|
let tag = "#errRecTable";
|
||||||
let datas;
|
let datas;
|
||||||
@ -2956,6 +2921,38 @@ License: You must have a valid license purchased only from wrapbootstrap.com (li
|
|||||||
errRecTable = new YourTeam.JqDataTables.getTableByStatic(tag, datas, columns, column_defs, null, null, null, null, "tpi");
|
errRecTable = new YourTeam.JqDataTables.getTableByStatic(tag, datas, columns, column_defs, null, null, null, null, "tpi");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//根據 data-type 設置顏色 (判斷後台是否有設定,若無則帶預設)
|
||||||
|
function setLightColor() {
|
||||||
|
$(".dev-card").each((index, ele) => {
|
||||||
|
let type = $(ele).find("[data-light-type]").data("light-type");
|
||||||
|
let isFlashing = false;
|
||||||
|
let color = "#000";
|
||||||
|
switch (type) {
|
||||||
|
case "normal":
|
||||||
|
color = pageAct.sysSubObj.device_normal_color ?? "var(--theme-success)";
|
||||||
|
isFlashing = pageAct.sysSubObj.device_normal_flashing == "1";
|
||||||
|
break;
|
||||||
|
case "close":
|
||||||
|
color = pageAct.sysSubObj.device_close_color ?? "var(--theme-secondary)";
|
||||||
|
isFlashing = pageAct.sysSubObj.device_close_flashing == "1";
|
||||||
|
break;
|
||||||
|
case "error":
|
||||||
|
color = pageAct.sysSubObj.device_error_color ?? "var(--theme-danger)";
|
||||||
|
isFlashing = pageAct.sysSubObj.device_error_flashing == "1";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
$(ele).find("[data-light-type]").css("background-color", color);
|
||||||
|
//是否閃爍
|
||||||
|
if (isFlashing) {
|
||||||
|
$(ele).addClass("light-flash");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
//==============================================================================
|
||||||
|
// ↑ 系統監控 - 共用 Function ↑
|
||||||
|
//==============================================================================
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
let baja_subscribe_device_callback_func; //設定BQL訂閱之後要回傳的Function
|
let baja_subscribe_device_callback_func; //設定BQL訂閱之後要回傳的Function
|
||||||
var ordPath; //當前點選選單的tag,用來抓出設備路徑,例如:旅館棟->H,消防偵煙器->F3
|
var ordPath; //當前點選選單的tag,用來抓出設備路徑,例如:旅館棟->H,消防偵煙器->F3
|
||||||
|
window.tolSubList = [];
|
||||||
function subscriptionDevices() {
|
function subscriptionDevices() {
|
||||||
// 用BQL的方式去訂閱
|
// 用BQL的方式去訂閱
|
||||||
this.setSubscribeDevicesByBql = function (tempOrdPath) {
|
this.setSubscribeDevicesByBql = function (tempOrdPath) {
|
||||||
@ -173,7 +173,7 @@ function BajaSubscribeDevicesByBql() {
|
|||||||
sub.subscribe({
|
sub.subscribe({
|
||||||
comps: component,
|
comps: component,
|
||||||
});
|
});
|
||||||
|
tolSubList.push(sub);
|
||||||
subFinish = new Date(Date.now());
|
subFinish = new Date(Date.now());
|
||||||
$("#sub-end").html(subFinish.toISOString());
|
$("#sub-end").html(subFinish.toISOString());
|
||||||
$("#sub-time").html((subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
|
$("#sub-time").html((subFinish.getTime() - subStart.getTime()) / 1000 + "sec");
|
||||||
|
@ -106,4 +106,104 @@ function creSelect(id = null, cls = [], name = null, data = {}, attr = {}, text
|
|||||||
function creOption(text = null, value = null, data = {}, attr = {}, cls = [], name = null, id = null) {
|
function creOption(text = null, value = null, data = {}, attr = {}, cls = [], name = null, id = null) {
|
||||||
attr = value != null ? attr.value = value : attr;
|
attr = value != null ? attr.value = value : attr;
|
||||||
return creEle("option", text, id, name, cls, data, attr);
|
return creEle("option", text, id, name, cls, data, attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
class ElevatorHandler {
|
||||||
|
constructor(ele, option = {}) {
|
||||||
|
this.ele = ele;
|
||||||
|
this.eleId = "";
|
||||||
|
this.eleWra = $("<div></div>");
|
||||||
|
this.speed = 0;
|
||||||
|
this.monStatus = 0; // 0=no 1=up 2=down
|
||||||
|
this.floorHeight = typeof option.fHeight == "undefined" ? 50 : option.fHeight;
|
||||||
|
this.floorWidth = typeof option.fWidth == "undefined" ? 45 : option.fWidth;
|
||||||
|
this.floors = typeof option.floors == "undefined" ? [{}] : option.floors;
|
||||||
|
this.eleCnt = typeof option.eleCnt == "undefined" ? 3 : option.eleCnt;
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
init = function () {
|
||||||
|
this.setTabWra();
|
||||||
|
this.setTabFloor();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 設置 wrapper
|
||||||
|
setTabWra = function () {
|
||||||
|
let id = $(this.ele).prop("id");
|
||||||
|
this.eleId = id;
|
||||||
|
if ($(this.ele).parent(".elevator-table-wrapper").length != 0) {
|
||||||
|
$(this.ele).unwrap(".elevator-table-wrapper");
|
||||||
|
}
|
||||||
|
let wrapper = creDiv(["elevator-table-wrapper"], null, `${id}_wrapper`);
|
||||||
|
$(this.ele).wrap(wrapper);
|
||||||
|
this.eleWra = wrapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 設置 table 樓層
|
||||||
|
setTabFloor = function () {
|
||||||
|
let _w = this.floorWidth, _h = this.floorHeight;
|
||||||
|
let thead = creEle("thead"), tbody = creEle("tbody");
|
||||||
|
let _floors = this.floors, _ele = this.ele, _eleCnt = this.eleCnt;
|
||||||
|
//樓層從小到大
|
||||||
|
_floors = _floors.oSort("sort").reverse().map(x => x.name);
|
||||||
|
|
||||||
|
let theadTr = creEle("tr");
|
||||||
|
for (let e = 1; e <= _eleCnt + 2; e++) {
|
||||||
|
let th = creEle("th");
|
||||||
|
th.css({ "width": `${_w}px`, "height": `${_h}px` });
|
||||||
|
if (e != 1 && e != _eleCnt + 2) {
|
||||||
|
// 電梯方框
|
||||||
|
let span = creEle("span", null, "elevator-item-" + (e - 1), null, ["elevator-item"]);
|
||||||
|
span.css({ "width": `${_w - 3}px`, "height": `${_h - 3}px`, "top": `1.5px`})
|
||||||
|
th.append(span);
|
||||||
|
}
|
||||||
|
theadTr.append(th);
|
||||||
|
}
|
||||||
|
thead.css("position", "absolute");
|
||||||
|
thead.append(theadTr);
|
||||||
|
|
||||||
|
//樓層表格建置 tbody
|
||||||
|
for (let f = 1; f <= _floors.length; f++) {
|
||||||
|
let tr = creEle("tr");
|
||||||
|
for (let e = 1; e <= _eleCnt + 2; e++) {
|
||||||
|
let td = creEle("td");
|
||||||
|
td.css({ "width": `${_w}px`, "height": `${_h}px` });
|
||||||
|
if (e == 1) {
|
||||||
|
td.addClass("t-black")
|
||||||
|
td.text(_floors[f - 1]);
|
||||||
|
} else if (e == _eleCnt + 2) {
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let div = creDiv(["d-flex", "justify-content-center", "align-items-end", "h-100"]);
|
||||||
|
div.append(`<i class="fas fa-door-open fs-1-05"></i>`)
|
||||||
|
td.append(div)
|
||||||
|
}
|
||||||
|
tr.append(td);
|
||||||
|
}
|
||||||
|
tbody.append(tr);
|
||||||
|
}
|
||||||
|
|
||||||
|
$(_ele).append(thead);
|
||||||
|
$(_ele).append(tbody);
|
||||||
|
|
||||||
|
//表格外圍無框線
|
||||||
|
$(_ele).find("tbody tr").each((index, tr) => {
|
||||||
|
|
||||||
|
$(tr).find("td:eq(0)").css("border-left", "0");
|
||||||
|
$(tr).find("td:eq(-1)").css("border-right", "0");
|
||||||
|
|
||||||
|
if (index == 0) {
|
||||||
|
$(tr).find("td").each((index, td) => {
|
||||||
|
$(td).css("border-top", "0");
|
||||||
|
})
|
||||||
|
} else if (index == $("#floorTable tbody tr").length - 1) {
|
||||||
|
$(tr).find("td").each((index, td) => {
|
||||||
|
$(td).css("border-bottom", "0");
|
||||||
|
})
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -51,6 +51,19 @@ Array.prototype.DistinctBy = function (...otherCol) {
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
Array.prototype.nSort = function () {
|
||||||
|
function compareNumbers(a, b) {
|
||||||
|
return a - b;
|
||||||
|
}
|
||||||
|
return this.sort(compareNumbers);
|
||||||
|
}
|
||||||
|
|
||||||
|
Array.prototype.oSort = function (key) {
|
||||||
|
function compareNumbers(a, b) {
|
||||||
|
return a[key] - b[key];
|
||||||
|
}
|
||||||
|
return this.sort(compareNumbers);
|
||||||
|
}
|
||||||
BigInt.prototype.toJSON = function () { return this.toString() }
|
BigInt.prototype.toJSON = function () { return this.toString() }
|
||||||
|
|
||||||
$.fn.classList = function () { return this[0].className.split(/\s+/); };
|
$.fn.classList = function () { return this[0].className.split(/\s+/); };
|
||||||
|
@ -71,7 +71,7 @@ $.fn.YTTooltip = function (option) {
|
|||||||
obj.tooltipDiv = clone;
|
obj.tooltipDiv = clone;
|
||||||
//顯示 tooltip
|
//顯示 tooltip
|
||||||
$(clone).css({ "display": display, "position": "absolute" });
|
$(clone).css({ "display": display, "position": "absolute" });
|
||||||
obj.onShow ? obj.onShow(clone,obj.ele,obj) : "";
|
|
||||||
//tooltip 高寬
|
//tooltip 高寬
|
||||||
let toolWidth = $(clone)[0].offsetWidth;
|
let toolWidth = $(clone)[0].offsetWidth;
|
||||||
let toolHeight = $(clone)[0].offsetHeight;
|
let toolHeight = $(clone)[0].offsetHeight;
|
||||||
@ -95,7 +95,9 @@ $.fn.YTTooltip = function (option) {
|
|||||||
} else if (obj.direction == "top" || obj.direction == "bottom"){
|
} else if (obj.direction == "top" || obj.direction == "bottom"){
|
||||||
$(clone).css({ left: offset.left, top: top});
|
$(clone).css({ left: offset.left, top: top});
|
||||||
}
|
}
|
||||||
|
setTimeout(function () {
|
||||||
|
obj.onShow ? obj.onShow(clone, obj.ele, obj) : "";
|
||||||
|
}, 10)
|
||||||
event();
|
event();
|
||||||
} else {
|
} else {
|
||||||
obj.hideTooltipEvent(tooId);
|
obj.hideTooltipEvent(tooId);
|
||||||
|
Loading…
Reference in New Issue
Block a user