Files
Cloud-CMS/views/dashboard-status-page.twig

952 lines
43 KiB
Twig
Raw Permalink Normal View History

2025-12-02 10:32:59 -05:00
{#
/**
* Copyright (C) 2021 Xibo Signage Ltd
*
* Xibo - Digital Signage - http://www.xibo.org.uk
*
* This file is part of Xibo.
*
* Xibo is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* Xibo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Xibo. If not, see <http://www.gnu.org/licenses/>.
*/
#}
{% extends "authed.twig" %}
{% import "inline.twig" as inline %}
{% block pageContent %}
{% include "theme-dashboard-message.twig" ignore missing %}
<div class="row">
<div class="col-xl-3 col-md-6 col-12">
<div class="widget">
<div class="widget-body p-3 p-xl-2">
<div class="widget-icon orange pull-left">
<i class="fa fa-desktop"></i>
</div>
<div class="widget-content pull-left">
<div class="title displays-count">0</div>
<div class="comment displays-comment" data-title="{% trans "Display" %}" data-title-plural="{% trans "Displays" %}"></div>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 col-12">
<div class="widget">
<div class="widget-body p-3 p-xl-2">
<div class="widget-icon red pull-left">
<i class="fa fa-tasks"></i>
</div>
<div class="widget-content pull-left">
<div class="title">{{ librarySize }}</div>
<div class="comment">{% trans "Library Size" %}</div>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 col-12">
<div class="widget">
<div class="widget-body p-3 p-xl-2">
<div class="widget-icon green pull-left">
<i class="fa fa-users"></i>
</div>
<div class="widget-content pull-left">
<div class="title">{{ countUsers }}</div>
<div class="comment">{% if countUsers == 1 %}{% trans "User" %}{% else %}{% trans "Users" %}{% endif %}</div>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
<div class="col-xl-3 col-md-6 col-12">
<div class="widget">
<div class="widget-body p-3 p-xl-2">
<div class="widget-icon blue pull-left">
<i class="fa fa-cogs"></i>
</div>
<div class="widget-content pull-left">
{% if embeddedWidget != "" %}
{{ embeddedWidget|raw }}
{% else %}
<div class="title">{{ nowShowing }}</div>
<div class="comment">{% trans "Now Showing" %}</div>
{% endif %}
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6">
<div class="widget">
<div class="widget-title">
<i class="fa fa-cloud-download"></i>
{% if xmdsLimit != "" %}
{% trans %}Bandwidth Usage. Limit {{ xmdsLimit }}{% endtrans %}
{% else %}
{% trans %}Bandwidth Usage ({{ bandwidthSuffix }}){% endtrans %}
{% endif %}
{% if currentUser.featureEnabled("displays.reporting") %}
<a class="pull-right" href="/report/form/bandwidth">{% trans "More Statistics" %}</a>
{% endif %}
<div class="clearfix"></div>
</div>
<div class="widget-body medium no-padding">
<canvas id="bandwidthChart" style="clear:both;" height="230"></canvas>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="widget">
<div class="widget-title">
<i class="fa fa-tasks"></i>
{% if libraryLimitSet != "" %}
{% trans %}Library Usage. Limit {{ libraryLimit }}{% endtrans %}
{% else %}
{% trans "Library Usage" %}
{% endif %}
<div class="clearfix"></div>
</div>
<div class="widget-body medium no-padding">
<canvas id="libraryChart" style="clear:both;" width="350" height="220"></canvas>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6">
<div class="widget">
<div class="widget-title">
<i class="fa fa-desktop"></i>
{% trans "Display Activity" %}
<div class="clearfix"></div>
</div>
<div class="widget-body medium no-padding">
<div class="table-responsive">
<table id="displays" class="table">
<thead>
<tr>
<th>{% trans "Display" %}</th>
<th>{% trans "Logged In" %}</th>
<th>{% trans "Authorised" %}</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="widget news-widget">
<div class="widget-title">
<i class="fa fa-book"></i>
{% trans "Latest News" %}
<div class="clearfix"></div>
</div>
<div class="widget-body medium">
{% if latestNews|length > 0 %}
{% for news in latestNews %}
<div class="article">
<h4 class="article_title">{{ news.title }} <small class="article_date">{{ news.date }}</small></h4>
<p>{{ news.description|raw }} {% if news.link %}<a href="{{ news.link }}" title="Read" target="_blank">{% trans "Full Article" %}</a>.{% endif %}</p>
</div>
{% endfor %}
{% endif %}
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6">
<div class="widget">
<div class="widget-title">
<i class="fa fa-desktop"></i>
{% trans "Display Status" %}
<div class="clearfix"></div>
</div>
<div class="widget-body medium no-padding" style="overflow: hidden;">
<div style="text-align: center; height: 10px; margin-bottom: 5px"><span>{% trans "Click on the chart for a breakdown" %}</span></div>
<div style="position: relative; height: 235px">
<canvas id="displayStatusChart" style="clear:both;"></canvas>
</div>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="widget">
<div class="widget-title">
<i class="fa fa-cloud-download"></i>
{% trans "Display Content Status" %}
<div class="clearfix"></div>
</div>
<div class="widget-body medium no-padding" style="overflow: hidden;">
<div style="text-align: center; height: 10px; margin-bottom: 5px"><span>{% trans "Click on the chart for a breakdown" %}</span></div>
<div style="position: relative; height: 235px">
<canvas id="displayContentChart" style="clear:both;"></canvas>
</div>
</div>
</div>
</div>
</div>
<div class="row d-none" id="displayGroupStatusChartRow">
<div class="col-lg-6">
<div class="widget">
<div class="widget-title">
<i class="fa fa-desktop"></i>
<span id="dGStatusTitle">{% trans "Display Groups Status" %}</span>
<div class="clearfix"></div>
</div>
<div class="widget-body medium no-padding" style="overflow: hidden;">
<div style="text-align: center; height: 10px; margin-bottom: 5px"><span>{% trans "Click on the chart to view Display information" %}</span></div>
<div style="position: relative; height: 235px;">
<canvas id="displayGroupStatusChart" style="clear:both;"></canvas>
</div>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="widget">
<div class="widget-title">
<i class="fa fa-desktop"></i>
<span id="dGContentTitle"> {% trans "Display Groups Content Status" %}</span>
<div class="clearfix"></div>
</div>
<div class="widget-body medium no-padding" style="overflow: hidden;">
<div style="text-align: center; height: 10px; margin-bottom: 5px"><span>{% trans "Click on the chart to view Display information" %}</span></div>
<div style="position: relative; height: 235px">
<canvas id="displayGroupContentStatusChart" style="clear:both;"></canvas>
</div>
</div>
</div>
</div>
</div>
<div class="widget d-none" id="displaysGridTable">
<div class="widget-title">{% trans "Displays" %}
{% if currentUser.featureEnabled("displays.view") %}
<a class="pull-right" href="{{ url_for('display.view') }}">{% trans "Displays Page" %}</a>
{% endif %}
</div>
<div class="widget-body">
<div class="XiboGrid" id="{{ random() }}" data-grid-name="displayGridView">
<div class="XiboFilter card mb-3 bg-light d-none">
<div class="FilterDiv card-body" id="Filter">
<form class="form-inline d-block">
<div class="tab-content">
<div class="tab-pane active" id="filter-general">
{{ inline.hidden("displayGroupId") }}
{{ inline.hidden("mediaInventoryStatus") }}
{{ inline.hidden("loggedIn") }}
</div>
</div>
</form>
</div>
</div>
<div class="XiboData card pt-3">
<table id="displaysGrid" class="table table-striped" data-state-preference-name="statusDashboardDisplays" style="width: 100%;">
<thead>
<tr>
<th>{% trans "ID" %}</th>
<th>{% trans "Display" %}</th>
<th>{% trans "Status" %}</th>
<th>{% trans "Authorised?" %}</th>
<th>{% trans "Current Layout" %}</th>
<th>{% trans "Storage Available" %}</th>
<th>{% trans "Storage Total" %}</th>
<th>{% trans "Storage Free %" %}</th>
<th>{% trans "Description" %}</th><th>{% trans "Orientation" %}</th>
<th>{% trans "Resolution" %}</th>
{% if currentUser.featureEnabled("tag.tagging") %}<th>{% trans "Tags" %}</th>{% endif %}
<th>{% trans "Default Layout" %}</th>
<th>{% trans "Interleave Default" %}</th>
<th>{% trans "Email Alert" %}</th>
<th>{% trans "Logged In" %}</th>
<th>{% trans "Last Accessed" %}</th>
<th>{% trans "Display Profile" %}</th>
<th>{% trans "Version" %}</th>
<th>{% trans "Device Name" %}</th>
<th>{% trans "IP Address" %}</th>
<th>{% trans "Mac Address" %}</th>
<th>{% trans "Timezone" %}</th>
<th>{% trans "Latitude" %}</th>
<th>{% trans "Longitude" %}</th>
<th>{% trans "Screen shot?" %}</th>
<th>{% trans "Thumbnail" %}</th>
<th>{% trans "CMS Transfer?" %}</th>
<th>{% trans "Bandwidth Limit" %}</th>
<th>{% trans "Last Command" %}</th>
<th>{% trans "XMR Registered" %}</th>
<th>{% trans "Commercial Licence" %}</th>
<th>{% trans "Remote" %}</th>
<th>{% trans "Created Date" %}</th>
<th>{% trans "Modified Date" %}</th>
<th>{% trans "Faults?" %}</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
{% endblock %}
{% block javaScript %}
<script type="text/javascript" nonce="{{ cspNonce }}">
const stringToColour = function(str) {
let hash = 0;
str.split('').forEach(char => {
hash = char.charCodeAt(0) + ((hash << 5) - hash);
});
let colour = '#';
for (let i = 0; i < 3; i++) {
const value = (hash >> (i * 8)) & 0xff
colour += value.toString(16).padStart(2, '0');
}
return colour;
}
var displayGroupStatusChart = null;
var displayGroupContentStatusChart = null;
var displayGroupId = null;
var loggedInStatus = null;
var mediaInventoryStatus = null;
var displayGroupIdsContent = [];
var displayGroupIdsStatus = [];
var displayGridTable = null
// Create our chart
var bandwidthChart = new Chart($("#bandwidthChart"), {
type: "bar",
data: {{ bandwidthWidget|raw }},
options: {
scales: {
xAxes: [{
stacked: {% if xmdsLimit %}true{% else %}false{% endif %}
}],
yAxes: [{
scaleLabel: {
display: true,
labelString: "{{ bandwidthSuffix }}",
},
stacked: {% if xmdsLimit %}true{% else %}false{% endif %}
}]
},
legend: {
display: false
},
maintainAspectRatio: false,
}
});
var libraryData = {{ libraryWidgetData|raw }};
const libraryLabels = {{ libraryWidgetLabels|raw }};
var colours = new Array();
for (var i = 0; i < libraryData.length; i++) {
colours.push(stringToColour(libraryLabels[i]));
}
var libraryChart = new Chart($("#libraryChart"), {
type: 'pie',
data: {
datasets: [{
data: libraryData,
backgroundColor: colours
}],
labels: {{ libraryWidgetLabels|raw }}
},
options: {
maintainAspectRatio: false
}
});
$('.article_date').each(function(index, element) {
// Replace the ISO date with a nice formatted date "for humans"
const date = $(element).html();
if (date) {
$(element).html(moment(date, systemDateFormat).fromNow());
}
});
var table = $("#displays").DataTable({
"language": dataTablesLanguage,
serverSide: true,
stateSave: true,
responsive: true,
stateDuration: 0,
stateLoadCallback: dataTableStateLoadCallback,
stateSaveCallback: dataTableStateSaveCallback,
filter: false,
searchDelay: 3000,
order: [[0, "asc"]],
ajax: {
"url": "{{ url_for("statusdashboard.displays") }}",
"data": function (dataToSend) {
//make a new object so as not to destroy the input.
var data = {};
data.draw = dataToSend.draw;
data.length = dataToSend.length;
data.start = dataToSend.start;
data.order = dataToSend.order;
data.columns = [];
$.each(dataToSend.columns, function (index, e) {
var col = {};
col.data = e.data;
if (e.name != null && e.name !== "")
col.name = e.name;
data.columns.push(col);
});
$.extend(data, $("#displays").closest(".XiboGrid").find(".FilterDiv form").serializeObject());
return data;
}
},
createdRow: function (row, data, index) {
if (data.mediaInventoryStatus === 1) {
$(row).addClass('table-success');
} else if (data.mediaInventoryStatus === 1) {
$(row).addClass('table-danger');
} else {
$(row).addClass('table-warning');
}
},
lengthChange: false,
"columns": [
{"data": "display"},
{"data": "loggedIn", "render": dataTableTickCrossColumn},
{"data": "licensed", "render": dataTableTickCrossColumn}
]
});
table.on('processing.dt', dataTableProcessing);
table.on('draw', function(e, settings) {
var $displaysComment = $(".displays-comment");
var total = table.page.info().recordsTotal;
$(".displays-count").html(total);
$displaysComment.html((total > 0) ? $displaysComment.data().titlePlural : $displaysComment.data().title)
});
var displayData {% if displayStatus|raw %}= {{ displayStatus|raw }}{% endif %};
var displayStatusChart = new Chart($("#displayStatusChart"), {
type: 'doughnut',
data: {
datasets: [{
data: displayData,
backgroundColor: ["rgb(0,255,0)", "rgb(255,0,0)"]
}],
labels: [translations.online, translations.offline]
},
options: {
maintainAspectRatio: false
}
});
var displayMediaStatusData {% if displayMediaStatus|raw %}= {{ displayMediaStatus|raw }}{% endif %};
var displayContentChart = new Chart($("#displayContentChart"), {
type: 'doughnut',
data: {
datasets: [{
data: displayMediaStatusData,
backgroundColor: ["rgb(0,255,0)", "rgb(255,0,0)"]
}],
labels: [translations.upToDate, translations.notUpToDate]
},
options: {
maintainAspectRatio: false
}
});
$("#displayStatusChart").click(function(evt){
var activePoints = displayStatusChart.getElementsAtEvent(evt);
if (activePoints[0]) {
var chartData = activePoints[0]['_chart'].config.data;
var index = activePoints[0]['_index'];
var label = chartData.labels[index];
if (label == translations.online) {
loggedInStatus = 1;
$('#dGStatusTitle').css('color', 'rgb(0,255,0)')
} else {
loggedInStatus = 0;
$('#dGStatusTitle').css('color', 'rgb(255,0,0)')
}
if (displayGroupStatusChart !== undefined && displayGroupStatusChart !== null) {
displayGroupStatusChart.destroy();
}
$.ajax({
type: "get",
url: "{{ url_for("statusdashboard.displayGroups") }}",
data: {
status: label
},
success: function (result) {
if (result.success === true) {
var displayGroupNames = JSON.parse(result.data.displayGroupNames);
var displaysAssigned = JSON.parse(result.data.displayGroupMembers);
displayGroupIdsStatus = JSON.parse(result.data.displayGroupIds);
var coloursDG = [];
for(var i = 0; i < displayGroupNames.length; i++) {
coloursDG.push($c.rand());
}
displayGroupStatusChart = new Chart($("#displayGroupStatusChart"), {
type: 'doughnut',
data: {
datasets: [{
data: displaysAssigned,
backgroundColor: coloursDG
}],
labels: displayGroupNames
},
options: {
maintainAspectRatio: false,
}
});
$("#displayGroupStatusChartRow").removeClass('d-none');
}
}
});
}
}
);
$("#displayContentChart").click(function(evt){
var activePoints = displayContentChart.getElementsAtEvent(evt);
if (activePoints[0]) {
var chartData = activePoints[0]['_chart'].config.data;
var index = activePoints[0]['_index'];
var label = chartData.labels[index];
if (label == translations.upToDate) {
mediaInventoryStatus = 1;
$('#dGContentTitle').css('color', 'rgb(0,255,0)')
} else {
mediaInventoryStatus = -1;
$('#dGContentTitle').css('color', 'rgb(255,0,0)')
}
if (displayGroupContentStatusChart !== undefined && displayGroupContentStatusChart !== null) {
displayGroupContentStatusChart.destroy();
}
$.ajax({
type: "get",
url: "{{ url_for("statusdashboard.displayGroups") }}",
data: {
inventoryStatus: label
},
success: function (result) {
if (result.success === true) {
var displayGroupNames = JSON.parse(result.data.displayGroupNames);
var displaysAssigned = JSON.parse(result.data.displayGroupMembers);
displayGroupIdsContent = JSON.parse(result.data.displayGroupIds);
var coloursDG = [];
for(var i = 0; i < displayGroupNames.length; i++) {
coloursDG.push($c.rand());
}
displayGroupContentStatusChart = new Chart($("#displayGroupContentStatusChart"), {
type: 'doughnut',
data: {
datasets: [{
data: displaysAssigned,
backgroundColor: coloursDG
}],
labels: displayGroupNames
},
options: {
maintainAspectRatio: false
}
});
$("#displayGroupStatusChartRow").removeClass('d-none');
}
}
});
}
}
);
$("#displayGroupStatusChart").click(function(evt) {
var activePoints = displayGroupStatusChart.getElementsAtEvent(evt);
$('#displayGroupId').val("");
$('#mediaInventoryStatus').val("");
$('#loggedIn').val("");
if (activePoints[0]) {
var chartData = activePoints[0]['_chart'].config.data;
var index = activePoints[0]['_index'];
displayGroupId = displayGroupIdsStatus[index];
$('#displayGroupId').val(displayGroupId);
$('#loggedIn').val(loggedInStatus);
handleDisplaysGrid();
$("#displaysGridTable").removeClass('d-none');
}
}
);
$("#displayGroupContentStatusChart").click(function(evt){
var activePoints = displayGroupContentStatusChart.getElementsAtEvent(evt);
if (activePoints[0]) {
$('#displayGroupId').val("");
$('#mediaInventoryStatus').val("");
$('#loggedIn').val("");
var chartData = activePoints[0]['_chart'].config.data;
var index = activePoints[0]['_index'];
displayGroupId = displayGroupIdsContent[index];
$('#displayGroupId').val(displayGroupId);
$('#mediaInventoryStatus').val(mediaInventoryStatus);
handleDisplaysGrid();
$("#displaysGridTable").removeClass('d-none');
}
}
);
function handleDisplaysGrid() {
if (displayGridTable != null) {
displayGridTable.ajax.reload();
} else {
displayGridTable = $("#displaysGrid").DataTable({
"language": dataTablesLanguage,
dom: dataTablesTemplate,
serverSide: true,
stateSave: true,
stateDuration: 0,
stateLoadCallback: dataTableStateLoadCallback,
stateSaveCallback: dataTableStateSaveCallback,
filter: false,
searchDelay: 3000,
responsive: true,
order: [[1, "asc"]],
ajax: {
"url": "{{ url_for("display.search") }}",
"data": function (dataToSend) {
//make a new object so as not to destroy the input.
var data = {};
data.draw = dataToSend.draw;
data.length = dataToSend.length;
data.start = dataToSend.start;
data.order = dataToSend.order;
data.columns = [];
$.each(dataToSend.columns, function (index, e) {
var col = {};
col.data = e.data;
if (e.name != null && e.name != "")
col.name = e.name;
data.columns.push(col);
});
$.extend(data, $("#displaysGrid").closest(".XiboGrid").find(".FilterDiv form").serializeObject());
return data;
}
},
createdRow: function (row, data, index) {
if (data.mediaInventoryStatus === 1) {
$(row).addClass('table-success');
} else if (data.mediaInventoryStatus === 1) {
$(row).addClass('table-danger');
} else {
$(row).addClass('table-warning');
}
},
"columns": [
{"data": "displayId", responsivePriority: 2},
{"data": "display", responsivePriority: 2},
{
"data": "mediaInventoryStatus",
responsivePriority: 2,
"render": function (data, type, row) {
if (type != "display")
return data;
var icon = "";
if (data == 1)
icon = "fa-check";
else if (data == 2)
icon = "fa-times";
else
icon = "fa-cloud-download";
return '<span class="fa ' + icon + '" title="' + (row.statusDescription) + '"></span>';
}
},
{"data": "licensed", "render": dataTableTickCrossColumn, responsivePriority: 3},
{"data": "currentLayout", "visible": false, "sortable": false, responsivePriority: 5},
{
"data": "storageAvailableSpace",
responsivePriority: 5,
"visible": false,
"render": function (data, type, row) {
if (type != "display")
return data;
return row.storageAvailableSpaceFormatted;
}
},
{
"data": "storageTotalSpace",
responsivePriority: 5,
"visible": false,
"render": function (data, type, row) {
if (type != "display")
return data;
return row.storageTotalSpaceFormatted;
}
},
{"data": "storagePercentage", "visible": false, "sortable": false, responsivePriority: 5},
{"data": "description", "visible": false, responsivePriority: 4},
{"data": "orientation", "visible": false, responsivePriority: 6},
{"data": "resolution", "visible": false, responsivePriority: 6},
{% if currentUser.featureEnabled("tag.tagging") %}
{
"name": "tags",
responsivePriority: 3,
"sortable": false,
"visible": false,
"data": dataTableCreateTags
},
{% endif %}
{"data": "defaultLayout", "visible": false, responsivePriority: 4},
{"data": "incSchedule", "render": dataTableTickCrossColumn, "visible": false, responsivePriority: 5},
{"data": "emailAlert", "render": dataTableTickCrossColumn, "visible": false, responsivePriority: 5},
{"data": "loggedIn", "render": dataTableTickCrossColumn, responsivePriority: 3},
{"data": "lastAccessed", "render": dataTableDateFromUnix, responsivePriority: 4},
{
"name": "displayProfileId",
responsivePriority: 5,
"data": function (data, type) {
return data.displayProfile;
},
"visible": false
},
{
"name": "clientSort",
responsivePriority: 4,
"data": function (data) {
if (data.clientType === 'lg') {
data.clientType = 'webOS'
}
return data.clientType + ' ' + data.clientVersion + '-' + data.clientCode;
},
"visible": false
},
{"data": "deviceName", "visible": false, responsivePriority: 5},
{"data": "clientAddress", "visible": false, responsivePriority: 6},
{"data": "macAddress", responsivePriority: 5},
{"data": "timeZone", "visible": false, responsivePriority: 5},
{"data": "latitude", "visible": false, responsivePriority: 6},
{"data": "longitude", "visible": false, responsivePriority: 6},
{"data": "screenShotRequested", "render": dataTableTickCrossColumn, "visible": false, "name": "screenShotRequested", responsivePriority: 7},
{
"name": "thumbnail",
responsivePriority: 4,
"orderable": false,
"data": function (data, type) {
if (type != "display")
return data.thumbnail;
if (data.thumbnail != "") {
return '<a class="display-screenshot-container" data-toggle="lightbox" data-type="image" href="' + data.thumbnail + '"><img class="display-screenshot" src="' + data.thumbnail + '" data-display-id="'+ data.displayId +'" data-type="'+ data.clientType +'" /></a>';
}
else {
return "";
}
},
"visible": false
},
{
"data": "isCmsTransferInProgress",
"render": dataTableTickCrossColumn,
"visible": false,
"name": "isCmsTransferInProgress"
},
{
"name": "bandwidthLimit",
responsivePriority: 5,
"data": null,
"render": {"_": "bandwidthLimit", "display": "bandwidthLimitFormatted", "sort": "bandwidthLimit"},
"visible": false
},
{
"data": "lastCommandSuccess",
responsivePriority: 6,
"render": function (data, type, row) {
if (type != "display")
return data;
var icon = "";
if (data == 1)
icon = "fa-check";
else if (data == 0)
icon = "fa-times";
else
icon = "fa-question";
return "<span class='fa " + icon + "'></span>";
},
"visible": false
},
{
"data": "xmrChannel",
responsivePriority: 6,
"render": function (data, type, row) {
if (type === "export") {
return (data !== null && data !== "") ? 1 : 0;
}
if (type != "display")
return data;
var icon = "";
if (data != null && data != "")
icon = "fa-check";
else
icon = "fa-times";
return "<span class='fa " + icon + "'></span>";
},
"visible": false
},
{
"data": "commercialLicence",
"name": "commercialLicence",
responsivePriority: 5,
"render": function (data, type, row) {
if (type != "display")
return data;
var icon = "";
if (data == 3) {
return "N/A";
} else {
if (data == 1) {
icon = "fa-check";
} else if (data == 0) {
icon = "fa-times";
} else if (data == 2) {
icon = "fa-clock-o";
}
return '<span class="fa ' + icon + '" title="' + (row.commercialLicenceDescription) + '"></span>';
}
},
"visible": false
},
{
"name": "remote",
"data": null,
responsivePriority: 4,
"render": function (data, type, row) {
if (type === "display") {
var html = "<div class='remote-icons'>";
if ("{{ settings.SHOW_DISPLAY_AS_VNCLINK }}" !== "" && row.clientAddress != null && row.clientAddress !== "") {
var link = "{{ settings.SHOW_DISPLAY_AS_VNCLINK }}".replace('%s', row.clientAddress);
html += '<a href="' + link + '" title="{{ "VNC to this Display"|trans }}" target="{{ settings.SHOW_DISPLAY_AS_VNC_TGT }}">'
+ '<i class="fa fa-eye"></i></a>';
}
if (row.teamViewerLink !== "") {
html += '<a href="' + row.teamViewerLink + '" title="{{ "TeamViewer to this Display"|trans }}" target="_blank">'
+ '<img src="{{ theme.rootUri() }}theme/default/img/remote_icons/teamviewer.png" alt="TeamViewer Icon"></a>';
}
if (row.webkeyLink !== "") {
html += '<a href="' + row.webkeyLink + '" title="{{ "Webkey to this Display"|trans }}" target="_blank">'
+ '<img src="{{ theme.rootUri() }}theme/default/img/remote_icons/webkey.png" alt="Webkey Icon"></a>';
}
return html + "</div>";
} else if (type === "export") {
if (row.teamViewerLink !== "") {
return "TeamViewer: " + row.teamViewerLink;
}
if (row.webkeyLink !== "") {
return "Webkey: " + row.webkeyLink;
}
if (row.teamViewerLink === "" && row.webkeyLink === "") {
return "";
}
} else {
return "";
}
},
"visible": true,
"orderable": false
},
{"data": "createdDt", "visible": false, responsivePriority: 6},
{"data": "modifiedDt", "visible": false, responsivePriority: 6},
{
"data": "countFaults",
"name": "countFaults",
responsivePriority: 3,
"render": function (data, type, row) {
if (type != "display") {
return data;
}
if (data > 0) {
return '<span class="badge" style="background-color: red; color: white">'+(row.countFaults)+'</span>';
} else {
return '';
}
}
},
]
});
displayGridTable.on('draw', dataTableDraw);
displayGridTable.on('draw', { form: $("#displaysGrid").closest(".XiboGrid").find(".FilterDiv form") }, dataTableCreateTagEvents);
displayGridTable.on('processing.dt', dataTableProcessing);
dataTableAddButtons(displayGridTable, $('#displaysGrid_wrapper').find('.dataTables_buttons'))}
}
</script>
{% endblock %}