addAndRemove.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Subservices</title>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0 user-scalable=no">
  7. <link rel="stylesheet" href="../../script/semantic/semantic.min.css">
  8. <script type="text/javascript" src="../../script/jquery.min.js"></script>
  9. <script type="text/javascript" src="../../script/semantic/semantic.min.js"></script>
  10. <!-- <script type="text/javascript" src="../../script/ao_module.js"></script> -->
  11. <style>
  12. .ui.active.segment{
  13. background-color: #f5f5f5 !important;
  14. }
  15. .ui.segment.installedModule{
  16. cursor: pointer;
  17. margin: 0px !important;
  18. }
  19. .ui.segment.installedModule:hover{
  20. background-color: #e3e3e3;
  21. }
  22. </style>
  23. </head>
  24. <body>
  25. <br>
  26. <div class="ui container">
  27. <div class="ui container">
  28. <div class="ui header">
  29. <i class="add icon"></i>
  30. <div class="content">
  31. Add & Remove Module
  32. <div class="sub header">Install or Uninstall WebApp Modules from this Host</div>
  33. </div>
  34. </div>
  35. </div>
  36. <div class="ui divider"></div>
  37. <div class="ui red message" style="display:none;" id="errmsgbox">
  38. <h4 class="ui header">
  39. <i class="remove icon"></i>
  40. <div class="content">
  41. Module Installation Failed
  42. <div class="sub header" id="errmsg"></div>
  43. </div>
  44. </h4>
  45. </div>
  46. <div class="ui green message" style="display:none;" id="ok">
  47. <h4 class="ui header">
  48. <i class="checkmark icon"></i>
  49. <div class="content">
  50. Module Installation Completed
  51. <div class="sub header" >You should be able to see your new module in the list below.</div>
  52. </div>
  53. </h4>
  54. </div>
  55. <div class="ui blue segment">
  56. <h4 class="ui header">
  57. New WebApp
  58. <div class="sub header">Download new WebApp to your ArozOS Host</div>
  59. </h4>
  60. <div class="ui divider"></div>
  61. <h5>Install via Git Repository</h5>
  62. <p>Enter the Github repo link in the field below and click "Install"</p>
  63. <div class="ui small fluid action input" id="installViaGitInput">
  64. <input id="gitlink" type="text" placeholder="http://github.com/....">
  65. <button class="ui blue button" onclick="installViaGit();"><i class="download icon"></i> Install</button>
  66. </div>
  67. <div class="ui blue message" style="display:none;" id="installingDialog">
  68. <p><i class="ui loading spinner icon"></i> Module installing in the background. Please wait until this dialog is closed.</p>
  69. </div>
  70. <div class="ui divider"></div>
  71. <h4>Install via Zip File</h4>
  72. <p>Select your module zip file and upload it to the system for installation.</p>
  73. <div class="ui small fluid action input">
  74. <input type="text" id="installpendingFile" placeholder="New Module.zip">
  75. <button class="ui button" onclick="selectInstaller()"><i class="folder open icon"></i> Select Installer</button>
  76. <button class="ui blue button" onclick="InstallViaZipFile(this)"><i class="zip icon" ></i> Install</button>
  77. </div>
  78. </div>
  79. <div class="ui red segment">
  80. <h4 class="ui header">
  81. Remove WebApp
  82. <div class="sub header">Remove WebApp from your ArozOS Host</div>
  83. </h4>
  84. <div class="ui green message" id="succ" style="display:none;">
  85. <i class="check icon"></i> WebApp module uninstalled successfully.
  86. </div>
  87. <div class="ui divider"></div>
  88. <div id="modulelist">
  89. No Module Installed
  90. </div>
  91. </div>
  92. </div>
  93. <div id="loadingUI" class="ui dimmer">
  94. <div class="ui indeterminate text loader">Fetching Files</div>
  95. </div>
  96. <script>
  97. var moduleList = [];
  98. initModuleUninstallList();
  99. function bytesToSize(bytes) {
  100. var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
  101. if (bytes == 0) return '0 Byte';
  102. var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)));
  103. return Math.round(bytes / Math.pow(1024, i), 2) + ' ' + sizes[i];
  104. }
  105. function initModuleUninstallList(){
  106. $.get("../../system/module/install", function(data){
  107. console.log(data);
  108. moduleList = data;
  109. $("#modulelist").html("");
  110. data.forEach(mod => {
  111. var uninstallButtonClass = "";
  112. if (mod.Uninstallable == false){
  113. uninstallButtonClass = "disabled"
  114. }
  115. $("#modulelist").append(`<div class="ui basic segment installedModule" onclick="selectThisModule(event, this);">
  116. <img class="ui top aligned image" style="margin-right: 12px; width: 50px;" src="../../${mod.IconPath}">
  117. <div style="display:inline-block;">
  118. <b>${mod.Name}</b>
  119. <p>${mod.Desc}</p>
  120. <div style="position: absolute;top: 0.6em; right: 2em; text-align: right;">
  121. <b>${bytesToSize(mod.DiskSpace)}</b><br>
  122. <span>${mod.InstallDate}</span>
  123. </div>
  124. </div>
  125. <div style="text-align: right; display:none;" class="actionField">
  126. <button class="ui small ${uninstallButtonClass} button" name="${mod.Name}" onclick="removeModule(event,this);">Uninstall</button>
  127. <div class="ui red message errordialog" style="text-align:left; display:none;">
  128. <i class="remove icon"></i> WebApp Removal Failed: <span class="errmsg"></span>
  129. </div>
  130. </div>
  131. </div> `);
  132. });
  133. });
  134. }
  135. function removeModule(e, btn){
  136. var modulename = $(btn).attr("name");
  137. //Ask for confirmation
  138. if (confirm("Confirm permanently remove " + modulename + " ?")){
  139. $.ajax({
  140. url: "../../system/module/install",
  141. data: {opr: "remove", module: modulename},
  142. success: function(data){
  143. if (data.error !== undefined){
  144. $(btn).parent().find(".errmsg").text(data.error);
  145. $(btn).parent().find(".errordialog").slideDown("fast").delay(10000).slideUp("fast");
  146. }else{
  147. //Reload list
  148. initModuleUninstallList();
  149. //Reload desktop module list
  150. if (parent && parent.initModuleList != undefined){
  151. parent.initModuleList();
  152. }
  153. $("#succ").slideDown("fast").delay(3000).slideUp('fast');
  154. }
  155. }
  156. });
  157. }
  158. }
  159. function selectInstaller(){
  160. ao_module_openFileSelector(fileSelected, "user:/Desktop", "file",true, {
  161. filter: ["zip"]
  162. });
  163. }
  164. function fileSelected(filedata){
  165. for (var i=0; i < filedata.length; i++){
  166. var filename = filedata[i].filename;
  167. var filepath = filedata[i].filepath;
  168. $("#installpendingFile").val(filepath);
  169. }
  170. }
  171. function InstallViaZipFile(btn){
  172. //Select the upload module zip file
  173. var installerPath = $("#installpendingFile").val();
  174. if (installerPath == ""){
  175. $("#installpendingFile").parent().addClass("error");
  176. }else{
  177. $("#installpendingFile").parent().removeClass("error");
  178. }
  179. $(btn).addClass("loading");
  180. //Install it
  181. $.ajax({
  182. url: "../../system/modules/installViaZip",
  183. data: {path: installerPath},
  184. success: function(data){
  185. console.log(data);
  186. if (data.error !== undefined){
  187. $("#errmsg").text(data.error);
  188. $("#errmsgbox").slideDown("fast").delay(10000).slideUp("fast");
  189. }else{
  190. //Install completed.
  191. if (parent && parent.initModuleList != undefined){
  192. parent.initModuleList();
  193. }
  194. initModuleUninstallList();
  195. $("#ok").slideDown('fast').delay(5000).slideUp('fast');
  196. }
  197. $(btn).removeClass("loading");
  198. },
  199. error: function(){
  200. $(btn).removeClass("loading");
  201. alert("Installation failed due to unknown reason")
  202. }
  203. })
  204. }
  205. function installViaGit(){
  206. var url = $("#gitlink").val();
  207. $("#installingDialog").show();
  208. $("#installViaGitInput").addClass("disabled");
  209. $.ajax({
  210. url: "../../system/module/install",
  211. data: {opr: "gitinstall", url: url},
  212. success: function(data){
  213. console.log(data);
  214. if (data.error !== undefined){
  215. $("#errmsg").text(data.error);
  216. $("#errmsgbox").slideDown("fast").delay(10000).slideUp("fast");
  217. }else{
  218. //OK. Reload the list
  219. if (parent && parent.initModuleList != undefined){
  220. parent.initModuleList();
  221. }
  222. //Reload the uninstall list
  223. initModuleUninstallList();
  224. }
  225. $("#installingDialog").hide();
  226. $("#installViaGitInput").removeClass("disabled");
  227. },
  228. error: function(){
  229. $("#errmsg").text(data.error);
  230. $("#errmsgbox").slideDown("fast").delay(10000).slideUp("fast");
  231. $("#installingDialog").hide();
  232. $("#installViaGitInput").removeClass("disabled");
  233. }
  234. });
  235. }
  236. function selectThisModule(e, obj){
  237. e.preventDefault();
  238. $(".ui.segment.installedModule.active").removeClass('active');
  239. $(".actionField").hide();
  240. $(obj).addClass("active");
  241. $(obj).find(".actionField").show();
  242. }
  243. </script>
  244. </body>
  245. </html>