Multi-edit ✏ #571
This commit is contained in:
2
.github/workflows/docker_prod.yml
vendored
2
.github/workflows/docker_prod.yml
vendored
@@ -13,7 +13,7 @@ on:
|
|||||||
release:
|
release:
|
||||||
types: [published]
|
types: [published]
|
||||||
tags:
|
tags:
|
||||||
- '*.*.*'
|
- '*.[1-9]+[0-9]?.[1-9]+*'
|
||||||
jobs:
|
jobs:
|
||||||
docker:
|
docker:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ services:
|
|||||||
- ${DEV_LOCATION}/front/report.php:/home/pi/pialert/front/report.php
|
- ${DEV_LOCATION}/front/report.php:/home/pi/pialert/front/report.php
|
||||||
- ${DEV_LOCATION}/front/workflows.php:/home/pi/pialert/front/workflows.php
|
- ${DEV_LOCATION}/front/workflows.php:/home/pi/pialert/front/workflows.php
|
||||||
- ${DEV_LOCATION}/front/appEventsCore.php:/home/pi/pialert/front/appEventsCore.php
|
- ${DEV_LOCATION}/front/appEventsCore.php:/home/pi/pialert/front/appEventsCore.php
|
||||||
|
- ${DEV_LOCATION}/front/multiEditCore.php:/home/pi/pialert/front/multiEditCore.php
|
||||||
- ${DEV_LOCATION}/front/donations.php:/home/pi/pialert/front/donations.php
|
- ${DEV_LOCATION}/front/donations.php:/home/pi/pialert/front/donations.php
|
||||||
- ${DEV_LOCATION}/front/plugins:/home/pi/pialert/front/plugins
|
- ${DEV_LOCATION}/front/plugins:/home/pi/pialert/front/plugins
|
||||||
# DELETE END anyone trying to use this file: comment out / delete ABOVE lines, they are only for development purposes
|
# DELETE END anyone trying to use this file: comment out / delete ABOVE lines, they are only for development purposes
|
||||||
|
|||||||
@@ -1030,6 +1030,31 @@ input[readonly] {
|
|||||||
z-index: 100;
|
z-index: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Multi-edit adjustements */
|
||||||
|
.box-header
|
||||||
|
{
|
||||||
|
min-height: 55px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.red-hover-border:hover
|
||||||
|
{
|
||||||
|
border-color: red !important;
|
||||||
|
border-width: 1px;
|
||||||
|
border-style: solid;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.red-hover-background:hover
|
||||||
|
{
|
||||||
|
background-color: red !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#multi-edit-form .form-group
|
||||||
|
{
|
||||||
|
height: 45px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* -----------------------------------------------------------------------------
|
/* -----------------------------------------------------------------------------
|
||||||
Donations
|
Donations
|
||||||
----------------------------------------------------------------------------- */
|
----------------------------------------------------------------------------- */
|
||||||
|
|||||||
@@ -1471,23 +1471,7 @@ function setDeviceData (direction='', refreshCallback='') {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------------
|
|
||||||
// Calls a backend function to add a front-end event to an execution queue
|
|
||||||
function updateApi()
|
|
||||||
{
|
|
||||||
|
|
||||||
// value has to be in format event|param. e.g. run|ARPSCAN
|
|
||||||
action = `update_api|devices,appevents`
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
method: "POST",
|
|
||||||
url: "php/server/util.php",
|
|
||||||
data: { function: "addToExecutionQueue", action: action },
|
|
||||||
success: function(data, textStatus) {
|
|
||||||
console.log(data)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -148,7 +148,10 @@
|
|||||||
|
|
||||||
<!-- box-header -->
|
<!-- box-header -->
|
||||||
<div class="box-header">
|
<div class="box-header">
|
||||||
<h3 id="tableDevicesTitle" class="box-title text-gray">Devices</h3>
|
<div class=" col-md-10 ">
|
||||||
|
<h3 id="tableDevicesTitle" class="box-title text-gray "></h3>
|
||||||
|
</div>
|
||||||
|
<div id="multiEditPlc" class="col-md-2"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- table -->
|
<!-- table -->
|
||||||
@@ -188,6 +191,9 @@
|
|||||||
<link rel="stylesheet" href="lib/AdminLTE/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css">
|
<link rel="stylesheet" href="lib/AdminLTE/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css">
|
||||||
<script src="lib/AdminLTE/bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
|
<script src="lib/AdminLTE/bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
|
||||||
<script src="lib/AdminLTE/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
|
<script src="lib/AdminLTE/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
|
||||||
|
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/select/1.3.3/css/select.dataTables.min.css">
|
||||||
|
<script type="text/javascript" src="https://cdn.datatables.net/select/1.3.3/js/dataTables.select.min.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<!-- page script ----------------------------------------------------------- -->
|
<!-- page script ----------------------------------------------------------- -->
|
||||||
@@ -521,6 +527,7 @@ function initializeDatatable (status) {
|
|||||||
// Parameters
|
// Parameters
|
||||||
'pageLength' : tableRows,
|
'pageLength' : tableRows,
|
||||||
'order' : tableOrder,
|
'order' : tableOrder,
|
||||||
|
'select' : true, // Enable selection
|
||||||
|
|
||||||
'columnDefs' : [
|
'columnDefs' : [
|
||||||
{visible: false, targets: tableColumnHide },
|
{visible: false, targets: tableColumnHide },
|
||||||
@@ -656,6 +663,28 @@ function initializeDatatable (status) {
|
|||||||
setCache ('devicesList', getDevicesFromTable(table) );
|
setCache ('devicesList', getDevicesFromTable(table) );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
// add multi-edit button
|
||||||
|
$('#multiEditPlc').append(
|
||||||
|
`<button type="submit" id="multiEdit" class="btn btn-primary" style="display:none" onclick="multiEditDevices();">
|
||||||
|
<i class="fa fa-pencil pointer" ></i> ${getString("Device_MultiEdit")}
|
||||||
|
</button>`)
|
||||||
|
|
||||||
|
// Event listener for row selection in DataTable
|
||||||
|
$('#tableDevices').on('click', 'tr', function (e) {
|
||||||
|
setTimeout(function(){
|
||||||
|
// Check if any row is selected
|
||||||
|
var anyRowSelected = $('#tableDevices tr.selected').length > 0;
|
||||||
|
|
||||||
|
console.log(anyRowSelected);
|
||||||
|
|
||||||
|
// Toggle visibility of element with ID 'multiEdit'
|
||||||
|
$('#multiEdit').toggle(anyRowSelected);
|
||||||
|
}, 200);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@@ -729,6 +758,52 @@ function handleLoadingDialog()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
function multiEditDevices()
|
||||||
|
{
|
||||||
|
rows = $('#tableDevices')[0].rows
|
||||||
|
|
||||||
|
// Initialize an empty array to store selected rows
|
||||||
|
var selectedRows = [];
|
||||||
|
|
||||||
|
console.log($('#tableDevices')[0].rows);
|
||||||
|
|
||||||
|
// Loop through each row in the HTML collection
|
||||||
|
for (var i = 0; i < rows.length; i++) {
|
||||||
|
var row = rows[i];
|
||||||
|
// Check if the row has the 'selected' class
|
||||||
|
if (row.classList.contains('selected')) {
|
||||||
|
// If selected, push the row's data to the selectedRows array
|
||||||
|
selectedRows.push(row);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now, selectedRows contains all selected rows
|
||||||
|
console.log(selectedRows);
|
||||||
|
|
||||||
|
var devicesDataTableData = $('#tableDevices').dataTable().fnGetData();
|
||||||
|
|
||||||
|
var selectedDevices = [];
|
||||||
|
|
||||||
|
for (var i = 0; i < selectedRows.length; i++) {
|
||||||
|
selectedDevices.push(devicesDataTableData[selectedRows[i]._DT_RowIndex]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Now, selectedDevices contains all selected devices
|
||||||
|
console.log(selectedDevices);
|
||||||
|
|
||||||
|
macs = ""
|
||||||
|
|
||||||
|
for (var i = 0; i < selectedDevices.length; i++) {
|
||||||
|
macs += selectedDevices[i][4] + ","; // [4] == MAC
|
||||||
|
}
|
||||||
|
// setCache('activeMaintenanceTab', 'tab_multiEdit_id')
|
||||||
|
window.location.href = window.location.origin + '/maintenance.php#tab_multiEdit?macs=' + macs.slice(0, -1);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script src="js/pialert_common.js"></script>
|
<script src="js/pialert_common.js"></script>
|
||||||
|
|||||||
@@ -473,6 +473,36 @@ function getQueryString(key){
|
|||||||
|
|
||||||
tmp = params[key]
|
tmp = params[key]
|
||||||
|
|
||||||
|
if(emptyArr.includes(tmp))
|
||||||
|
{
|
||||||
|
var queryParams = {};
|
||||||
|
fullUrl = window.location.toString();
|
||||||
|
|
||||||
|
// console.log(fullUrl);
|
||||||
|
|
||||||
|
if (fullUrl.includes('?')) {
|
||||||
|
var queryString = fullUrl.split('?')[1];
|
||||||
|
|
||||||
|
// Split the query string into individual parameters
|
||||||
|
var paramsArray = queryString.split('&');
|
||||||
|
|
||||||
|
// Loop through the parameters array
|
||||||
|
paramsArray.forEach(function(param) {
|
||||||
|
// Split each parameter into key and value
|
||||||
|
var keyValue = param.split('=');
|
||||||
|
var keyTmp = decodeURIComponent(keyValue[0]);
|
||||||
|
var value = decodeURIComponent(keyValue[1] || '');
|
||||||
|
|
||||||
|
// Store key-value pair in the queryParams object
|
||||||
|
queryParams[keyTmp] = value;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// console.log(queryParams);
|
||||||
|
|
||||||
|
tmp = queryParams[key]
|
||||||
|
}
|
||||||
|
|
||||||
result = emptyArr.includes(tmp) ? "" : tmp;
|
result = emptyArr.includes(tmp) ? "" : tmp;
|
||||||
|
|
||||||
return result
|
return result
|
||||||
@@ -722,9 +752,9 @@ function getGuid() {
|
|||||||
// UI
|
// UI
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// Genrate work-in-progress icons
|
// Generate work-in-progress icons
|
||||||
function workInProgress() {
|
function workInProgress() {
|
||||||
console.log()
|
|
||||||
if($(".work-in-progress").html().trim() == "")
|
if($(".work-in-progress").html().trim() == "")
|
||||||
{
|
{
|
||||||
$(".work-in-progress").append(`
|
$(".work-in-progress").append(`
|
||||||
@@ -768,6 +798,25 @@ function hideSpinner()
|
|||||||
$("#loadingSpinner").hide()
|
$("#loadingSpinner").hide()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// --------------------------------------------------------
|
||||||
|
// Calls a backend function to add a front-end event to an execution queue
|
||||||
|
function updateApi()
|
||||||
|
{
|
||||||
|
|
||||||
|
// value has to be in format event|param. e.g. run|ARPSCAN
|
||||||
|
action = `update_api|devices,appevents`
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: "POST",
|
||||||
|
url: "php/server/util.php",
|
||||||
|
data: { function: "addToExecutionQueue", action: action },
|
||||||
|
success: function(data, textStatus) {
|
||||||
|
console.log(data)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
// initialize
|
// initialize
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|||||||
92
front/js/ui_components.js
Executable file
92
front/js/ui_components.js
Executable file
@@ -0,0 +1,92 @@
|
|||||||
|
/* -----------------------------------------------------------------------------
|
||||||
|
* Pi.Alert
|
||||||
|
* Open Source Network Guard / WIFI & LAN intrusion detector
|
||||||
|
*
|
||||||
|
* ui_components.js - Front module. Common UI components
|
||||||
|
*-------------------------------------------------------------------------------
|
||||||
|
# jokob jokob@duck.com GNU GPLv3
|
||||||
|
----------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// Initialize device selectors / pickers fields
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
function initDeviceSelectors() {
|
||||||
|
|
||||||
|
console.log(devicesList)
|
||||||
|
// Retrieve device list from session variable
|
||||||
|
var devicesListAll_JSON = sessionStorage.getItem('devicesListAll_JSON');
|
||||||
|
|
||||||
|
console.log(devicesListAll_JSON)
|
||||||
|
|
||||||
|
var devicesList = JSON.parse(devicesListAll_JSON);
|
||||||
|
|
||||||
|
console.log(devicesList)
|
||||||
|
|
||||||
|
// Check if both device list exists
|
||||||
|
if (devicesListAll_JSON) {
|
||||||
|
// Parse the JSON string to get the device list array
|
||||||
|
var devicesList = JSON.parse(devicesListAll_JSON);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
console.log(devicesList)
|
||||||
|
|
||||||
|
var selectorFieldsHTML = ''
|
||||||
|
|
||||||
|
// Loop through the devices list
|
||||||
|
devicesList.forEach(function(device) {
|
||||||
|
|
||||||
|
selectorFieldsHTML += `<option value="${device.dev_MAC}">${device.dev_Name}</option>`;
|
||||||
|
});
|
||||||
|
|
||||||
|
selector = `<div class="db_info_table_row col-sm-12" >
|
||||||
|
<div class="form-group" >
|
||||||
|
<div class="input-group col-sm-12 " >
|
||||||
|
<select class="form-control select2 select2-hidden-accessible" multiple="" style="width: 100%;" tabindex="-1" aria-hidden="true">
|
||||||
|
${selectorFieldsHTML}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>`
|
||||||
|
|
||||||
|
|
||||||
|
// Find HTML elements with class "deviceSelector" and append selector field
|
||||||
|
$('.deviceSelector').append(selector);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize selected items after a delay so selected macs are available in the context
|
||||||
|
setTimeout(function(){
|
||||||
|
// Retrieve MAC addresses from query string or cache
|
||||||
|
var macs = getQueryString('macs') || getCache('selectedDevices');
|
||||||
|
|
||||||
|
if(macs)
|
||||||
|
{
|
||||||
|
// Split MAC addresses if they are comma-separated
|
||||||
|
macs = macs.split(',');
|
||||||
|
|
||||||
|
console.log(macs)
|
||||||
|
|
||||||
|
// Loop through macs to be selected list
|
||||||
|
macs.forEach(function(mac) {
|
||||||
|
|
||||||
|
// Create the option and append to Select2
|
||||||
|
var option = new Option($('.deviceSelector select option[value="' + mac + '"]').html(), mac, true, true);
|
||||||
|
|
||||||
|
$('.deviceSelector select').append(option).trigger('change');
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}, 100);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// initialize
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
initDeviceSelectors();
|
||||||
|
|
||||||
|
console.log("init ui_components.js")
|
||||||
@@ -243,6 +243,12 @@ $db->close();
|
|||||||
<?= lang('Maintenance_Tools_Tab_Logging');?>
|
<?= lang('Maintenance_Tools_Tab_Logging');?>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a id="tab_multiEdit_id" href="#tab_multiEdit" data-toggle="tab">
|
||||||
|
<i class="fa fa-pencil pointer" ></i>
|
||||||
|
<?= lang('Device_MultiEdit');?>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div class="tab-pane active" id="tab_Settings">
|
<div class="tab-pane active" id="tab_Settings">
|
||||||
@@ -501,8 +507,21 @@ $db->close();
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- ---------------------------Bulk edit -------------------------------------------- -->
|
||||||
|
<div class="tab-pane" id="tab_multiEdit">
|
||||||
|
<div class="db_info_table">
|
||||||
|
<div class="log-area box box-solid box-primary">
|
||||||
|
<?php
|
||||||
|
require 'multiEditCore.php';
|
||||||
|
?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<!-- ------------------------------------------------------------------------------ -->
|
<!-- ------------------------------------------------------------------------------ -->
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="box-body" style="text-align: center;">
|
<div class="box-body" style="text-align: center;">
|
||||||
@@ -827,7 +846,7 @@ function initializeSelectedColumns () {
|
|||||||
|
|
||||||
$("#columnsSelect").append(option).trigger('change');
|
$("#columnsSelect").append(option).trigger('change');
|
||||||
|
|
||||||
$(option).attr('eee','eee')
|
// $(option).attr('eee','eee')
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
@@ -873,6 +892,14 @@ function initializeTabs () {
|
|||||||
// the #target from the url
|
// the #target from the url
|
||||||
target = window.location.hash.substr(1)
|
target = window.location.hash.substr(1)
|
||||||
|
|
||||||
|
// get only the part between #...?
|
||||||
|
if(target.includes('?'))
|
||||||
|
{
|
||||||
|
target = target.split('?')[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(target)
|
||||||
|
|
||||||
// update cookie if target specified
|
// update cookie if target specified
|
||||||
if(target != "")
|
if(target != "")
|
||||||
{
|
{
|
||||||
|
|||||||
159
front/multiEditCore.php
Executable file
159
front/multiEditCore.php
Executable file
@@ -0,0 +1,159 @@
|
|||||||
|
<?= lang('Gen_Selected_Devices');?>
|
||||||
|
|
||||||
|
<div class="deviceSelector"></div>
|
||||||
|
|
||||||
|
<div class="callout callout-warning">
|
||||||
|
<h4><?= lang('Gen_Warning');?></h4>
|
||||||
|
|
||||||
|
<p><?= lang('Device_MultiEdit_Backup');?></p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title"><?= lang('Device_MultiEdit_Fields');?></h3>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<form id="multi-edit-form">
|
||||||
|
<!-- Form fields will be appended here -->
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
// Get plugin and settings data from API endpoints
|
||||||
|
function getData(){
|
||||||
|
|
||||||
|
$.get('api/table_settings.json?nocache=' + Date.now(), function(res) {
|
||||||
|
|
||||||
|
settingsData = res["data"];
|
||||||
|
|
||||||
|
excludedColumns = ["NEWDEV_dev_MAC", "NEWDEV_dev_FirstConnection", "NEWDEV_dev_LastConnection", "dev_LastNotification", "NEWDEV_dev_LastIP", "NEWDEV_dev_StaticIP", "NEWDEV_dev_ScanCycle", "NEWDEV_dev_PresentLastScan" ]
|
||||||
|
|
||||||
|
const relevantColumns = settingsData.filter(set =>
|
||||||
|
set.Group === "NEWDEV" &&
|
||||||
|
set.Code_Name.includes("_dev_") &&
|
||||||
|
!excludedColumns.includes(set.Code_Name) &&
|
||||||
|
!set.Code_Name.includes("__metadata")
|
||||||
|
);
|
||||||
|
|
||||||
|
const generateSimpleForm = columns => {
|
||||||
|
const form = $('#multi-edit-form');
|
||||||
|
const numColumns = 2; // Number of columns
|
||||||
|
|
||||||
|
// Calculate number of elements per column
|
||||||
|
const elementsPerColumn = Math.ceil(columns.length / numColumns);
|
||||||
|
|
||||||
|
// Divide columns equally
|
||||||
|
for (let i = 0; i < numColumns; i++) {
|
||||||
|
const column = $('<div>').addClass('col-md-6');
|
||||||
|
|
||||||
|
// Append form groups to the column
|
||||||
|
for (let j = i * elementsPerColumn; j < Math.min((i + 1) * elementsPerColumn, columns.length); j++) {
|
||||||
|
|
||||||
|
const inputType = columns[j].Type === 'integer.checkbox' ? 'checkbox' : 'text';
|
||||||
|
|
||||||
|
// Add classes specifically for checkboxes
|
||||||
|
if (inputType === 'checkbox') {
|
||||||
|
inputClass = 'checkbox';
|
||||||
|
} else {
|
||||||
|
inputClass = 'form-control';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const inputEntry = `<div class="form-group col-sm-12" >
|
||||||
|
<label class="col-sm-3 control-label">${columns[j].Display_Name}</label>
|
||||||
|
<div class="col-sm-9">
|
||||||
|
<div class="input-group red-hover-border">
|
||||||
|
<input class="${inputClass}" id="${columns[j].Code_Name}" data-my-column="${columns[j].Code_Name}" data-my-targetColumns="${columns[j].Code_Name.replace('NEWDEV_','')}" type="${inputType}">
|
||||||
|
<span class="input-group-addon pointer red-hover-background" onclick="genericSaveData('${columns[j].Code_Name}', selectorMacs());" title="${getString('Device_MultiEdit_Tooltip')}">
|
||||||
|
<i class="fa fa-save"></i>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>`
|
||||||
|
|
||||||
|
|
||||||
|
column.append(inputEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
form.append(column);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
generateSimpleForm(relevantColumns);
|
||||||
|
|
||||||
|
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// Get selected devices Macs
|
||||||
|
function selectorMacs () {
|
||||||
|
return $('.deviceSelector select').val().join(',');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// -----------------------------------------------------------------------------
|
||||||
|
// Update the corresponding DB column and entry
|
||||||
|
function genericSaveData(id, index) {
|
||||||
|
|
||||||
|
// Get the input element
|
||||||
|
var inputElement = $(`#${id}`);
|
||||||
|
|
||||||
|
// Initialize columnValue variable
|
||||||
|
var columnValue;
|
||||||
|
|
||||||
|
// Check the type of the input element
|
||||||
|
if (inputElement.is(':checkbox')) {
|
||||||
|
// For checkboxes, set the value to 1 if checked, otherwise set it to 0
|
||||||
|
columnValue = inputElement.is(':checked') ? 1 : 0;
|
||||||
|
} else {
|
||||||
|
// For other input types (like textboxes), simply retrieve their values
|
||||||
|
columnValue = inputElement.val();
|
||||||
|
}
|
||||||
|
|
||||||
|
var targetColumns = inputElement.attr('data-my-targetColumns');
|
||||||
|
|
||||||
|
|
||||||
|
console.log(targetColumns);
|
||||||
|
console.log(index);
|
||||||
|
console.log(columnValue);
|
||||||
|
|
||||||
|
$.get(`php/server/dbHelper.php?action=update&dbtable=Devices&columnName=dev_MAC&id=${index}&columns=${targetColumns}&values=${columnValue}`, function(data) {
|
||||||
|
console.log(data);
|
||||||
|
|
||||||
|
if (sanitize(data) == 'OK') {
|
||||||
|
showMessage('<?= lang('Gen_DataUpdatedUITakesTime');?>');
|
||||||
|
// Remove navigation prompt "Are you sure you want to leave..."
|
||||||
|
window.onbeforeunload = null;
|
||||||
|
|
||||||
|
// update API endpoints to refresh the UI
|
||||||
|
updateApi()
|
||||||
|
|
||||||
|
} else {
|
||||||
|
showMessage('<?= lang('Gen_LockedDB');?>');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getData();
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- ----------------------------------------------------------------------- -->
|
||||||
|
<script src="js/ui_components.js"></script>
|
||||||
@@ -80,45 +80,61 @@ function update($columnName, $id, $skipCache, $defaultValue, $expireMinutes, $db
|
|||||||
|
|
||||||
global $db;
|
global $db;
|
||||||
|
|
||||||
// handle one or multiple columns
|
// Handle one or multiple columns
|
||||||
if(strpos($columns, ',') !== false)
|
if(strpos($columns, ',') !== false) {
|
||||||
{
|
|
||||||
$columnsArr = explode(",", $columns);
|
$columnsArr = explode(",", $columns);
|
||||||
}else
|
} else {
|
||||||
{
|
|
||||||
$columnsArr = array($columns);
|
$columnsArr = array($columns);
|
||||||
}
|
}
|
||||||
|
|
||||||
// handle one or multiple values
|
// Handle one or multiple values
|
||||||
if(strpos($values, ',') !== false)
|
if(strpos($values, ',') !== false) {
|
||||||
{
|
|
||||||
$valuesArr = explode(",", $values);
|
$valuesArr = explode(",", $values);
|
||||||
} else
|
} else {
|
||||||
{
|
|
||||||
$valuesArr = array($values);
|
$valuesArr = array($values);
|
||||||
}
|
}
|
||||||
|
|
||||||
$columnValues = '';
|
// Handle one or multiple IDs
|
||||||
|
if(strpos($id, ',') !== false) {
|
||||||
$index = 0;
|
$idsArr = explode(",", $id);
|
||||||
foreach($columnsArr as $column)
|
$idsPlaceholder = rtrim(str_repeat('?,', count($idsArr)), ',');
|
||||||
{
|
} else {
|
||||||
$columnValues = $columnValues .' "' .$column.'" = "'.$valuesArr[$index] . '",' ;
|
$idsArr = array($id);
|
||||||
$index = $index + 1;
|
$idsPlaceholder = '?';
|
||||||
}
|
}
|
||||||
|
|
||||||
$columnValues = substr($columnValues, 0, -1);
|
// Build column-value pairs string
|
||||||
|
$columnValues = '';
|
||||||
|
foreach($columnsArr as $column) {
|
||||||
|
$columnValues .= '"' . $column . '" = ?,';
|
||||||
|
}
|
||||||
|
// Remove trailing comma
|
||||||
|
$columnValues = rtrim($columnValues, ',');
|
||||||
|
|
||||||
// Update value
|
// Construct the SQL query
|
||||||
$sql = 'UPDATE '.$dbtable.' SET '. $columnValues .'
|
$sql = 'UPDATE ' . $dbtable . ' SET ' . $columnValues . ' WHERE ' . $columnName . ' IN (' . $idsPlaceholder . ')';
|
||||||
WHERE "'. $columnName .'"="'. $id.'"';
|
|
||||||
$result = $db->query($sql);
|
|
||||||
|
|
||||||
if (! $result == TRUE) {
|
// Prepare the statement
|
||||||
echo "Error updating parameter\n\n$sql \n\n". $db->lastErrorMsg();
|
$stmt = $db->prepare($sql);
|
||||||
|
|
||||||
|
// Check for errors
|
||||||
|
if(!$stmt) {
|
||||||
|
echo "Error preparing statement: " . $db->lastErrorMsg();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Bind the parameters
|
||||||
|
$paramTypes = str_repeat('s', count($columnsArr));
|
||||||
|
foreach($valuesArr as $i => $value) {
|
||||||
|
$stmt->bindValue($i + 1, $value);
|
||||||
|
}
|
||||||
|
foreach($idsArr as $i => $idValue) {
|
||||||
|
$stmt->bindValue(count($valuesArr) + $i + 1, $idValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute the statement
|
||||||
|
$result = $stmt->execute();
|
||||||
|
|
||||||
$changes = $db->changes();
|
$changes = $db->changes();
|
||||||
if ($changes == 0) {
|
if ($changes == 0) {
|
||||||
// Insert new value
|
// Insert new value
|
||||||
@@ -129,7 +145,7 @@ function update($columnName, $id, $skipCache, $defaultValue, $expireMinutes, $db
|
|||||||
$uniqueHash = hash('ripemd160', $dbtable . $columns);
|
$uniqueHash = hash('ripemd160', $dbtable . $columns);
|
||||||
setCache($uniqueHash, $values, $expireMinutes);
|
setCache($uniqueHash, $values, $expireMinutes);
|
||||||
|
|
||||||
echo 'OK';
|
echo 'OK' ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -140,16 +156,19 @@ function create($skipCache, $defaultValue, $expireMinutes, $dbtable, $columns, $
|
|||||||
{
|
{
|
||||||
global $db;
|
global $db;
|
||||||
|
|
||||||
// Insert new value
|
echo "NOT IMPLEMENTED!\n\n";
|
||||||
$sql = 'INSERT INTO '.$dbtable.' ('.$columns.')
|
|
||||||
VALUES ("'. quotes($parameter) .'",
|
|
||||||
"'. $values .'")';
|
|
||||||
$result = $db->query($sql);
|
|
||||||
|
|
||||||
if (! $result == TRUE) {
|
|
||||||
echo "Error creating entry\n\n$sql \n\n". $db->lastErrorMsg();
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
// // Insert new value
|
||||||
|
// $sql = 'INSERT INTO '.$dbtable.' ('.$columns.')
|
||||||
|
// VALUES ("'. quotes($parameter) .'",
|
||||||
|
// "'. $values .'")';
|
||||||
|
// $result = $db->query($sql);
|
||||||
|
|
||||||
|
// if (! $result == TRUE) {
|
||||||
|
// echo "Error creating entry\n\n$sql \n\n". $db->lastErrorMsg();
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -185,7 +185,7 @@ function displayMessage($message, $logAlert = FALSE, $logConsole = TRUE, $logFil
|
|||||||
echo '<script>alert(escape("'.$message.'"));</script>';
|
echo '<script>alert(escape("'.$message.'"));</script>';
|
||||||
}
|
}
|
||||||
|
|
||||||
// F12 Browser console
|
// F12 Browser dev console
|
||||||
if($logConsole)
|
if($logConsole)
|
||||||
{
|
{
|
||||||
echo '<script>console.log(escape("'.str_replace('"',"'",$message).'"));</script>';
|
echo '<script>console.log(escape("'.str_replace('"',"'",$message).'"));</script>';
|
||||||
@@ -194,16 +194,26 @@ function displayMessage($message, $logAlert = FALSE, $logConsole = TRUE, $logFil
|
|||||||
//File
|
//File
|
||||||
if($logFile)
|
if($logFile)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
if (is_writable($logFolderPath.$log_file)) {
|
||||||
|
|
||||||
|
|
||||||
if(file_exists($logFolderPath.$log_file) != 1) // file doesn't exist, create one
|
if(file_exists($logFolderPath.$log_file) != 1) // file doesn't exist, create one
|
||||||
{
|
{
|
||||||
$log = fopen($logFolderPath.$log_file, "w") or die("Unable to open file!");
|
$log = fopen($logFolderPath.$log_file, "w") or die("Unable to open file!");
|
||||||
}else // file exists, append
|
}else // file exists, append
|
||||||
{
|
{
|
||||||
$log = fopen($logFolderPath.$log_file, "a") or die("Unable to open file!");
|
$log = fopen($logFolderPath.$log_file, "a") or die("Unable to open file - Permissions issue!");
|
||||||
}
|
}
|
||||||
|
|
||||||
fwrite($log, "[".$timestamp. "] " . str_replace('<br>',"\n ",str_replace('<br/>',"\n ",$message)).PHP_EOL."" );
|
fwrite($log, "[".$timestamp. "] " . str_replace('<br>',"\n ",str_replace('<br/>',"\n ",$message)).PHP_EOL."" );
|
||||||
fclose($log);
|
fclose($log);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
echo 'The file is not writable: '.$logFolderPath.$log_file;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//echo
|
//echo
|
||||||
|
|||||||
@@ -187,6 +187,10 @@
|
|||||||
"DevDetail_button_OverwriteIcons_Warning": "Are you sure you want to overwrite all icons of all devices with the same device type as the current device type?",
|
"DevDetail_button_OverwriteIcons_Warning": "Are you sure you want to overwrite all icons of all devices with the same device type as the current device type?",
|
||||||
"DevDetail_button_Reset": "Verwerfen",
|
"DevDetail_button_Reset": "Verwerfen",
|
||||||
"DevDetail_button_Save": "Speichern",
|
"DevDetail_button_Save": "Speichern",
|
||||||
|
"Device_MultiEdit": "",
|
||||||
|
"Device_MultiEdit_Backup": "",
|
||||||
|
"Device_MultiEdit_Fields": "",
|
||||||
|
"Device_MultiEdit_Tooltip": "",
|
||||||
"Device_Searchbox": "Suche",
|
"Device_Searchbox": "Suche",
|
||||||
"Device_Shortcut_AllDevices": "Alle Ger\u00e4te",
|
"Device_Shortcut_AllDevices": "Alle Ger\u00e4te",
|
||||||
"Device_Shortcut_Archived": "Archiviert",
|
"Device_Shortcut_Archived": "Archiviert",
|
||||||
@@ -280,6 +284,7 @@
|
|||||||
"Gen_Run": "Run",
|
"Gen_Run": "Run",
|
||||||
"Gen_Save": "Speichern",
|
"Gen_Save": "Speichern",
|
||||||
"Gen_Saved": "Gespeichert",
|
"Gen_Saved": "Gespeichert",
|
||||||
|
"Gen_Selected_Devices": "",
|
||||||
"Gen_Switch": "Umschalten",
|
"Gen_Switch": "Umschalten",
|
||||||
"Gen_Upd": "Aktualisierung erfolgreich",
|
"Gen_Upd": "Aktualisierung erfolgreich",
|
||||||
"Gen_Upd_Fail": "Aktualisierung fehlgeschlagen",
|
"Gen_Upd_Fail": "Aktualisierung fehlgeschlagen",
|
||||||
|
|||||||
@@ -175,6 +175,10 @@
|
|||||||
"DevDetail_button_OverwriteIcons_Warning": "Are you sure you want to overwrite all icons of all devices with the same device type as the current device type?",
|
"DevDetail_button_OverwriteIcons_Warning": "Are you sure you want to overwrite all icons of all devices with the same device type as the current device type?",
|
||||||
"DevDetail_button_Reset": "Reset Changes",
|
"DevDetail_button_Reset": "Reset Changes",
|
||||||
"DevDetail_button_Save": "Save",
|
"DevDetail_button_Save": "Save",
|
||||||
|
"Device_MultiEdit": "Multi-edit",
|
||||||
|
"Device_MultiEdit_Backup": "Please backup your databse or Devices configuration first by creating a <code>devices.csv</code> backup via the <b>CSV Export</b> feature under the <a href=\"#tab_BackupRestore\" target=\"_blank\"> <i class=\"fa fa-file-shield\"></i> Backup / Restore </a> tab.",
|
||||||
|
"Device_MultiEdit_Fields": "Editable fields:",
|
||||||
|
"Device_MultiEdit_Tooltip": "Careful. Clicking this will apply the value on the left to all devices selected above.",
|
||||||
"Device_Searchbox": "Search",
|
"Device_Searchbox": "Search",
|
||||||
"Device_Shortcut_AllDevices": "My Devices",
|
"Device_Shortcut_AllDevices": "My Devices",
|
||||||
"Device_Shortcut_Archived": "Archived",
|
"Device_Shortcut_Archived": "Archived",
|
||||||
@@ -268,6 +272,7 @@
|
|||||||
"Gen_Run": "Run",
|
"Gen_Run": "Run",
|
||||||
"Gen_Save": "Save",
|
"Gen_Save": "Save",
|
||||||
"Gen_Saved": "Saved",
|
"Gen_Saved": "Saved",
|
||||||
|
"Gen_Selected_Devices": "Selected Devices:",
|
||||||
"Gen_Switch": "Switch",
|
"Gen_Switch": "Switch",
|
||||||
"Gen_Upd": "Updated successfully",
|
"Gen_Upd": "Updated successfully",
|
||||||
"Gen_Upd_Fail": "Update failed",
|
"Gen_Upd_Fail": "Update failed",
|
||||||
|
|||||||
@@ -185,6 +185,10 @@
|
|||||||
"DevDetail_button_OverwriteIcons_Warning": "\u00bfSobreescribir todos los iconos de todos los dispositivos con el mismo tipo que el dispositivo actual?",
|
"DevDetail_button_OverwriteIcons_Warning": "\u00bfSobreescribir todos los iconos de todos los dispositivos con el mismo tipo que el dispositivo actual?",
|
||||||
"DevDetail_button_Reset": "Restablecer cambios",
|
"DevDetail_button_Reset": "Restablecer cambios",
|
||||||
"DevDetail_button_Save": "Guardar",
|
"DevDetail_button_Save": "Guardar",
|
||||||
|
"Device_MultiEdit": "",
|
||||||
|
"Device_MultiEdit_Backup": "",
|
||||||
|
"Device_MultiEdit_Fields": "",
|
||||||
|
"Device_MultiEdit_Tooltip": "",
|
||||||
"Device_Searchbox": "B\u00fasqueda",
|
"Device_Searchbox": "B\u00fasqueda",
|
||||||
"Device_Shortcut_AllDevices": "Mis dispositivos",
|
"Device_Shortcut_AllDevices": "Mis dispositivos",
|
||||||
"Device_Shortcut_Archived": "Archivado(s)",
|
"Device_Shortcut_Archived": "Archivado(s)",
|
||||||
@@ -278,6 +282,7 @@
|
|||||||
"Gen_Run": "Ejecutar",
|
"Gen_Run": "Ejecutar",
|
||||||
"Gen_Save": "Guardar",
|
"Gen_Save": "Guardar",
|
||||||
"Gen_Saved": "Guardado",
|
"Gen_Saved": "Guardado",
|
||||||
|
"Gen_Selected_Devices": "",
|
||||||
"Gen_Switch": "Cambiar",
|
"Gen_Switch": "Cambiar",
|
||||||
"Gen_Upd": "Actualizado correctamente",
|
"Gen_Upd": "Actualizado correctamente",
|
||||||
"Gen_Upd_Fail": "Fallo al actualizar",
|
"Gen_Upd_Fail": "Fallo al actualizar",
|
||||||
|
|||||||
@@ -175,6 +175,10 @@
|
|||||||
"DevDetail_button_OverwriteIcons_Warning": "",
|
"DevDetail_button_OverwriteIcons_Warning": "",
|
||||||
"DevDetail_button_Reset": "",
|
"DevDetail_button_Reset": "",
|
||||||
"DevDetail_button_Save": "Enregistrer",
|
"DevDetail_button_Save": "Enregistrer",
|
||||||
|
"Device_MultiEdit": "",
|
||||||
|
"Device_MultiEdit_Backup": "",
|
||||||
|
"Device_MultiEdit_Fields": "",
|
||||||
|
"Device_MultiEdit_Tooltip": "",
|
||||||
"Device_Searchbox": "Rechercher",
|
"Device_Searchbox": "Rechercher",
|
||||||
"Device_Shortcut_AllDevices": "Tous les appareils",
|
"Device_Shortcut_AllDevices": "Tous les appareils",
|
||||||
"Device_Shortcut_Archived": "Archiv\u00e9",
|
"Device_Shortcut_Archived": "Archiv\u00e9",
|
||||||
@@ -268,6 +272,7 @@
|
|||||||
"Gen_Run": "Lancer",
|
"Gen_Run": "Lancer",
|
||||||
"Gen_Save": "Enregistrer",
|
"Gen_Save": "Enregistrer",
|
||||||
"Gen_Saved": "Enregistr\u00e9",
|
"Gen_Saved": "Enregistr\u00e9",
|
||||||
|
"Gen_Selected_Devices": "",
|
||||||
"Gen_Switch": "Basculer",
|
"Gen_Switch": "Basculer",
|
||||||
"Gen_Upd": "",
|
"Gen_Upd": "",
|
||||||
"Gen_Upd_Fail": "",
|
"Gen_Upd_Fail": "",
|
||||||
|
|||||||
@@ -175,6 +175,10 @@
|
|||||||
"DevDetail_button_OverwriteIcons_Warning": "",
|
"DevDetail_button_OverwriteIcons_Warning": "",
|
||||||
"DevDetail_button_Reset": "",
|
"DevDetail_button_Reset": "",
|
||||||
"DevDetail_button_Save": "",
|
"DevDetail_button_Save": "",
|
||||||
|
"Device_MultiEdit": "",
|
||||||
|
"Device_MultiEdit_Backup": "",
|
||||||
|
"Device_MultiEdit_Fields": "",
|
||||||
|
"Device_MultiEdit_Tooltip": "",
|
||||||
"Device_Searchbox": "",
|
"Device_Searchbox": "",
|
||||||
"Device_Shortcut_AllDevices": "",
|
"Device_Shortcut_AllDevices": "",
|
||||||
"Device_Shortcut_Archived": "",
|
"Device_Shortcut_Archived": "",
|
||||||
@@ -268,6 +272,7 @@
|
|||||||
"Gen_Run": "",
|
"Gen_Run": "",
|
||||||
"Gen_Save": "",
|
"Gen_Save": "",
|
||||||
"Gen_Saved": "",
|
"Gen_Saved": "",
|
||||||
|
"Gen_Selected_Devices": "",
|
||||||
"Gen_Switch": "",
|
"Gen_Switch": "",
|
||||||
"Gen_Upd": "",
|
"Gen_Upd": "",
|
||||||
"Gen_Upd_Fail": "",
|
"Gen_Upd_Fail": "",
|
||||||
|
|||||||
141
front/php/templates/language/ru_ru.json
Normal file → Executable file
141
front/php/templates/language/ru_ru.json
Normal file → Executable file
@@ -1,74 +1,74 @@
|
|||||||
{
|
{
|
||||||
"API_CUSTOM_SQL_description": "Вы можете указать пользовательский SQL-запрос, который будет генерировать файл JSON, а затем выдать его через <a href=\"/api/table_custom_endpoint.json\" target=\"_blank\"><code>table_custom_endpoint.json</code> file endpoint</a>.",
|
"API_CUSTOM_SQL_description": "\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 SQL-\u0437\u0430\u043f\u0440\u043e\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b JSON, \u0430 \u0437\u0430\u0442\u0435\u043c \u0432\u044b\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u0447\u0435\u0440\u0435\u0437 <a href=\"/api/table_custom_endpoint.json\" target=\"_blank\"><code>table_custom_endpoint.json</code> file endpoint</a>.",
|
||||||
"API_CUSTOM_SQL_name": "Пользовательская конечная точка",
|
"API_CUSTOM_SQL_name": "\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0430\u044f \u043a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430",
|
||||||
"API_display_name": "API",
|
"API_display_name": "API",
|
||||||
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
|
"API_icon": "<i class=\"fa fa-arrow-down-up-across-line\"></i>",
|
||||||
"About_Design": "Разработан:",
|
"About_Design": "\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d:",
|
||||||
"About_Exit": "Зарегистрироваться",
|
"About_Exit": "\u0417\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f",
|
||||||
"About_Title": "Сетевая защита с открытым исходным кодом",
|
"About_Title": "\u0421\u0435\u0442\u0435\u0432\u0430\u044f \u0437\u0430\u0449\u0438\u0442\u0430 \u0441 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c",
|
||||||
"AppEvents_DateTimeCreated": "Журнал",
|
"AppEvents_DateTimeCreated": "\u0416\u0443\u0440\u043d\u0430\u043b",
|
||||||
"AppEvents_Extra": "Дополнительно",
|
"AppEvents_Extra": "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e",
|
||||||
"AppEvents_GUID": "GUID события приложения",
|
"AppEvents_GUID": "GUID \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f",
|
||||||
"AppEvents_Helper1": "Помощник 1",
|
"AppEvents_Helper1": "\u041f\u043e\u043c\u043e\u0449\u043d\u0438\u043a 1",
|
||||||
"AppEvents_Helper2": "Помощник 2",
|
"AppEvents_Helper2": "\u041f\u043e\u043c\u043e\u0449\u043d\u0438\u043a 2",
|
||||||
"AppEvents_Helper3": "Помощник 3",
|
"AppEvents_Helper3": "\u041f\u043e\u043c\u043e\u0449\u043d\u0438\u043a 3",
|
||||||
"AppEvents_ObjectForeignKey": "Внешний ключ",
|
"AppEvents_ObjectForeignKey": "\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u043a\u043b\u044e\u0447",
|
||||||
"AppEvents_ObjectIndex": "Индекс",
|
"AppEvents_ObjectIndex": "\u0418\u043d\u0434\u0435\u043a\u0441",
|
||||||
"AppEvents_ObjectIsArchived": "Архивировано (во время входа в систему)",
|
"AppEvents_ObjectIsArchived": "\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e (\u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443)",
|
||||||
"AppEvents_ObjectIsNew": "Новый (во время входа в систему)",
|
"AppEvents_ObjectIsNew": "\u041d\u043e\u0432\u044b\u0439 (\u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443)",
|
||||||
"AppEvents_ObjectPlugin": "Связанный плагин",
|
"AppEvents_ObjectPlugin": "\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 \u043f\u043b\u0430\u0433\u0438\u043d",
|
||||||
"AppEvents_ObjectPrimaryID": "Первичный ID",
|
"AppEvents_ObjectPrimaryID": "\u041f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 ID",
|
||||||
"AppEvents_ObjectSecondaryID": "Вторичный ID",
|
"AppEvents_ObjectSecondaryID": "\u0412\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u0439 ID",
|
||||||
"AppEvents_ObjectStatus": "Состояние (во время входа в систему)",
|
"AppEvents_ObjectStatus": "\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (\u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443)",
|
||||||
"AppEvents_ObjectStatusColumn": "Колонка состояния",
|
"AppEvents_ObjectStatusColumn": "\u041a\u043e\u043b\u043e\u043d\u043a\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f",
|
||||||
"AppEvents_ObjectType": "Тип объекта",
|
"AppEvents_ObjectType": "\u0422\u0438\u043f \u043e\u0431\u044a\u0435\u043a\u0442\u0430",
|
||||||
"AppEvents_Plugin": "Плагин",
|
"AppEvents_Plugin": "\u041f\u043b\u0430\u0433\u0438\u043d",
|
||||||
"AppEvents_Type": "Тип",
|
"AppEvents_Type": "\u0422\u0438\u043f",
|
||||||
"BackDevDetail_Actions_Ask_Run": "Вы хотите выполнить действие?",
|
"BackDevDetail_Actions_Ask_Run": "\u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435?",
|
||||||
"BackDevDetail_Actions_Not_Registered": "Действие не зарегистрировано:· ",
|
"BackDevDetail_Actions_Not_Registered": "\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043d\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043e:\u00b7 ",
|
||||||
"BackDevDetail_Actions_Title_Run": "Запустить действие",
|
"BackDevDetail_Actions_Title_Run": "\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435",
|
||||||
"BackDevDetail_Copy_Ask": "Копировать данные с устройства из выпадающего списка (все на этой странице будет перезаписано)?",
|
"BackDevDetail_Copy_Ask": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u0437 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430 (\u0432\u0441\u0435 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e)?",
|
||||||
"BackDevDetail_Copy_Title": "Копировать детали",
|
"BackDevDetail_Copy_Title": "\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0438",
|
||||||
"BackDevDetail_Tools_WOL_error": "Команда НЕ была выполнена.",
|
"BackDevDetail_Tools_WOL_error": "\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u041d\u0415 \u0431\u044b\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.",
|
||||||
"BackDevDetail_Tools_WOL_okay": "Команда была выполнена.",
|
"BackDevDetail_Tools_WOL_okay": "\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0431\u044b\u043b\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430.",
|
||||||
"BackDevices_Arpscan_disabled": "Arp сканирование запрещено",
|
"BackDevices_Arpscan_disabled": "Arp \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e",
|
||||||
"BackDevices_Arpscan_enabled": "Arp сканирование разрешено",
|
"BackDevices_Arpscan_enabled": "Arp \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e",
|
||||||
"BackDevices_Backup_CopError": "Оригинальную базу данных не удалось сохранить.",
|
"BackDevices_Backup_CopError": "\u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c.",
|
||||||
"BackDevices_Backup_Failed": "Резервное копирование выполнено частично. Архив не может быть создан или пуст.",
|
"BackDevices_Backup_Failed": "\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e. \u0410\u0440\u0445\u0438\u0432 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d \u0438\u043b\u0438 \u043f\u0443\u0441\u0442.",
|
||||||
"BackDevices_Backup_okay": "Резервное копирование успешно выполнено с новым архивом",
|
"BackDevices_Backup_okay": "\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0441 \u043d\u043e\u0432\u044b\u043c \u0430\u0440\u0445\u0438\u0432\u043e\u043c",
|
||||||
"BackDevices_DBTools_DelDevError_a": "Ошибка удаления устройства",
|
"BackDevices_DBTools_DelDevError_a": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430",
|
||||||
"BackDevices_DBTools_DelDevError_b": "Ошибка удаления устройств",
|
"BackDevices_DBTools_DelDevError_b": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432",
|
||||||
"BackDevices_DBTools_DelDev_a": "Устройство удалено",
|
"BackDevices_DBTools_DelDev_a": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u043e",
|
||||||
"BackDevices_DBTools_DelDev_b": "Устройства удалены",
|
"BackDevices_DBTools_DelDev_b": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u044b",
|
||||||
"BackDevices_DBTools_DelEvents": "События удалены",
|
"BackDevices_DBTools_DelEvents": "\u0421\u043e\u0431\u044b\u0442\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u044b",
|
||||||
"BackDevices_DBTools_DelEventsError": "Ошибка удаления событий",
|
"BackDevices_DBTools_DelEventsError": "\u041e\u0448\u0438\u0431\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439",
|
||||||
"BackDevices_DBTools_ImportCSV": "Устройства из файла CSV были успешно импортированы.",
|
"BackDevices_DBTools_ImportCSV": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 CSV \u0431\u044b\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b.",
|
||||||
"BackDevices_DBTools_ImportCSVError": "Не удалось импортировать файл CSV. Убедитесь, что формат правильный.",
|
"BackDevices_DBTools_ImportCSVError": "\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u0439\u043b CSV. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439.",
|
||||||
"BackDevices_DBTools_ImportCSVMissing": "CSV-файл не найден в<b>/config/devices.csv.</b>",
|
"BackDevices_DBTools_ImportCSVMissing": "CSV-\u0444\u0430\u0439\u043b \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0432<b>/config/devices.csv.</b>",
|
||||||
"BackDevices_DBTools_Purge": "Самые старые резервные копии были удалены",
|
"BackDevices_DBTools_Purge": "\u0421\u0430\u043c\u044b\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 \u0431\u044b\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u044b",
|
||||||
"BackDevices_DBTools_UpdDev": "Устройство успешно обновлено",
|
"BackDevices_DBTools_UpdDev": "\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u043e",
|
||||||
"BackDevices_DBTools_UpdDevError": "Ошибка обновления устройства",
|
"BackDevices_DBTools_UpdDevError": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430",
|
||||||
"BackDevices_DBTools_Upgrade": "База данных успешно обновлена",
|
"BackDevices_DBTools_Upgrade": "\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0430",
|
||||||
"BackDevices_DBTools_UpgradeError": "Обновление базы данных не удалось",
|
"BackDevices_DBTools_UpgradeError": "\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c",
|
||||||
"BackDevices_Device_UpdDevError": "Ошибка обновления устройств. Повторите попытку позже. Вероятно, база данных заблокирована из-за текущей задачи.",
|
"BackDevices_Device_UpdDevError": "\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432. \u041f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u043f\u043e\u0437\u0436\u0435. \u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0438\u0437-\u0437\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438.",
|
||||||
"BackDevices_Restore_CopError": "Исходную базу данных сохранить не удалось.",
|
"BackDevices_Restore_CopError": "\u0418\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.",
|
||||||
"BackDevices_Restore_Failed": "Восстановление не удалось. Пожалуйста, восстановите резервную копию вручную.",
|
"BackDevices_Restore_Failed": "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u0443\u044e \u043a\u043e\u043f\u0438\u044e \u0432\u0440\u0443\u0447\u043d\u0443\u044e.",
|
||||||
"BackDevices_Restore_okay": "Восстановление выполнено успешно.",
|
"BackDevices_Restore_okay": "\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e.",
|
||||||
"BackDevices_darkmode_disabled": "Темный режим отключен",
|
"BackDevices_darkmode_disabled": "\u0422\u0435\u043c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d",
|
||||||
"BackDevices_darkmode_enabled": "Темный режим включен",
|
"BackDevices_darkmode_enabled": "\u0422\u0435\u043c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0432\u043a\u043b\u044e\u0447\u0435\u043d",
|
||||||
"DAYS_TO_KEEP_EVENTS_description": "Это настройка обслуживания. Здесь указывается количество дней, в течение которых будут храниться записи о событиях. Все старые мероприятия будут периодически удаляться. Также применимо к истории событий плагина.",
|
"DAYS_TO_KEEP_EVENTS_description": "\u042d\u0442\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f. \u0417\u0434\u0435\u0441\u044c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0434\u043d\u0435\u0439, \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445. \u0412\u0441\u0435 \u0441\u0442\u0430\u0440\u044b\u0435 \u043c\u0435\u0440\u043e\u043f\u0440\u0438\u044f\u0442\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u044f\u0442\u044c\u0441\u044f. \u0422\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u043e \u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u043b\u0430\u0433\u0438\u043d\u0430.",
|
||||||
"DAYS_TO_KEEP_EVENTS_name": "Удалить события старше",
|
"DAYS_TO_KEEP_EVENTS_name": "\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0441\u0442\u0430\u0440\u0448\u0435",
|
||||||
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> Скопировать данные с устройства",
|
"DevDetail_Copy_Device_Title": "<i class=\"fa fa-copy\"></i> \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430",
|
||||||
"DevDetail_Copy_Device_Tooltip": "Скопируйте данные с устройства из раскрывающегося списка. Все на этой странице будет перезаписано",
|
"DevDetail_Copy_Device_Tooltip": "\u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0439\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438\u0437 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u0430. \u0412\u0441\u0435 \u043d\u0430 \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e",
|
||||||
"DevDetail_EveandAl_AlertAllEvents": "Оповещение обо всех событиях",
|
"DevDetail_EveandAl_AlertAllEvents": "\u041e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0431\u043e \u0432\u0441\u0435\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u0445",
|
||||||
"DevDetail_EveandAl_AlertDown": "Оповещение о доступности",
|
"DevDetail_EveandAl_AlertDown": "\u041e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0435 \u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438",
|
||||||
"DevDetail_EveandAl_Archived": "Архив",
|
"DevDetail_EveandAl_Archived": "\u0410\u0440\u0445\u0438\u0432",
|
||||||
"DevDetail_EveandAl_NewDevice": "Новое устройство",
|
"DevDetail_EveandAl_NewDevice": "\u041d\u043e\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e",
|
||||||
"DevDetail_EveandAl_NewDevice_Tooltip": "Будет показывать статус «Новое» для устройства и включать его в списки, когда фильтр «Новые устройства» активен. Не влияет на уведомления.",
|
"DevDetail_EveandAl_NewDevice_Tooltip": "\u0411\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u00ab\u041d\u043e\u0432\u043e\u0435\u00bb \u0434\u043b\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 \u0444\u0438\u043b\u044c\u0442\u0440 \u00ab\u041d\u043e\u0432\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u00bb \u0430\u043a\u0442\u0438\u0432\u0435\u043d. \u041d\u0435 \u0432\u043b\u0438\u044f\u0435\u0442 \u043d\u0430 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f.",
|
||||||
"DevDetail_EveandAl_RandomMAC": "Случайный MAC-адрес",
|
"DevDetail_EveandAl_RandomMAC": "\u0421\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0439 MAC-\u0430\u0434\u0440\u0435\u0441",
|
||||||
"DevDetail_EveandAl_ScanCycle": "Сканировать устройство",
|
"DevDetail_EveandAl_ScanCycle": "\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e",
|
||||||
"DevDetail_EveandAl_ScanCycle_a": "Сканировать Устройство",
|
"DevDetail_EveandAl_ScanCycle_a": "\u0421\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e",
|
||||||
"DevDetail_EveandAl_ScanCycle_z": "Не сканировать устройство",
|
"DevDetail_EveandAl_ScanCycle_z": "\u041d\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e",
|
||||||
"DevDetail_EveandAl_Skip": "",
|
"DevDetail_EveandAl_Skip": "",
|
||||||
"DevDetail_EveandAl_Title": "",
|
"DevDetail_EveandAl_Title": "",
|
||||||
"DevDetail_Events_CheckBox": "",
|
"DevDetail_Events_CheckBox": "",
|
||||||
@@ -175,6 +175,10 @@
|
|||||||
"DevDetail_button_OverwriteIcons_Warning": "",
|
"DevDetail_button_OverwriteIcons_Warning": "",
|
||||||
"DevDetail_button_Reset": "",
|
"DevDetail_button_Reset": "",
|
||||||
"DevDetail_button_Save": "",
|
"DevDetail_button_Save": "",
|
||||||
|
"Device_MultiEdit": "",
|
||||||
|
"Device_MultiEdit_Backup": "",
|
||||||
|
"Device_MultiEdit_Fields": "",
|
||||||
|
"Device_MultiEdit_Tooltip": "",
|
||||||
"Device_Searchbox": "",
|
"Device_Searchbox": "",
|
||||||
"Device_Shortcut_AllDevices": "",
|
"Device_Shortcut_AllDevices": "",
|
||||||
"Device_Shortcut_Archived": "",
|
"Device_Shortcut_Archived": "",
|
||||||
@@ -268,6 +272,7 @@
|
|||||||
"Gen_Run": "",
|
"Gen_Run": "",
|
||||||
"Gen_Save": "",
|
"Gen_Save": "",
|
||||||
"Gen_Saved": "",
|
"Gen_Saved": "",
|
||||||
|
"Gen_Selected_Devices": "",
|
||||||
"Gen_Switch": "",
|
"Gen_Switch": "",
|
||||||
"Gen_Upd": "",
|
"Gen_Upd": "",
|
||||||
"Gen_Upd_Fail": "",
|
"Gen_Upd_Fail": "",
|
||||||
|
|||||||
Reference in New Issue
Block a user