0byt3m1n1
Path:
/
home
/
mgatv524
/
public_html
/
mctv
/
views
/
[
Home
]
File: display-page.twig
{# /** * Copyright (C) 2020 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 title %}{{ "Displays"|trans }} | {% endblock %} {% block actionMenu %} <div class="widget-action-menu pull-right"> {% if currentUser.featureEnabled("displays.add") %} <button class="btn btn-success XiboFormButton" title="{% trans "Add a Display via user_code displayed on the Player screen" %}" href="{{ url_for("display.addViaCode.form") }}"> <i class="fa fa-plus-circle" aria-hidden="true"></i> {% trans "Add Display (Code)" %}</button> {% endif %} <button class="btn btn-primary" id="refreshGrid" title="{% trans "Refresh the Table" %}" href="#"><i class="fa fa-refresh" aria-hidden="true"></i> {% trans "Refresh" %}</button> </div> {% endblock %} {% block pageContent %} <div class="widget"> <div class="widget-title">{% trans "Displays" %}</div> <div class="widget-body"> <div class="XiboGrid" id="{{ random() }}" data-grid-name="displayView"> <div class="XiboFilter card mb-3 bg-light"> <div class="FilterDiv card-body" id="Filter"> <ul class="nav nav-tabs" role="tablist"> <li class="nav-item"><a class="nav-link active" href="#filter-general" role="tab" data-toggle="tab">{% trans "General" %}</a></li> <li class="nav-item"><a class="nav-link" href="#filter-advanced" role="tab" data-toggle="tab">{% trans "Advanced" %}</a></li> </ul> <form class="form-inline"> <div class="tab-content"> <div class="tab-pane active" id="filter-general"> {% set title %}{% trans "ID" %}{% endset %} {{ inline.number("displayId", title) }} <div class="form-group mr-1 mb-1"> <label class="control-label mr-1" title="" for="display" accesskey="">{% trans "Name" %}</label> <div> <div class="input-group"> <input class="form-control" name="display" type="text" id="display" value=""> <div class="input-group-append input-group-addon"> <div class="input-group-text"> <input title="{% trans "Use Regex?" %}" type="checkbox" id="useRegexForName" name="useRegexForName"> </div> </div> </div> </div> </div> {% set title %}{% trans "Status" %}{% endset %} {% set check %}{% trans "Up to date" %}{% endset %} {% set cloud %}{% trans "Out of date" %}{% endset %} {% set cross %}{% trans "Downloading" %}{% endset %} {% set options = [ { optionid: "", option: "" }, { optionid: "1", option: check}, { optionid: "3", option: cloud}, { optionid: "2", option: cross} ] %} {{ inline.dropdown("mediaInventoryStatus", "single", title, "", options, "optionid", "option") }} {% set title %}{% trans "Logged In?" %}{% endset %} {% set yesOption %}{% trans "Yes" %}{% endset %} {% set noOption %}{% trans "No" %}{% endset %} {% set options = [ { optionid: "", option: "" }, { optionid: "1", option: yesOption}, { optionid: "0", option: noOption} ] %} {{ inline.dropdown("loggedIn", "single", title, "", options, "optionid", "option") }} {% set title %}{% trans "Authorised?" %}{% endset %} {% set yesOption %}{% trans "Yes" %}{% endset %} {% set noOption %}{% trans "No" %}{% endset %} {% set options = [ { optionid: "", option: "" }, { optionid: "1", option: yesOption }, { optionid: "0", option: noOption}, ] %} {{ inline.dropdown("authorised", "single", title, "", options, "optionid", "option") }} {% if currentUser.featureEnabled("tag.tagging") %} {% set title %}{% trans "Tags" %}{% endset %} {% set exactTagTitle %}{% trans "Exact match?" %}{% endset %} {% set helpText %}{% trans "A comma separated list of tags to filter by. Enter a Tag value preceded with | to filter by Tag values. Enter --no-tag to see items without tags." %}{% endset %} {{ inline.inputWithTags("tags", title, null, helpText, null, null, null, "exactTags", exactTagTitle) }} {% endif %} {% if currentUser.featureEnabled("displaygroup.view") %} {% set title %}{% trans "Display Group" %}{% endset %} {{ inline.dropdown("displayGroupId", "single", title, "", [{displayGroupId:null, displayGroup:""}]|merge(displayGroups), "displayGroupId", "displayGroup") }} {% endif %} {% if currentUser.featureEnabled("displayprofile.view") %} {% set title %}{% trans "Display Profile" %}{% endset %} {{ inline.dropdown("displayProfileId", "single", title, "", [{displayProfileId:null, name:""}]|merge(displayProfiles), "displayProfileId", "name") }} {% endif %} {{ inline.hidden("folderId") }} </div> <div class="tab-pane" id="filter-advanced"> {% set title %}{% trans "Last Accessed" %}{% endset %} {{ inline.date("lastAccessed", title) }} {% set title %}{% trans "Player Type" %}{% endset %} {% set android %}{% trans "Android" %}{% endset %} {% set windows %}{% trans "Windows" %}{% endset %} {% set webos %}{% trans "webOS" %}{% endset %} {% set sssp %}{% trans "Tizen" %}{% endset %} {% set linux %}{% trans "Linux" %}{% endset %} {% set options = [ { optionid: "", option: "" }, { optionid: "android", option: android}, { optionid: "windows", option: windows}, { optionid: "lg", option: webos}, { optionid: "sssp", option: sssp}, { optionid: "linux", option: linux}, ] %} {{ inline.dropdown("clientType", "single", title, "", options, "optionid", "option") }} {% set title %}{% trans "Player Code" %}{% endset %} {{ inline.input("clientCode", title) }} {% set title %}{% trans "Mac Address" %}{% endset %} {{ inline.input("macAddress", title) }} {% set title %}{% trans "IP Address" %}{% endset %} {{ inline.input("clientAddress", title) }} {% set title %}{% trans "Orientation" %}{% endset %} {% set landscape %}{% trans "Landscape" %}{% endset %} {% set portrait %}{% trans "Portrait" %}{% endset %} {% set options = [ { optionid: "", option: "" }, { optionid: "landscape", option: landscape}, { optionid: "portrait", option: portrait} ] %} {{ inline.dropdown("orientation", "single", title, "", options, "optionid", "option") }} {% set title %}{% trans "Commercial Licence" %}{% endset %} {% set licensed %}{% trans "Licensed fully" %}{% endset %} {% set trial %}{% trans "Trial" %}{% endset %} {% set notLinceced %}{% trans "Not licenced" %}{% endset %} {% set notApplicable %}{% trans "Not applicable" %}{% endset %} {% set options = [ { optionid: "", option: "" }, { optionid: "1", option: licensed}, { optionid: "2", option: trial}, { optionid: "0", option: notLinceced}, { optionid: "3", option: notApplicable} ] %} {{ inline.dropdown("commercialLicence", "single", title, "", options, "optionid", "option") }} </div> </div> </form> </div> </div> <div class="row"> <div class="col-sm-2 p-3 bg-light" id="grid-folder-filter"> <div class="form-check"> <input type="checkbox" class="form-check-input" id="folder-tree-clear-selection-button"> <label class="form-check-label" for="folder-tree-clear-selection-button" title="{{ "Search in all folders"|trans }}">{{ "All Folders"|trans }}</label> </div> <div id="container-folder-tree"></div> </div> <div class="folder-controller d-none"> <button type="button" id="folder-tree-select-folder-button" class="btn btn-outline-secondary" title="{{ "Open / Close Folder Search options"|trans }}"><i class="fas fa-folder fa-1x"></i></button> <div id="breadcrumbs" class="mt-2 pl-2"></div> </div> <div id="datatable-container" class="card col-sm-10 pt-4 px-2"> <div class="XiboData"> <table id="displays" class="table table-striped" data-content-type="display" data-content-id-name="displayId" data-state-preference-name="displayGrid" 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 class="rowMenu"></th> </tr> </thead> <tbody> </tbody> </table> </div> </div> </div> </div> </div> </div> {% endblock %} {% block javaScript %} <script type="text/javascript"> {% if not currentUser.featureEnabled("folder.view") %} disableFolders(); {% endif %} $(document).ready(function() { var table = $("#displays").DataTable({ "language": dataTablesLanguage, dom: dataTablesTemplate, serverSide: true, stateSave: true, stateDuration: 0, responsive: true, stateLoadCallback: dataTableStateLoadCallback, stateSaveCallback: dataTableStateSaveCallback, filter: false, searchDelay: 3000, 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, $("#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'); } }, "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}, { "orderable": false, responsivePriority: 1, "data": dataTableButtonsColumn } ] }); table.on('draw', dataTableDraw); table.on('draw', { form: $("#displays").closest(".XiboGrid").find(".FilterDiv form") }, dataTableCreateTagEvents); table.on('processing.dt', dataTableProcessing); dataTableAddButtons(table, $('#displays_wrapper').find('.dataTables_buttons')); $("#refreshGrid").click(function () { table.ajax.reload(); }); }); {% set showThumbnailColumn = currentUser.getOptionValue("showThumbnailColumn", 1) %} function displayRequestScreenshotFormSubmit() { $("#displayRequestScreenshotForm").submit(); XiboDialogClose(); {% if showThumbnailColumn == 1 %} var table = $('#displays').DataTable(); if (!table.column(["thumbnail:name"]).visible()) { table.columns(["screenShotRequested:name", "thumbnail:name"]).visible(true); } {% endif %} } function setDefaultMultiSelectFormOpen(dialog) { console.log('Multi-select form opened for default layout'); // Inject a list of layouts into the form, in a drop down. var $select = $('<select name="layoutId" class="form-control" data-search-url="{{ url_for("layout.search") }}" data-search-term="layout" data-search-term-tags="tags" data-id-property="layoutId" data-text-property="layout">'); $select.on('change', function() { console.log('Setting commit data to ' + $(this).val()); dialog.data().commitData = {layoutId: $(this).val()}; }); // Add the list to the body. $(dialog).find('.modal-body').append($select); makePagedSelect($select, dialog); } function displayFormLicenceCheckSubmit(form) { // Display commercial licence table column $('table#displays').DataTable().column('commercialLicence:name').visible(true); // Submit form form.submit(); } function setMoveCmsMultiSelectFormOpen(dialog) { console.log('Multi-select form opened for move CMS'); var $message = $( '<div class="col-sm-12 alert alert-info">' + "<p>{{ 'Please note: Once the CMS Address and Key are authenticated in this form the Display will attempt to register with the CMS Instance details entered. Once transferred the Display will stop communicating with this CMS Instance.'|trans }}</p>" + '</div>' ); $(dialog).find('.modal-body').append($message); var $cmsAddress = $( '<div class="form-group row">' + '<label class="col-sm-2 control-label" for="newCmsAddress" accesskey="">New CMS Address</label>' + '<div class="col-sm-10">' + '<input class="form-control" name="newCmsAddress" type="text" id="newCmsAddress" value="">' + '<span class="help-block">{{ "Full URL to the new CMS, including https:// "|trans }}</span>' + '</div>' + '</div>' ); var $cmsKey = $( '<div class="form-group row">' + '<label class="col-sm-2 control-label" for="newCmsKey" accesskey="">New CMS Key</label>' + '<div class="col-sm-10">' + '<input class="form-control" name="newCmsKey" type="text" id="newCmsKey" value="">' + '<span class="help-block">{{ "CMS Secret Key associated with the provided new CMS Address"|trans }}</span>' + '</div>' + '</div>' ); var $authenticationCode = $( '<div class="form-group row">' + '<label class="col-sm-2 control-label" for="twoFactorCode" accesskey="">Two Factor Code</label>' + '<div class="col-sm-10">' + '<input class="form-control" name="twoFactorCode" type="text" id="twoFactorCode" value="">' + '<span class="help-block">{{ "Please enter your Two Factor authentication code"|trans }}</span>' + '</div>' + '</div>' ); $(dialog).find('.modal-body').append($cmsAddress, $cmsKey, $authenticationCode); $('#twoFactorCode, #newCmsAddress, #newCmsKey').on('change', function() { dialog.data().commitData = { newCmsAddress: $('#newCmsAddress').val(), newCmsKey: $('#newCmsKey').val(), twoFactorCode: $('#twoFactorCode').val() }; }); } function displayEditFormOpen(dialog) { // Setup display profile form displayProfileFormOpen(); XiboInitialise('#settings-from-display-profile'); var $settings = $(dialog).find('#settings-from-display-profile').find('.form-group'); var $table = $(dialog).find('#settings-from-profile tbody').empty(); var override = $(dialog).data('extra'); // Parse special fields override.forEach(function(field, index) { if(['lockOptions','pictureOptions', 'timers'].includes(field.name)) { var parsedValues = JSON.parse(field.value); // Add values to the override array $.each(parsedValues, function(name, value){ if(name == 'keylock') { $.each(value, function(keylockName, keylockValue){ if(keylockName == 'local') { keylockName = 'keylockLocal'; } if(keylockName == 'remote') { keylockName = 'keylockRemote'; } override.push({name: keylockName, value: keylockValue}) }); } // Convert boolean and numbers to string value = (['boolean','number'].includes(typeof value)) ? value.toString() : value; override.push({name: name, value: value}) }); } }); // Method to create a new input field based on the hidden form var createInputField = function(target, inputName, newValue = null) { var select2FixFlag = false; var timepickerFixFlag = false; var timepickerOptionsFixFlag = false; var sliderFixFlag = false; var sliderFixOptions = {}; // Grab input field from hidden table var $inputFields = $settings.find('#' + inputName); // If no input field is capture by ID, get special fields if($inputFields.length == 0) { if( $settings.find('.multiSelect').length > 0) { // Copy special fields ( timers, pictureOptions ) by selected option $inputFields = $settings.find('.multiSelect option:selected[value="' + inputName + '"]').parents('.form-group:first').find('.multiSelect, .multiSelectInputs'); $inputFields.each(function(key, el) { if($(el).find('.timePickerDisplayEditForm').length > 0) { timepickerOptionsFixFlag = true; $(el).find('.input-group.timerInit').removeClass('timerInit'); destroyDatePicker($(el).find('.timePickerDisplayEditForm:not(.datePickerHelper)')); } else if($(el).find('.pictureControlsSlider').length > 0) { sliderFixFlag = true; sliderFixOptions = $(el).find('.pictureControlsSlider').bootstrapSlider('getAttribute'); $(el).find('.pictureControlsSlider').bootstrapSlider('destroy'); } }); } } else if($inputFields.length == 1 && $inputFields.hasClass('timePicker')) { timepickerFixFlag = true; destroyDatePicker($inputFields); // Time inputs $inputFields = $inputFields.parent(); } else if($inputFields.length == 1 && $inputFields.hasClass('select2-hidden-accessible')) { select2FixFlag = true; // Destroy select2 before copying $inputFields.select2('destroy'); } // Save old field before cloning $inputFieldsOld = $inputFields; // Clone input fields ( to be able to reuse the originals ) $inputFields = $inputFields.clone(true); if(select2FixFlag) { // Restore old field to a select2 makePagedSelect($inputFieldsOld); } // Add input field to the target $(target).html($inputFields); if(timepickerFixFlag) { XiboInitialise('#' + $inputFieldsOld.parents('form').attr('id')); XiboInitialise('#' + $(target).parents('form').attr('id')); } if(timepickerOptionsFixFlag) { timersFormInit($inputFieldsOld); timersFormInit($(target)); // Parent container var $inputParent = $inputFields.parent() $inputParent.addClass('timerOverride'); $inputParent.find('.date-clear-button').remove(); $inputParent.append('<div class="text-muted">{{ "Adjust the times of this timer. To add or remove a day, use the Display Profile."|trans }}</div>'); } if(sliderFixFlag) { $inputFieldsOld.find('.pictureControlsSlider').bootstrapSlider(sliderFixOptions); $inputFields.find('.pictureControlsSlider').bootstrapSlider(sliderFixOptions); } // Set value if defined if(newValue != null) { if($(target).find('.multiSelectInputs .pictureControlsSlider').length > 0) { // SLIDER if(!$.isNumeric(newValue)) { // If value is a label, get index $(target).find('.multiSelectInputs .slider-tick-label').each(function(idx, el) { if($(el).html() == newValue) { newValue = idx; return false; } }); } // Set value $(target).find('.pictureControlsSlider').bootstrapSlider('setValue', newValue); } else if($inputFields.attr('type') == 'checkbox') { // CHECKBOX $($inputFields).prop('checked', newValue); } else if(timepickerFixFlag) { $($inputFields).find('input').val(newValue); } else if(timepickerOptionsFixFlag) { $.each(newValue, function(name, value){ if(name == 'on') { $($inputFields).find('input.timersOn').val(value); } else if(name == 'off') { $($inputFields).find('input.timersOff').val(value); } }) } else { $($inputFields).val(newValue); } } // Reload select 2 with new value if(select2FixFlag) { // Restore select2 after value set makePagedSelect($inputFields); } // Android dimensions init if(inputName == 'screenDimensions') { setAndroidDimensions($(target)); // CSS fix $(target).find('.androidDimensionInput').removeClass('col-3').addClass('col-6'); } // If there's a multiselect, set the value of the dropdown ( it's not kept on cloning ) and hide it $(target).find('.multiSelect').val(inputName).hide(); // Style multi selects if($(target).find('.multiSelectInputs').length > 0) { // Calculate column size for bootstrap var colSize = Math.round(12/$(target).find('.multiSelectInputs').length); //Remove all style classes and add the new size class $(target).find('.multiSelectInputs').attr('class', 'multiSelectInputs col-sm-' + colSize) } // Set data propeties $(target).attr('data-editing', 'true'); $(target).attr('data-input-name', inputName); // Remove click to edit event $(target).unbind('click'); // Fixes for slider $(target).find('.slider').addClass('scaled-slider'); $(target).find('.pictureControlsSlider').bootstrapSlider('refresh', { useCurrentValue: true }); // Add help text if exists on label let inputHelpText = $(target).parent('tr').find('td:first strong').attr('title'); if(inputHelpText) { $(target).append('<div class="text-muted">' + inputHelpText + '</div>'); } var $newButton = $('<button class="btn btn-outline-danger btn-sm pull-right button-close-override" type="button"><i class="fa fa-times"></i></button>').click(function (e) { e.stopPropagation(); restoreInputField(target, inputName); }); $(target).append($newButton); }; // Method to restore the input field to the edit button var restoreInputField = function(target, inputName) { $(target).html('<button class="btn btn-block btn-outline-secondary" type="button"><i class="fa fa-edit"></i></button>'); // Handlers for field edit $(target).off().click(function() { if(!$(this).data('editing')) { createInputField($(this), inputName); } }); $(target).attr('data-editing', 'false'); }; // Build table $.each($settings, function(index, element) { var $label = $(element).find('label'); var $input = $(element).find('input,select'); var $help = $(element).find('small.form-text.text-muted'); var over = $label.prop("for"); var value = ''; var text = ''; var help = $help.length > 0 ? $help.text() : ''; // Skip for some fields if(['name', 'isDefault'].includes(over)) { return true; } if($(element).hasClass('form-group-timers')) { // Get text and override name over = $(element).find('.multiSelect').val(); text = $(element).find('.multiSelect option:selected').text(); // Get value value = $(element).find('.timersOn').val() + ' - ' + $(element).find('.timersOff').val(); } else if($(element).hasClass('form-group-picture-options')) { // Get text and override name over = $(element).find('.multiSelect').val(); text = $(element).find('.multiSelect option:selected').text(); // Get labels var labels = []; $(element).find('.multiSelectInputs .slider-tick-label').each(function(idx, el) { labels.push($(el).html()); }); // Get value value = $(element).find('.multiSelectInputs .pictureControlsSlider').bootstrapSlider('getValue'); // If specific value has a label, use it as value if(labels[value] != undefined) { value = labels[value]; } } else if($input.attr('type') == 'checkbox'){ // Get text and value text = $label.text(); value = $input.is(":checked"); } else if($input.is('select')){ // Get text and value text = $label.text(); value = $input.find('option:selected').text(); } else if(over === 'screenDimensions'){ // Get text and value text = $label.text(); value = $(element).find('#screenDimensions').val(); } else { // Get text and value text = $label.text(); value = $input.val(); } // Skip empty fields if(over == '' || over == undefined || over == null) { return true; } // Append new row to the table var $tableNewRow = $('<tr><td style="width: 40%;"><strong title="' + help + '">' + text + '</strong></td><td style="width: 25%; overflow-x: auto; max-width: 250px;"><div>' + value + '</div></td><td class="override-input text-center" style="width: 35%;" data-editing="false" data-input-name="' + over + '"><button class="btn btn-block btn-outline-secondary" type="button"><i class="fa fa-edit"></i></button></td></tr>').appendTo($table); // Get override element var overrideEl = override.find(function(x) { return x.name === over; }); if(overrideEl != undefined) { //If element was found, create an input // Create input with override value createInputField($tableNewRow.find('.override-input'), over, overrideEl.value); } }); // Handlers for field edit $(dialog).find('.override-input[data-editing="false"]').click(function() { var inputName = $(this).data('inputName'); createInputField($(this), inputName); }); // Refresh on tab switch to fix broken labels $('a[data-toggle="tab"]').on('shown.bs.tab', function() { $('.pictureControlsSlider').bootstrapSlider('refresh', { useCurrentValue: true }); }); // Call XiboInitialise on table XiboInitialise('#settings-from-profile'); } // Custom submit for display form function displayEditFormSubmit() { var $form = $('#displayEditForm'); // Grab and alter the value in the bandwidth limit field var bandwidthLimitField = $form.find("input[name=bandwidthLimit]"); var bandwidthLimitUnitsField = $form.find("select[name=bandwidthLimitUnits]"); var bandwidthLimit = bandwidthLimitField.val(); if (bandwidthLimitUnitsField.val() == 'mb') { bandwidthLimit = bandwidthLimit * 1024; } else if (bandwidthLimitUnitsField.val() == 'gb') { bandwidthLimit = bandwidthLimit * 1024 * 1024; } // Set the field bandwidthLimitField.prop('value', bandwidthLimit); // Remove temp fields and enable checkbox after submit $form.submit(function(event) { event.preventDefault(); // Re-enable checkboxes $form.find('input[type="checkbox"]').each(function () { // Enable checkbox $(this).attr('disabled', false); }); // Remove temp input fields $form.find('input.temp-input').each(function () { $(this).remove(); }); }); // Replace all checkboxes with hidden input fields $form.find('input[type="checkbox"]').each(function () { // Get checkbox values var value = $(this).is(':checked') ? 'on' : 'off'; var id = $(this).attr('id'); // Create hidden input $('<input type="hidden" class="temp-input">') .attr('id', id) .attr('name', id) .val(value) .appendTo($(this).parent()); // Disable checkbox so it won't be submitted $(this).attr('disabled', true); }); // Submit form $form.submit(); } $('body').on('click', '.display-screenshot', function(el) { var displayId = el.target.dataset.displayId; var displayType = el.target.dataset.type; var statusWindowData = {}; $.ajax({ url: "/display/status/" + displayId, method: "GET", dataType: "json", success: function (data) { if (data != null) { // do some processing on data received from webOS and Tizen Players. if (displayType === 'webOS' || displayType === 'sssp') { data.logMessagesArray = JSON.stringify(data.logMessagesArray); data.allLayouts = JSON.stringify(data.allLayouts); data.scheduledLayouts = JSON.stringify(data.scheduledLayouts); data.validLayouts = JSON.stringify(data.validLayouts); data.invalidLayouts = JSON.stringify(data.invalidLayouts); data.blacklistArray = JSON.stringify(data.blacklistArray); data.spaceTotal = formatBytes(data.spaceTotal, 2); data.spaceFree = formatBytes(data.spaceFree, 2); data.spaceUsed = formatBytes(data.spaceUsed, 2); } statusWindowData['data'] = data; statusWindowData['type'] = displayType; var statusWindowTemplate = Handlebars.compile($('#display-status-window-template').html()); $('.modal-body').append(statusWindowTemplate(statusWindowData)); } } }); }); </script> <style> #settings-from-profile tr.row-fluid { height: 50px; } </style> {% endblock %}