More user group UI improvements.

Ylian Saint-Hilaire committed Dec 29, 2019 at 22:38 UTC d42c54f32e0dea61c6deaac340ad1b62ac6496f8
4 files changed +371 -173
common.js
+2 -2
@@ -149,8 +149,8 @@ module.exports.unEscapeFieldName = function (name) { if (name.indexOf('%') == -1
149 // Escape all links
150 module.exports.escapeLinksFieldName = function (docx) { var doc = Object.assign({}, docx); if (doc.links != null) { doc.links = Object.assign({}, doc.links); for (var i in doc.links) { var ue = module.exports.escapeFieldName(i); if (ue !== i) { doc.links[ue] = doc.links[i]; delete doc.links[i]; } } } return doc; };
151 module.exports.unEscapeLinksFieldName = function (doc) { if (doc.links != null) { for (var j in doc.links) { var ue = module.exports.unEscapeFieldName(j); if (ue !== j) { doc.links[ue] = doc.links[j]; delete doc.links[j]; } } } return doc; };
152 -//module.exports.escapeAllLinksFieldName = function (docs) { for (var i in docs) { module.exports.escapeLinksFieldName(docs[i]); } };
153 -module.exports.unEscapeAllLinksFieldName = function (docs) { for (var i in docs) { docs[i] = module.exports.unEscapeLinksFieldName(docs[i]); } };
152 +//module.exports.escapeAllLinksFieldName = function (docs) { for (var i in docs) { module.exports.escapeLinksFieldName(docs[i]); } return docs; };
153 +module.exports.unEscapeAllLinksFieldName = function (docs) { for (var i in docs) { docs[i] = module.exports.unEscapeLinksFieldName(docs[i]); } return docs; };
154
155 // Validation methods
156 module.exports.validateString = function (str, minlen, maxlen) { return ((str != null) && (typeof str == 'string') && ((minlen == null) || (str.length >= minlen)) && ((maxlen == null) || (str.length <= maxlen))); };
meshuser.js
+131 -25
@@ -1199,9 +1199,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1199 var err = null;
1200 try {
1201 // Broadcast a message to all currently connected users.
1202 - if ((user.siteadmin & 2) == 0) { err = 'Permission denied'; }
1203 - else if (common.validateString(command.msg, 1, 512) == false) { err = 'Message is too long'; } // Notification message is between 1 and 256 characters
1204 - } catch (ex) { err = 'Validation exception: ' + ex; }
1202 + if ((user.siteadmin & 2) == 0) { err = "Permission denied"; }
1203 + else if (common.validateString(command.msg, 1, 512) == false) { err = "Message is too long"; } // Notification message is between 1 and 256 characters
1204 + } catch (ex) { err = "Validation exception: " + ex; }
1205
1206 // Handle any errors
1207 if (err != null) {
@@ -1210,20 +1210,22 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1210 }
1211
1212 // Create the notification message
1213 - var notification = { action: "msg", type: "notify", domain: domain.id, "value": command.msg, "title": user.name, icon: 0, tag: "broadcast" };
1213 + var notification = { action: 'msg', type: 'notify', domain: domain.id, value: command.msg, title: user.name, icon: 0, tag: 'broadcast' };
1214
1215 // Send the notification on all user sessions for this server
1216 for (var i in parent.wssessions2) {
1217 try {
1218 if (parent.wssessions2[i].domainid == domain.id) {
1219 - if ((user.groups == null) || (user.groups.length == 0)) {
1220 - // We are part of no user groups, send to everyone.
1221 - parent.wssessions2[i].send(JSON.stringify(notification));
1222 - } else {
1223 - // We are part of user groups, only send to sessions of users in our groups.
1224 - var sessionUser = parent.users[parent.wssessions2[i].userid];
1225 - if ((sessionUser != null) && findOne(sessionUser.groups, user.groups)) {
1219 + var sessionUser = parent.users[parent.wssessions2[i].userid];
1220 + if ((command.target == null) || ((sessionUser.links) != null && (sessionUser.links[command.target] != null))) {
1221 + if ((user.groups == null) || (user.groups.length == 0)) {
1222 + // We are part of no user groups, send to everyone.
1223 parent.wssessions2[i].send(JSON.stringify(notification));
1224 + } else {
1225 + // We are part of user groups, only send to sessions of users in our groups.
1226 + if ((sessionUser != null) && findOne(sessionUser.groups, user.groups)) {
1227 + parent.wssessions2[i].send(JSON.stringify(notification));
1228 + }
1229 }
1230 }
1231 }
@@ -1478,7 +1480,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1480
1481 // Request a list of all user groups this user as rights to
1482 db.GetAllTypeNoTypeField('ugrp', domain.id, function (err, docs) {
1481 - try { ws.send(JSON.stringify({ action: 'usergroups', ugroups: docs, tag: command.tag })); } catch (ex) { }
1483 + try { ws.send(JSON.stringify({ action: 'usergroups', ugroups: common.unEscapeAllLinksFieldName(docs), tag: command.tag })); } catch (ex) { }
1484 });
1485 break;
1486 }
@@ -1493,7 +1495,7 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1495 else if ((parent.parent.mailserver != null) && (domain.auth != 'sspi') && (domain.auth != 'ldap') && (user.emailVerified !== true) && (user.siteadmin != 0xFFFFFFFF)) { err = 'Email verification required'; } // User must verify it's email first.
1496
1497 // Create user group
1496 - else if (common.validateString(command.name, 1, 64) == false) { err = 'Invalid group name'; } // User group name is between 1 and 64 characters
1498 + else if ((common.validateString(command.name, 1, 64) == false) || (command.name.indexOf(' ') >= 0)) { err = 'Invalid group name'; } // User group name is between 1 and 64 characters
1499 else if ((command.desc != null) && (common.validateString(command.desc, 0, 1024) == false)) { err = 'Invalid group description'; } // User group description is between 0 and 1024 characters
1500 } catch (ex) { err = 'Validation exception: ' + ex; }
1501
@@ -1532,8 +1534,24 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1534
1535 db.Get(command.ugrpid, function (err, groups) {
1536 if ((err != null) || (groups.length != 1)) return;
1535 - var group = groups[0];
1537 + var group = common.unEscapeLinksFieldName(groups[0]);
1538 +
1539 + // Unlink any user that has a link to this group
1540 + if (group.links) {
1541 + for (var i in group.links) {
1542 + var xuser = parent.users[i];
1543 + if ((xuser != null) && (xuser.links != null)) {
1544 + delete xuser.links[group._id];
1545 + db.SetUser(xuser);
1546 + parent.parent.DispatchEvent([xuser._id], obj, 'resubscribe');
1547 + }
1548 + }
1549 + }
1550 +
1551 + // Remove the user group from the database
1552 db.Remove(group._id);
1553 +
1554 + // Event the user group being removed
1555 var event = { etype: 'ugrp', userid: user._id, username: user.name, ugrpid: group._id, action: 'deleteusergroup', msg: change, domain: domain.id };
1556 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.
1557 parent.parent.DispatchEvent(['*', group._id, user._id], obj, event);
@@ -1551,9 +1569,9 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1569
1570 db.Get(command.ugrpid, function (err, groups) {
1571 if ((err != null) || (groups.length != 1)) return;
1554 - var group = groups[0], change = '';
1572 + var group = common.unEscapeLinksFieldName(groups[0]), change = '';
1573
1556 - if ((common.validateString(command.name, 1, 64) == true) && (command.name != group.name)) { change = 'User group name changed from "' + group.name + '" to "' + command.name + '"'; group.name = command.name; }
1574 + if ((common.validateString(command.name, 1, 64) == true) && (command.name != group.name) && (command.name.indexOf(' ') >= 0)) { change = 'User group name changed from "' + group.name + '" to "' + command.name + '"'; group.name = command.name; }
1575 if ((common.validateString(command.desc, 0, 1024) == true) && (command.desc != group.desc)) { if (change != '') change += ' and description changed'; else change += 'User group "' + group.name + '" description changed'; group.desc = command.desc; }
1576 if (change != '') {
1577 db.Set(common.escapeLinksFieldName(group));
@@ -1566,20 +1584,108 @@ module.exports.CreateMeshUser = function (parent, db, ws, req, args, domain, use
1584 }
1585 case 'addusertousergroup':
1586 {
1569 - if ((user.siteadmin & SITERIGHT_USERGROUPS) == 0) { return; }
1587 + var err = null;
1588 + try {
1589 + if ((user.siteadmin & SITERIGHT_USERGROUPS) == 0) { err = 'Permission denied'; }
1590 + else if (common.validateString(command.ugrpid, 1, 1024) == false) { err = 'Invalid groupid'; } // Check the meshid
1591 + else if (common.validateStrArray(command.usernames, 1, 64) == false) { err = 'Invalid usernames'; } // Username is between 1 and 64 characters
1592 + else {
1593 + var ugroupidsplit = command.ugrpid.split('/');
1594 + if ((ugroupidsplit.length != 3) || (ugroupidsplit[0] != 'ugrp') || (ugroupidsplit[1] != domain.id)) { err = 'Invalid groupid'; }
1595 + }
1596 + } catch (ex) { err = 'Validation exception: ' + ex; }
1597
1571 - // Change the name or description of a user group
1572 - if (common.validateString(command.ugrpid, 1, 1024) == false) break; // Check the user group id
1573 - var ugroupidsplit = command.ugrpid.split('/');
1574 - if ((ugroupidsplit.length != 3) || (ugroupidsplit[0] != 'ugrp') || (ugroupidsplit[1] != domain.id)) break;
1598 + // Handle any errors
1599 + if (err != null) {
1600 + if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: err })); } catch (ex) { } }
1601 + break;
1602 + }
1603
1604 db.Get(command.ugrpid, function (err, groups) {
1577 - if ((err != null) || (groups.length != 1)) return;
1578 - var group = groups[0];
1605 + if ((err != null) || (groups.length != 1)) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'Invalid groupid' })); } catch (ex) { } return; }
1606 + var group = common.unEscapeLinksFieldName(groups[0]);
1607 + if (group.links == null) { group.links = {}; }
1608 +
1609 + var unknownUsers = [], addedCount = 0, failCount = 0;
1610 + for (var i in command.usernames) {
1611 + // Check if the user exists
1612 + var newuserid = 'user/' + domain.id + '/' + command.usernames[i].toLowerCase(), newuser = parent.users[newuserid];
1613 + if (newuser != null) {
1614 + // Add mesh to user
1615 + if (newuser.links == null) { newuser.links = {}; }
1616 + newuser.links[group._id] = { rights: 1 };
1617 + db.SetUser(newuser);
1618 + parent.parent.DispatchEvent([newuser._id], obj, 'resubscribe');
1619 +
1620 + // Add a user to the mesh
1621 + group.links[newuserid] = { userid: newuser.id, name: newuser.name, rights: 1 };
1622 + db.Set(common.escapeLinksFieldName(group));
1623 +
1624 + // Notify mesh change
1625 + var event = { etype: 'ugrp', userid: user._id, username: user.name, ugrpid: group._id, name: group.name, desc: group.desc, action: 'usergroupchange', links: group.links, msg: 'Added user ' + newuser.name + ' to user group ' + group.name, domain: domain.id };
1626 + if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user group. Another event will come.
1627 + parent.parent.DispatchEvent(['*', group._id, user._id, newuserid], obj, event);
1628 + addedCount++;
1629 + } else {
1630 + unknownUsers.push(command.usernames[i]);
1631 + failCount++;
1632 + }
1633 + }
1634
1580 - // TODO
1581 - console.log(command);
1635 + if (unknownUsers.length > 0) {
1636 + // Send error back, user not found.
1637 + displayNotificationMessage('User' + ((unknownUsers.length > 1) ? 's' : '') + ' ' + EscapeHtml(unknownUsers.join(', ')) + ' not found.', 'Device Group', 'ServerNotify');
1638 + }
1639 +
1640 + if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'ok', added: addedCount, failed: failCount })); } catch (ex) { } }
1641 });
1642 + break;
1643 + }
1644 + case 'removeuserfromusergroup':
1645 + {
1646 + var err = null;
1647 + try {
1648 + if ((user.siteadmin & SITERIGHT_USERGROUPS) == 0) { err = 'Permission denied'; }
1649 + else if (common.validateString(command.ugrpid, 1, 1024) == false) { err = 'Invalid groupid'; }
1650 + else if (common.validateString(command.userid, 1, 256) == false) { err = 'Invalid userid'; }
1651 + else {
1652 + var ugroupidsplit = command.ugrpid.split('/');
1653 + if ((ugroupidsplit.length != 3) || (ugroupidsplit[0] != 'ugrp') || (ugroupidsplit[1] != domain.id)) { err = 'Invalid groupid'; }
1654 + }
1655 + } catch (ex) { err = 'Validation exception: ' + ex; }
1656 +
1657 + // Handle any errors
1658 + if (err != null) {
1659 + if (command.responseid != null) { try { ws.send(JSON.stringify({ action: 'removeuserfromusergroup', responseid: command.responseid, result: err })); } catch (ex) { } }
1660 + break;
1661 + }
1662 +
1663 + db.Get(command.ugrpid, function (err, groups) {
1664 + if ((err != null) || (groups.length != 1)) { try { ws.send(JSON.stringify({ action: 'addusertousergroup', responseid: command.responseid, result: 'Invalid groupid' })); } catch (ex) { } return; }
1665 + var group = common.unEscapeLinksFieldName(groups[0]);
1666 + if (group.links == null) { group.links = {}; }
1667 +
1668 + // Check if the user exists
1669 + newuser = parent.users[command.userid];
1670 + if (newuser != null) {
1671 + var change = false;
1672 + if ((newuser.links != null) && (newuser.links[command.ugrpid] != null)) { change = true; delete newuser.links[command.ugrpid]; }
1673 + db.SetUser(newuser);
1674 + parent.parent.DispatchEvent([newuser._id], obj, 'resubscribe');
1675 +
1676 + // Remove the user from the group
1677 + if ((group.links != null) && (group.links[command.userid] != null)) { change = true; delete group.links[command.userid]; }
1678 + db.Set(common.escapeLinksFieldName(group));
1679 +
1680 + // Notify mesh change
1681 + if (change) {
1682 + var event = { etype: 'ugrp', userid: user._id, username: user.name, ugrpid: group._id, name: group.name, desc: group.desc, action: 'usergroupchange', links: group.links, msg: 'Removed user ' + newuser.name + ' from user group ' + group.name, domain: domain.id };
1683 + if (db.changeStream) { event.noact = 1; } // If DB change stream is active, don't use this event to change the user group. Another event will come.
1684 + parent.parent.DispatchEvent(['*', group._id, user._id, newuserid], obj, event);
1685 + }
1686 + }
1687 + });
1688 +
1689 break;
1690 }
1691 case 'changemeshnotify':
translate/translate.json
+215 -135
@@ -178,7 +178,8 @@
178 "ja": " ユーザーは、デバイスグループに追加する前にこのサーバーに1回ログインする必要があります。",
179 "nl": " Gebruikers moeten inloggen bij de server voordat ze kunnen worden toegevoegd aan een apparaatgroep.",
180 "xloc": [
181 - "default.handlebars->23->1051"
181 + "default.handlebars->23->1051",
182 + "default.handlebars->23->1256"
183 ]
184 },
185 {
@@ -391,7 +392,7 @@
392 "xloc": [
393 "default.handlebars->23->620",
394 "default.handlebars->23->1116",
394 - "default.handlebars->23->1284",
395 + "default.handlebars->23->1312",
396 "default-mobile.handlebars->9->64",
397 "default-mobile.handlebars->9->240"
398 ]
@@ -414,7 +415,7 @@
415 "ja": "1つのアクティブなセッション",
416 "nl": "1 actieve sessie",
417 "xloc": [
417 - "default.handlebars->23->1268"
418 + "default.handlebars->23->1296"
419 ]
420 },
421 {
@@ -451,7 +452,7 @@
452 "ja": "1グループ",
453 "nl": "1 groep",
454 "xloc": [
454 - "default.handlebars->23->1252"
455 + "default.handlebars->23->1280"
456 ]
457 },
458 {
@@ -995,7 +996,7 @@
996 "ja": "サーバーファイルへのアクセス",
997 "nl": "Toegang tot de server bestanden",
998 "xloc": [
998 - "default.handlebars->23->1233"
999 + "default.handlebars->23->1261"
1000 ]
1001 },
1002 {
@@ -1388,7 +1389,8 @@
1389 "ja": "ユーザーを追加",
1390 "nl": "Gebruikers toevoegen",
1391 "xloc": [
1391 - "default.handlebars->23->983"
1392 + "default.handlebars->23->983",
1393 + "default.handlebars->23->1241"
1394 ]
1395 },
1396 {
@@ -1448,7 +1450,7 @@
1450 "ja": "管理レルム",
1451 "nl": "Beheerdersgebied",
1452 "xloc": [
1451 - "default.handlebars->23->1256"
1453 + "default.handlebars->23->1284"
1454 ]
1455 },
1456 {
@@ -1601,7 +1603,7 @@
1603 "ja": "エージェント",
1604 "nl": "Agents",
1605 "xloc": [
1604 - "default.handlebars->23->1321"
1606 + "default.handlebars->23->1349"
1607 ]
1608 },
1609 {
@@ -1657,7 +1659,8 @@
1659 "cs": "Umožnit uživatelům spravovat tuto skupinu a zařízení v této skupině.",
1660 "nl": "Gebruikers toestaan deze apparaatgroep en apparaten in deze groep te beheren.",
1661 "xloc": [
1660 - "default.handlebars->23->1050"
1662 + "default.handlebars->23->1050",
1663 + "default.handlebars->23->1255"
1664 ]
1665 },
1666 {
@@ -2066,7 +2069,7 @@
2069 "cs": "Opravdu chcete {0} zásuvný modul: {1}",
2070 "nl": "Weet u zeker dat u de plug-in {0} wilt gebruiken: {1}",
2071 "xloc": [
2069 - "default.handlebars->23->1356"
2072 + "default.handlebars->23->1384"
2073 ]
2074 },
2075 {
@@ -2150,7 +2153,7 @@
2153 "cs": "Aplikace pro ověřování se",
2154 "nl": "Verificatie-app",
2155 "xloc": [
2153 - "default.handlebars->23->1257"
2156 + "default.handlebars->23->1285"
2157 ]
2158 },
2159 {
@@ -2267,6 +2270,7 @@
2270 "default.handlebars->container->column_l->p30->1->1->0->1->p30title->1",
2271 "default.handlebars->container->column_l->p31->p31title->1",
2272 "default.handlebars->container->column_l->p43->p43BackButton",
2273 + "default.handlebars->container->column_l->p51->1->1->0->1->p30title->1",
2274 "error404.handlebars->container->footer->1->1->0->3->0",
2275 "error404-mobile.handlebars->container->footer->1->1->0->3->1",
2276 "terms.handlebars->container->footer->1->1->0->3->0",
@@ -2341,7 +2345,7 @@
2345 "cs": "Záložní kódy",
2346 "nl": "Back-up codes",
2347 "xloc": [
2344 - "default.handlebars->23->1259"
2348 + "default.handlebars->23->1287"
2349 ]
2350 },
2351 {
@@ -2422,7 +2426,8 @@
2426 "cs": "Hromadná zpráva",
2427 "nl": "Uitzending",
2428 "xloc": [
2425 - "default.handlebars->container->column_l->p4->3->1->0->3->1"
2429 + "default.handlebars->container->column_l->p4->3->1->0->3->1",
2430 + "default.handlebars->23->1239"
2431 ]
2432 },
2433 {
@@ -2474,7 +2479,7 @@
2479 "cs": "Chyba volání",
2480 "nl": "Oproepfout",
2481 "xloc": [
2477 - "default.handlebars->23->1357"
2482 + "default.handlebars->23->1385"
2483 ]
2484 },
2485 {
@@ -2564,7 +2569,7 @@
2569 "ja": "{0}のメールを変更",
2570 "nl": "Verander e-mail voor {0}",
2571 "xloc": [
2567 - "default.handlebars->23->1272"
2572 + "default.handlebars->23->1300"
2573 ]
2574 },
2575 {
@@ -2587,7 +2592,7 @@
2592 "nl": "Verander wachtwoord",
2593 "xloc": [
2594 "default.handlebars->23->915",
2590 - "default.handlebars->23->1267",
2595 + "default.handlebars->23->1295",
2596 "default-mobile.handlebars->9->46"
2597 ]
2598 },
@@ -2609,7 +2614,7 @@
2614 "cs": "Změnit heslo pro {0}",
2615 "nl": "Verander wachtwoord voor {0}",
2616 "xloc": [
2612 - "default.handlebars->23->1279"
2617 + "default.handlebars->23->1307"
2618 ]
2619 },
2620 {
@@ -2733,7 +2738,7 @@
2738 "nl": "Controleren...",
2739 "xloc": [
2740 "default.handlebars->23->689",
2736 - "default.handlebars->23->1353"
2741 + "default.handlebars->23->1381"
2742 ]
2743 },
2744 {
@@ -2828,7 +2833,7 @@
2833 "cs": "CIRA Server",
2834 "nl": "CIRA Server",
2835 "xloc": [
2831 - "default.handlebars->23->1347"
2836 + "default.handlebars->23->1375"
2837 ]
2838 },
2839 {
@@ -2838,7 +2843,7 @@
2843 "cs": "příkazy CIRA serveru",
2844 "nl": "CIRA Server opdrachten",
2845 "xloc": [
2841 - "default.handlebars->23->1348"
2846 + "default.handlebars->23->1376"
2847 ]
2848 },
2849 {
@@ -3023,6 +3028,7 @@
3028 "default.handlebars->23->542",
3029 "default.handlebars->23->551",
3030 "default.handlebars->23->1031",
3031 + "default.handlebars->23->1251",
3032 "default-mobile.handlebars->9->217",
3033 "default-mobile.handlebars->9->284"
3034 ]
@@ -3109,6 +3115,7 @@
3115 "nl": "Bevestig de verwijdering van gebruiker {0}?",
3116 "xloc": [
3117 "default.handlebars->23->1097",
3118 + "default.handlebars->23->1254",
3119 "default-mobile.handlebars->9->330"
3120 ]
3121 },
@@ -3216,7 +3223,7 @@
3223 "cs": "Počitadlo připojení",
3224 "nl": "Aantal verbindingen",
3225 "xloc": [
3219 - "default.handlebars->23->1320"
3226 + "default.handlebars->23->1348"
3227 ]
3228 },
3229 {
@@ -3226,7 +3233,7 @@
3233 "cs": "Předávání (relay) spojení",
3234 "nl": "Verbindings Relay",
3235 "xloc": [
3229 - "default.handlebars->23->1346"
3236 + "default.handlebars->23->1374"
3237 ]
3238 },
3239 {
@@ -3292,7 +3299,7 @@
3299 "cs": "Cookie enkodér",
3300 "nl": "Cookie encoder",
3301 "xloc": [
3295 - "default.handlebars->23->1334"
3302 + "default.handlebars->23->1362"
3303 ]
3304 },
3305 {
@@ -3468,7 +3475,7 @@
3475 "cs": "Hlavní server",
3476 "nl": "Core Server",
3477 "xloc": [
3471 - "default.handlebars->23->1333"
3478 + "default.handlebars->23->1361"
3479 ]
3480 },
3481 {
@@ -3488,7 +3495,7 @@
3495 "cs": "vytížení procesoru v uplynulých 15 minutách",
3496 "nl": "CPU-belasting in de afgelopen 15 minuten",
3497 "xloc": [
3491 - "default.handlebars->23->1316"
3498 + "default.handlebars->23->1344"
3499 ]
3500 },
3501 {
@@ -3498,7 +3505,7 @@
3505 "cs": "vyžítení procesoru v uplynulých 5 minutách",
3506 "nl": "CPU-belasting in de afgelopen 5 minuten",
3507 "xloc": [
3501 - "default.handlebars->23->1315"
3508 + "default.handlebars->23->1343"
3509 ]
3510 },
3511 {
@@ -3508,7 +3515,7 @@
3515 "ja": "直前のCPU負荷",
3516 "nl": "CPU-belasting in de laatste minuut",
3517 "xloc": [
3511 - "default.handlebars->23->1314"
3518 + "default.handlebars->23->1342"
3519 ]
3520 },
3521 {
@@ -3593,7 +3600,7 @@
3600 "cs": "Vytváření",
3601 "nl": "Aanmaken",
3602 "xloc": [
3596 - "default.handlebars->23->1245"
3603 + "default.handlebars->23->1273"
3604 ]
3605 },
3606 {
@@ -3761,7 +3768,7 @@
3768 "nl": "Dag",
3769 "xloc": [
3770 "default.handlebars->23->526",
3764 - "default.handlebars->23->1281"
3771 + "default.handlebars->23->1309"
3772 ]
3773 },
3774 {
@@ -3901,7 +3908,7 @@
3908 "ja": "ユーザーを削除{0}",
3909 "nl": "Verwijder gebruiker {0}",
3910 "xloc": [
3904 - "default.handlebars->23->1280"
3911 + "default.handlebars->23->1308"
3912 ]
3913 },
3914 {
@@ -3981,7 +3988,10 @@
3988 "default.handlebars->23->927",
3989 "default.handlebars->23->951",
3990 "default.handlebars->23->1034",
3984 - "default.handlebars->23->1229",
3991 + "default.handlebars->23->1232",
3992 + "default.handlebars->23->1236",
3993 + "default.handlebars->23->1238",
3994 + "default.handlebars->23->1248",
3995 "default-mobile.handlebars->9->57",
3996 "default-mobile.handlebars->9->138",
3997 "default-mobile.handlebars->9->139",
@@ -4166,8 +4176,8 @@
4176 "nl": "Apparaatgroepen",
4177 "xloc": [
4178 "default.handlebars->container->column_l->p2->9",
4169 - "default.handlebars->23->1254",
4170 - "default.handlebars->23->1307",
4179 + "default.handlebars->23->1282",
4180 + "default.handlebars->23->1335",
4181 "default-mobile.handlebars->container->page_content->column_l->p3->p3info->1->3"
4182 ]
4183 },
@@ -4864,9 +4874,9 @@
4874 "xloc": [
4875 "default.handlebars->23->277",
4876 "default.handlebars->23->1203",
4867 - "default.handlebars->23->1241",
4868 - "default.handlebars->23->1242",
4877 + "default.handlebars->23->1269",
4878 "default.handlebars->23->1270",
4879 + "default.handlebars->23->1298",
4880 "default-mobile.handlebars->9->34"
4881 ]
4882 },
@@ -4888,7 +4898,7 @@
4898 "ja": "メールが確認されました",
4899 "nl": "E-mail is geverifieerd",
4900 "xloc": [
4891 - "default.handlebars->23->1238"
4901 + "default.handlebars->23->1266"
4902 ]
4903 },
4904 {
@@ -4908,7 +4918,7 @@
4918 "ja": "メールが確認されていません",
4919 "nl": "E-mail is niet geverifieerd",
4920 "xloc": [
4911 - "default.handlebars->23->1239"
4921 + "default.handlebars->23->1267"
4922 ]
4923 },
4924 {
@@ -5550,7 +5560,7 @@
5560 "nl": "Forceer wachtwoord opnieuw instellen bij de volgende aanmelding.",
5561 "xloc": [
5562 "default.handlebars->23->1207",
5553 - "default.handlebars->23->1277"
5563 + "default.handlebars->23->1305"
5564 ]
5565 },
5566 {
@@ -5603,8 +5613,8 @@
5613 "cs": "Volné",
5614 "nl": "Vrij",
5615 "xloc": [
5606 - "default.handlebars->23->1288",
5607 - "default.handlebars->23->1290"
5616 + "default.handlebars->23->1316",
5617 + "default.handlebars->23->1318"
5618 ]
5619 },
5620 {
@@ -5615,7 +5625,7 @@
5625 "cs": "volné",
5626 "nl": "vrij",
5627 "xloc": [
5618 - "default.handlebars->23->1318"
5628 + "default.handlebars->23->1346"
5629 ]
5630 },
5631 {
@@ -5754,7 +5764,7 @@
5764 "ja": "完全な管理者",
5765 "nl": "Volledige beheerder",
5766 "xloc": [
5757 - "default.handlebars->23->1234"
5767 + "default.handlebars->23->1262"
5768 ]
5769 },
5770 {
@@ -6524,8 +6534,8 @@
6534 "xloc": [
6535 "default.handlebars->23->1105",
6536 "default.handlebars->23->1111",
6527 - "default.handlebars->23->1325",
6528 - "default.handlebars->23->1345"
6537 + "default.handlebars->23->1353",
6538 + "default.handlebars->23->1373"
6539 ]
6540 },
6541 {
@@ -7463,7 +7473,7 @@
7473 "ja": "最終変更:{0}",
7474 "nl": "Laatst gewijzigd: {0}",
7475 "xloc": [
7466 - "default.handlebars->23->1250"
7476 + "default.handlebars->23->1278"
7477 ]
7478 },
7479 {
@@ -7496,7 +7506,7 @@
7506 "cs": "Poslední přihlášení",
7507 "nl": "Laatste inlog",
7508 "xloc": [
7499 - "default.handlebars->23->1246"
7509 + "default.handlebars->23->1274"
7510 ]
7511 },
7512 {
@@ -7596,7 +7606,7 @@
7606 "cs": "Méně",
7607 "nl": "Minder",
7608 "xloc": [
7599 - "default.handlebars->23->1359"
7609 + "default.handlebars->23->1387"
7610 ]
7611 },
7612 {
@@ -7956,7 +7966,7 @@
7966 "cs": "Uzamknutý účet",
7967 "nl": "Vergrendeld account",
7968 "xloc": [
7959 - "default.handlebars->23->1231"
7969 + "default.handlebars->23->1259"
7970 ]
7971 },
7972 {
@@ -8112,7 +8122,7 @@
8122 "cs": "Zprávy hlavního serveru",
8123 "nl": "Hoofdserver berichten",
8124 "xloc": [
8115 - "default.handlebars->23->1336"
8125 + "default.handlebars->23->1364"
8126 ]
8127 },
8128 {
@@ -8356,7 +8366,7 @@
8366 "ja": "メガバイト",
8367 "nl": "Megabytes",
8368 "xloc": [
8359 - "default.handlebars->23->1326"
8369 + "default.handlebars->23->1354"
8370 ]
8371 },
8372 {
@@ -8369,7 +8379,7 @@
8379 "xloc": [
8380 "default.handlebars->container->column_l->p40->3->1->p40type->3",
8381 "default.handlebars->23->70",
8372 - "default.handlebars->23->1317"
8382 + "default.handlebars->23->1345"
8383 ]
8384 },
8385 {
@@ -8440,7 +8450,7 @@
8450 "cs": "MeshAgent provoz",
8451 "nl": "MeshAgent verkeer",
8452 "xloc": [
8443 - "default.handlebars->23->1338"
8453 + "default.handlebars->23->1366"
8454 ]
8455 },
8456 {
@@ -8449,7 +8459,7 @@
8459 "cs": "MeshAgent aktualizace",
8460 "nl": "MeshAgent update",
8461 "xloc": [
8452 - "default.handlebars->23->1339"
8462 + "default.handlebars->23->1367"
8463 ]
8464 },
8465 {
@@ -8510,7 +8520,7 @@
8520 "cs": "MeshCentral Server Peering",
8521 "nl": "MeshCentral Server Peering",
8522 "xloc": [
8513 - "default.handlebars->23->1337"
8523 + "default.handlebars->23->1365"
8524 ]
8525 },
8526 {
@@ -8595,7 +8605,7 @@
8605 "cs": "Odesílatel",
8606 "nl": "Bericht Dispatcher",
8607 "xloc": [
8598 - "default.handlebars->23->1335"
8608 + "default.handlebars->23->1363"
8609 ]
8610 },
8611 {
@@ -8668,7 +8678,7 @@
8678 "ja": "もっと",
8679 "nl": "Meer",
8680 "xloc": [
8671 - "default.handlebars->23->1358"
8681 + "default.handlebars->23->1386"
8682 ]
8683 },
8684 {
@@ -8985,6 +8995,10 @@
8995 "default.handlebars->23->1161",
8996 "default.handlebars->23->1202",
8997 "default.handlebars->23->1228",
8998 + "default.handlebars->23->1231",
8999 + "default.handlebars->23->1235",
9000 + "default.handlebars->23->1237",
9001 + "default.handlebars->23->1247",
9002 "default-mobile.handlebars->container->page_content->column_l->p10->p10desktop->deskarea3->deskarea3x->DeskTools->5->1->1",
9003 "default-mobile.handlebars->9->53",
9004 "default-mobile.handlebars->9->132",
@@ -9249,7 +9263,7 @@
9263 "xloc": [
9264 "default.handlebars->23->657",
9265 "default.handlebars->23->1151",
9252 - "default.handlebars->23->1283"
9266 + "default.handlebars->23->1311"
9267 ]
9268 },
9269 {
@@ -9412,7 +9426,7 @@
9426 "cs": "Žádná práva k serveru",
9427 "nl": "Geen server rechten",
9428 "xloc": [
9415 - "default.handlebars->23->1232"
9429 + "default.handlebars->23->1260"
9430 ]
9431 },
9432 {
@@ -9513,8 +9527,9 @@
9527 "default.handlebars->23->968",
9528 "default.handlebars->23->973",
9529 "default.handlebars->23->1123",
9516 - "default.handlebars->23->1251",
9517 - "default.handlebars->23->1255",
9530 + "default.handlebars->23->1234",
9531 + "default.handlebars->23->1279",
9532 + "default.handlebars->23->1283",
9533 "default-mobile.handlebars->9->72",
9534 "default-mobile.handlebars->9->90",
9535 "default-mobile.handlebars->9->92",
@@ -9599,7 +9614,7 @@
9614 "ja": "設定されていません",
9615 "nl": "Niet ingesteld",
9616 "xloc": [
9602 - "default.handlebars->23->1237"
9617 + "default.handlebars->23->1265"
9618 ]
9619 },
9620 {
@@ -9613,7 +9628,7 @@
9628 "default.handlebars->23->480",
9629 "default.handlebars->23->513",
9630 "default.handlebars->23->981",
9616 - "default.handlebars->23->1262"
9631 + "default.handlebars->23->1290"
9632 ]
9633 },
9634 {
@@ -9664,7 +9679,7 @@
9679 "cs": "Upozornit",
9680 "nl": "Melden",
9681 "xloc": [
9667 - "default.handlebars->23->1264"
9682 + "default.handlebars->23->1292"
9683 ]
9684 },
9685 {
@@ -9708,7 +9723,7 @@
9723 "cs": "Nastalo na {0}",
9724 "nl": "Heeft plaatsgevonden op {0}",
9725 "xloc": [
9711 - "default.handlebars->23->1286"
9726 + "default.handlebars->23->1314"
9727 ]
9728 },
9729 {
@@ -9986,7 +10001,7 @@
10001 "cs": "Částečná práva",
10002 "nl": "Gedeeltelijke rechten",
10003 "xloc": [
9989 - "default.handlebars->23->1235"
10004 + "default.handlebars->23->1263"
10005 ]
10006 },
10007 {
@@ -10012,10 +10027,10 @@
10027 "default.handlebars->23->530",
10028 "default.handlebars->23->1204",
10029 "default.handlebars->23->1205",
10015 - "default.handlebars->23->1247",
10016 - "default.handlebars->23->1249",
10017 - "default.handlebars->23->1273",
10018 - "default.handlebars->23->1274",
10030 + "default.handlebars->23->1275",
10031 + "default.handlebars->23->1277",
10032 + "default.handlebars->23->1301",
10033 + "default.handlebars->23->1302",
10034 "default-mobile.handlebars->9->210"
10035 ]
10036 },
@@ -10037,7 +10052,7 @@
10052 "cs": "Nápověda k heslu",
10053 "nl": "wachtwoord hint",
10054 "xloc": [
10040 - "default.handlebars->23->1275"
10055 + "default.handlebars->23->1303"
10056 ]
10057 },
10058 {
@@ -10359,7 +10374,7 @@
10374 "nl": "Plugin Actie",
10375 "xloc": [
10376 "default.handlebars->23->171",
10362 - "default.handlebars->23->1355"
10377 + "default.handlebars->23->1383"
10378 ]
10379 },
10380 {
@@ -10819,8 +10834,8 @@
10834 "cs": "Předávané relace",
10835 "nl": "Relay Sessies",
10836 "xloc": [
10822 - "default.handlebars->23->1311",
10823 - "default.handlebars->23->1324"
10837 + "default.handlebars->23->1339",
10838 + "default.handlebars->23->1352"
10839 ]
10840 },
10841 {
@@ -10969,7 +10984,7 @@
10984 "cs": "Odstranit celé 2-faktorové ověřování.",
10985 "nl": "Verwijder alle Tweestapsverificatie.",
10986 "xloc": [
10972 - "default.handlebars->23->1278"
10987 + "default.handlebars->23->1306"
10988 ]
10989 },
10990 {
@@ -11001,7 +11016,8 @@
11016 "cs": "Odstranit uživatelská práva pro tuto skupinu zařízení",
11017 "nl": "Gebruikersrechten voor deze apparaatgroep verwijderen",
11018 "xloc": [
11004 - "default.handlebars->23->1000"
11019 + "default.handlebars->23->1000",
11020 + "default.handlebars->23->1243"
11021 ]
11022 },
11023 {
@@ -11042,7 +11058,7 @@
11058 "nl": "Vereisten: {0}.",
11059 "xloc": [
11060 "default.handlebars->23->1211",
11045 - "default.handlebars->23->1276",
11061 + "default.handlebars->23->1304",
11062 "default-mobile.handlebars->9->45"
11063 ]
11064 },
@@ -11192,7 +11208,7 @@
11208 "ja": "制限事項",
11209 "nl": "Beperkingen",
11210 "xloc": [
11195 - "default.handlebars->23->1236"
11211 + "default.handlebars->23->1264"
11212 ]
11213 },
11214 {
@@ -11547,7 +11563,7 @@
11563 "xloc": [
11564 "default.handlebars->23->238",
11565 "default.handlebars->23->531",
11550 - "default.handlebars->23->1260",
11566 + "default.handlebars->23->1288",
11567 "default-mobile.handlebars->9->211"
11568 ]
11569 },
@@ -11559,7 +11575,7 @@
11575 "cs": "Bezpečnostní klíč",
11576 "nl": "Veiligheidssleutel",
11577 "xloc": [
11562 - "default.handlebars->23->1258"
11578 + "default.handlebars->23->1286"
11579 ]
11580 },
11581 {
@@ -11755,7 +11771,7 @@
11771 "cs": "Poslat upozornění uživateli",
11772 "nl": "Stuur gebruikersmelding",
11773 "xloc": [
11758 - "default.handlebars->23->1265"
11774 + "default.handlebars->23->1293"
11775 ]
11776 },
11777 {
@@ -11804,7 +11820,7 @@
11820 "cs": "Certifikát serveru",
11821 "nl": "Server Certificaat",
11822 "xloc": [
11807 - "default.handlebars->23->1340"
11823 + "default.handlebars->23->1368"
11824 ]
11825 },
11826 {
@@ -11882,7 +11898,7 @@
11898 "cs": "Kvóta serveru",
11899 "nl": "Serverquotum",
11900 "xloc": [
11885 - "default.handlebars->23->1244"
11901 + "default.handlebars->23->1272"
11902 ]
11903 },
11904 {
@@ -11903,7 +11919,7 @@
11919 "cs": "Práva serveru",
11920 "nl": "Serverrechten",
11921 "xloc": [
11906 - "default.handlebars->23->1243"
11922 + "default.handlebars->23->1271"
11923 ]
11924 },
11925 {
@@ -11925,7 +11941,7 @@
11941 "cs": "Trasování serveru",
11942 "nl": "Server traceren",
11943 "xloc": [
11928 - "default.handlebars->23->1349"
11944 + "default.handlebars->23->1377"
11945 ]
11946 },
11947 {
@@ -11966,7 +11982,7 @@
11982 "cs": "ServerStats.csv",
11983 "nl": "ServerStats.csv",
11984 "xloc": [
11969 - "default.handlebars->23->1332"
11985 + "default.handlebars->23->1360"
11986 ]
11987 },
11988 {
@@ -11976,7 +11992,7 @@
11992 "cs": "servertrace.csv",
11993 "nl": "servertrace.csv",
11994 "xloc": [
11979 - "default.handlebars->23->1351"
11995 + "default.handlebars->23->1379"
11996 ]
11997 },
11998 {
@@ -12770,7 +12786,7 @@
12786 "nl": "Status",
12787 "xloc": [
12788 "default.handlebars->container->column_l->p42->p42tbl->1->0->7",
12773 - "default.handlebars->23->1271"
12789 + "default.handlebars->23->1299"
12790 ]
12791 },
12792 {
@@ -13101,7 +13117,7 @@
13117 "cs": "V tuto chvíli zde nejsou žádná upozornění",
13118 "nl": "Er zijn momenteel geen meldingen",
13119 "xloc": [
13104 - "default.handlebars->23->1285"
13120 + "default.handlebars->23->1313"
13121 ]
13122 },
13123 {
@@ -13266,7 +13282,7 @@
13282 "cs": "time, conn.agent, conn.users, conn.usersessions, conn.relaysession, conn.intelamt, mem.external, mem.heapused, mem.heaptotal, mem.rss",
13283 "nl": "tijd, conn.agent, conn.gebruikers, conn.gebruikerssessies, conn.relaysessie, conn.intelamt, mem.extern, mem.heapused, mem.heaptotaal, mem.rss",
13284 "xloc": [
13269 - "default.handlebars->23->1331"
13285 + "default.handlebars->23->1359"
13286 ]
13287 },
13288 {
@@ -13276,7 +13292,7 @@
13292 "cs": "time, source, message",
13293 "nl": "tijd, bron, bericht",
13294 "xloc": [
13279 - "default.handlebars->23->1350"
13295 + "default.handlebars->23->1378"
13296 ]
13297 },
13298 {
@@ -13574,7 +13590,7 @@
13590 "ja": "合計",
13591 "nl": "totaal",
13592 "xloc": [
13577 - "default.handlebars->23->1319"
13593 + "default.handlebars->23->1347"
13594 ]
13595 },
13596 {
@@ -13932,7 +13948,7 @@
13948 "cs": "Aktuální",
13949 "nl": "Bijgewerkt",
13950 "xloc": [
13935 - "default.handlebars->23->1354"
13951 + "default.handlebars->23->1382"
13952 ]
13953 },
13954 {
@@ -14067,8 +14083,8 @@
14083 "ja": "中古",
14084 "nl": "Gebruikt",
14085 "xloc": [
14070 - "default.handlebars->23->1287",
14071 - "default.handlebars->23->1289"
14086 + "default.handlebars->23->1315",
14087 + "default.handlebars->23->1317"
14088 ]
14089 },
14090 {
@@ -14082,6 +14098,7 @@
14098 "default.handlebars->23->194",
14099 "default.handlebars->23->1001",
14100 "default.handlebars->23->1176",
14101 + "default.handlebars->23->1244",
14102 "default-mobile.handlebars->9->325"
14103 ]
14104 },
@@ -14149,7 +14166,7 @@
14166 "nl": "gebruikersID",
14167 "xloc": [
14168 "default.handlebars->23->1092",
14152 - "default.handlebars->23->1240"
14169 + "default.handlebars->23->1268"
14170 ]
14171 },
14172 {
@@ -14195,7 +14212,8 @@
14212 "cs": "Uživatelská jména",
14213 "nl": "Gebruikersnamen",
14214 "xloc": [
14198 - "default.handlebars->23->1052"
14215 + "default.handlebars->23->1052",
14216 + "default.handlebars->23->1257"
14217 ]
14218 },
14219 {
@@ -14205,7 +14223,7 @@
14223 "cs": "Relace uživatele",
14224 "nl": "Gebruikerssessie",
14225 "xloc": [
14208 - "default.handlebars->23->1323"
14226 + "default.handlebars->23->1351"
14227 ]
14228 },
14229 {
@@ -14301,7 +14319,8 @@
14319 "nl": "Gebruikers",
14320 "xloc": [
14321 "default.handlebars->container->topbar->1->1->UsersSubMenuSpan->UsersSubMenu->1->0->UsersGeneral",
14304 - "default.handlebars->23->1322"
14322 + "default.handlebars->23->1229",
14323 + "default.handlebars->23->1350"
14324 ]
14325 },
14326 {
@@ -14435,7 +14454,7 @@
14454 "cs": "Zobrazit poznámky o tomto uživateli",
14455 "nl": "Bekijk opmerkingen over deze gebruiker",
14456 "xloc": [
14438 - "default.handlebars->23->1263"
14457 + "default.handlebars->23->1291"
14458 ]
14459 },
14460 {
@@ -14555,8 +14574,8 @@
14574 "cs": "Webový server",
14575 "nl": "webserver",
14576 "xloc": [
14558 - "default.handlebars->23->1341",
14559 - "default.handlebars->23->1342"
14577 + "default.handlebars->23->1369",
14578 + "default.handlebars->23->1370"
14579 ]
14580 },
14581 {
@@ -14567,7 +14586,7 @@
14586 "cs": "Požadavky webového serveru",
14587 "nl": "Webserver Verzoeken",
14588 "xloc": [
14570 - "default.handlebars->23->1343"
14589 + "default.handlebars->23->1371"
14590 ]
14591 },
14592 {
@@ -14578,7 +14597,7 @@
14597 "cs": "Web Socket Relay",
14598 "nl": "Web Socket Relay",
14599 "xloc": [
14581 - "default.handlebars->23->1344"
14600 + "default.handlebars->23->1372"
14601 ]
14602 },
14603 {
@@ -14622,7 +14641,7 @@
14641 "ja": "次回ログイン時に変更されます。",
14642 "nl": "Wordt bij de volgende aanmelding gewijzigd.",
14643 "xloc": [
14625 - "default.handlebars->23->1248"
14644 + "default.handlebars->23->1276"
14645 ]
14646 },
14647 {
@@ -15025,7 +15044,7 @@
15044 "cs": "{0} aktivních spojení",
15045 "nl": "{0} actieve sessies",
15046 "xloc": [
15028 - "default.handlebars->23->1269"
15047 + "default.handlebars->23->1297"
15048 ]
15049 },
15050 {
@@ -15088,7 +15107,7 @@
15107 "cs": "{0} skupin",
15108 "nl": "{0} groepen",
15109 "xloc": [
15091 - "default.handlebars->23->1253"
15110 + "default.handlebars->23->1281"
15111 ]
15112 },
15113 {
@@ -15486,7 +15505,7 @@
15505 "cs": "2-faktorové ověřování zapnuto",
15506 "nl": "Tweestapsverificatie ingeschakeld",
15507 "xloc": [
15489 - "default.handlebars->23->1261"
15508 + "default.handlebars->23->1289"
15509 ]
15510 },
15511 {
@@ -15495,7 +15514,7 @@
15514 "cs": "\\\\'",
15515 "nl": "\\\\'",
15516 "xloc": [
15498 - "default.handlebars->23->1352"
15517 + "default.handlebars->23->1380"
15518 ]
15519 },
15520 {
@@ -15694,7 +15713,7 @@
15713 "cs": "Smazat uživatele",
15714 "nl": "Verwijder gebruiker",
15715 "xloc": [
15697 - "default.handlebars->23->1266"
15716 + "default.handlebars->23->1294"
15717 ]
15718 },
15719 {
@@ -15702,7 +15721,7 @@
15721 "cs": "Stav přihlášení za 7 dnů",
15722 "nl": "Inlogstatus afgelopen 7 dagen",
15723 "xloc": [
15705 - "default.handlebars->23->1282"
15724 + "default.handlebars->23->1310"
15725 ]
15726 },
15727 {
@@ -15710,7 +15729,7 @@
15729 "cs": "Vytížení procesoru",
15730 "nl": "CPU gebruik",
15731 "xloc": [
15713 - "default.handlebars->23->1313"
15732 + "default.handlebars->23->1341"
15733 ]
15734 },
15735 {
@@ -15718,14 +15737,14 @@
15737 "cs": "Stav serveru",
15738 "nl": "Server Status",
15739 "xloc": [
15721 - "default.handlebars->23->1291"
15740 + "default.handlebars->23->1319"
15741 ]
15742 },
15743 {
15744 "en": "Agent Error Counters",
15745 "cs": "Počitadla chyb agenta",
15746 "xloc": [
15728 - "default.handlebars->23->1292"
15747 + "default.handlebars->23->1320"
15748 ]
15749 },
15750 {
@@ -15733,7 +15752,7 @@
15752 "cs": "Neznámá skupina",
15753 "nl": "Onbekende groep",
15754 "xloc": [
15736 - "default.handlebars->23->1293"
15755 + "default.handlebars->23->1321"
15756 ]
15757 },
15758 {
@@ -15741,7 +15760,7 @@
15760 "cs": "Neplatný PKCS podpis",
15761 "nl": "Onjuiste PKCS handtekening",
15762 "xloc": [
15744 - "default.handlebars->23->1294"
15763 + "default.handlebars->23->1322"
15764 ]
15765 },
15766 {
@@ -15749,7 +15768,7 @@
15768 "cs": "Neplatný RSA podpis",
15769 "nl": "Ongeldige RSA handtekening",
15770 "xloc": [
15752 - "default.handlebars->23->1295"
15771 + "default.handlebars->23->1323"
15772 ]
15773 },
15774 {
@@ -15757,7 +15776,7 @@
15776 "cs": "Neplatný JSON",
15777 "nl": "Onjuiste JSON",
15778 "xloc": [
15760 - "default.handlebars->23->1296"
15779 + "default.handlebars->23->1324"
15780 ]
15781 },
15782 {
@@ -15765,7 +15784,7 @@
15784 "cs": "Neznámá akce",
15785 "nl": "Onbekende actie",
15786 "xloc": [
15768 - "default.handlebars->23->1297"
15787 + "default.handlebars->23->1325"
15788 ]
15789 },
15790 {
@@ -15773,7 +15792,7 @@
15792 "cs": "Nesprávný certifikát webu",
15793 "nl": "Onjuist webcertificaat",
15794 "xloc": [
15776 - "default.handlebars->23->1298"
15795 + "default.handlebars->23->1326"
15796 ]
15797 },
15798 {
@@ -15781,7 +15800,7 @@
15800 "cs": "Nesprávný podpis",
15801 "nl": "Ongeldige handtening",
15802 "xloc": [
15784 - "default.handlebars->23->1299"
15803 + "default.handlebars->23->1327"
15804 ]
15805 },
15806 {
@@ -15789,7 +15808,7 @@
15808 "cs": "Dosaženo maximálního počtu relací",
15809 "nl": "Max Sessies bereikt",
15810 "xloc": [
15792 - "default.handlebars->23->1300"
15811 + "default.handlebars->23->1328"
15812 ]
15813 },
15814 {
@@ -15797,7 +15816,7 @@
15816 "cs": "Neznámá skupina zařízení",
15817 "nl": "Onbekende apparaatgroep",
15818 "xloc": [
15800 - "default.handlebars->23->1301"
15819 + "default.handlebars->23->1329"
15820 ]
15821 },
15822 {
@@ -15805,7 +15824,7 @@
15824 "cs": "Neplatný typ skupiny zařízení",
15825 "nl": "Ongeldige apparaatgroep type",
15826 "xloc": [
15808 - "default.handlebars->23->1302"
15827 + "default.handlebars->23->1330"
15828 ]
15829 },
15830 {
@@ -15813,7 +15832,7 @@
15832 "cs": "Duplikovat agenta",
15833 "nl": "Duplicaat Agent",
15834 "xloc": [
15816 - "default.handlebars->23->1303"
15835 + "default.handlebars->23->1331"
15836 ]
15837 },
15838 {
@@ -15821,7 +15840,7 @@
15840 "cs": "Připojené Intel&reg; AMT",
15841 "nl": "Verbonden Intel&reg; AMT",
15842 "xloc": [
15824 - "default.handlebars->23->1304"
15843 + "default.handlebars->23->1332"
15844 ]
15845 },
15846 {
@@ -15829,7 +15848,7 @@
15848 "cs": "Chyby předávání (relay)",
15849 "nl": "Relay fouten",
15850 "xloc": [
15832 - "default.handlebars->23->1305"
15851 + "default.handlebars->23->1333"
15852 ]
15853 },
15854 {
@@ -15837,14 +15856,14 @@
15856 "cs": "Uživatelské účty",
15857 "nl": "Gebruikersaccounts",
15858 "xloc": [
15840 - "default.handlebars->23->1306"
15859 + "default.handlebars->23->1334"
15860 ]
15861 },
15862 {
15863 "en": "Agent Sessions",
15864 "cs": "Relace agenta",
15865 "xloc": [
15847 - "default.handlebars->23->1308"
15866 + "default.handlebars->23->1336"
15867 ]
15868 },
15869 {
@@ -15852,7 +15871,7 @@
15871 "cs": "Připojení",
15872 "nl": "Verbonden gebruikers",
15873 "xloc": [
15855 - "default.handlebars->23->1309"
15874 + "default.handlebars->23->1337"
15875 ]
15876 },
15877 {
@@ -15860,7 +15879,7 @@
15879 "cs": "Uživatelské relace",
15880 "nl": "gebruikers Sessies",
15881 "xloc": [
15863 - "default.handlebars->23->1310"
15882 + "default.handlebars->23->1338"
15883 ]
15884 },
15885 {
@@ -15909,28 +15928,28 @@
15928 "cs": "Externí",
15929 "nl": "Extern",
15930 "xloc": [
15912 - "default.handlebars->23->1327"
15931 + "default.handlebars->23->1355"
15932 ]
15933 },
15934 {
15935 "en": "Heap Used",
15936 "nl": "Heap gebruikt",
15937 "xloc": [
15919 - "default.handlebars->23->1328"
15938 + "default.handlebars->23->1356"
15939 ]
15940 },
15941 {
15942 "en": "Heap Total",
15943 "nl": "Heap Totaal",
15944 "xloc": [
15926 - "default.handlebars->23->1329"
15945 + "default.handlebars->23->1357"
15946 ]
15947 },
15948 {
15949 "en": "RSS",
15950 "nl": "RSS",
15951 "xloc": [
15933 - "default.handlebars->23->1330"
15952 + "default.handlebars->23->1358"
15953 ]
15954 },
15955 {
@@ -15958,7 +15977,7 @@
15977 "en": "Relay Count",
15978 "cs": "Počet předávání (relay)",
15979 "xloc": [
15961 - "default.handlebars->23->1312"
15980 + "default.handlebars->23->1340"
15981 ]
15982 },
15983 {
@@ -15993,9 +16012,70 @@
16012 },
16013 {
16014 "en": "Create User Group",
16015 + "xloc": [
16016 + "default.handlebars->23->1233"
16017 + ]
16018 + },
16019 + {
16020 + "en": "User Group -",
16021 + "xloc": [
16022 + "default.handlebars->container->column_l->p51->1->1->0->1->p30title->3"
16023 + ]
16024 + },
16025 + {
16026 + "en": "No groups found.",
16027 "xloc": [
16028 "default.handlebars->23->1230"
16029 ]
16030 + },
16031 + {
16032 + "en": "Send a notice to all users in this group.",
16033 + "xloc": [
16034 + "default.handlebars->23->1240"
16035 + ]
16036 + },
16037 + {
16038 + "en": "Group Members",
16039 + "xloc": [
16040 + "default.handlebars->23->1242"
16041 + ]
16042 + },
16043 + {
16044 + "en": "No Members",
16045 + "xloc": [
16046 + "default.handlebars->23->1245"
16047 + ]
16048 + },
16049 + {
16050 + "en": "Delete User Group",
16051 + "xloc": [
16052 + "default.handlebars->23->1246",
16053 + "default.handlebars->23->1252"
16054 + ]
16055 + },
16056 + {
16057 + "en": "Edit User Group",
16058 + "xloc": [
16059 + "default.handlebars->23->1249"
16060 + ]
16061 + },
16062 + {
16063 + "en": "Delete user group {0}?",
16064 + "xloc": [
16065 + "default.handlebars->23->1250"
16066 + ]
16067 + },
16068 + {
16069 + "en": "Remote User",
16070 + "xloc": [
16071 + "default.handlebars->23->1253"
16072 + ]
16073 + },
16074 + {
16075 + "en": "Add Users to User Group",
16076 + "xloc": [
16077 + "default.handlebars->23->1258"
16078 + ]
16079 }
16080 ]
16081 }
\ No newline at end of file
views/default.handlebars
+23 -11
@@ -8851,15 +8851,15 @@
8851 return false;
8852 }
8853
8854 - function showUserBroadcastDialog() {
8854 + function showUserBroadcastDialog(targetid) {
8855 if (xxdialogMode) return;
8856 var x = "Broadcast a message to all connected users." + '<textarea id=broadcastMessage value="" maxlength="256"/></textarea>';
8857 - setDialogMode(2, "Broadcast Message", 3, showUserBroadcastDialogEx, x);
8857 + setDialogMode(2, "Broadcast Message", 3, showUserBroadcastDialogEx, x, targetid?decodeURIComponent(targetid):null);
8858 Q('broadcastMessage').focus();
8859 }
8860
8861 - function showUserBroadcastDialogEx() {
8862 - meshserver.send({ action: 'userbroadcast', msg: Q('broadcastMessage').value });
8861 + function showUserBroadcastDialogEx(b, targetid) {
8862 + meshserver.send({ action: 'userbroadcast', msg: Q('broadcastMessage').value, target: targetid });
8863 }
8864
8865 function showCreateNewAccountDialog() {
@@ -9104,6 +9104,10 @@
9104 }
9105 x += '</table></div><br />';
9106
9107 + if ((userinfo.siteadmin & 256) != 0) {
9108 + x += '<input type=button value=\"' + "Broadcast" + '\" title=\"' + "Send a notice to all users in this group." + '\" onclick=showUserBroadcastDialog("' + encodeURIComponent(group._id) + '") />';
9109 + }
9110 +
9111 // Setup the panel
9112 QH('p51group', x);
9113
@@ -9125,7 +9129,7 @@
9129 // Display all users for this mesh
9130 for (var i in sortedusers) {
9131 var trash = '<a href=# onclick=\'return p51deleteUser(event,"' + encodeURIComponent(sortedusers[i].id) + '")\' title=\"' + "Remove user rights to this device group" + '\" style=cursor:pointer><img src=images/trash.png border=0 height=10 width=10></a>';
9128 - x += '<tr tabindex=0 onclick=p20viewuser("' + encodeURIComponent(sortedusers[i].id) + '") onkeypress="if (event.key==\'Enter\') p20viewuser(\'' + encodeURIComponent(sortedusers[i].id) + '\')" style=cursor:pointer' + (((count % 2) == 0) ? ';background-color:#DDD' : '') + '><td><div title=\"' + "User" + '\" class=m2></div><div>&nbsp;' + EscapeHtml(decodeURIComponent(sortedusers[i].name)) + '<div></div></div></td><td><div style=float:right>' + trash + '</div></td></tr>';
9132 + x += '<tr ' + (((count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td><div title=\"' + "User" + '\" class=m2></div><div>&nbsp;' + EscapeHtml(decodeURIComponent(sortedusers[i].name)) + '<div></div></div></td><td><div style=float:right>' + trash + '</div></td></tr>';
9133 ++count;
9134 }
9135
@@ -9178,12 +9182,20 @@
9182 }
9183
9184 function p51deleteUser(e, id) {
9181 - console.log('p51deleteUser', id);
9185 + haltEvent(e);
9186 + p51viewuserEx(2, decodeURIComponent(id));
9187 + return false;
9188 }
9183 -
9184 -
9185 -
9189
9190 + function p51viewuserEx(button, userid) {
9191 + if (button != 2) return;
9192 + var uname = userid.split('/')[2];
9193 + if (users && users[userid]) { uname = users[userid].name; }
9194 + if (userinfo._id == userid) { uname = userinfo.name; }
9195 + setDialogMode(2, "Remote User", 3, p51viewuserEx2, format("Confirm removal of user {0}?", EscapeHtml(decodeURIComponent(uname))), userid);
9196 + }
9197 + function p51viewuserEx2(button, userid) { meshserver.send({ action: 'removeuserfromusergroup', ugrpid: currentUserGroup._id, userid: userid }); }
9198 +
9199 function p51showAddUserDialog() {
9200 if (xxdialogMode) return false;
9201 var x = "Allow users to manage this device group and devices in this group.";
@@ -9244,9 +9256,9 @@
9256 if (t == null) {
9257 var users = Q('dp51username').value.split(','), users2 = [];
9258 for (var i in users) { users2.push(users[i].trim()); }
9247 - meshserver.send({ action: 'addusertousergroup', meshid: currentUserGroup._id, usernames: users2 });
9259 + meshserver.send({ action: 'addusertousergroup', ugrpid: currentUserGroup._id, usernames: users2 });
9260 } else {
9249 - meshserver.send({ action: 'addusertousergroup', meshid: currentUserGroup._id, usernames: [ t.split('/')[2] ] });
9261 + meshserver.send({ action: 'addusertousergroup', ugrpid: currentUserGroup._id, usernames: [ t.split('/')[2] ] });
9262 }
9263 }
9264