file_versions.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title locale="title/title">File Version History</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.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. <script type="text/javascript" src="../../script/applocale.js"></script>
  12. <style>
  13. .backgroundIcon{
  14. position: fixed;
  15. bottom: 0px;
  16. right: 0px;
  17. opacity: 0.3;
  18. margin-right: -8em;
  19. margin-bottom: -5em;
  20. z-index: -99;
  21. pointer-events: none;
  22. user-select: none;
  23. }
  24. </style>
  25. </head>
  26. <body id="filePropertiesWindow">
  27. <br>
  28. <div class="backgroundIcon">
  29. <img class="ui medium image" src="../../img/system/file-restore.svg">
  30. </div>
  31. <div class="ui container">
  32. <h3 class="ui header">
  33. <div class="content">
  34. <span locale="title/title">File Version History</span>
  35. <div class="sub header" locale="title/desc">Any file versions that is more than 30 days old will be automatically removed from the system.</div>
  36. </div>
  37. </h3>
  38. <button onclick="createSnapshot();" class="ui basic green button"><i class="ui add icon"></i> <span locale="button/newver">Create New Version</span></button>
  39. <div class="ui divider"></div>
  40. <div id="succ" style="display:none;" class="ui green message">
  41. <i class="ui checkmark icon"></i> <span id="msg">File Restore Succeed</span>
  42. </div>
  43. <div>
  44. <table class="ui very basic fluid celled table unstackable">
  45. <tbody id="versions">
  46. <tr>
  47. <td>
  48. <h4 class="ui header">
  49. <div class="content">
  50. <span locale="message/nofile/title">No File</span>
  51. <div locale="message/nofile/desc" class="sub header">Invalid usage</div>
  52. </div>
  53. </h4>
  54. </td>
  55. </tr>
  56. </tbody>
  57. </table>
  58. </div>
  59. <div class="ui divider"></div>
  60. <button class="ui red button" onclick="deleteAllVersions();"><i class="ui trash icon"></i> <span locale="button/removeAll">Remove All Version Histories</span></button>
  61. <br>
  62. </div>
  63. <script>
  64. var files = ao_module_loadInputFiles();
  65. var targetFile = "";
  66. var currentVersionList = [];
  67. if (files.length >= 1){
  68. targetFile = files[0];
  69. applocale.init("../../SystemAO/locale/file_versions.json", function(){
  70. applocale.translate();
  71. loadVersionHistory(targetFile);
  72. });
  73. setInterval(function(){
  74. checkHistoryListUpdate(targetFile);
  75. }, 3000)
  76. }else{
  77. //No file selected
  78. applocale.init("../../SystemAO/locale/file_versions.json", function(){
  79. applocale.translate();
  80. });
  81. }
  82. function checkHistoryListUpdate(vpath){
  83. $.ajax({
  84. url: "../../system/file_system/versionHistory",
  85. data: {path: vpath},
  86. method: "POST",
  87. success: function(data){
  88. if (data.error == undefined){
  89. if (currentVersionList.length != data.Versions.length){
  90. loadVersionHistory(vpath);
  91. }
  92. }
  93. }
  94. });
  95. }
  96. function loadVersionHistory(vpath){
  97. $("#versions").html("Loading...");
  98. $.ajax({
  99. url: "../../system/file_system/versionHistory",
  100. data: {path: vpath},
  101. method: "POST",
  102. success: function(data){
  103. if (data.error !== undefined){
  104. alert(data.error);
  105. }else{
  106. $("#versions").html("");
  107. currentVersionList = data.Versions;
  108. data.Versions.forEach(fileVersionEntry => {
  109. var filesize = ao_module_utils.formatBytes(fileVersionEntry.Filesize, 1);
  110. $("#versions").append(`<tr>
  111. <td>
  112. <h4 class="ui header">
  113. <div class="content">
  114. <span>${fileVersionEntry.Filename}</span>
  115. <div class="sub header">${fileVersionEntry.OverwriteTime} / ${filesize}</div>
  116. </div>
  117. </h4></td>
  118. <td>
  119. <div class="ui icon mini buttons">
  120. <button relpath="${fileVersionEntry.Relpath}" onclick="downloadVersion(this);" class="ui very basic icon button" title="${applocale.getString("title/download", "Download Version")}"><i class="ui blue download icon"></i></button>
  121. <button verid="${fileVersionEntry.HistoryID}" onclick="restoreVersion(this);" class="ui very basic icon button" title="${applocale.getString("title/restore", "Restore This Version")}"><i class="ui green history icon"></i></button>
  122. <button verid="${fileVersionEntry.HistoryID}" onclick="deleteVersion(this);" class="ui very basic icon button" title="${applocale.getString("title/delete", "Delete")}"><i class="ui red trash icon"></i></button>
  123. </div>
  124. </td>
  125. </tr>`);
  126. });
  127. if (data.Versions.length == 0){
  128. //This file has no version history
  129. $("#versions").html(`<tr>
  130. <td>
  131. <h4 class="ui header">
  132. <div class="content">
  133. <i class="ui history icon"></i><span> ${applocale.getString("message/nohist/title", "No History")}</span>
  134. <div class="sub header">${applocale.getString("message/nohist/desc", "This file has no previous version histories.")}</div>
  135. </div>
  136. </h4>
  137. </td>
  138. </tr>`);
  139. }
  140. applocale.translate();
  141. }
  142. }
  143. });
  144. }
  145. function downloadVersion(object){
  146. var relpath = $(object).attr("relpath");
  147. var dirname = targetFile.split("/");
  148. dirname.pop();
  149. var accessPath = dirname.join("/") + "/" + relpath;
  150. window.open("../../media/download?file=" + accessPath)
  151. }
  152. function createSnapshot(){
  153. //Create a snapshot of the current object
  154. $.ajax({
  155. url: "../../system/file_system/versionHistory",
  156. data: {path: targetFile, opr: "new"},
  157. method: "POST",
  158. success: function(data){
  159. if (data.error != undefined){
  160. alert(data.error)
  161. }else{
  162. msgbox(applocale.getString("msgbox/created","New Version Created"));
  163. loadVersionHistory(targetFile);
  164. }
  165. }
  166. });
  167. }
  168. function restoreVersion(object){
  169. var versionID = $(object).attr("verid");
  170. if (confirm(applocale.getString("warning/restore", "Restoring this file will remove all newer version histories of this file. Confirm?"))){
  171. $.ajax({
  172. url: "../../system/file_system/versionHistory",
  173. data: {path: targetFile, opr: "restore", histid: versionID},
  174. method: "POST",
  175. success: function(data){
  176. if (data.error != undefined){
  177. alert(data.error)
  178. }else{
  179. loadVersionHistory(targetFile);
  180. msgbox(applocale.getString("msgbox/restored","Restore Succeed"));
  181. }
  182. }
  183. });
  184. }
  185. }
  186. function msgbox(message){
  187. $("#msg").text(message);
  188. $("#succ").stop().finish().fadeIn("fast").delay(3000).fadeOut("fast");
  189. }
  190. function deleteVersion(object){
  191. var versionID = $(object).attr("verid");
  192. $.ajax({
  193. url: "../../system/file_system/versionHistory",
  194. data: {path: targetFile, opr: "delete", histid: versionID},
  195. method: "POST",
  196. success: function(data){
  197. if (data.error != undefined){
  198. alert(data.error)
  199. }else{
  200. loadVersionHistory(targetFile);
  201. }
  202. }
  203. });
  204. }
  205. function deleteAllVersions(object){
  206. var versionID = $(object).attr("verid");
  207. if (confirm(applocale.getString("warning/deleteall", "This operation will **PERMANENTLY DELETE ALL** version history of this file. Confirm?"))){
  208. $.ajax({
  209. url: "../../system/file_system/versionHistory",
  210. data: {path: targetFile, opr: "deleteAll", histid: versionID},
  211. method: "POST",
  212. success: function(data){
  213. if (data.error != undefined){
  214. alert(data.error)
  215. }else{
  216. msgbox(applocale.getString("msgbox/deletedall","All version history deleted"));
  217. loadVersionHistory(targetFile);
  218. }
  219. }
  220. });
  221. }
  222. }
  223. </script>
  224. </body>
  225. </html>