Web app improvements and support for high SPI screens.

This commit is contained in:
Ylian Saint-Hilaire 2020-12-07 19:13:31 -08:00
parent a7c7ee7e66
commit c99048be13
16 changed files with 184 additions and 208 deletions

View File

@ -3526,7 +3526,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
// Event the node change
var newMesh = parent.meshes[command.meshid];
var event = { etype: 'node', userid: user._id, username: user.name, action: 'nodemeshchange', nodeid: node._id, node: node, oldMeshId: oldMeshId, newMeshId: command.meshid, msgid: 85, msgArgs: [node.name, newMesh.name], msg: 'Moved device ' + node.name + ' to group ' + newMesh.name, domain: domain.id };
if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the mesh. Another event will come.
// Even if change stream is enabled on this server, we still make the nodemeshchange actionable. This is because the DB can't send out a change event that will match this.
parent.parent.DispatchEvent(parent.CreateMeshDispatchTargets(command.meshid, [oldMeshId, node._id]), obj, event);
// Send response if required

BIN
public/images/icons100.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
public/images/icons32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -858,17 +858,17 @@ NoMeshesPanel img {
box-shadow:none;
}
.deviceBatterySmall1 { background: url(../images/batteries24.png) 0px 0px; }
.deviceBatterySmall2 { background: url(../images/batteries24.png) -14px 0px; }
.deviceBatterySmall3 { background: url(../images/batteries24.png) -28px 0px; }
.deviceBatterySmall4 { background: url(../images/batteries24.png) -42px 0px; }
.deviceBatterySmall5 { background: url(../images/batteries24.png) -56px 0px; }
.deviceBatterySmall6 { background: url(../images/batteries24.png) -70px 0px; }
.deviceBatterySmall7 { background: url(../images/batteries24.png) -84px 0px; }
.deviceBatterySmall8 { background: url(../images/batteries24.png) -98px 0px; }
.deviceBatterySmall9 { background: url(../images/batteries24.png) -112px 0px; }
.deviceBatterySmall10 { background: url(../images/batteries24.png) -126px 0px; }
.deviceBatterySmall11 { background: url(../images/batteries24.png) -140px 0px; }
.deviceBatterySmall1 { background: url(../images/batteries24.png) 0px 0px; background-image: -webkit-image-set(url(../images/batteries24.png) 1x, url(../images/batteries48.png) 2x); }
.deviceBatterySmall2 { background: url(../images/batteries24.png) -14px 0px; background-image: -webkit-image-set(url(../images/batteries24.png) 1x, url(../images/batteries48.png) 2x); }
.deviceBatterySmall3 { background: url(../images/batteries24.png) -28px 0px; background-image: -webkit-image-set(url(../images/batteries24.png) 1x, url(../images/batteries48.png) 2x); }
.deviceBatterySmall4 { background: url(../images/batteries24.png) -42px 0px; background-image: -webkit-image-set(url(../images/batteries24.png) 1x, url(../images/batteries48.png) 2x); }
.deviceBatterySmall5 { background: url(../images/batteries24.png) -56px 0px; background-image: -webkit-image-set(url(../images/batteries24.png) 1x, url(../images/batteries48.png) 2x); }
.deviceBatterySmall6 { background: url(../images/batteries24.png) -70px 0px; background-image: -webkit-image-set(url(../images/batteries24.png) 1x, url(../images/batteries48.png) 2x); }
.deviceBatterySmall7 { background: url(../images/batteries24.png) -84px 0px; background-image: -webkit-image-set(url(../images/batteries24.png) 1x, url(../images/batteries48.png) 2x); }
.deviceBatterySmall8 { background: url(../images/batteries24.png) -98px 0px; background-image: -webkit-image-set(url(../images/batteries24.png) 1x, url(../images/batteries48.png) 2x); }
.deviceBatterySmall9 { background: url(../images/batteries24.png) -112px 0px; background-image: -webkit-image-set(url(../images/batteries24.png) 1x, url(../images/batteries48.png) 2x); }
.deviceBatterySmall10 { background: url(../images/batteries24.png) -126px 0px; background-image: -webkit-image-set(url(../images/batteries24.png) 1x, url(../images/batteries48.png) 2x); }
.deviceBatterySmall11 { background: url(../images/batteries24.png) -140px 0px; background-image: -webkit-image-set(url(../images/batteries24.png) 1x, url(../images/batteries48.png) 2x); }
.deviceNotifyLargeDot {
position:absolute;
@ -1303,6 +1303,7 @@ a {
.i1 {
background: url(../images/icons50.png) 0px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
cursor: pointer;
@ -1311,6 +1312,7 @@ a {
.i2 {
background: url(../images/icons50.png) -50px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
cursor: pointer;
@ -1319,6 +1321,7 @@ a {
.i3 {
background: url(../images/icons50.png) -100px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
cursor: pointer;
@ -1327,6 +1330,7 @@ a {
.i4 {
background: url(../images/icons50.png) -150px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
cursor: pointer;
@ -1335,6 +1339,7 @@ a {
.i5 {
background: url(../images/icons50.png) -200px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
cursor: pointer;
@ -1343,6 +1348,7 @@ a {
.i6 {
background: url(../images/icons50.png) -250px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
cursor: pointer;
@ -1351,6 +1357,7 @@ a {
.i7 {
background: url(../images/icons50.png) -300px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
cursor: pointer;
@ -1359,6 +1366,7 @@ a {
.i8 {
background: url(../images/icons50.png) -350px 0px;
background-image: -webkit-image-set(url(../images/icons50.png) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
cursor: pointer;
@ -1367,6 +1375,7 @@ a {
.j1 {
background: url(../images/icons16.png) 0px 0px;
background-image: -webkit-image-set(url(../images/webp/icons16.webp) 1x, url(../images/webp/icons32.webp) 2x);
height: 16px;
width: 16px;
cursor: pointer;
@ -1375,6 +1384,7 @@ a {
.j2 {
background: url(../images/icons16.png) -16px 0px;
background-image: -webkit-image-set(url(../images/webp/icons16.webp) 1x, url(../images/webp/icons32.webp) 2x);
height: 16px;
width: 16px;
cursor: pointer;
@ -1383,6 +1393,7 @@ a {
.j3 {
background: url(../images/icons16.png) -32px 0px;
background-image: -webkit-image-set(url(../images/webp/icons16.webp) 1x, url(../images/webp/icons32.webp) 2x);
height: 16px;
width: 16px;
cursor: pointer;
@ -1391,6 +1402,7 @@ a {
.j4 {
background: url(../images/icons16.png) -48px 0px;
background-image: -webkit-image-set(url(../images/webp/icons16.webp) 1x, url(../images/webp/icons32.webp) 2x);
height: 16px;
width: 16px;
cursor: pointer;
@ -1399,6 +1411,7 @@ a {
.j5 {
background: url(../images/icons16.png) -64px 0px;
background-image: -webkit-image-set(url(../images/webp/icons16.webp) 1x, url(../images/webp/icons32.webp) 2x);
height: 16px;
width: 16px;
cursor: pointer;
@ -1407,6 +1420,7 @@ a {
.j6 {
background: url(../images/icons16.png) -80px 0px;
background-image: -webkit-image-set(url(../images/webp/icons16.webp) 1x, url(../images/webp/icons32.webp) 2x);
height: 16px;
width: 16px;
cursor: pointer;
@ -1415,6 +1429,7 @@ a {
.j7 {
background: url(../images/icons16.png) -96px 0px;
background-image: -webkit-image-set(url(../images/webp/icons16.webp) 1x, url(../images/webp/icons32.webp) 2x);
height: 16px;
width: 16px;
cursor: pointer;
@ -1423,6 +1438,7 @@ a {
.j8 {
background: url(../images/icons16.png) -112px 0px;
background-image: -webkit-image-set(url(../images/webp/icons16.webp) 1x, url(../images/webp/icons32.webp) 2x);
height: 16px;
width: 16px;
cursor: pointer;
@ -1469,6 +1485,7 @@ a {
.lb1 {
background: url(../images/leftbar-64.png) -1px -2px;
background-image: -webkit-image-set(url(../images/webp/leftbar-64.webp) 1x, url(../images/webp/leftbar-128.webp) 2x);
height: 62px;
width: 62px;
cursor: pointer;
@ -1480,6 +1497,7 @@ a {
.lb2 {
background: url(../images/leftbar-64.png) -66px -2px;
background-image: -webkit-image-set(url(../images/webp/leftbar-64.webp) 1x, url(../images/webp/leftbar-128.webp) 2x);
height: 62px;
width: 62px;
cursor: pointer;
@ -1491,6 +1509,7 @@ a {
.lb3 {
background: url(../images/leftbar-64.png) -130px -2px;
background-image: -webkit-image-set(url(../images/webp/leftbar-64.webp) 1x, url(../images/webp/leftbar-128.webp) 2x);
height: 62px;
width: 62px;
cursor: pointer;
@ -1502,6 +1521,7 @@ a {
.lb4 {
background: url(../images/leftbar-64.png) -194px -2px;
background-image: -webkit-image-set(url(../images/webp/leftbar-64.webp) 1x, url(../images/webp/leftbar-128.webp) 2x);
height: 62px;
width: 62px;
cursor: pointer;
@ -1513,6 +1533,7 @@ a {
.lb5 {
background: url(../images/leftbar-64.png) -257px -2px;
background-image: -webkit-image-set(url(../images/webp/leftbar-64.webp) 1x, url(../images/webp/leftbar-128.webp) 2x);
height: 62px;
width: 62px;
cursor: pointer;
@ -1524,6 +1545,7 @@ a {
.lb6 {
background: url(../images/leftbar-64.png) -318px -2px;
background-image: -webkit-image-set(url(../images/webp/leftbar-64.webp) 1x, url(../images/webp/leftbar-128.webp) 2x);
height: 62px;
width: 62px;
cursor: pointer;
@ -1583,6 +1605,7 @@ a {
.si1 {
background: url(../images/icons16.png) 0px 0px;
background-image: -webkit-image-set(url(../images/icons16.png) 1x, url(../images/icons32.png) 2x);
height: 16px;
width: 16px;
border: none;
@ -1591,6 +1614,7 @@ a {
.si2 {
background: url(../images/icons16.png) -16px 0px;
background-image: -webkit-image-set(url(../images/icons16.png) 1x, url(../images/icons32.png) 2x);
height: 16px;
width: 16px;
border: none;
@ -1599,6 +1623,7 @@ a {
.si3 {
background: url(../images/icons16.png) -32px 0px;
background-image: -webkit-image-set(url(../images/icons16.png) 1x, url(../images/icons32.png) 2x);
height: 16px;
width: 16px;
border: none;
@ -1607,6 +1632,7 @@ a {
.si4 {
background: url(../images/icons16.png) -48px 0px;
background-image: -webkit-image-set(url(../images/icons16.png) 1x, url(../images/icons32.png) 2x);
height: 16px;
width: 16px;
border: none;
@ -1615,6 +1641,7 @@ a {
.si5 {
background: url(../images/icons16.png) -64px 0px;
background-image: -webkit-image-set(url(../images/icons16.png) 1x, url(../images/icons32.png) 2x);
height: 16px;
width: 16px;
border: none;
@ -1623,6 +1650,7 @@ a {
.si6 {
background: url(../images/icons16.png) -80px 0px;
background-image: -webkit-image-set(url(../images/icons16.png) 1x, url(../images/icons32.png) 2x);
height: 16px;
width: 16px;
border: none;
@ -1631,6 +1659,7 @@ a {
.si7 {
background: url(../images/icons16.png) -96px 0px;
background-image: -webkit-image-set(url(../images/icons16.png) 1x, url(../images/icons32.png) 2x);
height: 16px;
width: 16px;
border: none;
@ -1639,6 +1668,7 @@ a {
.si8 {
background: url(../images/icons16.png) -112px 0px;
background-image: -webkit-image-set(url(../images/icons16.png) 1x, url(../images/icons32.png) 2x);
height: 16px;
width: 16px;
border: none;
@ -1647,6 +1677,7 @@ a {
.mi {
background: url(../images/meshicon50.png) 0px 0px;
background-image: -webkit-image-set(url(../images/meshicon50.png) 1x, url(../images/meshicon100.png) 2x);
height: 50px;
width: 50px;
cursor: pointer;

View File

@ -2392,7 +2392,7 @@
"zh-chs": "AMT",
"zh-cht": "AMT",
"xloc": [
"default.handlebars->29->219",
"default.handlebars->29->244",
"default.handlebars->29->430"
]
},
@ -3214,7 +3214,7 @@
"default.handlebars->29->1482",
"default.handlebars->29->1886",
"default.handlebars->29->2004",
"default.handlebars->29->239"
"default.handlebars->29->224"
]
},
{
@ -3855,7 +3855,7 @@
"zh-chs": "地址",
"zh-cht": "地址",
"xloc": [
"default.handlebars->29->235"
"default.handlebars->29->220"
]
},
{
@ -4064,7 +4064,7 @@
"default-mobile.handlebars->9->250",
"default.handlebars->29->1545",
"default.handlebars->29->1553",
"default.handlebars->29->215",
"default.handlebars->29->240",
"default.handlebars->29->426",
"default.handlebars->container->column_l->p15->consoleTable->1->6->1->1->1->0->p15outputselecttd->p15outputselect->1"
]
@ -6314,7 +6314,7 @@
"zh-cht": "CIRA",
"xloc": [
"default-mobile.handlebars->9->204",
"default.handlebars->29->217",
"default.handlebars->29->242",
"default.handlebars->29->428"
]
},
@ -7530,7 +7530,7 @@
"nl": "Wis zoekfilter",
"xloc": [
"default-mobile.handlebars->9->154",
"default.handlebars->29->229"
"default.handlebars->29->214"
]
},
{
@ -8919,8 +8919,8 @@
"default-mobile.handlebars->9->2",
"default-mobile.handlebars->9->337",
"default-mobile.handlebars->9->37",
"default.handlebars->29->245",
"default.handlebars->29->248",
"default.handlebars->29->230",
"default.handlebars->29->233",
"default.handlebars->29->277",
"default.handlebars->29->9",
"default.handlebars->29->945",
@ -9028,7 +9028,7 @@
"xloc": [
"default-mobile.handlebars->9->255",
"default.handlebars->29->1556",
"default.handlebars->29->236",
"default.handlebars->29->221",
"default.handlebars->29->616",
"default.handlebars->container->column_l->p21->3->1->meshConnChartDiv->1"
]
@ -9666,7 +9666,7 @@
"zh-chs": "创建一个新的设备组。",
"zh-cht": "創建一個新的裝置群。",
"xloc": [
"default.handlebars->29->238"
"default.handlebars->29->223"
]
},
{
@ -11614,7 +11614,7 @@
"xloc": [
"default-mobile.handlebars->9->160",
"default-mobile.handlebars->9->216",
"default.handlebars->29->213",
"default.handlebars->29->238",
"default.handlebars->29->545"
]
},
@ -11862,7 +11862,7 @@
"xloc": [
"default-mobile.handlebars->9->159",
"default-mobile.handlebars->9->215",
"default.handlebars->29->212",
"default.handlebars->29->237",
"default.handlebars->29->544"
]
},
@ -12134,9 +12134,9 @@
"default-mobile.handlebars->9->1",
"default-mobile.handlebars->container->page_content->column_l->p10->p10desktop->deskarea1->1->3->deskstatus",
"default-mobile.handlebars->container->page_content->column_l->p10->p10files->p13toolbar->1->0->1->3->p13Status",
"default.handlebars->29->224",
"default.handlebars->29->244",
"default.handlebars->29->247",
"default.handlebars->29->229",
"default.handlebars->29->232",
"default.handlebars->29->249",
"default.handlebars->29->276",
"default.handlebars->29->8",
"default.handlebars->container->column_l->p11->deskarea0->deskarea1->3->deskstatus",
@ -12543,7 +12543,7 @@
"zh-chs": "下载MeshCentral Router一个TCP端口映射工具。",
"zh-cht": "下載MeshCentral Router一個TCP端口映射工具。",
"xloc": [
"default.handlebars->29->242"
"default.handlebars->29->227"
]
},
{
@ -12583,7 +12583,7 @@
"zh-chs": "下载MeshCmd这是一个多功能的指令执行工具。",
"zh-cht": "下載MeshCmd這是一個多功能的指令執行工具。",
"xloc": [
"default.handlebars->29->240"
"default.handlebars->29->225"
]
},
{
@ -18029,8 +18029,8 @@
"xloc": [
"default-mobile.handlebars->9->148",
"default.handlebars->29->209",
"default.handlebars->29->225",
"default.handlebars->29->226"
"default.handlebars->29->210",
"default.handlebars->29->211"
]
},
{
@ -18410,7 +18410,7 @@
"zh-chs": "英特尔®AMT CIRA已连接并可以使用。",
"zh-cht": "Intel® AMT CIRA已連接並可以使用。",
"xloc": [
"default.handlebars->29->216",
"default.handlebars->29->241",
"default.handlebars->29->427",
"default.handlebars->29->608"
]
@ -18701,7 +18701,7 @@
"zh-chs": "英特尔®AMT是可路由的。",
"zh-cht": "Intel® AMT是可路由的。",
"xloc": [
"default.handlebars->29->218",
"default.handlebars->29->243",
"default.handlebars->29->429"
]
},
@ -22004,7 +22004,7 @@
"default-mobile.handlebars->9->254",
"default.handlebars->29->1028",
"default.handlebars->29->1029",
"default.handlebars->29->223",
"default.handlebars->29->248",
"default.handlebars->29->434",
"default.handlebars->29->615",
"default.handlebars->container->column_l->p15->consoleTable->1->6->1->1->1->0->p15outputselecttd->p15outputselect->3"
@ -22109,7 +22109,7 @@
"zh-chs": "与设备的MQTT连接已激活。",
"zh-cht": "與裝置的MQTT連接已啟動。",
"xloc": [
"default.handlebars->29->222",
"default.handlebars->29->247",
"default.handlebars->29->433",
"default.handlebars->29->614"
]
@ -22902,7 +22902,7 @@
"zh-chs": "已连接网状代理并准备使用。",
"zh-cht": "已連接Mesh Agent並準備使用。",
"xloc": [
"default.handlebars->29->214",
"default.handlebars->29->239",
"default.handlebars->29->425",
"default.handlebars->29->606"
]
@ -22924,7 +22924,7 @@
"zh-chs": "网格代理可以经过其他代理作为中继访问得到。",
"zh-cht": "Mesh Agent可以經過其他代理作為中繼訪問得到。",
"xloc": [
"default.handlebars->29->220",
"default.handlebars->29->245",
"default.handlebars->29->431",
"default.handlebars->29->612"
]
@ -23170,7 +23170,7 @@
"zh-chs": "MeshCmd",
"zh-cht": "MeshCmd",
"xloc": [
"default.handlebars->29->241",
"default.handlebars->29->226",
"default.handlebars->29->639",
"default.handlebars->29->819"
]
@ -24745,7 +24745,7 @@
"zh-chs": "此网格中没有英特尔®AMT设备",
"zh-cht": "此網格中沒有Intel® AMT裝置",
"xloc": [
"default.handlebars->29->230"
"default.handlebars->29->215"
]
},
{
@ -25031,7 +25031,7 @@
"zh-chs": "没有一个设备被加入任何一组,请单击一个设备的“组”以添加到一个组中。",
"zh-cht": "沒有一個裝置被加入任何一群,請單擊一個裝置的“群”以新增到一個群中。",
"xloc": [
"default.handlebars->29->227"
"default.handlebars->29->212"
]
},
{
@ -25130,7 +25130,7 @@
"zh-cht": "該群中沒有裝置",
"xloc": [
"default-mobile.handlebars->9->151",
"default.handlebars->29->232"
"default.handlebars->29->217"
]
},
{
@ -25152,7 +25152,7 @@
"xloc": [
"default-mobile.handlebars->9->149",
"default-mobile.handlebars->9->153",
"default.handlebars->29->228"
"default.handlebars->29->213"
]
},
{
@ -25172,7 +25172,7 @@
"zh-chs": "找不到带有标签的设备。",
"zh-cht": "找不到帶有標籤的裝置。",
"xloc": [
"default.handlebars->29->237"
"default.handlebars->29->222"
]
},
{
@ -25490,8 +25490,8 @@
"default.handlebars->29->1945",
"default.handlebars->29->1949",
"default.handlebars->29->1961",
"default.handlebars->29->210",
"default.handlebars->29->211",
"default.handlebars->29->235",
"default.handlebars->29->236",
"default.handlebars->29->546",
"default.handlebars->29->557",
"default.handlebars->29->558",
@ -28875,7 +28875,7 @@
"zh-cht": "中繼",
"xloc": [
"default-mobile.handlebars->9->206",
"default.handlebars->29->221",
"default.handlebars->29->246",
"default.handlebars->29->432"
]
},
@ -30662,7 +30662,7 @@
"zh-chs": "路由器",
"zh-cht": "路由器",
"xloc": [
"default.handlebars->29->243"
"default.handlebars->29->228"
]
},
{
@ -32875,8 +32875,8 @@
"xloc": [
"default-mobile.handlebars->9->3",
"default.handlebars->29->10",
"default.handlebars->29->246",
"default.handlebars->29->249",
"default.handlebars->29->231",
"default.handlebars->29->234",
"default.handlebars->29->278",
"desktop.handlebars->3->3",
"terminal.handlebars->3->3",
@ -38257,7 +38257,7 @@
"default.handlebars->29->1745",
"default.handlebars->29->1884",
"default.handlebars->29->2067",
"default.handlebars->29->234",
"default.handlebars->29->219",
"default.handlebars->29->671"
]
},
@ -41188,8 +41188,8 @@
"zh-chs": "加一",
"zh-cht": "加一",
"xloc": [
"default.handlebars->29->231",
"default.handlebars->29->233"
"default.handlebars->29->216",
"default.handlebars->29->218"
]
},
{

View File

@ -52,6 +52,7 @@
.i1 {
background: url(../images/icons50.png) 0px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
border: none;
@ -59,6 +60,7 @@
.i2 {
background: url(../images/icons50.png) -50px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
border: none;
@ -66,6 +68,7 @@
.i3 {
background: url(../images/icons50.png) -100px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
border: none;
@ -73,6 +76,7 @@
.i4 {
background: url(../images/icons50.png) -150px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
border: none;
@ -80,6 +84,7 @@
.i5 {
background: url(../images/icons50.png) -200px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
border: none;
@ -87,6 +92,7 @@
.i6 {
background: url(../images/icons50.png) -250px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
border: none;
@ -94,6 +100,7 @@
.i7 {
background: url(../images/icons50.png) -300px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
border: none;
@ -101,6 +108,7 @@
.i8 {
background: url(../images/icons50.png) -350px 0px;
background-image: -webkit-image-set(url(../images/webp/icons50.webp) 1x, url(../images/webp/icons100.webp) 2x);
height: 50px;
width: 50px;
border: none;
@ -146,15 +154,15 @@
float: left;
}
.NotifyIconSmall1 { width:24px; height:24px; background: url(../images/notify24.png) 0px 0px; }
.NotifyIconSmall2 { width:24px; height:24px; background: url(../images/notify24.png) -24px 0px; }
.NotifyIconSmall3 { width:24px; height:24px; background: url(../images/notify24.png) -48px 0px; }
.NotifyIconSmall4 { width:24px; height:24px; background: url(../images/notify24.png) -72px 0px; }
.NotifyIconSmall5 { width:24px; height:24px; background: url(../images/notify24.png) -96px 0px; }
.NotifyIconSmall6 { width:24px; height:24px; background: url(../images/notify24.png) -120px 0px; }
.NotifyIconSmall7 { width:24px; height:24px; background: url(../images/notify24.png) -144px 0px; }
.NotifyIconSmall8 { width:24px; height:24px; background: url(../images/notify24.png) -168px 0px; }
.NotifyIconSmall9 { width:24px; height:24px; background: url(../images/notify24.png) -192px 0px; }
.NotifyIconSmall1 { width:24px; height:24px; background: url(../images/notify24.png) 0px 0px; background-image: -webkit-image-set(url(../images/webp/notify24.webp) 1x, url(../images/webp/notify48.webp) 2x); }
.NotifyIconSmall2 { width:24px; height:24px; background: url(../images/notify24.png) -24px 0px; background-image: -webkit-image-set(url(../images/webp/notify24.webp) 1x, url(../images/webp/notify48.webp) 2x); }
.NotifyIconSmall3 { width:24px; height:24px; background: url(../images/notify24.png) -48px 0px; background-image: -webkit-image-set(url(../images/webp/notify24.webp) 1x, url(../images/webp/notify48.webp) 2x); }
.NotifyIconSmall4 { width:24px; height:24px; background: url(../images/notify24.png) -72px 0px; background-image: -webkit-image-set(url(../images/webp/notify24.webp) 1x, url(../images/webp/notify48.webp) 2x); }
.NotifyIconSmall5 { width:24px; height:24px; background: url(../images/notify24.png) -96px 0px; background-image: -webkit-image-set(url(../images/webp/notify24.webp) 1x, url(../images/webp/notify48.webp) 2x); }
.NotifyIconSmall6 { width:24px; height:24px; background: url(../images/notify24.png) -120px 0px; background-image: -webkit-image-set(url(../images/webp/notify24.webp) 1x, url(../images/webp/notify48.webp) 2x); }
.NotifyIconSmall7 { width:24px; height:24px; background: url(../images/notify24.png) -144px 0px; background-image: -webkit-image-set(url(../images/webp/notify24.webp) 1x, url(../images/webp/notify48.webp) 2x); }
.NotifyIconSmall8 { width:24px; height:24px; background: url(../images/notify24.png) -168px 0px; background-image: -webkit-image-set(url(../images/webp/notify24.webp) 1x, url(../images/webp/notify48.webp) 2x); }
.NotifyIconSmall9 { width:24px; height:24px; background: url(../images/notify24.png) -192px 0px; background-image: -webkit-image-set(url(../images/webp/notify24.webp) 1x, url(../images/webp/notify48.webp) 2x); }
.gray {
/*filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#grayscale");*/ /* Firefox 10+, Firefox on Android */
@ -442,7 +450,7 @@
<div id=xdevicesBar style="position:absolute;overflow-y:auto;height:34px;left:0;right:0;bottom:0px;background-color:#aaa">
<div style="margin:4px">
<span style="width:20px;display:inline-block;text-align:center;cursor:pointer;font-size:16px" onclick=clearSearchInput()><b>X</b></span>
<input id=SearchInput type=text placeholder=Filter onchange=onDeviceSearchChanged(event) onkeyup=onDeviceSearchChanged(event) autocomplete=off style="padding:2px;margin:0;height:20px" />&nbsp;
<input id=SearchInput autocomplete=off type=search placeholder=Filter onchange=onDeviceSearchChanged(event) onkeyup=onDeviceSearchChanged(event) style="padding:2px;margin:0;height:20px" />&nbsp;
<label class=noselect><input type=checkbox id=RealNameCheckBox onclick=onRealNameCheckBox() />OS Name</label>
<label class=noselect><input type=checkbox id=OnlineCheckBox onclick=onOnlineCheckBox(event) />Online</label>
</div>
@ -2359,9 +2367,7 @@
var onDevicesTouchActive = false;
var onDevicesScrollnagleTimer = null;
function onDevicesScroll() {
if (onDevicesScrollnagleTimer != null) { clearTimeout(onDevicesScrollnagleTimer); onDevicesScrollnagleTimer = null; }
if (onDevicesTouchActive) return;
onDevicesScrollnagleTimer = setTimeout(onDevicesScrollEx, 50);
if (onDevicesScrollnagleTimer == null) { onDevicesScrollnagleTimer = setTimeout(onDevicesScrollEx, 250); }
}
function onDeviceTouch(x) {
@ -4021,7 +4027,7 @@
var m = hardware.windows.osinfo;
if (m.OSArchitecture) { x += addDetailItem("Architecture", EscapeHtml(m.OSArchitecture), s); }
}
if (x != '') { sections.push({ name: "Operating System", html: x, img: 'software32.png' }); }
if (x != '') { sections.push({ name: "Operating System", html: x, img: 'software' }); }
}
// MeshAgent
@ -4052,7 +4058,7 @@
}
}
}
if (x != '') { sections.push({ name: "Mesh Agent", html: x, img: 'meshagent32.png' }); }
if (x != '') { sections.push({ name: "Mesh Agent", html: x, img: 'meshagent' }); }
}
// Networking
@ -4094,7 +4100,7 @@
x += '</div>';
}
x += '</table>';
if (x != '') { sections.push({ name: "Networking", html: x, img: 'networking64.png' }); }
if (x != '') { sections.push({ name: "Networking", html: x, img: 'networking' }); }
}
// Attribute: Intel AMT
@ -4107,7 +4113,7 @@
x += addDetailItem("Provisioning State", ((node.intelamt.state) ? (provisioningStates[node.intelamt.state]) : ('<i>' + "Unknown" + '</i>')) + provisioningMode, s);
x += addDetailItem("Security", (node.intelamt.tls == 1) ? "Secured using TLS" : "TLS is not setup", s);
x += addDetailItem("Admin Credentials", (node.intelamt.user == null || node.intelamt.user == '') ? "Not Known" : "Known", s);
if (x != '') { sections.push({ name: "Intel&reg; Active Management Technology (Intel&reg; AMT)", html: x, img: 'amt32.png' }); }
if (x != '') { sections.push({ name: "Intel&reg; Active Management Technology (Intel&reg; AMT)", html: x, img: 'amt' }); }
}
if (hardware.identifiers) {
@ -4115,7 +4121,7 @@
// BIOS
if (ident.bios_vendor) { x += addDetailItem("Vendor", EscapeHtml(ident.bios_vendor), s); }
if (ident.bios_version) { x += addDetailItem("Version", EscapeHtml(ident.bios_version), s); }
if (x != '') { sections.push({ name: "BIOS", html: x, img: 'chip32.png' }); }
if (x != '') { sections.push({ name: "BIOS", html: x, img: 'chip' }); }
// Motherboard
x = '';
@ -4126,7 +4132,7 @@
if (ident.product_uuid) { x += addDetailItem("Identifier", EscapeHtml(ident.product_uuid), s); }
if (ident.cpu_name) { x += addDetailItem("CPU", EscapeHtml(ident.cpu_name).split('(TM)').join('&trade;').split('(R)').join('&reg;'), s); }
if (ident.gpu_name) { for (var i in ident.gpu_name) { x += addDetailItem("GPU", EscapeHtml(ident.gpu_name[i]).split('(TM)').join('&trade;').split('(R)').join('&reg;'), s); } }
if (x != '') { sections.push({ name: "Motherboard", html: x, img: 'motherboard32.png' }); }
if (x != '') { sections.push({ name: "Motherboard", html: x, img: 'motherboard' }); }
}
if (hardware.windows) {
@ -4147,7 +4153,7 @@
}
x += '</table>';
if (x != '') { sections.push({ name: "Memory", html: x, img: 'ram32.png' }); }
if (x != '') { sections.push({ name: "Memory", html: x, img: 'ram' }); }
}
}
@ -4174,7 +4180,7 @@
}
x += '</table>';
if (x != '') { sections.push({ name: "Storage", html: x, img: 'storage32.png' }); }
if (x != '') { sections.push({ name: "Storage", html: x, img: 'storage' }); }
}
// Render the sections
@ -4184,7 +4190,7 @@
x += '<div class=DevSt style=margin-bottom:3px;margin-left:4px><b>' + sections[i].name + '</b></div><div style=margin-bottom:10px;margin-left:4px>' + sections[i].html + '</div>';
} else {
x += '<table style=width:100%><tr>';
x += '<td style=width:32px;vertical-align:top><img src=images/details/' + sections[i].img + ' border=0 width=32 /></td>'; // height=12
x += '<td style=width:32px;vertical-align:top><img src=images/details/' + sections[i].img + '32.png srcset="images/details/' + sections[i].img + '64.png 2x" border=0 width=32 /></td>'; // height=12
x += '<td><div class=DevSt style=margin-bottom:3px;margin-left:4px><b>' + sections[i].name + '</b></div><div style=margin-bottom:10px;margin-left:4px>' + sections[i].html + '</div></td>';
x += '</tr></table>';
}

View File

@ -246,7 +246,7 @@
<td id=devListToolbar class=style14 style="display:none">
&nbsp;&nbsp;<input type="button" id="SelectAllButton" onclick="selectallButtonFunction();" value="Select All" />&nbsp;
<input type=button id=GroupActionButton disabled="disabled" value="Group Action" onclick=groupActionFunction() />&nbsp;
<input id=SearchInput type=text placeholder=Filter onchange=onDeviceSearchChanged(event) onkeyup=onDeviceSearchChanged(event) autocomplete=off onfocus=onSearchFocus(1) onblur=onSearchFocus(0) />&nbsp;
<input id=SearchInput type=search autocomplete=off placeholder=Filter onchange=onDeviceSearchChanged(event) onkeyup=onDeviceSearchChanged(event) onfocus=onSearchFocus(1) onblur=onSearchFocus(0) />&nbsp;
<select id=DevFilterSelect onchange=onOnlineCheckBox(event) title="Device Filter">
<option value=0>All</option>
<option value=1>Online</option>
@ -267,10 +267,10 @@
<input type="button" onclick="disconnectAllKvmFunction()" value="Disconnect All" />&nbsp;
<label><input type="checkbox" id="autoConnectDesktopCheckbox" onclick="autoConnectDesktops(event)" title="Automatic connect" />Auto&nbsp;</label>
<input type="button" onclick="showMultiDesktopSettings()" value="Settings" />&nbsp;
<input id=KvmSearchInput type=text placeholder=Filter onchange=onDeviceSearchChanged(event) onkeyup=onDeviceSearchChanged(event) autocomplete=off onfocus=onSearchFocus(1) onblur=onSearchFocus(0) />&nbsp;
<input id=KvmSearchInput type=search placeholder=Filter onchange=onDeviceSearchChanged(event) onkeyup=onDeviceSearchChanged(event) autocomplete=off onfocus=onSearchFocus(1) onblur=onSearchFocus(0) />&nbsp;
</td>
<td id=devMapToolbar class=style14 style="display:none">
&nbsp;&nbsp;<input type=text id=mapSearchLocation placeholder="Search Location" onfocus=onMapSearchFocus(1) onblur=onMapSearchFocus(0) />
&nbsp;&nbsp;<input type=search id=mapSearchLocation placeholder="Search Location" onfocus=onMapSearchFocus(1) onblur=onMapSearchFocus(0) />
<input type=button value=Search title="Search for location" onclick=getSearchLocation() />
<input type=button id=refreshmap title="Reset map view" value=Reset onclick=refreshMap(false,true) />
</td>
@ -411,7 +411,7 @@
<input type=button id=UsersSelectAllButton onclick="p3usersSelectallButtonFunction()" value="Select All" />
<input type=button id=UsersGroupActionButton disabled="disabled" value="Group Action" onclick=p3usersGroupActionFunction() />
<input id=UserNewAccountButton type=button onclick=showCreateNewAccountDialog() value="New Account..." />
<input id=UserSearchInput type=text style=width:120px;margin-left:6px placeholder=Filter onchange=onUserSearchInputChanged() onkeyup=onUserSearchInputChanged() autocomplete=off onfocus=onUserSearchFocus(1) onblur=onUserSearchFocus(0) />
<input id=UserSearchInput type=search style=width:120px;margin-left:6px placeholder=Filter onchange=onUserSearchInputChanged() onkeyup=onUserSearchInputChanged() autocomplete=off onfocus=onUserSearchFocus(1) onblur=onUserSearchFocus(0) />
</div>
</td>
<td class="h2"></td>
@ -1299,7 +1299,6 @@
var logoutControls = JSON.parse(decodeURIComponent('{{{logoutControls}}}'));
var authCookieRenewTimer = null;
var multiDesktop = {};
var multiDesktopFilter = null;
var serverPublicNamePort = '{{{serverDnsName}}}:{{{serverPublicPort}}}';
var amtScanResults = null;
var debugmode = 0;
@ -1329,6 +1328,7 @@
var xtermfit = null;
var xtermResizeTimer = null;
var miscState = {};
var checkedNodeids = {};
// Console Message Display Timers
var p11DeskConsoleMsgTimer = null;
@ -2853,6 +2853,27 @@
if (node.rname) { node.rnamel = node.rname.toLowerCase(); } else { node.rnamel = node.namel; }
if (message.event.node.icon) { node.icon = message.event.node.icon; }
// Check if this device has changed device group
if (message.event.node.meshid != node.meshid) {
if ((meshes[message.event.node.meshid] == null) && ((userinfo.links == null) || (userinfo.links[node._id] == null))) {
// We don't see the new mesh, remove this device
// TODO: Correctly disconnect from this node (Desktop/Terminal/Files...)
if ((currentNode != null) && (currentNode._id == node._id)) {
if ((xxcurrentView >= 10) && (xxcurrentView < 20) && !IsNodeViewable(currentNode)) { currentNode = null; setDialogMode(0); go(1); }
}
var index = -1;
for (var i in nodes) { if (nodes[i]._id == message.event.nodeid) { index = i; break; } }
nodes.splice(index, 1);
mainUpdate(4 | 16);
} else {
// We see the new mesh, move this device
node.meshid = message.event.node.meshid;
node.meshnamel = meshes[message.event.node.meshid]?meshes[message.event.node.meshid].name.toLowerCase():'*';
mainUpdate(1 | 2 | 4);
}
}
// Web page update
updateDeviceViewDevice(node);
mainUpdate(2 | 8 | 16);
@ -2871,7 +2892,9 @@
// We don't see the new mesh, remove this device
// TODO: Correctly disconnect from this node (Desktop/Terminal/Files...)
if ((xxcurrentView >= 10) && (xxcurrentView < 20) && !IsNodeViewable(currentNode)) { currentNode = null; setDialogMode(0); go(1); }
if ((currentNode != null) && (currentNode._id == node._id)) {
if ((xxcurrentView >= 10) && (xxcurrentView < 20) && !IsNodeViewable(currentNode)) { currentNode = null; setDialogMode(0); go(1); }
}
nodes.splice(index, 1);
mainUpdate(4 | 16);
} else {
@ -3441,12 +3464,6 @@
else if (sort == 1) { nodes.sort(powerSort); }
else if (sort == 2) { if (showRealNames == true) { nodes.sort(deviceHostSort); } else { nodes.sort(deviceSort); } }
// Save the list of currently checked nodeid's
var checkedNodeids = [], elements = document.getElementsByClassName('DeviceCheckbox'), checkcount = 0;
for (var i=0;i<elements.length;i++) { if (elements[i].checked) { checkedNodeids.push(elements[i].value); } }
if ((oldviewmode < 3) && (view == 3)) { multiDesktopFilter = checkedNodeids; }
else if ((oldviewmode == 3) && (view < 3)) { checkedNodeids = multiDesktopFilter; }
// Compute the width of the device view.
var totalDeviceViewWidth = Q('column_l').clientWidth - 60;
var deviceBoxWidth = Math.floor(totalDeviceViewWidth / 301);
@ -3525,95 +3542,9 @@
var collapsed = (sort != 3) & (sort != 4) & CollapsedGroups[collapseName];
r += '<tr name=xxdevice2 colname=DevxCol' + collapseName + ' style=height:20px' + (collapsed?';display:none':'') + ' id=xv2' + node._id + '></tr>';
} else if ((view == 3) && (node.conn & 1) && (((meshrights & 8) || (meshrights & 256)) != 0) && ((node.agent.caps & 1) != 0)) { // Check if we have rights and agent is capable of KVM.
if ((multiDesktopFilter) && ((multiDesktopFilter.length == 0) || (multiDesktopFilter.indexOf('devid_' + node._id) >= 0))) {
var title = EscapeHtml(node.name);
if (title.length == 0) { title = '<i>' + "None" + '</i>'; }
if ((node.rname != null) && (node.rname.length > 0)) { title += ' / ' + EscapeHtml(node.rname); }
var name = EscapeHtml(node.name);
if (showRealNames == true && node.rname != null) name = EscapeHtml(node.rname);
if (name.length == 0) { name = '<i>' + "None" + '</i>'; }
// Add device notification icons
var devNotify = '', devNotifySub = '';
// This device is "starred"
if (stars[node._id] == 1) {
if (view == 2) {
devNotifySub += '<img class=deviceNotifySmallDotSub src=images/icon-star-notify-10.png width=10 height=10>';
} else {
devNotifySub += '<img class=deviceNotifyDotSub src=images/icon-star-notify-16.png width=16 height=16>';
}
}
// This device has session information
if (node.sessions != null) {
// Display any agent messages
if (node.sessions.msg != null) {
if (view == 2) {
devNotifySub += '<div onclick=showDeviceMessages(\'' + node._id + '\',null,event) style="width:10;height:10" class=deviceNotifySmallDotSub></div>';
} else {
devNotifySub += '<div onclick=showDeviceMessages(\'' + node._id + '\',null,event) style="width:16;height:16" class=deviceNotifyDotSub>' + Object.keys(node.sessions.msg).length + '</div>';
}
}
// Sessions are active
if ((node.sessions.kvm != null) || (node.sessions.terminal != null) || (node.sessions.files != null) || (node.sessions.tcp != null) || (node.sessions.udp != null)) {
if (view == 2) {
devNotifySub += '<img onclick=showDeviceSessions(\'' + node._id + '\',null,event) class=deviceNotifySmallDotSub src=images/icon-relay-notify10.png width=10 height=10>';
} else {
devNotifySub += '<img onclick=showDeviceSessions(\'' + node._id + '\',null,event) class=deviceNotifyDotSub src=images/icon-relay-notify.png width=16 height=16>';
}
}
// Help is required
if (node.sessions.help != null) {
if (view == 2) {
devNotifySub += '<img onclick=showDeviceHelpRequests(\'' + node._id + '\',null,event) class=deviceNotifySmallDotSub src=images/icon-help-notify-10.png width=10 height=10>';
} else {
devNotifySub += '<img onclick=showDeviceHelpRequests(\'' + node._id + '\',null,event) class=deviceNotifyDotSub src=images/icon-help-notify-16.png width=16 height=16>';
}
}
// Battery state
if ((node.sessions.battery != null) && (view == 1)) {
var bat = node.sessions.battery;
var statestr = '';
if (bat.state == 'ac') { statestr = "Device is plugged-in"; }
if (bat.state == 'dc') { statestr = "Device is battery powered"; }
var levelstr = '', levelnum = -1;
if ((typeof bat.level == 'number') && (bat.level >= 0) && (bat.level <= 100)) {
levelstr = bat.level + '%';
levelnum = (Math.floor((bat.level + 10) / 25) + 1);
if (levelnum > 5) { lvl = 5; }
if (bat.state == 'ac') { if (bat.level == 100) { levelnum = 11; } else { levelnum += 5; } }
}
if (levelnum > 0) {
devNotify += '<div class="deviceBatterySmall deviceBatterySmall' + levelnum + '" title="' + ((statestr != null)?(statestr + ', ' + levelstr):levelstr) + '"></div>';
}
}
}
// Add any device icons
if (devNotifySub != '') {
if (view == 2) {
devNotify += '<div class=deviceNotifySmallDot>' + devNotifySub + '</div>';
} else {
devNotify += '<div class=deviceNotifyDot>' + devNotifySub + '</div>';
}
}
// Node
var icon = node.icon;
if ((!node.conn) || (node.conn == 0)) { icon += ' gray'; }
// Draw the device and canvas
r += '<div id=devs cmenu=devsContentMenu style=display:inline-block;position:relative;margin:1px;background-color:lightgray;border-radius:5px;position:relative><div tabindex=0 style=padding:3px;cursor:pointer onclick=gotoDevice(\'' + node._id + '\',11,null,event) onkeypress="if (event.key==\'Enter\') gotoDevice(\'' + node._id + '\',11,null,event)">' + devNotify;
//r += '<input class="' + node.meshid + ' DeviceCheckbox" onclick=p1updateInfo() value=devid_' + node._id + ' type=checkbox style=float:left>';
r += '<div class="j' + icon + '" style=width:16px;float:left></div>&nbsp;' + name + '</div>';
r += '<span onclick=gotoDevice(\'' + node._id + '\',null,null,event)></span><div id=xkvmid_' + node._id.split('/')[2] + '><div id=skvmid_' + node._id.split('/')[2] + ' tabindex=0 style="position:absolute;color:white;left:5px;top:27px;text-shadow:0px 0px 5px #000;z-index:1000;cursor:default" onclick=toggleKvmDevice(\'' + node._id + '\') onkeypress="if (event.key==\'Enter\') toggleKvmDevice(\'' + node._id + '\')">' + "Disconnected" + '</div></div>';
r += '</div>';
// Draw the device (TODO: See if we can replace this with a standin in the future)
if ((Object.keys(checkedNodeids).length == 0) || checkedNodeids[node._id]) {
r += updateDeviceViewHtml(3, null, node);
kvmDivs.push(node._id);
}
}
@ -3741,10 +3672,6 @@
QH('xdevices', r);
deviceHeaderSet();
// Re-check nodeid's
var elements = document.getElementsByClassName('DeviceCheckbox'), checkcount = 0;
if (checkedNodeids) { for (var i=0;i<elements.length;i++) { elements[i].checked = (checkedNodeids.indexOf(elements[i].value) >= 0); } }
for (var i in deviceHeaders) { QH(i, deviceHeaders[i]); }
for (var i in deviceHeadersTitles) { Q(i).title = deviceHeadersTitles[i]; }
p1updateInfo();
@ -3835,7 +3762,7 @@
}
function onDevicesScrollEx() {
onDevicesScrollnagleTimer = null;
if (onDevicesScrollnagleTimer != null) { clearTimeout(onDevicesScrollnagleTimer); onDevicesScrollnagleTimer = null; }
var visibleTop = Q('xdevices').scrollTop - 200, visibleBottom = Q('xdevices').scrollTop + Q('xdevices').clientHeight + 200;
var view = Q('viewselect').value, devdivs = document.getElementsByName('xxdevice' + view);
for (var i = 0; i < devdivs.length; i++) {
@ -3855,18 +3782,17 @@
if (typeof node == 'string') { node = getNodeFromId(node); }
if (node == null) return;
var devdiv = Q('xv' + view + node._id);
if (devdiv.innerHTML != '') { updateDeviceViewHtml(view, devdiv, node); } // Only update if the device is visible
if ((devdiv != null) && (devdiv.innerHTML != '')) { updateDeviceViewHtml(view, devdiv, node); } // Only update if the device is visible
}
function updateDeviceViewHtml(view, div, node) {
var deviceBoxWidth = div.clientWidth;
var title = EscapeHtml(node.name);
if (title.length == 0) { title = '<i>' + "None" + '</i>'; }
if ((node.rname != null) && (node.rname.length > 0)) { title += ' / ' + EscapeHtml(node.rname); }
var name = EscapeHtml(node.name);
if (showRealNames == true && node.rname != null) name = EscapeHtml(node.rname);
if (name.length == 0) { name = '<i>' + "None" + '</i>'; }
if (((view == 1) && (div.parentNode.style['display'] == 'none')) || ((view == 2) && (div.style['display'] == 'none'))) { div.innerHTML = ''; return; } // If this section is collapsed, don't render
// Add device notification icons
var devNotify = '', devNotifySub = '';
@ -3944,8 +3870,8 @@
if ((!node.conn) || (node.conn == 0)) { icon += ' gray'; }
if (view == 1) {
div.innerHTML = '<div id=devs cmenu=devsContentMenu onmouseover=devMouseHover(this,1) onmouseout=devMouseHover(this,0) style=width:100%;height:100%><div style=width:22px;height:50%;float:left;padding-top:12px><input class="' + node.meshid + ' DeviceCheckbox" onclick=p1updateInfo() value=devid_' + node._id + ' type=checkbox></div><div style=height:100%;cursor:pointer tabindex=0 onclick=gotoDevice(\'' + node._id + '\',null,null,event) onkeypress="if (event.key==\'Enter\') gotoDevice(\'' + node._id + '\',null,null,event)"><div class="i' + icon + '" style=width:50px;float:left></div><div style=height:100%><div class=g1></div><div class=e2><div class=e1 style=width:' + (deviceBoxWidth - 100) + 'px title="' + title + '">' + name + '</div><div>' + NodeStateStr(node) + '</div></div><div class=g2></div></div></div>' + devNotify + '</div>';
} else {
div.innerHTML = '<div id=devs cmenu=devsContentMenu onmouseover=devMouseHover(this,1) onmouseout=devMouseHover(this,0) style=width:100%;height:100%><div style=width:22px;height:50%;float:left;padding-top:12px><input class="' + node.meshid + ' DeviceCheckbox" onchange=p1devcheck(event) value=devid_' + node._id + ' type=checkbox ' + (checkedNodeids[node._id]?' checked':'') + '></div><div style=height:100%;cursor:pointer tabindex=0 onclick=gotoDevice(\'' + node._id + '\',null,null,event) onkeypress="if (event.key==\'Enter\') gotoDevice(\'' + node._id + '\',null,null,event)"><div class="i' + icon + '" style=width:50px;float:left></div><div style=height:100%><div class=g1></div><div class=e2 style=width:' + ((div.clientWidth) - 100) + 'px><div class=e1 title="' + title + '">' + name + '</div><div>' + NodeStateStr(node) + '</div></div><div class=g2></div></div></div>' + devNotify + '</div>';
} else if (view == 2) {
var states = [];
if (node.conn) {
if ((node.conn & 1) != 0) { states.push('<span title="' + "Mesh agent is connected and ready for use." + '">' + "Agent" + '</span>'); }
@ -3959,18 +3885,21 @@
if (sort == 1) { collapseName = ('pwr:' + (node.pwr?node.pwr:0)); }
else if ((sort == 3) || (sort == 4)) { collapseName = 'tag:**xx**xx*TaG*xx**xx**'; }
var collapsed = (sort != 3) & (sort != 4) & CollapsedGroups[collapseName];
//r += '<tr name=DevxCol' + collapseName + (collapsed?' style=display:none':'') + '><td style=position:relative><div id=devs cmenu=devsContentMenu class=bar18 tabindex=0 onmouseover=devMouseHover(this,1) onmouseout=devMouseHover(this,0) style=height:18px;width:100%;font-size:medium onkeypress="if (event.key==\'Enter\') gotoDevice(\'' + node._id + '\',null,null,event)">';
var r = '<td style=position:relative><div id=devs cmenu=devsContentMenu class=bar18 tabindex=0 onmouseover=devMouseHover(this,1) onmouseout=devMouseHover(this,0) style=height:18px;width:100%;font-size:medium onkeypress="if (event.key==\'Enter\') gotoDevice(\'' + node._id + '\',null,null,event)">';
r += '<div class=deviceBarCheckbox><input class="' + node.meshid + ' DeviceCheckbox" onclick=p1updateInfo() value=devid_' + node._id + ' type=checkbox></div>';
r += '<div class=deviceBarCheckbox><input class="' + node.meshid + ' DeviceCheckbox" value=devid_' + node._id + ' type=checkbox onchange=p1devcheck(event) ' + (checkedNodeids[node._id]?' checked':'') + '></div>';
r += '<div class=deviceBarIcon onclick=gotoDevice(\'' + node._id + '\',null,null,event)><div class="j' + icon + '" style=width:16px;margin-top:1px;margin-left:2px;height:16px></div></div>';
r += '<div class=g1 style=height:18px;float:left></div><div class=g2 style=height:18px;float:right></div>';
r += '<div class=style10 style=cursor:pointer;font-size:14px title="' + title + '" onclick=gotoDevice(\'' + node._id + '\',null,null,event)><span style=width:300px>' + name + '</span></div></div>' + devNotify + '</td>';
r += '<td style=text-align:center>' + getUserShortStr(node);
r += '<td style=text-align:center>' + (node.ip != null ? node.ip : '');
r += '<td style=text-align:center>' + states.join('&nbsp;+&nbsp;');
//r += '<td style=text-align:center>' + (node.pwr != null ? powerStateStrings[node.pwr] : '');
//r += '</tr>';
r += '<td style=text-align:center>' + getUserShortStr(node) + '<td style=text-align:center>' + (node.ip != null ? node.ip : '') + '<td style=text-align:center>' + states.join('&nbsp;+&nbsp;');
div.innerHTML = r;
} else if (view == 3) {
// Draw the device and canvas
var r = '<div id=devs cmenu=devsContentMenu style=display:inline-block;position:relative;margin:1px;background-color:lightgray;border-radius:5px;position:relative><div tabindex=0 style=padding:3px;cursor:pointer onclick=gotoDevice(\'' + node._id + '\',11,null,event) onkeypress="if (event.key==\'Enter\') gotoDevice(\'' + node._id + '\',11,null,event)">' + devNotify;
//r += '<input class="' + node.meshid + ' DeviceCheckbox" onclick=p1updateInfo() value=devid_' + node._id + ' type=checkbox style=float:left>';
r += '<div class="j' + icon + '" style=width:16px;float:left></div>&nbsp;' + name + '</div>';
r += '<span onclick=gotoDevice(\'' + node._id + '\',null,null,event)></span><div id=xkvmid_' + node._id.split('/')[2] + '><div id=skvmid_' + node._id.split('/')[2] + ' tabindex=0 style="position:absolute;color:white;left:5px;top:27px;text-shadow:0px 0px 5px #000;z-index:1000;cursor:default" onclick=toggleKvmDevice(\'' + node._id + '\') onkeypress="if (event.key==\'Enter\') toggleKvmDevice(\'' + node._id + '\')">' + "Disconnected" + '</div></div>';
r += '</div>';
return r;
}
}
@ -4062,6 +3991,7 @@
}
Q('DevxColImg' + id).src = x?'images/c2.png':'images/c1.png';
putstore('_collapse', JSON.stringify(CollapsedGroups));
onDevicesScrollEx();
}
function toggleKvmDevice(node) {
@ -4091,7 +4021,7 @@
var count = 0;
for (var i in nodes) {
var node = nodes[i], nodeid = nodes[i]._id;
if ((multiDesktop[nodeid] == null) && ((multiDesktopFilter.length == 0) || (multiDesktopFilter.indexOf('devid_' + nodeid) >= 0))) {
if ((multiDesktop[nodeid] == null) && ((Object.keys(checkedNodeids).length == 0) || checkedNodeids[nodeid])) {
var rights = GetNodeRights(node);
if ((rights & 8) || (rights & 256)) { // Requires remote control rights or desktop view only rights
//var conn = 0;
@ -4105,7 +4035,7 @@
// Perform connect all
for (var i in nodes) {
if ((nodes[i].v == true) && (multiDesktop[nodes[i]._id] == null) && ((multiDesktopFilter.length == 0) || (multiDesktopFilter.indexOf('devid_' + nodes[i]._id) >= 0))) {
if ((nodes[i].v == true) && (multiDesktop[nodes[i]._id] == null) && ((Object.keys(checkedNodeids).length == 0) || checkedNodeids[nodes[i]._id])) {
toggleKvmDevice(nodes[i]._id);
}
}
@ -4579,16 +4509,23 @@
}
function selectallButtonFunction() {
var elements = document.getElementsByClassName('DeviceCheckbox'), checkcount = 0;
for (var i=0;i<elements.length;i++) { if (elements[i].checked === true) checkcount++; }
for (var i=0;i<elements.length;i++) { elements[i].checked = (checkcount == 0); }
var elements = document.getElementsByClassName('DeviceCheckbox'), checkcount = Object.keys(checkedNodeids).length;
for (var i = 0; i < elements.length; i++) { elements[i].checked = (checkcount == 0); }
checkedNodeids = {};
if (checkcount == 0) {
var devdivs = document.getElementsByName('xxdevice' + Q('viewselect').value);
for (var i = 0; i < devdivs.length; i++) { checkedNodeids[devdivs[i].id.substring(3)] = 1; }
}
p1updateInfo();
}
function p1devcheck(e) {
if (e.srcElement.checked) { checkedNodeids[e.srcElement.value.substring(6)] = 1; } else { delete checkedNodeids[e.srcElement.value.substring(6)]; }
p1updateInfo();
}
function p1updateInfo() {
var elements = document.getElementsByClassName('DeviceCheckbox'), checkcount = 0;
for (var i=0;i<elements.length;i++) { if (elements[i].checked === true) { checkcount++; } }
if (checkcount > 0) {
if (Object.keys(checkedNodeids).length > 0) {
QE('GroupActionButton', true);
Q('SelectAllButton').value = "Select None";
QV('cxmdesktop', true);
@ -4636,16 +4573,13 @@
setDialogMode(2, "Group Action", 3, groupActionFunctionEx, x);
}
// Get the list of checked devices, removes any duplicates.
function getCheckedDevices() {
var nodeids = [], elements = document.getElementsByClassName('DeviceCheckbox'), checkcount = 0;
for (var i=0;i<elements.length;i++) { if (elements[i].checked) { if (elements[i].value) { var nid = elements[i].value.substring(6); if (nodeids.indexOf(nid) == -1) { nodeids.push(nid); } } } }
return nodeids;
}
// Get the list of checked devices
function getCheckedDevices() { return Object.keys(checkedNodeids); }
function uncheckAllDevices() {
var elements = document.getElementsByClassName('DeviceCheckbox');
for (var i=0;i<elements.length;i++) { elements[i].checked = false; }
checkedNodeids = {};
}
function groupActionFunctionEx() {
@ -4778,7 +4712,6 @@
csv += '"' + n._id.split(',').join('') + '","' + n.name.split(',').join('') + '","' + (n.rname?(n.rname.split(',').join('')):'') + '","' + (n.host?(n.host.split(',').join('')):'') + '","' + n.icon + '","' + (n.ip?n.ip:'') + '","' + (n.osdesc?(n.osdesc.split(',').join('')):'') + '","' + n.state + '","' + meshes[n.meshid].name.split(',').join('') + '","' + (n.conn?n.conn:'') + '","' + (n.pwr?n.pwr:'') + '"\r\n';
}
saveAs(new Blob([csv], { type: 'application/octet-stream' }), "devicelist.csv");
uncheckAllDevices();
return false;
}
@ -4786,7 +4719,6 @@
var chkNodeIds = getCheckedDevices(), r = [];
for (var i in chkNodeIds) { r.push(getNodeFromId(chkNodeIds[i])); }
saveAs(new Blob([JSON.stringify(r, null, 2)], { type: 'application/octet-stream' }), "devicelist.json");
uncheckAllDevices();
return false;
}
@ -5001,9 +4933,16 @@
var meshid = contextelement.attributes.onclick.value.substring(10, contextelement.attributes.onclick.value.length - 2);
var elements = document.getElementsByClassName('DeviceCheckbox');
if ((action == 1) || (action == 2)) {
// Change the visible check boxes
for (var i = 0; i < elements.length; i++) {
if ((elements[i].attributes) && (elements[i].attributes['class']['value'].split(' ')[0] == meshid)) { elements[i].checked = (action == 1); }
}
// Update the list of checked nodes
if (action == 1) {
for (var i in nodes) { if (nodes[i].meshid == meshid) { checkedNodeids[nodes[i]._id] = 1; } }
} else if (action == 2) {
for (var i in checkedNodeids) { if (getNodeFromId(i).meshid == meshid) { delete checkedNodeids[i]; } }
}
}
//if (action == 3) { window.location = "multidesktop.aspx?mesh=" + meshid + "&auto=1"; }
p1updateInfo();