folders.html 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. {{template "base" .}}
  2. {{define "title"}}{{.Title}}{{end}}
  3. {{define "extra_css"}}
  4. <link href="/static/vendor/datatables/dataTables.bootstrap4.min.css" rel="stylesheet">
  5. <link href="/static/vendor/datatables/select.bootstrap4.min.css" rel="stylesheet">
  6. <link href="/static/vendor/datatables/buttons.bootstrap4.min.css" rel="stylesheet">
  7. {{end}}
  8. {{define "page_body"}}
  9. <div id="errorMsg" class="card mb-4 border-left-warning" style="display: none;">
  10. <div id="errorTxt" class="card-body text-form-error"></div>
  11. </div>
  12. <div id="successMsg" class="card mb-4 border-left-success" style="display: none;">
  13. <div id="successTxt" class="card-body"></div>
  14. </div>
  15. <div class="card shadow mb-4">
  16. <div class="card-header py-3">
  17. <h6 class="m-0 font-weight-bold text-primary">View and manage folders</h6>
  18. </div>
  19. <div class="card-body">
  20. <div class="table-responsive">
  21. <table class="table table-striped table-bordered" id="dataTable" width="100%" cellspacing="0">
  22. <thead>
  23. <tr>
  24. <th>Path</th>
  25. <th>Quota</th>
  26. <th>Used by</th>
  27. </tr>
  28. </thead>
  29. <tbody>
  30. {{range .Folders}}
  31. <tr>
  32. <td>{{.MappedPath}}</td>
  33. <td>{{.GetQuotaSummary}}</td>
  34. <td>{{.GetUsersAsString}}</td>
  35. </tr>
  36. {{end}}
  37. </tbody>
  38. </table>
  39. </div>
  40. </div>
  41. </div>
  42. {{end}}
  43. {{define "dialog"}}
  44. <div class="modal fade" id="deleteModal" tabindex="-1" role="dialog" aria-labelledby="deleteModalLabel"
  45. aria-hidden="true">
  46. <div class="modal-dialog" role="document">
  47. <div class="modal-content">
  48. <div class="modal-header">
  49. <h5 class="modal-title" id="deleteModalLabel">
  50. Confirmation required
  51. </h5>
  52. <button class="close" type="button" data-dismiss="modal" aria-label="Close">
  53. <span aria-hidden="true">×</span>
  54. </button>
  55. </div>
  56. <div class="modal-body">Do you want to delete the selected virtual folder and any users mapping?</div>
  57. <div class="modal-footer">
  58. <button class="btn btn-secondary" type="button" data-dismiss="modal">
  59. Cancel
  60. </button>
  61. <a class="btn btn-warning" href="#" onclick="deleteAction()">
  62. Delete
  63. </a>
  64. </div>
  65. </div>
  66. </div>
  67. </div>
  68. {{end}}
  69. {{define "extra_js"}}
  70. <script src="/static/vendor/datatables/jquery.dataTables.min.js"></script>
  71. <script src="/static/vendor/datatables/dataTables.bootstrap4.min.js"></script>
  72. <script src="/static/vendor/datatables/dataTables.select.min.js"></script>
  73. <script src="/static/vendor/datatables/select.bootstrap4.min.js"></script>
  74. <script src="/static/vendor/datatables/dataTables.buttons.min.js"></script>
  75. <script src="/static/vendor/datatables/buttons.bootstrap4.min.js"></script>
  76. <script type="text/javascript">
  77. function deleteAction() {
  78. var table = $('#dataTable').DataTable();
  79. table.button(1).enable(false);
  80. var folderPath = table.row({ selected: true }).data()[0];
  81. var path = '{{.APIFoldersURL}}'.trimEnd("/") + "?folder_path=" + encodeURIComponent(folderPath);
  82. $('#deleteModal').modal('hide');
  83. $.ajax({
  84. url: path,
  85. type: 'DELETE',
  86. dataType: 'json',
  87. timeout: 15000,
  88. success: function (result) {
  89. table.button(1).enable(true);
  90. window.location.href = '{{.FoldersURL}}';
  91. },
  92. error: function ($xhr, textStatus, errorThrown) {
  93. console.log("delete error")
  94. table.button(1).enable(true);
  95. var txt = "Unable to delete the selected folder";
  96. if ($xhr) {
  97. var json = $xhr.responseJSON;
  98. if (json) {
  99. txt += ": " + json.error;
  100. }
  101. }
  102. $('#errorTxt').text(txt);
  103. $('#errorMsg').show();
  104. setTimeout(function () {
  105. $('#errorMsg').hide();
  106. }, 5000);
  107. }
  108. });
  109. }
  110. $(document).ready(function () {
  111. $.fn.dataTable.ext.buttons.add = {
  112. text: 'Add',
  113. action: function (e, dt, node, config) {
  114. window.location.href = '{{.FolderURL}}';
  115. }
  116. };
  117. $.fn.dataTable.ext.buttons.delete = {
  118. text: 'Delete',
  119. action: function (e, dt, node, config) {
  120. $('#deleteModal').modal('show');
  121. },
  122. enabled: false
  123. };
  124. $.fn.dataTable.ext.buttons.quota_scan = {
  125. text: 'Quota scan',
  126. action: function (e, dt, node, config) {
  127. table.button(2).enable(false);
  128. var folderPath = dt.row({ selected: true }).data()[0];
  129. var path = '{{.APIFolderQuotaScanURL}}'
  130. $.ajax({
  131. url: path,
  132. type: 'POST',
  133. dataType: 'json',
  134. data: JSON.stringify({ "mapped_path": folderPath }),
  135. timeout: 15000,
  136. success: function (result) {
  137. table.button(2).enable(true);
  138. $('#successTxt').text("Quota scan started for the selected folder. Please reload the folders page to check when the scan ends");
  139. $('#successMsg').show();
  140. setTimeout(function () {
  141. $('#successMsg').hide();
  142. }, 5000);
  143. },
  144. error: function ($xhr, textStatus, errorThrown) {
  145. console.log("quota scan error")
  146. table.button(2).enable(true);
  147. var txt = "Unable to update quota for the selected folder";
  148. if ($xhr) {
  149. var json = $xhr.responseJSON;
  150. if (json) {
  151. if (json.message) {
  152. txt += ": " + json.message;
  153. } else if (json.error) {
  154. txt += ": " + json.error;
  155. }
  156. }
  157. }
  158. $('#errorTxt').text(txt);
  159. $('#errorMsg').show();
  160. setTimeout(function () {
  161. $('#errorMsg').hide();
  162. }, 5000);
  163. }
  164. });
  165. },
  166. enabled: false
  167. };
  168. var table = $('#dataTable').DataTable({
  169. dom: "<'row'<'col-sm-12'B>>" +
  170. "<'row'<'col-sm-12 col-md-6'l><'col-sm-12 col-md-6'f>>" +
  171. "<'row'<'col-sm-12'tr>>" +
  172. "<'row'<'col-sm-12 col-md-5'i><'col-sm-12 col-md-7'p>>",
  173. select: true,
  174. buttons: [
  175. 'add','delete', 'quota_scan'
  176. ],
  177. "scrollX": false,
  178. "order": [[0, 'asc']]
  179. });
  180. table.on('select deselect', function () {
  181. var selectedRows = table.rows({ selected: true }).count();
  182. table.button(1).enable(selectedRows == 1);
  183. table.button(2).enable(selectedRows == 1);
  184. });
  185. });
  186. </script>
  187. {{end}}