improve bootstrap icons and formatting

Signed-off-by: si458 <simonsmith5521@gmail.com>

si458 committed Oct 24, 2024 at 15:56 UTC e10f5277e9249ad2c295a88c8a14c1be6d0fdbd8
2 files changed +213 -307
public/styles/style-bootstrap.css
+7 -3
@@ -1540,8 +1540,12 @@ a {
1540 opacity: 1;
1541 }
1542
1543 -.lbbuttonsel {
1543 +nav .lbbuttonsel {
1544 + width: 100%;
1545 + border-radius: 5px 0px 0px 5px;
1546 opacity: 0.9;
1547 + background-color: #ffffff;
1548 + color: #113962 !important;
1549 }
1550
1551 nav .lbbuttonsel2 {
@@ -3252,14 +3256,14 @@ nav .lbbuttonsel2 {
3256 color: #000;
3257 }
3258
3255 -.desktopButtons {
3259 +/* .desktopButtons {
3260 padding-top: 2px;
3261 }
3262
3263 .night .desktopButtons {
3264 filter: invert(60%);
3265 -webkit-filter: invert(60%);
3262 - }
3266 + } */
3267
3268
3269 .dtab {
views/default3.handlebars
+206 -304
@@ -186,36 +186,22 @@
186 style="position:absolute;right:0;top:10px;color:#c8c8c8;font-size:44px;margin-right:8px;cursor:pointer;display:none"
187 onclick=topMenu() src="/images/3bars-30.png" width=30 height=30 />
188 </div>
189 - <div class="sidebar d-flex flex-column" id="page_leftbar">
189 + <div class="sidebar flex-column" id="page_leftbar">
190 <div style="height:24px"></div>
191 <nav class="nav flex-column">
192 - <a class="nav-link active text-center text-white lbbuttonsel" id="LeftMenuMyDevices" href="#"
193 - data-target="general" onmouseup=go(1,event) onkeypress="if (event.key=='Enter') { go(1); }"><i
194 - class="fas fa-computer me-2"></i></a>
195 - <a class="nav-link text-center text-white" id="LeftMenuMyAccount" href="#" data-target="account"
196 - onmouseup=go(2,event) onkeypress="if (event.key=='Enter') { go(2); }"><i
197 - class="fas fa-user-gear me-2"></i></a>
198 - <a class="nav-link text-center text-white" id="LeftMenuMyEvents" href="#" data-target="events"
199 - onmouseup=go(3,event) onkeypress="if (event.key=='Enter') { go(3); }"><i
200 - class="fas fa-calendar-alt me-2"></i></a>
201 - <a class="nav-link text-center text-white" id="LeftMenuMyFiles" href="#" data-target="files"
202 - onmouseup=go(5,event) onkeypress="if (event.key=='Enter') { go(5); }"><i
203 - class="fas fa-folder-open me-2"></i></a>
204 - <a class="nav-link text-center text-white" id="LeftMenuMyUsers" href="#" data-target="users"
205 - onmouseup=go(4,event) onkeypress="if (event.key=='Enter') { go(4); }"><i
206 - class="fas fa-users me-2"></i></a>
207 - <a class="nav-link text-center text-white" id="LeftMenuMyServer" href="#" data-target="server"
208 - onmouseup=go(6,event) onkeypress="if (event.key=='Enter') { go(6); }"><i
209 - class="fas fa-server me-2"></i></a>
192 + <a class="nav-link active text-center text-white lbbuttonsel" id="LeftMenuMyDevices" href="#" data-target="general" onmouseup=go(1,event) onkeypress="if (event.key=='Enter') { go(1); }"><i class="fa-solid fa-computer me-2"></i></a>
193 + <a class="nav-link text-center text-white" id="LeftMenuMyAccount" href="#" data-target="account" onmouseup=go(2,event) onkeypress="if (event.key=='Enter') { go(2); }"><i class="fa-solid fa-user-gear me-2"></i></a>
194 + <a class="nav-link text-center text-white" id="LeftMenuMyEvents" href="#" data-target="events" onmouseup=go(3,event) onkeypress="if (event.key=='Enter') { go(3); }"><i class="fa-solid fa-calendar-alt me-2"></i></a>
195 + <a class="nav-link text-center text-white" id="LeftMenuMyFiles" href="#" data-target="files" onmouseup=go(5,event) onkeypress="if (event.key=='Enter') { go(5); }"><i class="fa-solid fa-folder-open me-2"></i></a>
196 + <a class="nav-link text-center text-white" id="LeftMenuMyUsers" href="#" data-target="users" onmouseup=go(4,event) onkeypress="if (event.key=='Enter') { go(4); }"><i class="fa-solid fa-users me-2"></i></a>
197 + <a class="nav-link text-center text-white" id="LeftMenuMyServer" href="#" data-target="server" onmouseup=go(6,event) onkeypress="if (event.key=='Enter') { go(6); }"><i class="fa-solid fa-server me-2"></i></a>
198 </nav>
199 </div>
200 <div id=topbar class=noselect>
201 <div>
202 <div style="position:relative">
203 <span id=logoutControlSpan2></span>
216 - <div tabindex=0 id=uiMenuButton title="User interface selection"
217 - onclick="showUserInterfaceSelectMenu()"
218 - onkeypress="if (event.key == 'Enter') showUserInterfaceSelectMenu()">
204 + <div tabindex=0 id=uiMenuButton title="User interface selection" onclick="showUserInterfaceSelectMenu()" onkeypress="if (event.key == 'Enter') showUserInterfaceSelectMenu()">
205 &diams;
206 <div id=uiMenu style="display:none">
207 <table>
@@ -388,7 +374,7 @@
374 </div>
375 </div>
376 </div>
391 - <div id="column_l">
377 + <div id="column_l" class='pt-3'>
378 <div id=p0 style="display:none">
379 <div id=p0message><span id=p0span>Server disconnected</span>, <href onclick=reload()
380 style=cursor:pointer><u>click to reconnect</u></href>.</div>
@@ -652,9 +638,7 @@
638 </div>
639 <div id=p2logintokens></div>
640 <strong>Device Groups</strong>
655 - <span id="p2createMeshLink1"> - <button class="btn btn-primary btn-sm me-2"
656 - onclick="return account_createMesh()"> <i class="fas fa-plus-circle"></i>
657 - New</button></span>
641 + <span id="p2createMeshLink1"> - <button class="btn btn-primary btn-sm me-2" onclick="return account_createMesh()"> <i class="fa-solid fa-plus-circle"></i>New</button></span>
642 <br /><br />
643 <div id=p2meshes></div>
644 <div id=p2noMeshFound style="display:none">No device groups.<span id="p2createMeshLink2"> <a href=#
@@ -701,8 +685,7 @@
685 <option value="">No limit</option>
686 </select>&nbsp;
687 </div>
704 - <a href=# onclick=p3showDownloadEventsDialog(2)><i class="fas fa-download"
705 - title="Download Events"></i></a>&nbsp;
688 + <a href=# onclick=p3showDownloadEventsDialog(2)><i class="fa-solid fa-download" title="Download Events"></i></a>&nbsp;
689 </td>
690 {{!-- <td class="h2"></td> --}}
691 </tr>
@@ -720,13 +703,9 @@
703 <div style="float:right">
704 <input type=button class="btn btn-outline-primary btn-sm m-1"
705 onclick=showUserBroadcastDialog() style=margin-right:6px value="Broadcast" />
723 - <a href=# onclick=p4downloadUserInfo()><i class="fas fa-download"
724 - title="Download user information" style="cursor:pointer"></i></a>
725 - <a href=# onclick=p4batchAccountCreate()><img id=p4UserBatchCreate
726 - style="cursor:pointer;display:none" title="Batch create many user accounts"
727 - src="images/link6.png" /></a>
728 - <i style="cursor:pointer;margin-top:3px;margin-left:6px" id=usersListToolbarSettings
729 - class="fas fa-cog" title="Settings" onclick="onUsersViewSettings()"></i>
706 + <a href=# onclick=p4downloadUserInfo()><i class="fa-solid fa-download" title="Download user information" style="cursor:pointer"></i></a>
707 + <a href=# onclick=p4batchAccountCreate()><img id=p4UserBatchCreate style="cursor:pointer;display:none" title="Batch create many user accounts" src="images/link6.png" /></a>
708 + <i style="cursor:pointer;margin-top:3px;margin-left:6px" id=usersListToolbarSettings class="fa-solid fa-cog" title="Settings" onclick="onUsersViewSettings()"></i>
709 </div>
710 <div>
711 <input type=button id=UsersSelectAllButton class="btn btn-outline-primary btn-sm m-1"
@@ -884,16 +863,13 @@
863 </div>
864 </div>
865 <div id=p10 style="display:none">
887 - <div id=p10title>
888 - <div id="p10BackButton">
889 - <div class="backButton" tabindex=0 onclick=goBack() title="Back"
890 - onkeypress="if (event.key == 'Enter') goBack()">
891 - <div class="backButtonEx"></div>
892 - </div>
866 + <div id=p10title class="d-flex align-items-center">
867 + <div id="p10BackButton" class="pe-2">
868 + <i class="fa-solid fa-square-caret-left fa-2xl" role="button" tabindex=0 onclick=goBack() title="Back" onkeypress="if (event.key == 'Enter') goBack()"></i>
869 </div>
894 - <h1>General - <span id=p10deviceName></span></h1>
870 + <div class='fs-4 fw-bold'>General - <span id=p10deviceName></span></div>
871 </div>
896 - <div id=p10info style="overflow-y:auto">
872 + <div id=p10info style="overflow-y:auto" class="pt-3">
873 <table style="width:100%" cellpadding="0" cellspacing="0">
874 <tr>
875 <td style=width:auto valign=top>
@@ -940,27 +916,18 @@
916 </div>
917 </div>
918 <div id=p11 class="noselect" style="display:none">
943 - <div id="p11title">
944 - <div id=p11deviceNameHeader>
945 - <div id="p11BackButton">
946 - <div class="backButton" tabindex=0 onclick=goBack() title="Back"
947 - onkeypress="if (event.key == 'Enter') goBack()">
948 - <div class="backButtonEx"></div>
949 - </div>
950 - </div>
951 - <div id="devListToolbarViewIcons">
952 - <div class="viewSelector" onclick=deskToggleFull(event)
953 - title="Full Screen. Hold shift to browser full screen.">
954 - <div class="viewSelector5"></div>
955 - </div>
956 - </div>
957 - <h1>Desktop - <span id=p11deviceName></span></h1>
919 + <div id="p11title" class="d-flex align-items-center">
920 + <div id="p11BackButton" class="pe-2">
921 + <i class="fa-solid fa-2xl fa-square-caret-left" role="button" tabindex=0 onclick=goBack() title="Back" onkeypress="if (event.key == 'Enter') goBack()"></i>
922 + </div>
923 + <div class='fs-4 fw-bold'>Desktop - <span id=p11deviceName></span></div>
924 + <div id="devListToolbarViewIcons" class="ms-auto">
925 + <i class="fa-solid fa-xl fa-maximize fa-border" role="button" onclick=deskToggleFull(event) title="Full Screen. Hold shift to browser full screen."></i>
926 </div>
927 </div>
928 <div id="p11warning" onclick="showFeaturesDlg()">
929 <div class="icon2"></div>
962 - <div class="warningbox">Redirection port or KVM feature is disabled<span id="p11warninga">, click
963 - here to enable it.</span></div>
930 + <div class="warningbox">Redirection port or KVM feature is disabled<span id="p11warninga">, click here to enable it.</span></div>
931 </div>
932 <div id="p11warning2" onclick="showPowerActionDlg()">
933 <div class="icon2"></div>
@@ -968,34 +935,19 @@
935 </div>
936 </div>
937 <div style="position:absolute;right:16px;margin-top:-14px;font-size:x-small;color:black">
971 - <div id="p11capslock"
972 - style="display:inline-block;margin-left:1px;border-radius:5px;background-color:#A3FFB8;padding:2px">
973 - CAPS
974 - </div>
975 - <div id="p11scrolllock"
976 - style="display:inline-block;margin-left:1px;border-radius:5px;background-color:#A3FFB8;padding:2px">
977 - SCROLL
978 - </div>
979 - <div id="p11numlock"
980 - style="display:inline-block;margin-left:1px;border-radius:5px;background-color:#A3FFB8;padding:2px">
981 - NUM
982 - </div>
938 + <div id="p11capslock" style="display:inline-block;margin-left:1px;border-radius:5px;background-color:#A3FFB8;padding:2px">CAPS</div>
939 + <div id="p11scrolllock" style="display:inline-block;margin-left:1px;border-radius:5px;background-color:#A3FFB8;padding:2px">SCROLL</div>
940 + <div id="p11numlock" style="display:inline-block;margin-left:1px;border-radius:5px;background-color:#A3FFB8;padding:2px">NUM</div>
941 </div>
942 <div id=deskarea0 cellpadding=0 cellspacing=0>
943 <div id=deskarea1 class="areaHead">
944 <div class="toright2">
987 - <div id="idx_deskFullBtn2" onclick=deskToggleFull(event) style="float:right">&nbsp;&#x2716;
988 - </div>
945 + <div id="idx_deskFullBtn2" onclick=deskToggleFull(event) style="float:right">&nbsp;&#x2716;</div>
946 <span id="p11power"></span>&nbsp;
990 - <div class='deskareaicon' title="Toggle View Mode" onclick="toggleAspectRatio(1)">&#8690;
991 - </div>
992 - <div class='deskareaicon' title="Rotate Left" onclick="drotate(-1)"><i
993 - class="fas fa-rotate-left"></i></div>
994 - <div class='deskareaicon' title="Rotate Right" onclick="drotate(1)"><i
995 - class="fas fa-rotate-right"></i></div>
996 - <div id="deskRecordIcon" class='deskareaicon' title="Server is recording this session"
997 - style="display:none;background-color:red;width:12px;height:12px;border-radius:6px;margin-top:5px">
998 - </div>
947 + <div class='deskareaicon' title="Toggle View Mode" onclick="toggleAspectRatio(1)">&#8690;</div>
948 + <div class='deskareaicon' title="Rotate Left" onclick="drotate(-1)"><i class="fa-solid fa-rotate-left"></i></div>
949 + <div class='deskareaicon' title="Rotate Right" onclick="drotate(1)"><i class="fa-solid fa-rotate-right"></i></div>
950 + <div id="deskRecordIcon" class='deskareaicon' title="Server is recording this session" style="display:none;background-color:red;width:12px;height:12px;border-radius:6px;margin-top:5px"></div>
951 <input id="deskFocusBtn" type="button"
952 title="Toggle focus mode, when active only the region around the mouse is updated"
953 onkeypress="return false" onkeydown="return false" value="Focus All"
@@ -1021,19 +973,19 @@
973 id=connectbutton1 cmenu="deskConnectButton"
974 title="Connect using MeshAgent remote desktop" onclick=connectDesktop(event,3)
975 onkeypress="return false" onkeydown="return false" disabled="disabled"><i
1024 - class="fas fa-circle-play"></i> Connect</button></span>
976 + class="fa-solid fa-circle-play"></i> Connect</button></span>
977 <span id=connectbutton1rspan><button class="btn btn-primary btn-sm me-2" type=button
978 id=connectbutton1r cmenu="altPortContextMenu" title="Connect using RDP"
979 onclick=askRdpCredentials() onkeypress="return false" onkeydown="return false"
1028 - disabled="disabled"><i class="fas fa-circle-play"></i> RDP Connect</button></span>
980 + disabled="disabled"><i class="fa-solid fa-circle-play"></i> RDP Connect</button></span>
981 <span id=connectbutton1hspan><button class="btn btn-primary btn-sm me-2" type=button
982 id=connectbutton1h title="Connect using hardware KVM"
983 onclick=connectDesktop(event,2) onkeypress="return false" onkeydown="return false"
1032 - disabled="disabled"><i class="fas fa-circle-play"></i> HW Connect</button></span>
984 + disabled="disabled"><i class="fa-solid fa-circle-play"></i> HW Connect</button></span>
985 <span id=disconnectbutton1span><button class="btn btn-primary btn-sm me-2" type=button
986 id=disconnectbutton1 cmenu="deskDisconnectButton" value="Disconnect"
987 onclick=connectDesktop(event,0) onkeypress="return false"
1036 - onkeydown="return false"><i class="fas fa-power-off"></i> Disconnect</button></span>
988 + onkeydown="return false"><i class="fa-solid fa-power-off"></i> Disconnect</button></span>
989 <span id="deskstatus" style="line-height:22px">Disconnected</span><span
990 id="deskmetadata"></span>
991 </div>
@@ -1050,7 +1002,7 @@
1002 </div>
1003 <div id=DeskTools>
1004 <div id=deskToolsAreaTop>
1053 - <a id=DeskToolsRefreshButton style="right:2px" onclick="refreshDeskTools()">Refresh</a>
1005 + <a id=DeskToolsRefreshButton class="link-underline-primary" style="right:2px" onclick="refreshDeskTools()">Refresh</a>
1006 <div id=deskToolsTopTabProcess class="deskToolsTopTab" onclick="changeDeskToolTab(0)"
1007 style="left:0px;bottom:0px">Processes</div>
1008 <div id=deskToolsTopTabService class="deskToolsTopTab" onclick="changeDeskToolTab(1)"
@@ -1083,57 +1035,52 @@
1035 </div>
1036 <div id=deskarea4 class="areaFoot">
1037 <div class="toright2">
1086 - <span id="DeskLatency" style="line-height:22px;width:50px"
1087 - title="Desktop Session Latency"></span>
1038 + <span id="DeskLatency" style="line-height:22px;width:50px" title="Desktop Session Latency"></span>
1039 <span id="DeskTimer" style="line-height:22px" title="Session time"></span>
1089 - <input id=DeskToolsButton type=button class="btn btn-outline-primary btn-sm m-1" value=Tools
1090 - title="Toggle tools view" onkeypress="return false" onkeydown="return false"
1091 - onclick="toggleDeskTools()" />
1040 + <input id=DeskToolsButton type=button class="btn btn-outline-primary btn-sm m-1" value=Tools title="Toggle tools view" onkeypress="return false" onkeydown="return false" onclick="toggleDeskTools()" />
1041 <span>&nbsp;</span>
1093 - <span id=DeskRunButton cmenu="deskPreConfigScriptContextMenu" class="deskarea"
1094 - title="Run a script on this computer"><i class="fas fa-play desktopButtons"
1095 - onclick=runDeviceCmd() height=16 width=16 style=padding-top:2px></i></span>
1096 - <span id=DeskChatButton class="deskarea" title="Open chat window to this computer"><i
1097 - class="fas fa-message desktopButtons" onclick=deviceChat(event) height=16 width=16
1098 - style=padding-top:2px></i></span>
1099 - <span id=DeskNotifyButton title="Display a notification on the remote computer"><i
1100 - class="fas fa-bell desktopButtons" onclick=deviceToastFunction() height=16 width=16
1101 - style=padding-top:2px></i></span>
1102 - <span id=DeskLockButton title="Lock the remote computer"><img src='images/icon-lock.png'
1103 - class="desktopButtons" onclick=deviceLockFunction() height=16 width=16 /></span>
1104 - <span id=DeskOpenWebButton title="Open a web address on the remote computer"><i
1105 - class="desktopButtons fas fa-globe" onclick=deviceUrlFunction() height=16
1106 - width=16></i></span>
1107 - <span id=DeskBackgroundButton title="Toggle remote desktop background"><img
1108 - class="desktopButtons" id=DeskBackgroundButtonImage src='images/icon-background.png'
1109 - onclick=deviceToggleBackground(event) height=16 width=16 /></span>
1110 - <span id=DeskSaveImageButton title="Save a screenshot of the remote desktop"><img
1111 - class="desktopButtons" src='images/icon-camera.png' onclick=deskSaveImage()
1112 - height=16 width=16 /></span>
1113 - <span id=DeskRecordButton cmenu=deskPlayerContextMenu
1114 - title="Record remote desktop session to file" style="display:none"><img
1115 - class="desktopButtons" id=DeskRecordButtonImage src='images/icon-film.png'
1116 - onclick=deskRecordSession() height=16 width=16 /></span>
1117 - <span id=DeskClipboardInButton title="Download remote clipboard to local clipboard"
1118 - style="display:none"><img class="desktopButtons" id=DeskClipboardInButtonImage
1119 - src='images/icon-clipboard-in.png' onclick=deskClipboardInFunction() height=16
1120 - width=16 /></span>
1121 - <span id=DeskClipboardOutButton title="Upload local clipboard to remote device"><img
1122 - class="desktopButtons" id=DeskClipboardOutButtonImage
1123 - src='images/icon-clipboard-out.png' onclick=deskClipboardOutFunction() height=16
1124 - width=16 /></span>
1125 - <span id=DeskRefreshButton title="Refresh the desktop"><img class="desktopButtons"
1126 - id=DeskRefreshButtonImage src='images/icon-refresh.png'
1127 - onclick=deskRefreshFunction() height=16 width=16 /></span>
1128 - <span id=DeskInputLockedButton title="Remote input is locked"><img class="desktopButtons"
1129 - id=DeskInputLockedButtonImage src='images/icon-keylock-red.png'
1130 - onclick=deskInputLockFunction(0) height=16 width=16 /></span>
1131 - <span id=DeskInputUnLockedButton title="Remote input is unlocked"><img
1132 - class="desktopButtons" id=DeskInputUnLockedButtonImage src='images/icon-keylock.png'
1133 - onclick=deskInputLockFunction(1) height=16 width=16 /></span>
1134 - <span id=DeskGuestShareButton title="Share the device with a guest"><i
1135 - class="desktopButtons fas fa-share-nodes" id=DeskInputUnLockedButtonImage
1136 - onclick=showShareDevice() height=16 width=16></i></span>
1042 + <span id=DeskRunButton cmenu="deskPreConfigScriptContextMenu" class="deskarea" title="Run a script on this computer" role="button">
1043 + <i class="fa-solid fa-fw fa-play" onclick=runDeviceCmd()></i>
1044 + </span>
1045 + <span id=DeskChatButton class="deskarea" title="Open chat window to this computer" role="button">
1046 + <i class="fa-solid fa-fw fa-message" onclick=deviceChat(event)></i>
1047 + </span>
1048 + <span id=DeskNotifyButton title="Display a notification on the remote computer" role="button">
1049 + <i class="fa-solid fa-fw fa-bell" onclick=deviceToastFunction()></i>
1050 + </span>
1051 + <span id=DeskLockButton title="Lock the remote computer" role="button">
1052 + <i class="fa-solid fa-fw fa-lock" onclick=deviceLockFunction()></i>
1053 + </span>
1054 + <span id=DeskOpenWebButton title="Open a web address on the remote computer" role="button">
1055 + <i class="fa-solid fa-fw fa-globe" onclick=deviceUrlFunction()></i>
1056 + </span>
1057 + <span id=DeskBackgroundButton title="Toggle remote desktop background" role="button">
1058 + <i class="fa-solid fa-fw fa-image" onclick=deviceToggleBackground(event) id=DeskBackgroundButtonImage >></i>
1059 + </span>
1060 + <span id=DeskSaveImageButton title="Save a screenshot of the remote desktop" role="button">
1061 + <i class="fa-solid fa-fw fa-camera" onclick=deskSaveImage()></i>
1062 + </span>
1063 + <span id=DeskRecordButton cmenu=deskPlayerContextMenu title="Record remote desktop session to file" style="display:none" role="button">
1064 + <i class="fa-solid fa-fw fa-video" onclick=deskRecordSession() id=DeskRecordButtonImage></i>
1065 + </span>
1066 + <span id=DeskClipboardInButton title="Download remote clipboard to local clipboard" style="display:none">
1067 + <i class="fa-solid fa-fw fa-down-long" data-fa-transform="shrink-9 down-4" data-fa-mask="fa-solid fa-clipboard" onclick=deskClipboardInFunction()></i>
1068 + </span>
1069 + <span id=DeskClipboardOutButton title="Upload local clipboard to remote device">
1070 + <i class="fa-solid fa-fw fa-up-long" data-fa-transform="shrink-9 down-4" data-fa-mask="fa-solid fa-clipboard" onclick=deskClipboardOutFunction()></i>
1071 + </span>
1072 + <span id=DeskRefreshButton title="Refresh the desktop" role="button">
1073 + <i class="fa-solid fa-fw fa-rotate" onclick=deskRefreshFunction()></i>
1074 + </span>
1075 + <span id=DeskInputLockedButton title="Remote input is locked">
1076 + <i class="fa-solid fa-fw fa-keyboard" style=color:red onclick=deskInputLockFunction(0)></i>
1077 + </span>
1078 + <span id=DeskInputUnLockedButton title="Remote input is unlocked" role="button">
1079 + <i class="fa-solid fa-fw fa-keyboard" onclick=deskInputLockFunction(1)></i>
1080 + </span>
1081 + <span id=DeskGuestShareButton title="Share the device with a guest">
1082 + <i class="fa-solid fa-fw fa-share-nodes" id=DeskInputUnLockedButtonImage onclick=showShareDevice()></i>
1083 + </span>
1084 </div>
1085 <div class="toright2"><span id=DeskMonitorSelectionSpan></span></div>
1086 <div>
@@ -1158,20 +1105,14 @@
1105 </div>
1106 </div>
1107 <div id=p12 style="display:none">
1161 - <div id="p12title">
1162 - <div id="p12BackButton">
1163 - <div class="backButton" tabindex=0 onclick=goBack() title="Back"
1164 - onkeypress="if (event.key == 'Enter') goBack()">
1165 - <div class="backButtonEx"></div>
1166 - </div>
1108 + <div id="p12title" class="d-flex align-items-center">
1109 + <div id="p12BackButton" class="pe-2">
1110 + <i class="fa-solid fa-square-caret-left fa-2xl" role="button" tabindex=0 onclick=goBack() title="Back" onkeypress="if (event.key == 'Enter') goBack()"></i>
1111 </div>
1168 - <div id="devListToolbarViewIcons2" style="float:right">
1169 - <div class="viewSelector" onclick=deskToggleFull(event)
1170 - title="Full Screen. Hold shift to browser full screen.">
1171 - <i class="fas fa-maximize"></i>
1172 - </div>
1112 + <div class='fs-4 fw-bold'>Terminal - <span id=p12deviceName></span></div>
1113 + <div id="devListToolbarViewIcons2" class="ms-auto">
1114 + <i class="fa-solid fa-xl fa-maximize fa-border" role="button" onclick=deskToggleFull(event) title="Full Screen. Hold shift to browser full screen."></i>
1115 </div>
1174 - <h1>Terminal - <span id=p12deviceName></span></h1>
1116 </div>
1117 <div id="p12warning" onclick=showFeaturesDlg()>
1118 <div class="icon2"></div>
@@ -1203,28 +1144,28 @@
1144 <div>
1145 <button type="button" id="autoconnectbutton2" class="btn btn-primary btn-sm me-2"
1146 onclick=autoConnectTerminal(event) onkeypress="return false"
1206 - onkeydown="return false" style="display:none"><i class="fas fa-play"></i>
1147 + onkeydown="return false" style="display:none"><i class="fa-solid fa-play"></i>
1148 AutoConnect</button><span id="connectbutton2span"
1149 style="margin-right:4px"><button type="button" id="connectbutton2"
1150 class="btn btn-primary btn-sm me-2" cmenu="termConnectButton"
1151 onclick=connectTerminal(event,1) onkeypress="return false"
1211 - onkeydown="return false" disabled="disabled"><i class="fas fa-play"></i>
1152 + onkeydown="return false" disabled="disabled"><i class="fa-solid fa-play"></i>
1153 Connect</button></span><span id="connectbutton2sspan"
1154 style="margin-right:4px"><button type="button" id="connectbutton2s"
1155 cmenu=sshPortContextMenu class="btn btn-primary btn-sm me-2"
1156 onclick=connectTerminal(event,3) onkeypress="return false"
1216 - onkeydown="return false" disabled="disabled"><i class="fas fa-play"></i> SSH
1157 + onkeydown="return false" disabled="disabled"><i class="fa-solid fa-play"></i> SSH
1158 Connect</button></span><span id="connectbutton2hspan"
1159 style="margin-right:4px"><button type="button"
1160 class="btn btn-primary btn-sm me-2" id="connectbutton2h"
1161 title="Connect using Intel&reg; AMT hardware KVM"
1162 onclick=connectTerminal(event,2) onkeypress="return false"
1222 - onkeydown="return false" disabled="disabled"><i class="fas fa-play"></i> HW
1163 + onkeydown="return false" disabled="disabled"><i class="fa-solid fa-play"></i> HW
1164 Connect</button></span><span id="disconnectbutton2span"
1165 style="margin-right:4px"><button type="button"
1166 class="btn btn-primary btn-sm me-2" id="disconnectbutton2"
1167 onclick=connectTerminal(event,0) onkeypress="return false"
1227 - onkeydown="return false"><i class="fas fa-play"></i>
1168 + onkeydown="return false"><i class="fa-solid fa-play"></i>
1169 Disconnect</button></span>
1170 <span id="termstatus" style="line-height:22px">Disconnected</span><span
1171 id="termtitle"></span>
@@ -1298,14 +1239,11 @@
1239 </div>
1240 </div>
1241 <div id=p13 style="display:none">
1301 - <div id="p13title">
1302 - <div id="p13BackButton" style="float:left">
1303 - <div class="backButton" tabindex=0 onclick=goBack() title="Back"
1304 - onkeypress="if (event.key == 'Enter') goBack()">
1305 - <div class="backButtonEx"></div>
1306 - </div>
1242 + <div id="p13title" class="d-flex align-items-center">
1243 + <div id="p13BackButton" class="pe-2">
1244 + <i class="fa-solid fa-square-caret-left fa-2xl" role="button" tabindex=0 onclick=goBack() title="Back" onkeypress="if (event.key == 'Enter') goBack()"></i>
1245 </div>
1308 - <h1>Files - <span id=p13deviceName></span></h1>
1246 + <div class='fs-4 fw-bold'>Files - <span id=p13deviceName></span></div>
1247 </div>
1248 <table id="p13toolbar" cellpadding="0" cellspacing="0">
1249 <tr>
@@ -1323,14 +1261,14 @@
1261 <div>
1262 <button id=p13AutoConnect onclick=autoConnectFiles(event)
1263 class="btn btn-primary btn-sm me-2" type="button" style="display:none"><i
1326 - class="fas fa-play"></i> AutoConnect</button>
1264 + class="fa-solid fa-play"></i> AutoConnect</button>
1265 <button id=p13Connect cmenu="filesConnectButton" class="btn btn-primary btn-sm me-2"
1328 - onclick=connectFiles(event,1) type="button"><i class="fas fa-play"></i>
1266 + onclick=connectFiles(event,1) type="button"><i class="fa-solid fa-play"></i>
1267 Connect</button>
1268 <button id=p13Disconnect class="btn btn-primary btn-sm me-2" onclick=connectFiles(event)
1331 - type="button"><i class="fas fa-play"></i> Disconnect</button>
1269 + type="button"><i class="fa-solid fa-play"></i> Disconnect</button>
1270 <button id=p13Connects class="btn btn-primary btn-sm me-2" cmenu=sshPortContextMenu
1333 - onclick=connectFiles(event,2) type="button"><i class="fas fa-play"></i> SFTP
1271 + onclick=connectFiles(event,2) type="button"><i class="fa-solid fa-play"></i> SFTP
1272 Connect</button>
1273 <span id=p13Status>Disconnected</span>
1274 </div>
@@ -1426,43 +1364,31 @@
1364 </table>
1365 </div>
1366 <div id=p14 style="display:none">
1429 - <div id="p14title">
1430 - <div id="p14BackButton" style="float:left">
1431 - <div class="backButton" tabindex=0 onclick=goBack() title="Back"
1432 - onkeypress="if (event.key == 'Enter') goBack()">
1433 - <div class="backButtonEx"></div>
1434 - </div>
1367 + <div id="p14title" class="d-flex align-items-center">
1368 + <div id="p14BackButton" class="pe-2">
1369 + <i class="fa-solid fa-square-caret-left fa-2xl" role="button" tabindex=0 onclick=goBack() title="Back" onkeypress="if (event.key == 'Enter') goBack()"></i>
1370 </div>
1436 - <div id="devListToolbarViewIcons">
1437 - <div class="viewSelector" onclick=deskToggleFull(event)
1438 - title="Full Screen. Hold shift to browser full screen.">
1439 - <div class="viewSelector5"></div>
1440 - </div>
1371 + <div class='fs-4 fw-bold'><span id=p14deviceNamePrefix>Intel&reg; AMT</span> - <span id=p14deviceName></span></div>
1372 + <div id="devListToolbarViewIcons" class="ms-auto">
1373 + <i class="fa-solid fa-xl fa-maximize fa-border" role="button" onclick=deskToggleFull(event) title="Full Screen. Hold shift to browser full screen."></i>
1374 </div>
1442 - <h1><span id=p14deviceNamePrefix>Intel&reg; AMT</span> - <span id=p14deviceName></span></h1>
1375 </div>
1376 <iframe id=p14iframe src="{{{domainurl}}}commander.ashx"></iframe>
1377 </div>
1378 <div id=p15 style="display:none">
1447 - <div id="p15title">
1448 - <div id="p15BackButton" style="float:left">
1449 - <div class="backButton" tabindex=0 onclick=goBack() title="Back"
1450 - onkeypress="if (event.key == 'Enter') goBack()">
1451 - <div class="backButtonEx"></div>
1452 - </div>
1379 + <div id="p15title" class="d-flex align-items-center">
1380 + <div id="p15BackButton" class="pe-2">
1381 + <i class="fa-solid fa-square-caret-left fa-2xl" role="button" tabindex=0 onclick=goBack() title="Back" onkeypress="if (event.key == 'Enter') goBack()"></i>
1382 </div>
1454 - <h1><span id=p15deviceName></span></h1>
1383 + <div class='fs-4 fw-bold'><span id=p15deviceName></span></div>
1384 </div>
1385 <table id="consoleTable" cellpadding=0 cellspacing=0>
1386 <tr>
1387 <td class="areaHead">
1388 <div class="toright2">
1389 <div id=p15coreName title="Information about current core running on this agent"></div>
1461 - <input type=button id=p15uploadCore class="btn btn-outline-primary me-2 btn-sm"
1462 - value="Agent Action" onclick=p15uploadCore(event)
1463 - title="Change the agent Java Script code module" />
1464 - <i onclick=p15downloadConsoleText() style="cursor:pointer;margin-top:6px"
1465 - title="Download console text" class="fas fa-download"></i>
1390 + <input type=button id=p15uploadCore class="btn btn-outline-primary me-2 btn-sm" value="Agent Action" onclick=p15uploadCore(event) title="Change the agent Java Script code module" />
1391 + <i onclick=p15downloadConsoleText() style="margin-top:6px" title="Download console text" class="fa-solid fa-download"></i>
1392 </div>
1393 <div id="p15statetext"></div>
1394 </td>
@@ -1505,14 +1431,11 @@
1431 </table>
1432 </div>
1433 <div id=p16 style="display:none">
1508 - <div id="p16title">
1509 - <div id="p16BackButton" style="float:left">
1510 - <div class="backButton" tabindex=0 onclick=goBack() title="Back"
1511 - onkeypress="if (event.key == 'Enter') goBack()">
1512 - <div class="backButtonEx"></div>
1513 - </div>
1434 + <div id="p16title" class="d-flex align-items-center">
1435 + <div id="p16BackButton" class="pe-2">
1436 + <i class="fa-solid fa-square-caret-left fa-2xl" role="button" tabindex=0 onclick=goBack() title="Back" onkeypress="if (event.key == 'Enter') goBack()"></i>
1437 </div>
1515 - <h1>Events - <span id=p16deviceName></span></h1>
1438 + <div class='fs-4 fw-bold'>Events - <span id=p16deviceName></span></div>
1439 </div>
1440 <table class="pTable">
1441 <tr>
@@ -1540,8 +1463,7 @@
1463 <option value=500>Last 500</option>
1464 <option value=1000>Last 1000</option>
1465 </select>
1543 - <a href=# onclick=p3showDownloadEventsDialog(1)><i class="fas fa-download"
1544 - title="Download Events" style=cursor:pointer></i></a>&nbsp;
1466 + <i onclick=p3showDownloadEventsDialog(1) class="fa-solid fa-download" title="Download Events" style=cursor:pointer></i>
1467 </td>
1468 {{!-- <td class="h2"></td> --}}
1469 </tr>
@@ -1549,20 +1471,14 @@
1471 <div id=p16events></div>
1472 </div>
1473 <div id=p17 style="display:none;">
1552 - <div id="p17title" style="margin-left:18px">
1553 - <div id="p17BackButton" style="float:left">
1554 - <div class="backButton" tabindex=0 onclick=goBack() title="Back"
1555 - onkeypress="if (event.key == 'Enter') goBack()">
1556 - <div class="backButtonEx"></div>
1557 - </div>
1474 + <div id="p17title" class="d-flex align-items-center">
1475 + <div id="p17BackButton" class="pe-2">
1476 + <i class="fa-solid fa-square-caret-left fa-2xl" role="button" tabindex=0 onclick=goBack() title="Back" onkeypress="if (event.key == 'Enter') goBack()"></i>
1477 </div>
1559 - <div id="devListToolbarViewIcons3">
1560 - <div class="viewSelector" onclick=deskToggleCpuGraph(event)
1561 - title="Show device CPU and memory usage.">
1562 - <div class="viewSelector6"></div>
1563 - </div>
1478 + <div class='fs-4 fw-bold'>Details - <span id=p17deviceName></span></div>
1479 + <div id="devListToolbarViewIcons3" class="ms-auto">
1480 + <i class="fa-solid fa-chart-line fa-xl fa-border" role="button" onclick=deskToggleCpuGraph(event) title="Show device CPU and memory usage."></i>
1481 </div>
1565 - <h1>Details - <span id=p17deviceName></span></h1>
1482 </div>
1483 <div id=p17info style="overflow-y:auto">
1484 <div id=p17graph style="width:100%">
@@ -1765,8 +1681,7 @@
1681 <option value="">No limit</option>
1682 </select>
1683 </div>
1768 - <a href=# onclick=p3showDownloadEventsDialog(3)><i class="fas fa-download"
1769 - title="Download Events" style=cursor:pointer></i></a>&nbsp;
1684 + <a href=# onclick=p3showDownloadEventsDialog(3)><i class="fa-solid fa-download" title="Download Events" style=cursor:pointer></i></a>&nbsp;
1685 </td>
1686 {{!-- <td class="h2"></td> --}}
1687 </tr>
@@ -1799,7 +1714,7 @@
1714 <option value=720>Last 30 days</option>
1715 </select>&nbsp;
1716 </div>
1802 - <i class="fas fa-download" title="Download data points (.csv)" style=cursor:pointer
1717 + <i class="fa-solid fa-download" title="Download data points (.csv)" style=cursor:pointer
1718 onclick=p40downloadEvents()></i>&nbsp;
1719 </div>
1720 <div>
@@ -1828,7 +1743,7 @@
1743 </div>
1744 <input value="Clear" type="button" class="btn btn-secondary btn-sm m-1"
1745 onclick="clearServerTracing()" />
1831 - <i class="fas fa-download" title="Download trace (.csv)" style=cursor:pointer
1746 + <i class="fa-solid fa-download" title="Download trace (.csv)" style=cursor:pointer
1747 onclick=p41downloadServerTrace()></i>&nbsp;
1748 </div>
1749 <div>
@@ -1998,11 +1913,11 @@
1913 <td class="style14">
1914 <div style="float:right;line-height:22px">
1915 <a id="p60downloadReportDiv" style="display:none" href=# onclick=p60downloadReport()><i
2001 - class="fas fa-download" title="Download Report"></i></a>&nbsp;
1916 + class="fa-solid fa-download" title="Download Report"></i></a>&nbsp;
1917 </div>
1918 <div>
1919 <button class="btn btn-primary btn-sm me-2 m-1" onclick=generateReportDialog()><i
2005 - class="far fa-file-alt"></i> Generate Report...</button>
1920 + class="fa-regular fa-file-alt"></i> Generate Report...</button>
1921 </div>
1922 </td>
1923 {{!-- <td class="h2"></td> --}}
@@ -2081,18 +1996,13 @@
1996 <input id="d4SizeButton" type="button" value="Small" onclick="d4ToggleSize()" />
1997 <input id="d4EncodingButton" type="button" value="Raw" onclick="d4ToggleEncoding()" />
1998 <input id="d4LineBreakButton" type="button" value="Windows" onclick="d4ToggleLineBreak()" />
2084 - <textarea id=d4editorarea autocomplete="off"
2085 - style="height:calc(100vh - 286px);width:100%;overflow:scroll;resize:none;white-space:pre"></textarea>
1999 + <textarea id=d4editorarea autocomplete="off" style="height:calc(100vh - 286px);width:100%;overflow:scroll;resize:none;white-space:pre"></textarea>
2000 </div>
2001 <div id=dialog7 style="">
2002 <div class="dtab">
2089 - <button id="td7meshkvm" class="tablinks"
2090 - onclick="changeDesktopSettingsTab(event, 'd7meshkvm')">Agent</button>
2091 - <button id="td7rdpkvm" class="tablinks"
2092 - onclick="changeDesktopSettingsTab(event, 'd7rdpkvm')">RDP</button>
2093 - <button id="td7amtkvm" class="tablinks"
2094 - onclick="changeDesktopSettingsTab(event, 'd7amtkvm')">Intel&reg;
2095 - AMT</button>
2003 + <button id="td7meshkvm" class="tablinks" onclick="changeDesktopSettingsTab(event, 'd7meshkvm')">Agent</button>
2004 + <button id="td7rdpkvm" class="tablinks" onclick="changeDesktopSettingsTab(event, 'd7rdpkvm')">RDP</button>
2005 + <button id="td7amtkvm" class="tablinks" onclick="changeDesktopSettingsTab(event, 'd7amtkvm')">Intel&reg; AMT</button>
2006 </div>
2007 <div id="d7meshkvm" class="tabcontent">
2008 <!--<h4>Agent Remote Desktop</h4>-->
@@ -2253,28 +2163,19 @@
2163 class="btn btn-outline-success" /><input type=submit id=p13loginSubmit2 style="display:none"
2164 class="btn btn-outline-success" /></form>
2165
2256 - <div id=topMenu
2257 - style="z-index:1000;background-color:#ffffff;box-shadow:0px 0px 15px #666;font-family:Arial,Helvetica,sans-serif;border-radius:0px 0px 5px 5px;position:fixed;top:50px;right:5px;width:170px;display:none">
2258 - <div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer" onclick=topMenu(1)>My Devices
2259 - </div>
2260 - <div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer" onclick=topMenu(2)>My Account
2261 - </div>
2262 - <div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer" onclick=topMenu(3)>My Events
2263 - </div>
2264 - <div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer" onclick=topMenu(5)>My Files
2265 - </div>
2266 - <div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer" onclick=topMenu(4)>My Users
2267 - </div>
2268 - <div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer" onclick=topMenu(6)>My Server
2166 + <div id=topMenu style="z-index:1000;background-color:#ffffff;box-shadow:0px 0px 15px #666;font-family:Arial,Helvetica,sans-serif;border-radius:0px 0px 5px 5px;position:fixed;top:50px;right:5px;width:170px;display:none">
2167 + <div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer" onclick=topMenu(1)>My Devices</div>
2168 + <div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer" onclick=topMenu(2)>My Account</div>
2169 + <div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer" onclick=topMenu(3)>My Events</div>
2170 + <div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer" onclick=topMenu(5)>My Files</div>
2171 + <div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer" onclick=topMenu(4)>My Users</div>
2172 + <div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer" onclick=topMenu(6)>My Server</div>
2173 + <div id="logoutMenuOption">
2174 + <a id="logoutMenuOptionRef" href=/logout><div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer">Logout</div></a>
2175 </div>
2270 - <div id="logoutMenuOption"><a id="logoutMenuOptionRef" href=/logout>
2271 - <div style="padding:12px;border-top:1px solid gray;color:black;cursor:pointer">Logout</div>
2272 - </a></div>
2176 </div>
2177
2275 - <audio id="chimes">
2276 - <source src="sounds/chimes.mp3" type="audio/mp3" />
2277 - </audio>
2178 + <audio id="chimes"><source src="sounds/chimes.mp3" type="audio/mp3" /></audio>
2179 <iframe style=display:none name="fileDownloadFrame"></iframe>
2180 </div>
2181 <script type="text/javascript">
@@ -3555,9 +3456,9 @@
3456 }
3457 } else if (message.type === 'deskBackground') {
3458 if (message.data != "") {
3558 - Q('DeskBackgroundButtonImage').src = 'images/icon-background.png';
3459 + Q('DeskBackgroundButtonImage').style.color = '';
3460 } else {
3560 - Q('DeskBackgroundButtonImage').src = 'images/icon-background-red.png';
3461 + Q('DeskBackgroundButtonImage').style.color = 'red';
3462 }
3463 }
3464 }
@@ -6440,22 +6341,22 @@
6341
6342 // Windows agent install
6343 x += '<div id=agins_windows>' + format("To add a new computer to device group \"{0}\", download the mesh agent and install it the computer to manage. This agent has server and device group information embedded within it.", EscapeHtml(mesh.name)) + '<br /><br />';
6443 - x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginsw32lnk name="meshagents?id=3&meshid=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "x86 32bit version of the MeshAgent" + '">' + "Windows x86-32 (.exe)" + '</a> <i class="far fa-clipboard" title="' + "Copy Windows x86 32bit agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=3&meshid=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6444 - x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginsw64lnk name="meshagents?id=4&meshid=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "x86 64bit version of the MeshAgent" + '">' + "Windows x86-64 (.exe)" + '</a> <i class="far fa-clipboard" title="' + "Copy Windows x86 64bit agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=4&meshid=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6445 - x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginswa64lnk name="meshagents?id=43&meshid=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "ARM 64bit version of the MeshAgent" + '">' + "Windows ARM-64 (.exe)" + '</a> <i class="far fa-clipboard" title="' + "Copy Windows ARM 64bit agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=43&meshid=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6344 + x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginsw32lnk name="meshagents?id=3&meshid=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "x86 32bit version of the MeshAgent" + '">' + "Windows x86-32 (.exe)" + '</a> <i class="fa-regular fa-clipboard" title="' + "Copy Windows x86 32bit agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=3&meshid=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6345 + x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginsw64lnk name="meshagents?id=4&meshid=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "x86 64bit version of the MeshAgent" + '">' + "Windows x86-64 (.exe)" + '</a> <i class="fa-regular fa-clipboard" title="' + "Copy Windows x86 64bit agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=4&meshid=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6346 + x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginswa64lnk name="meshagents?id=43&meshid=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "ARM 64bit version of the MeshAgent" + '">' + "Windows ARM-64 (.exe)" + '</a> <i class="fa-regular fa-clipboard" title="' + "Copy Windows ARM 64bit agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=43&meshid=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6347 if (debugmode > 0) { x += addHtmlValue("Settings File", '<a id=aginswmshlnk name="meshsettings?id=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '">' + format("{0} settings (.msh)", EscapeHtml(mesh.name)) + '</a>'); }
6348 x += '</div>';
6349
6350 // Linux agent install
6351 x += '<div id=agins_linux style=display:none>' + format("To add a computer to \"{0}\" run the following command. Root credentials will be needed.", EscapeHtml(mesh.name)) + '<br />';
6352 x += '<textarea id=agins_linux_area rows=2 cols=20 readonly=readonly style=border-radius:4px;padding:6px;margin-top:4px;margin-bottom:4px;background-color:#FFF9D3;border:0;width:100%;resize:none;height:160px;overflow:auto;font-size:12px class=form-control></textarea>';
6452 - x += '<div style=font-size:x-small;float:right>' + "* For BSD, run \"pkg install wget sudo bash\" first." + '</div><a style=text-decoration:none title="' + "Copy to clipboard" + '" onclick=copyAgentIdValue("agins_linux_area")>' + "Copy" + ' <i class="far fa-clipboard" style=cursor:pointer></i></a></div>';
6353 + x += '<div style=font-size:x-small;float:right>' + "* For BSD, run \"pkg install wget sudo bash\" first." + '</div><a style=text-decoration:none title="' + "Copy to clipboard" + '" onclick=copyAgentIdValue("agins_linux_area")>' + "Copy" + ' <i class="fa-regular fa-clipboard" style=cursor:pointer></i></a></div>';
6354
6355 // macOS agent install
6356 x += '<div id=agins_osx style=display:none>' + format("To add a new computer to device group \"{0}\", download the mesh agent and install it the computer to manage. This agent installer has server and device group information embedded within it.", EscapeHtml(mesh.name)) + '<br /><br />';
6456 - x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline onclick=downloadFile("meshosxagent?id=16&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '") title="' + "x86-64bit version of macOS Mesh Agent" + '">' + "macOS x86-64bit" + '</a> <i class="far fa-clipboard" title="' + "Copy macOS agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshosxagent?id=16&meshid=' + meshid.split('/')[2] + '",0)></i>', ['col-md-4', 'col-md-8']);
6457 - x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline onclick=downloadFile("meshosxagent?id=29&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '") title="' + "ARM 64bit version of macOS Mesh Agent" + '">' + "macOS ARM (64bit)" + '</a> <i class="far fa-clipboard" title="' + "Copy macOS agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshosxagent?id=29&meshid=' + meshid.split('/')[2] + '",0)></i>', ['col-md-4', 'col-md-8']);
6458 - x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline onclick=downloadFile("meshosxagent?id=10005&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '") title="' + "Universal version of macOS Mesh Agent" + '">' + "macOS (Universal)" + '</a> <i class="far fa-clipboard" title="' + "Copy macOS agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshosxagent?id=10005&meshid=' + meshid.split('/')[2] + '",0)></i>', ['col-md-4', 'col-md-8']);
6357 + x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline onclick=downloadFile("meshosxagent?id=16&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '") title="' + "x86-64bit version of macOS Mesh Agent" + '">' + "macOS x86-64bit" + '</a> <i class="fa-regular fa-clipboard" title="' + "Copy macOS agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshosxagent?id=16&meshid=' + meshid.split('/')[2] + '",0)></i>', ['col-md-4', 'col-md-8']);
6358 + x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline onclick=downloadFile("meshosxagent?id=29&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '") title="' + "ARM 64bit version of macOS Mesh Agent" + '">' + "macOS ARM (64bit)" + '</a> <i class="fa-regular fa-clipboard" title="' + "Copy macOS agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshosxagent?id=29&meshid=' + meshid.split('/')[2] + '",0)></i>', ['col-md-4', 'col-md-8']);
6359 + x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline onclick=downloadFile("meshosxagent?id=10005&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '") title="' + "Universal version of macOS Mesh Agent" + '">' + "macOS (Universal)" + '</a> <i class="fa-regular fa-clipboard" title="' + "Copy macOS agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshosxagent?id=10005&meshid=' + meshid.split('/')[2] + '",0)></i>', ['col-md-4', 'col-md-8']);
6360 x += '</div>';
6361
6362 // QR code agent install
@@ -6464,40 +6365,40 @@
6365 x += "<tr><td style=text-align:center><a rel=\"noreferrer noopener\" target=_blank href=\"https://play.google.com/store/apps/details?id=com.meshcentral.agent2\"><img style=cursor:pointer src=\"images/google-play-140.png\" width=140 srcset=\"images/google-play-280.png 2x\" /></a></td></tr>";
6366 x += "<tr><td style=text-align:center><a rel=\"noreferrer noopener\" target=_blank href=\"https://www.amazon.co.uk/gp/product/B097Z4Q7SK/\"><img style=cursor:pointer src=\"images/amazon-appstore-140.png\" width=140 srcset=\"images/amazon-appstore-280.png 2x\" /></a></td></tr>";
6367 x += "</table>";
6467 - x += addHtmlValue("Android APK", '<a class=text-decoration-underline onclick=downloadFile("meshagents?id=14' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '",null,true) title="' + "APK version of the MeshAgent" + '">' + "APK" + '</a> <i class="far fa-clipboard" title="' + "Copy URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=14&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '")></i>');
6368 + x += addHtmlValue("Android APK", '<a class=text-decoration-underline onclick=downloadFile("meshagents?id=14' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '",null,true) title="' + "APK version of the MeshAgent" + '">' + "APK" + '</a> <i class="fa-regular fa-clipboard" title="' + "Copy URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=14&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '")></i>');
6369 x += '</div>'
6370
6371 // MeshCentral Assistant
6372 x += '<div id=agins_assistant style=display:none><table><tr><td style=vertical-align:top><div>' + format("MeshCentral Assistant is a Windows tool that users can use to ask for help. Use the link below to download a version that will connect to device group \"{0}\".", EscapeHtml(mesh.name)) + '</div><div></div><br />';
6472 - x += '<a class=text-decoration-underline id=asinslnk name="meshagents?id=10006&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "MeshCentral Assistant for Windows" + '">' + "Assistant for Windows (.exe)" + '</a> <i class="far fa-clipboard" title="' + "Copy URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=10006&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '")></i>';
6373 + x += '<a class=text-decoration-underline id=asinslnk name="meshagents?id=10006&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "MeshCentral Assistant for Windows" + '">' + "Assistant for Windows (.exe)" + '</a> <i class="fa-regular fa-clipboard" title="' + "Copy URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=10006&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '")></i>';
6374 x += '</td><td><img id=agass_img1 src=images/assistant-100.png width=74 height=100 srcset="images/assistant-200.png 2x"><img id=agass_img2 src=images/assistant2-100.png width=74 height=100 srcset="images/assistant2-200.png 2x"></td></tr></table></div>';
6375
6376 // MeshCentral Assistant2
6377 x += '<div id=agins_assistant2 style=display:none><table><tr><td style=vertical-align:top><div>' + "MeshCentral Assistant is a Windows tool that users can use to ask for help. Use the link below to download a version that will monitor the background agent." + '</div><div></div><br />';
6477 - x += '<a class=text-decoration-underline id=asinslnk2 name="meshagents?id=10006&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "MeshCentral Assistant for Windows" + '">' + "Assistant for Windows (.exe)" + '</a> <i class="far fa-clipboard" title="' + "Copy URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=10006&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '")></i>';
6378 + x += '<a class=text-decoration-underline id=asinslnk2 name="meshagents?id=10006&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "MeshCentral Assistant for Windows" + '">' + "Assistant for Windows (.exe)" + '</a> <i class="fa-regular fa-clipboard" title="' + "Copy URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=10006&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '")></i>';
6379 x += '</td><td><img src=images/assistant-100.png width=74 height=100 srcset="images/assistant-200.png 2x"></td></tr></table></div>';
6380
6381 // Windows agent uninstall
6382 x += '<div id=agins_windows_un style=display:none>' + "To remove a mesh agent, download the file below, run it and click \"uninstall\"." + '<br /><br />';
6482 - x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginsw32unlnk name="meshagents?id=3&meshid=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "x86 32bit version of the MeshAgent" + '">' + "Windows x86-32 (.exe)" + '</a> <i class="far fa-clipboard" title="' + "Copy Windows x86 32bit agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=3&meshid=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6483 - x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginsw64unlnk name="meshagents?id=4&meshid=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "x86 64bit version of the MeshAgent" + '">' + "Windows x86-64 (.exe)" + '</a> <i class="far fa-clipboard" title="' + "Copy Windows x86 64bit agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=4&meshid=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6484 - x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginswa64unlnk name="meshagents?id=43&meshid=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "ARM 64bit version of the MeshAgent" + '">' + "Windows ARM-64 (.exe)" + '</a> <i class="far fa-clipboard" title="' + "Copy Windows ARM 64bit agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=43&meshid=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6383 + x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginsw32unlnk name="meshagents?id=3&meshid=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "x86 32bit version of the MeshAgent" + '">' + "Windows x86-32 (.exe)" + '</a> <i class="fa-regular fa-clipboard" title="' + "Copy Windows x86 32bit agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=3&meshid=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6384 + x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginsw64unlnk name="meshagents?id=4&meshid=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "x86 64bit version of the MeshAgent" + '">' + "Windows x86-64 (.exe)" + '</a> <i class="fa-regular fa-clipboard" title="' + "Copy Windows x86 64bit agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=4&meshid=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6385 + x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginswa64unlnk name="meshagents?id=43&meshid=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '" title="' + "ARM 64bit version of the MeshAgent" + '">' + "Windows ARM-64 (.exe)" + '</a> <i class="fa-regular fa-clipboard" title="' + "Copy Windows ARM 64bit agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=43&meshid=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6386 x += '</div>';
6387
6388 // Linux agent uninstall
6389 x += '<div id=agins_linux_un style=display:none>' + "To remove a mesh agent, run the following command. Root credentials will be needed." + '<br />';
6390 x += '<textarea id=agins_linux_area_un rows=2 cols=20 readonly=readonly style=border-radius:4px;padding:6px;margin-top:4px;margin-bottom:4px;background-color:#FFF9D3;border:0;width:100%;resize:none;height:160px;overflow:auto;font-size:12px class=form-control></textarea>';
6490 - x += '<a style=text-decoration:none title="' + "Copy to clipboard" + '" onclick=copyAgentIdValue("agins_linux_area_un")>Copy <i class="far fa-clipboard" style=cursor:pointer></i></a></div>';
6391 + x += '<a style=text-decoration:none title="' + "Copy to clipboard" + '" onclick=copyAgentIdValue("agins_linux_area_un")>Copy <i class="fa-regular fa-clipboard" style=cursor:pointer></i></a></div>';
6392
6393 // macOS agent uninstall
6394 x += '<div id=agins_osx_un style=display:none>' + "To remove a mesh agent, download the file below, right click on the \".mpkg\" file and click \"Show Package Contents\", then right click on \"Uninstall.command\" and click \"Open\"" + '<br /><br />';
6494 - x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline onclick=downloadFile("meshosxagent?id=10005&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '") title="' + "Universal version of macOS Mesh Agent" + '">macOS Agent (Universal)</a> <i class="far fa-clipboard" title="' + "Copy macOS agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshosxagent?id=10005&meshid=' + meshid.split('/')[2] + '",0)></i>', ['col-md-4', 'col-md-8']);
6395 + x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline onclick=downloadFile("meshosxagent?id=10005&meshid=' + meshid.split('/')[2] + (urlargs.key ? ('&key=' + urlargs.key) : '') + '") title="' + "Universal version of macOS Mesh Agent" + '">macOS Agent (Universal)</a> <i class="fa-regular fa-clipboard" title="' + "Copy macOS agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshosxagent?id=10005&meshid=' + meshid.split('/')[2] + '",0)></i>', ['col-md-4', 'col-md-8']);
6396 x += '</div>';
6397
6398 // Linux binary installer
6399 x += '<div id=agins_linux_inst style=display:none>' + "This is a executable on OS's with graphical user interfaces" + '<br /><br />' + "Apple macOS executables will need to be removed from quarantine to run 'xattr -r -d com.apple.quarantine meshagent'" + '<br /><br />' + "You need to 'chmod +x meshagent' and run this file" + '<br /><br />';
6499 - x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginsbinlnk name="meshagents?id=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '">' + "meshagent" + '</a> <i class="far fa-clipboard" title="' + "Copy agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6500 - x += addHtmlValue("Command" + '&nbsp;<i class="far fa-clipboard" title="' + "Copy agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentIdValue("aginsbincmd")></i>', '<input id=aginsbincmd type=text class="form-control" readonly value=\'wget -O meshagent' + (((features & 0x80000000) != 0) ? ' --no-check-certificate' : '') + ' \"https://' + servername + portStr + domainUrl + 'meshagents?id=' + meshid.split('/')[2].split('$').join('%24').split('@').join('%40') + '\' />', ['col-md-4 d-flex align-items-center', 'col-md-8']);
6400 + x += addHtmlValue("Mesh Agent", '<a class=text-decoration-underline id=aginsbinlnk name="meshagents?id=' + meshid.split('/')[2] + '&installflags=0' + (urlargs.key ? ('&key=' + urlargs.key) : '') + '">' + "meshagent" + '</a> <i class="fa-regular fa-clipboard" title="' + "Copy agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentUrl("meshagents?id=' + meshid.split('/')[2] + '&installflags=",1)></i>', ['col-md-4', 'col-md-8']);
6401 + x += addHtmlValue("Command" + '&nbsp;<i class="fa-regular fa-clipboard" title="' + "Copy agent URL to clipboard" + '" style=cursor:pointer onclick=copyAgentIdValue("aginsbincmd")></i>', '<input id=aginsbincmd type=text class="form-control" readonly value=\'wget -O meshagent' + (((features & 0x80000000) != 0) ? ' --no-check-certificate' : '') + ' \"https://' + servername + portStr + domainUrl + 'meshagents?id=' + meshid.split('/')[2].split('$').join('%24').split('@').join('%40') + '\' />', ['col-md-4 d-flex align-items-center', 'col-md-8']);
6402 x += '</div>';
6403
6404 setModalContent("xxAddAgent", "Add Mesh Agent", x);
@@ -8479,7 +8380,7 @@
8380 // Add node name
8381 var nname = EscapeHtml(node.name), nnameEx;
8382 if (nname.length == 0) { nname = '<i>' + "None" + '</i>'; }
8482 - if (((meshrights & 4) != 0) && ((!mesh.flags) || ((mesh.flags & 2) == 0))) { nname = '<span tabindex=0 title="' + "Click here to edit the server-side device name" + '" onclick=showEditNodeValueDialog(0) onkeyup="if (event.key == \'Enter\') showEditNodeValueDialog(0)" style=cursor:pointer>' + nname + ' <img class=hoverButton src="images/link5.png" /></span>'; }
8383 + if (((meshrights & 4) != 0) && ((!mesh.flags) || ((mesh.flags & 2) == 0))) { nname = '<span tabindex=0 title="' + "Click here to edit the server-side device name" + '" onclick=showEditNodeValueDialog(0) onkeyup="if (event.key == \'Enter\') showEditNodeValueDialog(0)" role="button">' + nname + ' <i class=\'fa-solid fa-pencil fa-2xs\'/></i></span>'; }
8384 nnameEx = nname;
8385 if (mesh) { nname += '<span style=color:#AAA;font-size:small> - ' + EscapeHtml(mesh.name) + '</span>'; }
8386 QH('p10deviceName', nname);
@@ -8506,13 +8407,13 @@
8407
8408 // Attribute: Host
8409 if ((((features & 1) == 0) && (node.mtype != 4)) || (node.mtype == 3)) { // If not WAN-only, local hostname is in use
8509 - x += addDeviceAttribute("Hostname", addLinkConditional('<span onclick=showEditNodeValueDialog(1) style=cursor:pointer>' + (node.host ? EscapeHtml(node.host) : ('<i>' + "None" + '</i>')) + '</span>', 'showEditNodeValueDialog(1)', meshrights & 4));
8410 + x += addDeviceAttribute("Hostname", addLinkConditional((node.host ? EscapeHtml(node.host) : ('<i>' + "None" + '</i>')), 'showEditNodeValueDialog(1)', meshrights & 4));
8411 }
8412
8413 // Attribute: Description
8414 var description = node.desc ? EscapeHtml(node.desc) : ('<i>' + "None" + '</i>');
8415 if ((meshrights & 4) != 0) {
8515 - x += addDeviceAttribute("Description", '<span onclick=showEditNodeValueDialog(2) style=cursor:pointer>' + description + ' <img class=hoverButton src="images/link5.png" /></span>');
8416 + x += addDeviceAttribute("Description", '<span onclick=showEditNodeValueDialog(2) style=cursor:pointer>' + description + ' <i class="fa-solid fa-pencil fa-xs" role="button"></i></span>');
8417 } else {
8418 x += addDeviceAttribute("Description", description);
8419 }
@@ -8700,7 +8601,7 @@
8601 var groupingTags = '<i>' + "None" + '</i>';
8602 if (node.tags != null) { groupingTags = ''; for (var i in node.tags) { groupingTags += '<span class=tagSpan>' + EscapeHtml(node.tags[i]) + '</span> '; } }
8603 if ((meshrights & 4) != 0) {
8703 - x += addDeviceAttribute("Tags", '<span onclick=showEditNodeValueDialog(3) style=line-height:26px;cursor:pointer>' + groupingTags + ' <img class=hoverButton src="images/link5.png" width=10 height=10 /></span>');
8604 + x += addDeviceAttribute("Tags", '<span onclick=showEditNodeValueDialog(3) style=line-height:26px;cursor:pointer>' + groupingTags + ' <i class="fa-solid fa-pencil fa-xs" role="button"></i></span>');
8605 } else {
8606 x += addDeviceAttribute("Tags", '<span style=line-height:26px>' + groupingTags + '</span>');
8607 }
@@ -8709,8 +8610,8 @@
8610 if ((node.ssh != null) || (node.rdp != null)) {
8611 var y = [];
8612 if ((meshrights & 4) != 0) {
8712 - if (node.ssh != null) { y.push('<span onclick=showClearSshDialog(3) style=cursor:pointer>' + ((node.ssh == 1) ? "SSH-User+Pass" : ((node.ssh == 2) ? "SSH-User+Key+Pass" : "SSH-User+Key")) + ' <img class=hoverButton src="images/link5.png" width=10 height=10 /></span>'); }
8713 - if (node.rdp != null) { y.push('<span onclick=showClearRdpDialog(3) style=cursor:pointer>' + "RDP" + ' <img class=hoverButton src="images/link5.png" width=10 height=10 /></span>'); }
8613 + if (node.ssh != null) { y.push('<span onclick=showClearSshDialog(3) style=cursor:pointer>' + ((node.ssh == 1) ? "SSH-User+Pass" : ((node.ssh == 2) ? "SSH-User+Key+Pass" : "SSH-User+Key")) + ' <i class="fa-solid fa-pencil fa-xs" role="button"></i></span>'); }
8614 + if (node.rdp != null) { y.push('<span onclick=showClearRdpDialog(3) style=cursor:pointer>' + "RDP" + ' <i class="fa-solid fa-pencil fa-xs" role="button"></i></span>'); }
8615 } else {
8616 if (node.ssh != null) { y.push(((node.ssh == 1) ? "SSH-User+Pass" : ((node.ssh == 2) ? "SSH-User+Key+Pass" : "SSH-User+Key"))); }
8617 if (node.rdp != null) { y.push("RDP"); }
@@ -8990,14 +8891,14 @@
8891 // Show user device permissions
8892 x = '';
8893 if (meshrights & 7) {
8993 - x += '<button class="btn btn-primary btn-sm me-2" onclick="return p20showAddMeshUserDialog(5)" style=cursor:pointer;margin-right:10px><i class="fas fa-plus-circle"></i> ' + "Add User" + '</button>';
8894 + x += '<button class="btn btn-primary btn-sm me-2" onclick="return p20showAddMeshUserDialog(5)" style=cursor:pointer;margin-right:10px><i class="fa-solid fa-plus-circle"></i> ' + "Add User" + '</button>';
8895 if (usergroups != null) {
8896 var userGroupCount = 0, newUserGroup = false;
8897 for (var i in usergroups) {
8898 if ((usergroups[i].membershipType != null) || (usergroups[i]._id.split('/')[1] != nodeid.split('/')[1])) continue;
8899 userGroupCount++; if ((currentNode.links == null) || (currentNode.links[i] == null)) { newUserGroup = true; }
8900 }
9000 - if ((userGroupCount > 0) && (newUserGroup)) { x += '<a href=# onclick="return p20showAddMeshUserDialog(6)" style=cursor:pointer;margin-right:10px><i class="fas fa-plus-circle"></i> ' + "Add User Group" + '</a>'; }
8901 + if ((userGroupCount > 0) && (newUserGroup)) { x += '<a href=# onclick="return p20showAddMeshUserDialog(6)" style=cursor:pointer;margin-right:10px><i class="fa-solid fa-plus-circle"></i> ' + "Add User Group" + '</a>'; }
8902 }
8903 }
8904
@@ -9016,10 +8917,10 @@
8917 if ((usergroups != null) && (usergroups[userid] != null)) { username = EscapeHtml(usergroups[userid].name); ugroup = true; }
8918 if ((meshrights & 2) != 0) {
8919 if (ugroup) {
9019 - trash = '<a href=# onclick=\'return p30removeUserFromNode(event,"' + encodeURIComponentEx(userid) + '")\' title="' + "Remove user group rights to this device group" + '" style=cursor:pointer><i class="fas fa-trash text-danger hoverButton"></i></a>';
8920 + trash = '<a href=# onclick=\'return p30removeUserFromNode(event,"' + encodeURIComponentEx(userid) + '")\' title="' + "Remove user group rights to this device group" + '" style=cursor:pointer><i class="fa-solid fa-trash text-danger hoverButton"></i></a>';
8921 rights = '<span style=cursor:pointer onclick=p20showAddMeshUserDialog(6,"' + encodeURIComponentEx(userid) + '")>' + rights + ' <img class=hoverButton style=cursor:pointer src=images/link5.png></span>';
8922 } else {
9022 - trash = '<a href=# onclick=\'return p30removeUserFromNode(event,"' + encodeURIComponentEx(userid) + '")\' title="' + "Remove user rights to this device group" + '" style=cursor:pointer><i class="fas fa-trash text-danger hoverButton"></i></a>';
8923 + trash = '<a href=# onclick=\'return p30removeUserFromNode(event,"' + encodeURIComponentEx(userid) + '")\' title="' + "Remove user rights to this device group" + '" style=cursor:pointer><i class="fa-solid fa-trash text-danger hoverButton"></i></a>';
8924 rights = '<span style=cursor:pointer onclick=p20showAddMeshUserDialog(5,"' + encodeURIComponentEx(userid) + '")>' + rights + ' <img class=hoverButton style=cursor:pointer src=images/link5.png></span>';
8925 }
8926 }
@@ -9740,7 +9641,7 @@
9641 // Add the language and timezone of the browser to the server so the server can localize the time correctly.
9642 var tz = '';
9643 try { tz = '&tz=' + encodeURIComponentEx(Intl.DateTimeFormat().resolvedOptions().timeZone); } catch (ex) { }
9743 - QH('p10html2', '<table class="table table-hover table-light" cellpadding=2 cellspacing=0><thead><tr style=><th scope=col style=text-align:center;width:150px>' + "Day" + '</th><th scope=col style=text-align:center><a onclick=downloadFile("devicepowerevents.ashx?id=' + currentNode._id + '&tf=' + new Date().getTimezoneOffset() + '&l=' + encodeURIComponentEx(getLang()) + tz + (urlargs.key ? ('&key=' + urlargs.key) : '') + '",null,true)><img title="' + "Download power events" + '" src="images/link4.png" /></a>' + "7 Day Power State" + '</th></tr></thead><tbody>' + x + '</tbody></table>');
9644 + QH('p10html2', '<table class="table table-striped align-middle text-center" cellpadding=2 cellspacing=0><thead><tr><th scope=col style=width:150px>' + "Day" + '</th><th scope=col>' + "7 Day Power State" + '<div class="float-end pe-1"><i role="button" onclick=downloadFile("devicepowerevents.ashx?id=' + currentNode._id + '&tf=' + new Date().getTimezoneOffset() + '&l=' + encodeURIComponentEx(getLang()) + tz + (urlargs.key ? ('&key=' + urlargs.key) : '') + '",null,true) title="' + "Download power events" + '" class="fas fa-download"></i></div></th></tr></thead><tbody>' + x + '</tbody></table>');
9645 }
9646
9647 // Return a color for the given power state
@@ -11452,11 +11353,11 @@
11353 for (var i in p) {
11354 if (p[i].p != 0) {
11355 var c = p[i].c;
11455 - x += '<div onclick=showProcessDetails(' + p[i].p + ') class=deskToolsBar>';
11456 - x += '<div style=width:50px;float:left;text-align:right;padding-right:5px>' + EscapeHtml(p[i].p) + '</div>';
11457 - x += '<a href=# style=float:right;padding-right:5px;cursor:pointer title="' + "Stop process" + '" onclick=\'return stopProcess(' + EscapeHtml(p[i].p) + ',"' + EscapeHtml(p[i].c) + '")\'><img width=10 height=10 src="images/trash.png"></a>';
11458 - x += '<div style=float:right;padding-right:5px>' + (p[i].u ? EscapeHtml(p[i].u) : '') + '</div>';
11459 - x += '<div style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding-right:5px" title="' + EscapeHtml(c) + '">' + c + '</div>';
11356 + x += '<div onclick=showProcessDetails(' + p[i].p + ') class="deskToolsBar d-flex">';
11357 + x += '<div class="pe-1 text-start" style=width:50px;>' + EscapeHtml(p[i].p) + '</div>';
11358 + x += '<div style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;" title="' + EscapeHtml(c) + '">' + c + '</div>';
11359 + x += '<div class="ms-auto">' + (p[i].u ? EscapeHtml(p[i].u) : '');
11360 + x += '<i class="ps-1 fa-solid fa-trash-can" role="button" title="' + "Stop process" + '" onclick=\'return stopProcess(' + EscapeHtml(p[i].p) + ',"' + EscapeHtml(p[i].c) + '")\'></i></div>';
11361 x += '</div>';
11362 }
11363 }
@@ -11584,11 +11485,11 @@
11485 if (desktop == null) return;
11486 if (desktop.m.recordedData == null) {
11487 // Start recording
11587 - Q('DeskRecordButtonImage').src = 'images/icon-film-red.png';
11488 + Q('DeskRecordButtonImage').style.color = 'red';
11489 desktop.m.StartRecording();
11490 } else {
11491 // Stop recording
11591 - Q('DeskRecordButtonImage').src = 'images/icon-film.png';
11492 + Q('DeskRecordButtonImage').style.color = '';
11493 var d = new Date(), n = "DesktopSession" + '-' + currentNode.name + '-' + d.getFullYear() + '-' + ('0' + (d.getMonth() + 1)).slice(-2) + '-' + ('0' + d.getDate()).slice(-2) + '-' + ('0' + d.getHours()).slice(-2) + '-' + ('0' + d.getMinutes()).slice(-2);
11494 saveAs(data2blob(desktop.m.StopRecording().join('')), n + '.mcrec');
11495 }
@@ -14598,7 +14499,7 @@
14499 x += '<p><strong>' + "Active Login Tokens" + '</strong> - <span id="p2createMeshLink1"> <a href=# onclick="return account_createLoginToken()" class="newMeshBtn"> ' + "New" + '</a></span></p><div style=margin-left:40px><table class="table table-hover"><tbody><tr class="table-active"><th scope=col style=text-align:left;width:430px>' + "Name" + '</th><th scope=col style=text-align:left>' + "Username" + '</th></tr>';
14500 for (var i = 0; i < loginTokens.length; i++) {
14501 var ltoken = loginTokens[i];
14601 - var trash = '<a href=# onclick=\'return p2removeLoginToken(event,"' + encodeURIComponentEx(ltoken.tokenUser) + '")\' title="' + "Remove login token" + '" style=cursor:pointer><i class="fas fa-trash text-danger hoverButton"></i></a>';
14502 + var trash = '<a href=# onclick=\'return p2removeLoginToken(event,"' + encodeURIComponentEx(ltoken.tokenUser) + '")\' title="' + "Remove login token" + '" style=cursor:pointer><i class="fa-solid fa-trash text-danger hoverButton"></i></a>';
14503 var details = '';
14504 if (ltoken.expire != 0) { details = EscapeHtml(format("Expires {0}", printDateTime(new Date(ltoken.expire)))) + ' '; }
14505 x += '<tr ' + (((++count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td style=width:30%><div class=m' + 2 + '></div><div>&nbsp;' + EscapeHtml(ltoken.name) + '<div></div></div></td><td style=width:70%><div style=float:right>' + details + trash + '</div><div>' + EscapeHtml(ltoken.tokenUser) + '</div></td></tr>';
@@ -14861,7 +14762,7 @@
14762 if (meshrights & 1) { x += '<br><input type=button class="btn btn-outline-primary btn-sm mb-1" value=' + "Notes" + ' title="' + "View notes about this device group" + '" onclick=showNotes(false,"' + encodeURIComponentEx(currentMesh._id) + '") />'; }
14763 x += '<br style=clear:both><br>';
14764 if (meshrights & 2) {
14864 - x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p20showAddMeshUserDialog()"><i class="fas fa-plus-circle"></i> ' + "Add Users" + '</button>';
14765 + x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p20showAddMeshUserDialog()"><i class="fa-solid fa-plus-circle"></i> ' + "Add Users" + '</button>';
14766 if (usergroups != null) {
14767 var userGroupCount = 0, newUserGroup = false;
14768 for (var i in usergroups) {
@@ -14869,7 +14770,7 @@
14770 userGroupCount++;
14771 if ((currentMesh.links == null) || (currentMesh.links[i] == null)) { newUserGroup = true; }
14772 }
14872 - if ((userGroupCount > 0) && (newUserGroup)) { x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p20showAddMeshUserDialog(2)"><i class="fas fa-plus-circle"></i> ' + "Add User Group" + '</button>'; }
14773 + if ((userGroupCount > 0) && (newUserGroup)) { x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p20showAddMeshUserDialog(2)"><i class="fa-solid fa-plus-circle"></i> ' + "Add User Group" + '</button>'; }
14774 }
14775 }
14776
@@ -14886,11 +14787,11 @@
14787 }
14788 }
14789 if ((currentMesh.mtype == 2) && ((userinfo.siteadmin == 0xFFFFFFFF) || ((userinfo.siteadmin & 4096) == 0))) {
14889 - x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick=\'return addAgentToMesh("' + currentMesh._id + '")\' title="' + "Add a new computer to this device group by installing the mesh agent." + '"><i class="fas fa-plus-circle"></i> ' + "Add Agent" + '</button>';
14890 - x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick=\'return inviteAgentToMesh("' + currentMesh._id + '")\' title="' + "Invite someone to install the mesh agent on this device group." + '"><i class="fas fa-user-plus"></i> ' + "Invite" + '</button>';
14790 + x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick=\'return addAgentToMesh("' + currentMesh._id + '")\' title="' + "Add a new computer to this device group by installing the mesh agent." + '"><i class="fa-solid fa-plus-circle"></i> ' + "Add Agent" + '</button>';
14791 + x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick=\'return inviteAgentToMesh("' + currentMesh._id + '")\' title="' + "Invite someone to install the mesh agent on this device group." + '"><i class="fa-solid fa-user-plus"></i> ' + "Invite" + '</button>';
14792 }
14793 if ((currentMesh.mtype == 3) && ((userinfo.siteadmin == 0xFFFFFFFF) || ((userinfo.siteadmin & 4096) == 0))) {
14893 - x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick=\'return addLocalDeviceToMesh("' + currentMesh._id + '")\' title="' + "Add device located on the local network." + '"><i class="fas fa-plus-circle"></i> ' + "Add Device" + '</button>';
14794 + x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick=\'return addLocalDeviceToMesh("' + currentMesh._id + '")\' title="' + "Add device located on the local network." + '"><i class="fa-solid fa-plus-circle"></i> ' + "Add Device" + '</button>';
14795 }
14796 if (currentMesh.amt && (currentMesh.amt.type > 2) && ((userinfo.siteadmin == 0xFFFFFFFF) || ((userinfo.siteadmin & 4096) == 0))) { // ACM activation or Full Automatic
14797 x += '<button class="btn btn-primary btn-sm me-2 mb-1" title="' + "Switch Intel AMT to Admin Control Mode (ACM)." + '" onclick=\'return showAmtAcmSetup()\'><i class="fa-solid fa-circle-arrow-down"></i> ' + "ACM" + '</button>';
@@ -14914,9 +14815,9 @@
14815 var trash = '', r = sortedusers[i].rights, rights = makeDeviceGroupRightsString(r), icon = 2;
14816 if ((sortedusers[i].id != userinfo._id) && (meshrights == 0xFFFFFFFF || (((meshrights & 2) != 0)))) {
14817 if ((meshrights == 0xFFFFFFFF) || (currentMesh.links[sortedusers[i].id].rights != 0xFFFFFFFF)) {
14917 - trash = '<a href=# onclick=\'return p20deleteUser(event,"' + encodeURIComponentEx(sortedusers[i].id) + '")\' title="' + "Remove user rights to this device group" + '" style=cursor:pointer><i class="fas fa-trash text-danger hoverButton"></i></a>';
14818 + trash = '<a href=# onclick=\'return p20deleteUser(event,"' + encodeURIComponentEx(sortedusers[i].id) + '")\' title="' + "Remove user rights to this device group" + '" style=cursor:pointer><i class="fa-solid fa-trash text-danger hoverButton"></i></a>';
14819 }
14919 - rights = '<span tabindex=0 style=cursor:pointer onclick=p20viewuser("' + encodeURIComponentEx(sortedusers[i].id) + '") onkeypress="if (event.key==\'Enter\') p20viewuser(\'' + encodeURIComponentEx(sortedusers[i].id) + '\')">' + rights + ' <i class="fas fa-pencil hoverButton"></i></span>';
14820 + rights = '<span tabindex=0 style=cursor:pointer onclick=p20viewuser("' + encodeURIComponentEx(sortedusers[i].id) + '") onkeypress="if (event.key==\'Enter\') p20viewuser(\'' + encodeURIComponentEx(sortedusers[i].id) + '\')">' + rights + ' <i class="fa-solid fa-pencil hoverButton"></i></span>';
14821 }
14822 if (sortedusers[i].id.startsWith('ugrp/')) { icon = 4; }
14823 var username = EscapeHtml(decodeURIComponent(sortedusers[i].name));
@@ -15117,9 +15018,9 @@
15018 x += '<span id=dp10passNotify style="font-size:10px"> ' + "* 8 characters, 1 upper, 1 lower, 1 numeric, 1 non-alpha numeric." + '</span>';
15019 if ((currentMesh.mtype == 2) && (ptype == 2)) { x += '<span style="font-size:10px"> ' + "This policy will not impact devices with Intel&reg; AMT in ACM mode." + '</span>'; }
15020 }
15120 - if (ptype == 0) { x = '<div class="row"><div class="col-2"><i class="fas fa-times-circle text-danger" style="padding-right:8px; font-size:60px;"></i></div><div class="col-10">When this policy is selected, Intel&reg; AMT is not managed by this server. Intel AMT can still be used by manually activating and configuring it.</div></div>'; }
15121 - if (ptype == 1) { x = '<div class="row"><div class="col-2"><i class="fas fa-times-circle text-danger" style="font-size:60px; padding-right:8px; color:green;"></i></div><div class="col-10">When this policy is selected, any Intel&reg; AMT in Client Control Mode (CCM) will be deactivated. Other devices will have CIRA cleared and can still be managed manually.</div></div>'; }
15122 - if (ptype == 4) { x = '<div class="row"><div class="col-2"><i class="fas fa-check-circle text-success" style="font-size:60px; padding-right:8px; color:blue;"></i></div><div class="col-10">This is the recommended policy. Intel&reg; AMT activation and management is completely automated and the server will attempt to make best possible use of hardware management.</div></div>'; }
15021 + if (ptype == 0) { x = '<div class="row"><div class="col-2"><i class="fa-solid fa-times-circle text-danger" style="padding-right:8px; font-size:60px;"></i></div><div class="col-10">When this policy is selected, Intel&reg; AMT is not managed by this server. Intel AMT can still be used by manually activating and configuring it.</div></div>'; }
15022 + if (ptype == 1) { x = '<div class="row"><div class="col-2"><i class="fa-solid fa-times-circle text-danger" style="font-size:60px; padding-right:8px; color:green;"></i></div><div class="col-10">When this policy is selected, any Intel&reg; AMT in Client Control Mode (CCM) will be deactivated. Other devices will have CIRA cleared and can still be managed manually.</div></div>'; }
15023 + if (ptype == 4) { x = '<div class="row"><div class="col-2"><i class="fa-solid fa-check-circle text-success" style="font-size:60px; padding-right:8px; color:blue;"></i></div><div class="col-10">This is the recommended policy. Intel&reg; AMT activation and management is completely automated and the server will attempt to make best possible use of hardware management.</div></div>'; }
15024 QH('dp20amtpolicydiv', x);
15025 setTimeout(dp20amtValidatePolicy, 500);
15026 }
@@ -17773,7 +17674,7 @@
17674
17675 x = '<br />';
17676 if ((currentUserGroup.membershipType == null) && ((userinfo.siteadmin & 256) != 0)) {
17776 - x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p51showAddUserDialog()"><i class="fas fa-plus-circle"></i> ' + " Add Users" + '</button>';
17677 + x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p51showAddUserDialog()"><i class="fa-solid fa-plus-circle"></i> ' + " Add Users" + '</button>';
17678 }
17679 x += '<table class="table table-hover"><tbody><tr class="table-active"><th scope=col>' + "Group Members" + '</th><th scope=col></th></tr>';
17680
@@ -17806,7 +17707,7 @@
17707 count = 1;
17708 var deviceGroupCount = 0, newDeviceGroup = false;
17709 for (var i in meshes) { if (currentUserGroup._id.split('/')[1] != meshes[i]._id.split('/')[1]) continue; deviceGroupCount++; if ((currentUserGroup.links == null) || (currentUserGroup.links[i] == null)) { newDeviceGroup = true; } }
17809 - if ((deviceGroupCount > 0) && (newDeviceGroup)) { x += '<button class="btn btn-primary btn-sm me-2 mb-1"onclick="return p20showAddMeshUserDialog(3)"><i class="fas fa-plus-circle"></i> ' + " Add Device Group" + '</button>'; }
17710 + if ((deviceGroupCount > 0) && (newDeviceGroup)) { x += '<button class="btn btn-primary btn-sm me-2 mb-1"onclick="return p20showAddMeshUserDialog(3)"><i class="fa-solid fa-plus-circle"></i> ' + " Add Device Group" + '</button>'; }
17711 x += '<table class="table table-hover"><tbody><tr class="table-active"><th scope=col>' + "Common Device Groups" + '</th><th scope=col></th></tr>';
17712 if (currentUserGroup.links) {
17713 var omeshes = [];
@@ -17818,7 +17719,7 @@
17719 var meshname = '<i>' + "Unknown Device Group" + '</i>';
17720 if (mesh) { meshname = '<a href=# onclick=\'gotoMesh("' + mesh._id + '");haltEvent(event);\'>' + mesh.name + '</a>'; } else { }
17721 if ((cr & 2) != 0) {
17821 - trash = '<a href=# onclick=\'return p51removeMeshFromUserGroup(event,"' + encodeURIComponentEx(mesh._id) + '")\' title="' + "Remove user group rights to this device group" + '" style=cursor:pointer><i class="fas fa-trash text-danger hoverButton"></i></a>';
17722 + trash = '<a href=# onclick=\'return p51removeMeshFromUserGroup(event,"' + encodeURIComponentEx(mesh._id) + '")\' title="' + "Remove user group rights to this device group" + '" style=cursor:pointer><i class="fa-solid fa-trash text-danger hoverButton"></i></a>';
17723 rights = '<span style=cursor:pointer onclick=p20showAddMeshUserDialog(3,"' + encodeURIComponentEx(mesh._id) + '")>' + rights + ' <img class=hoverButton style=cursor:pointer src=images/link5.png></span>';
17724 }
17725 x += '<tr ' + (((++count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td style=width:30%><div title="' + "Device Group" + '" class=m99></div><div>&nbsp;' + meshname + '<div></div></div></td><td style=width:70%><div style=float:right>' + trash + '</div><div>' + rights + '</div></td></tr>';
@@ -17830,7 +17731,7 @@
17731 // Display all devices for this user group
17732 count = 1;
17733 x += '<br />';
17833 - if (currentUserGroup._id.split('/')[1] == userinfo._id.split('/')[1]) { x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p20showAddMeshUserDialog(7)"><i class="fas fa-plus-circle"></i> ' + " Add Device" + '</button>'; }
17734 + if (currentUserGroup._id.split('/')[1] == userinfo._id.split('/')[1]) { x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p20showAddMeshUserDialog(7)"><i class="fa-solid fa-plus-circle"></i> ' + " Add Device" + '</button>'; }
17735 x += '<table class="table table-hover"><tbody><tr class="table-active"><th scope=col>' + "Common Devices" + '</th><th scope=col></th></tr>';
17736 if (currentUserGroup.links) {
17737 var onodes = [];
@@ -18535,7 +18436,7 @@
18436 // Display common device groups
18437 var deviceGroupCount = 0, newDeviceGroup = false;
18438 for (var i in meshes) { if (meshes[i]._id.split('/')[1] != currentUser._id.split('/')[1]) continue; deviceGroupCount++; if ((currentUser.links == null) || (currentUser.links[i] == null)) { newDeviceGroup = true; } }
18538 - if ((deviceGroupCount > 0) && (newDeviceGroup)) { x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p20showAddMeshUserDialog(1)"><i class="fas fa-plus-circle"></i> ' + "Add Device Group" + '</button>'; }
18439 + if ((deviceGroupCount > 0) && (newDeviceGroup)) { x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p20showAddMeshUserDialog(1)"><i class="fa-solid fa-plus-circle"></i> ' + "Add Device Group" + '</button>'; }
18440 x += '<table class="table table-hover"><tbody><tr class="table-active"><th scope=col>' + "Common Device Groups" + '</th><th scope=col></th></tr>';
18441 if (currentUser.links) {
18442 var omeshes = [];
@@ -18568,7 +18469,7 @@
18469 userGroupCount++;
18470 if ((currentUser.links == null) || (currentUser.links[i] == null)) { newUserGroup = true; }
18471 }
18571 - if ((userGroupCount > 0) && (newUserGroup)) { x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p30showAddUserGroupDialog()"><i class="fas fa-plus-circle"></i> ' + "Add User Group" + '</button>'; }
18472 + if ((userGroupCount > 0) && (newUserGroup)) { x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p30showAddUserGroupDialog()"><i class="fa-solid fa-plus-circle"></i> ' + "Add User Group" + '</button>'; }
18473 }
18474 x += '<table class="table table-hover"><tbody><tr class="table-active"><th scope=col>' + "User Group Memberships" + '</th><th scope=col></th></tr>';
18475 if (currentUser.links) {
@@ -18582,7 +18483,7 @@
18483 groupname = EscapeHtml(group.name);
18484 if (usergroups != null) { groupname = '<a href=# onclick=\'gotoUserGroup("' + encodeURIComponentEx(ougroups[i]._id) + '");haltEvent(event);\'>' + groupname + '</a>'; }
18485 }
18585 - if ((group.membershipType == null) && ((userinfo.siteadmin & 256) != 0)) { trash = '<a href=# onclick=\'return p30RemoveUserGroup(event,"' + encodeURIComponentEx(ougroups[i]._id) + '")\' title="' + "Remove user group membership" + '" style=cursor:pointer><i class="fas fa-trash text-danger hoverButton"></i></a>'; }
18486 + if ((group.membershipType == null) && ((userinfo.siteadmin & 256) != 0)) { trash = '<a href=# onclick=\'return p30RemoveUserGroup(event,"' + encodeURIComponentEx(ougroups[i]._id) + '")\' title="' + "Remove user group membership" + '" style=cursor:pointer><i class="fa-solid fa-trash text-danger hoverButton"></i></a>'; }
18487 x += '<tr ' + (((++count % 2) == 0) ? 'style=background-color:#DDD' : '') + '><td><div title="' + "User Group" + '" class=m4></div><div>&nbsp;' + groupname + '<div></div></div></td><td><div style=float:right>' + trash + '</div></td></tr>';
18488 }
18489 }
@@ -18593,7 +18494,7 @@
18494 // Display common devices
18495 count = 1;
18496 x += '<br />';
18596 - if (currentUser._id.split('/')[1] == userinfo._id.split('/')[1]) { x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p20showAddMeshUserDialog(4)"><i class="fas fa-plus-circle"></i> ' + "Add Device" + '</button>'; }
18497 + if (currentUser._id.split('/')[1] == userinfo._id.split('/')[1]) { x += '<button class="btn btn-primary btn-sm me-2 mb-1" onclick="return p20showAddMeshUserDialog(4)"><i class="fa-solid fa-plus-circle"></i> ' + "Add Device" + '</button>'; }
18498 x += '<table class="table table-hover"><tbody><tr class="table-active"><th scope=col>' + "Common Devices" + '</th><th scope=col></th></tr>';
18499 if (currentUser.links) {
18500 // Sort the list of devices to display
@@ -19249,16 +19150,16 @@
19150 if (user != null) {
19151 var name = user.name;
19152 if (user.realname != null) { name += ', ' + user.realname; }
19252 - return '<div onclick=\'gotoUser("' + user._id + '",10);haltEvent(event);\' style=float:left;margin-right:4px;cursor:pointer><i class="fas fa-user-circle"></i></div>' + EscapeHtml(name);
19153 + return '<div onclick=\'gotoUser("' + user._id + '",10);haltEvent(event);\' style=float:left;margin-right:4px;cursor:pointer><i class="fa-solid fa-user-circle"></i></div>' + EscapeHtml(name);
19154 } else {
19155 return '<i>' + "Unknown User" + '</i>';
19156 }
19157 }
19158 if (f == 'msg') {
19258 - if (v == 107) return '<div style=float:left;margin-right:4px;cursor:pointer><i class="fas fa-check-circle text-success"></i></div>' + "Succesful login";
19159 + if (v == 107) return '<div style=float:left;margin-right:4px;cursor:pointer><i class="fa-solid fa-check-circle text-success"></i></div>' + "Succesful login";
19160 if (v == 108) return '<div style=float:left;margin-right:4px;cursor:pointer class="NotifyIconTiny2"></div>' + "Incorrect 2nd factor";
19161 if (v == 109) return '<div style=float:left;margin-right:4px;cursor:pointer class="NotifyIconTiny4"></div>' + "Locked account";
19261 - if (v == 110) return '<div style=float:left;margin-right:4px;cursor:pointer><i class="fas fa-exclamation-triangle text-warning"></i></div>' + "Invalid login attempt";
19162 + if (v == 110) return '<div style=float:left;margin-right:4px;cursor:pointer><i class="fa-solid fa-exclamation-triangle text-warning"></i></div>' + "Invalid login attempt";
19163 }
19164 if (f == '2fa') {
19165 if (v == '') { return "None"; }
@@ -20673,7 +20574,8 @@
20574 function getLang() { if (navigator.languages != undefined) { return navigator.languages[0]; } return navigator.language; }
20575 function getNodeAmtVersion(node) { if ((node == null) || (node.intelamt == null) || (typeof node.intelamt.ver != 'string')) return 0; var verSplit = node.intelamt.ver.split('.'); if (verSplit.length < 2) return 0; return parseInt(verSplit[0]) + (parseInt(verSplit[1]) / 100); }
20576 function getstore(name, val) { try { if (typeof (localStorage) === 'undefined') return val; var v = localStorage.getItem(name); if ((v == null) || (v == null)) return val; return v; } catch (e) { return val; } }
20676 - function addLink(x, f) { return '<span tabindex=0 style=cursor:pointer;text-decoration:none onclick=\'' + f + '\' onkeypress="if (event.key==\'Enter\') {' + f + '} ">' + x + ' <img class=hoverButton src=images/link5.png></span>'; }
20577 + // function addLink(x, f) { return '<span tabindex=0 style=cursor:pointer;text-decoration:none onclick=\'' + f + '\' onkeypress="if (event.key==\'Enter\') {' + f + '} ">' + x + ' <img class=hoverButton src=images/link5.png></span>'; }
20578 + function addLink(x, f) { return '<span tabindex=0 role="button" onclick=\'' + f + '\' onkeypress="if (event.key==\'Enter\') {' + f + '} ">' + x + ' <i class="fa-solid fa-pencil fa-xs"></i></span>'; }
20579 function addLinkConditional(x, f, c) { if (c) return addLink(x, f); return x; }
20580 function addKeyLink(x, f) { return '<span tabindex=0 style=cursor:pointer;text-decoration:none onclick=' + f + ' onkeypress="if (event.key==\'Enter\') { ' + f + ' } ">' + x + ' <img class=hoverButton src=images/key16.png></span>'; }
20581 function addKeyLinkConditional(x, f, c) { if (c) return addKeyLink(x, f); return x; }