services.html 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="mobile-web-app-capable" content="yes">
  5. <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1"/>
  6. <meta charset="UTF-8">
  7. <link rel="stylesheet" href="../../script/semantic/semantic.min.css">
  8. <script src="../../script/jquery.min.js"></script>
  9. <script src="../../script/semantic/semantic.min.js"></script>
  10. <script src="../../script/clipboard.min.js"></script>
  11. <style>
  12. #sys-setting-page { padding: 20px; }
  13. .hidden{
  14. display:none;
  15. }
  16. .disabled{
  17. opacity: 0.5;
  18. pointer-events: none;
  19. }
  20. .detailBtn{
  21. position: absolute;
  22. right: 0.4em;
  23. top: calc(30% + 0.5em);
  24. }
  25. .servertype.active .detailBtn{
  26. pointer-events: none;
  27. opacity: 0.3;
  28. }
  29. .servertype:hover{
  30. opacity: 0.7;
  31. }
  32. .servertype.active{
  33. background-color: #f7f7f7 !important;
  34. border-right: 3px solid #6bc2ec !important;
  35. }
  36. .clickable{
  37. cursor: pointer;
  38. }
  39. .fileservice{
  40. margin-bottom: 1em;
  41. }
  42. .serviceConnEndpoints{
  43. margin-top: 0 !important;
  44. display: inline-block;
  45. vertical-align:top;
  46. }
  47. .ui.toggle.checkbox input[type=checkbox]:checked~label::before,
  48. .ui.toggle.checkbox input[type=checkbox]:checked:focus~label::before {
  49. background: #8cd493 !important;
  50. }
  51. </style>
  52. </head>
  53. <body>
  54. <br>
  55. <div class="ui container" id="sys-setting-page">
  56. <div class="ui header">
  57. <div class="content">
  58. Network File Transfer Servers
  59. <div class="sub header">Manage the exported file server interface for ArozOS Virtual File System</div>
  60. </div>
  61. </div>
  62. <br>
  63. <div class="ui stackable grid">
  64. <div class="six wide column" style="border-right: 1px solid #e0e0e0;">
  65. <div id="serviceList"></div>
  66. <div class="ui divider"></div>
  67. </div>
  68. <div class="ten wide column">
  69. <div id="serviceInstruction"></div>
  70. <div class="ui divider"></div>
  71. <div id="serviceSettings"></div>
  72. </div>
  73. </div>
  74. <br><br>
  75. </div>
  76. <script>
  77. var isAdmin = false;
  78. var fileServerServices = [];
  79. function isAdminCheck(){
  80. $.get("../../system/desktop/user?noicon=true", function(data){
  81. isAdmin = data.IsAdmin;
  82. initServiceList();
  83. });
  84. }
  85. isAdminCheck();
  86. function initServiceList(callback=undefined){
  87. $("#serviceList").html("");
  88. $.get("../../system/network/server/list", function(data){
  89. console.log(data);
  90. fileServerServices = data;
  91. data.forEach(server => {
  92. console.log(server);
  93. let checkboxDefaultState = "";
  94. let messageDefaultColor = "";
  95. if (server.Enabled){
  96. checkboxDefaultState = "checked";
  97. messageDefaultColor = "green";
  98. }
  99. $("#serviceList").append(`<div class="fileservice">
  100. <div class="ui clickable servertype top attached segment" uuid="${server.ID}" onclick="openServerConfig('${server.ID}', event, this);">
  101. <h4 class="ui header">
  102. <img src="../../${server.IconPath}">
  103. <div class="content">
  104. ${server.Name}
  105. <div class="sub header">
  106. ${server.Desc}
  107. </div>
  108. </div>
  109. </h4>
  110. <a title="Details" onclick="openServerConfig('${server.ID}', event, this.parent);" class="detailBtn">
  111. <i class="grey angle right icon"></i>
  112. </a>
  113. </div>
  114. <div class="ui bottom attached ${messageDefaultColor} mini message">
  115. <div class="ui toggle mini checkbox enableState" fserv="${server.ID}" onclick="handleServiceStateChange(this, event);">
  116. <input type="checkbox" ${checkboxDefaultState} onchange="updateCheckboxBackground(this, event);">
  117. <label></label>
  118. </div>
  119. <p fserv="${server.ID}" class="serviceConnEndpoints"></p>
  120. </div>`);
  121. });
  122. if (data.length > 0){
  123. openServerConfig(data[0].ID);
  124. $($(".servertype")[0]).addClass("active");
  125. }
  126. //Get a list of endpoints that is dedicated for this file server
  127. $.get("../../system/network/server/endpoints", function(data){
  128. for (let [id, endpoints] of Object.entries(data)){
  129. console.log(id, endpoints)
  130. //Get the target connection display for this endpoint
  131. $(".serviceConnEndpoints").each(function(){
  132. if ($(this).attr("fserv") == id){
  133. //This is the one. Render the endpoints on it
  134. let endpointHTML = "";
  135. endpoints.forEach(ep => {
  136. var portName = ":" + ep.Port;
  137. if (ep.Port == 0){
  138. //Do not define port. Hence do not show it
  139. portName = "";
  140. }
  141. let connURL = ep.ProtocolName + window.location.hostname + portName + ep.Subpath;
  142. endpointHTML += `<i class="ui grey caret right icon"></i> <a class="clip" data-clipboard-text="${connURL}" style="cursor:pointer;" conn="${connURL}">${connURL}</a><br>`
  143. });
  144. $(this).html(endpointHTML);
  145. }
  146. });
  147. var clipboard = new ClipboardJS('.clip');
  148. clipboard.on('success', function(e) {
  149. //console.info('Action:', e.action);
  150. //console.info('Text:', e.text);
  151. console.info('Trigger:', e.trigger);
  152. let targetElement = e.trigger;
  153. $(targetElement).html(`<i class="ui green checkmark icon"></i> Copied`);
  154. setTimeout(function(){
  155. let originalURL = $(targetElement).attr("conn");
  156. $(targetElement).html(originalURL);
  157. }, 3000);
  158. e.clearSelection();
  159. });
  160. //Activate all checkbox
  161. $(".ui.checkbox").checkbox();
  162. if (!isAdmin){
  163. //This user not admin. Disable all checkbox
  164. $(".ui.checkbox").addClass("disabled");
  165. }
  166. updateAllServiceState();
  167. }
  168. if (callback != undefined){
  169. callback();
  170. }
  171. });
  172. });
  173. }
  174. function updateAllServiceState(){
  175. $.get("../../system/network/server/status", function(data){
  176. $(".enableState").each(function(){
  177. var fservid = $(this).attr("fserv");
  178. var enableState = data[fservid];
  179. if (enableState){
  180. $(this).checkbox("set checked");
  181. }else{
  182. $(this).checkbox("set unchecked");
  183. }
  184. });
  185. });
  186. }
  187. function handleServiceStateChange(object, event){
  188. event.preventDefault();
  189. let targetElement = object;
  190. setTimeout(function(){
  191. //This delay is to make sure the checkbox event is executed first
  192. //Before the state is checked
  193. let isChecked = $(targetElement).checkbox("is checked");
  194. let isCheckedString = isChecked?"true":"false";
  195. let serviceId = $(targetElement).attr("fserv");
  196. $.ajax({
  197. url: "../../system/network/server/toggle",
  198. method: "POST",
  199. data: {id: serviceId, enable: isCheckedString},
  200. success: function(){
  201. updateAllServiceState();
  202. }
  203. })
  204. }, 100);
  205. }
  206. function getServiceById(serviceid){
  207. for (var i =0; i < fileServerServices.length; i++){
  208. if (fileServerServices[i].ID == serviceid){
  209. return fileServerServices[i];
  210. }
  211. }
  212. }
  213. function openServerConfig(serviceid, evt=undefined, object=undefined){
  214. if (evt != undefined){
  215. evt.preventDefault();
  216. }
  217. $(".servertype.active").removeClass("active");
  218. $(object).addClass("active");
  219. let targetService = getServiceById(serviceid);
  220. let targetServiceConfigPage = targetService.ConfigPage;
  221. if (targetServiceConfigPage == "" || targetServiceConfigPage == undefined){
  222. $("#serviceSettings").html(`No Configuration Avabile`);
  223. }else{
  224. $("#serviceInstruction").load("../../" + targetService.ConnInstrPage);
  225. if (isAdmin){
  226. $("#serviceSettings").load("../../" + targetService.ConfigPage);
  227. }else{
  228. $("#serviceSettings").load("../disk/instr/noaccess.html");
  229. }
  230. }
  231. }
  232. function updateCheckboxBackground(object, event){
  233. let message = $(object).parent().parent();
  234. if (object.checked){
  235. $(message).addClass("green");
  236. }else{
  237. $(message).removeClass("green");
  238. }
  239. }
  240. </script>
  241. </body>
  242. </html>