diff --git a/meshuser.js b/meshuser.js index 0ec18cb6..ccb4dcd9 100644 --- a/meshuser.js +++ b/meshuser.js @@ -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 diff --git a/public/images/icons100.png b/public/images/icons100.png new file mode 100644 index 00000000..cb2469c5 Binary files /dev/null and b/public/images/icons100.png differ diff --git a/public/images/icons32.png b/public/images/icons32.png new file mode 100644 index 00000000..2cb6df71 Binary files /dev/null and b/public/images/icons32.png differ diff --git a/public/images/leftbar-128.png b/public/images/leftbar-128.png new file mode 100644 index 00000000..55e83c86 Binary files /dev/null and b/public/images/leftbar-128.png differ diff --git a/public/images/webp/icons100.webp b/public/images/webp/icons100.webp new file mode 100644 index 00000000..76563d52 Binary files /dev/null and b/public/images/webp/icons100.webp differ diff --git a/public/images/webp/icons16.webp b/public/images/webp/icons16.webp new file mode 100644 index 00000000..d99cbb45 Binary files /dev/null and b/public/images/webp/icons16.webp differ diff --git a/public/images/webp/icons32.webp b/public/images/webp/icons32.webp new file mode 100644 index 00000000..6fc35558 Binary files /dev/null and b/public/images/webp/icons32.webp differ diff --git a/public/images/webp/icons50.webp b/public/images/webp/icons50.webp new file mode 100644 index 00000000..472f80f0 Binary files /dev/null and b/public/images/webp/icons50.webp differ diff --git a/public/images/webp/leftbar-128.webp b/public/images/webp/leftbar-128.webp new file mode 100644 index 00000000..0ccfe56a Binary files /dev/null and b/public/images/webp/leftbar-128.webp differ diff --git a/public/images/webp/leftbar-64.webp b/public/images/webp/leftbar-64.webp new file mode 100644 index 00000000..31c356ed Binary files /dev/null and b/public/images/webp/leftbar-64.webp differ diff --git a/public/images/webp/notify24.webp b/public/images/webp/notify24.webp new file mode 100644 index 00000000..67f64498 Binary files /dev/null and b/public/images/webp/notify24.webp differ diff --git a/public/images/webp/notify48.webp b/public/images/webp/notify48.webp new file mode 100644 index 00000000..84b7b3da Binary files /dev/null and b/public/images/webp/notify48.webp differ diff --git a/public/styles/style.css b/public/styles/style.css index a0b662d1..6552c314 100644 --- a/public/styles/style.css +++ b/public/styles/style.css @@ -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; diff --git a/translate/translate.json b/translate/translate.json index d7b98bb3..3d041b68 100644 --- a/translate/translate.json +++ b/translate/translate.json @@ -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" ] }, { diff --git a/views/default-mobile.handlebars b/views/default-mobile.handlebars index c104e217..18f13a6a 100644 --- a/views/default-mobile.handlebars +++ b/views/default-mobile.handlebars @@ -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 @@
X -   +  
@@ -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 += '
'; } x += ''; - 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]) : ('' + "Unknown" + '')) + 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® Active Management Technology (Intel® AMT)", html: x, img: 'amt32.png' }); } + if (x != '') { sections.push({ name: "Intel® Active Management Technology (Intel® 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('™').split('(R)').join('®'), s); } if (ident.gpu_name) { for (var i in ident.gpu_name) { x += addDetailItem("GPU", EscapeHtml(ident.gpu_name[i]).split('(TM)').join('™').split('(R)').join('®'), 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 += ''; - 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 += ''; - 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 += '
' + sections[i].name + '
' + sections[i].html + '
'; } else { x += ''; - x += ''; // height=12 + x += ''; // height=12 x += ''; x += '
' + sections[i].name + '
' + sections[i].html + '
'; } diff --git a/views/default.handlebars b/views/default.handlebars index f8185761..ab3c3bd5 100644 --- a/views/default.handlebars +++ b/views/default.handlebars @@ -246,7 +246,7 @@       -   +       -   +   -    +    @@ -411,7 +411,7 @@ - + @@ -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'; } 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 = '' + "None" + ''; } - 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 = '' + "None" + ''; } - - // Add device notification icons - var devNotify = '', devNotifySub = ''; - - // This device is "starred" - if (stars[node._id] == 1) { - if (view == 2) { - devNotifySub += ''; - } else { - devNotifySub += ''; - } - } - - // This device has session information - if (node.sessions != null) { - // Display any agent messages - if (node.sessions.msg != null) { - if (view == 2) { - devNotifySub += '
'; - } else { - devNotifySub += '
' + Object.keys(node.sessions.msg).length + '
'; - } - } - - // 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 += ''; - } else { - devNotifySub += ''; - } - } - - // Help is required - if (node.sessions.help != null) { - if (view == 2) { - devNotifySub += ''; - } else { - devNotifySub += ''; - } - } - - // 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 += '
'; - } - } - } - - // Add any device icons - if (devNotifySub != '') { - if (view == 2) { - devNotify += '
' + devNotifySub + '
'; - } else { - devNotify += '
' + devNotifySub + '
'; - } - } - - // Node - var icon = node.icon; - if ((!node.conn) || (node.conn == 0)) { icon += ' gray'; } - - // Draw the device and canvas - r += '
' + devNotify; - //r += ''; - r += '
 ' + name + '
'; - r += '
' + "Disconnected" + '
'; - r += '
'; + // 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= 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 = '' + "None" + ''; } 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 = '' + "None" + ''; } + 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 = '
' + name + '
' + NodeStateStr(node) + '
' + devNotify + '
'; - } else { + div.innerHTML = '
' + name + '
' + NodeStateStr(node) + '
' + devNotify + '
'; + } else if (view == 2) { var states = []; if (node.conn) { if ((node.conn & 1) != 0) { states.push('' + "Agent" + ''); } @@ -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 += '
'; var r = '
'; - r += '
'; + r += '
'; r += '
'; r += '
'; r += '
' + name + '
' + devNotify + ''; - r += '' + getUserShortStr(node); - r += '' + (node.ip != null ? node.ip : ''); - r += '' + states.join(' + '); - //r += '' + (node.pwr != null ? powerStateStrings[node.pwr] : ''); - //r += ''; + r += '' + getUserShortStr(node) + '' + (node.ip != null ? node.ip : '') + '' + states.join(' + '); div.innerHTML = r; + } else if (view == 3) { + // Draw the device and canvas + var r = '
' + devNotify; + //r += ''; + r += '
 ' + name + '
'; + r += '
' + "Disconnected" + '
'; + r += '
'; + 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 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