backups.tpl 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. <div class="module-main-header">
  2. <a href="index.php?m=DNSManager2" class="btn btn-back btn-icon" style="height: inherit;"><i class="fa fa-arrow-left"></i></a><h2>{$MGLANG->T('dns_manager')}</h2>
  3. </div>
  4. <h3 class="myheader-title backupsHeader"></h3>
  5. <div class="module-content">
  6. <div class="module-header">
  7. <h3 class="pull-left mg-backup-task-header">{$MGLANG->T('backups_tasks')}</h3>
  8. <div class="header-search">
  9. <div class="row-fluid-xs">
  10. <div class="fluid-0">
  11. <a {if !$caCanAddBackup}style="display: none"{/if} class="btn btn-primary pull-right caHeaderButtonBackup" data-act="addBackupImportZones"
  12. data-formid="zonesList">{$MGLANG->T('addExportToFile')}</a>
  13. </div>
  14. </div>
  15. </div>
  16. </div>
  17. <div class="module-body">
  18. <div class="section">
  19. <table id="backupsTasks" class="table mg-ca-backup-table">
  20. <thead>
  21. <tr>
  22. <th>{$MGLANG->T('taskDescription')}</th>
  23. <th>{$MGLANG->T('zones_procesed_total')}</th>
  24. <th>{$MGLANG->T('progress')}</th>
  25. <th></th>
  26. </tr>
  27. </thead>
  28. <tbody>
  29. {foreach from=$backupsTasks item="backupTask"}
  30. <tr>
  31. <td>{$backupTask.parsedDesc.0}
  32. <b>{$backupTask.parsedDesc.1}</b>{if $backupTask.parsedDesc.2}{$backupTask.parsedDesc.2}
  33. <b>{$backupTask.parsedDesc.3}</b>{/if}</td>
  34. <td>{$backupTask.zones_imported}/{$backupTask.zones_total}</td>
  35. <td>
  36. {if $backupTask.error neq false}
  37. {$backupTask.error}
  38. {elseif $backupTask.progress < 0}
  39. {$MGLANG->T('waitingToSelectZones')}
  40. {else}
  41. <div class="progress" style="margin-bottom: 0px;">
  42. <div class="progress-bar progress-bar-success" role="progressbar"
  43. aria-valuenow="{$backupTask.progress}" aria-valuemin="0" aria-valuemax="100"
  44. style="width: {$backupTask.progress}%;">{$backupTask.progress}%
  45. </div>
  46. </div>
  47. {/if}
  48. </td>
  49. <td>
  50. <a class="btn btn-primary btn-inverse btn-icon-only backups-action-button zoneRowIcon"
  51. data-act="{if $backupTask.type eq 'importToFileWHMCS'}showListImportToFile{else}exportFromFile{/if}"
  52. data-query="id={$backupTask.id}" title="{$MGLANG->T('show_list')}"><i class="fa fa-edit"></i></a>
  53. <a class="btn btn-danger btn-inverse btn-icon-only backups-action-button zoneRowIcon" data-act="backupRemoveTask"
  54. data-confirm-body="{if $backupTask.type === 'importToFileWHMCS'}{$MGLANG->T('removeBackupConfirmation')}{else}{$MGLANG->T('removeExportConfirmation')}{/if}"
  55. data-query="id={$backupTask.id}&file={$backupTask.parsedDesc.1}"
  56. title="{$MGLANG->T('cancel')}"><i class="fa fa-remove"></i></a>
  57. </td>
  58. </tr>
  59. {foreachelse}
  60. <tr>
  61. <td colspan="4" align="center">{$MGLANG->T('there_are_no_backup_tasks')}</td>
  62. </tr>
  63. {/foreach}
  64. </tbody>
  65. </table>
  66. </div>
  67. </div>
  68. </div>
  69. <div class="module-main-header"></div> <!-- HERE IS SPACE -->
  70. <div class="module-content">
  71. <table class="table mg-ca-backup-table" style="width:100%" id="backupsList">
  72. <thead>
  73. <tr>
  74. <th>{$MGLANG->T('fileName')}</th>
  75. <th>{$MGLANG->T('amountOfZonesInFile')}</th>
  76. <th class="action-cell"></th>
  77. </tr>
  78. </thead>
  79. <tbody>
  80. </tbody>
  81. </table>
  82. </div>
  83. <br>
  84. <br>
  85. <div class="module-main-header"></div> <!-- HERE IS SPACE -->
  86. <div class="module-content">
  87. <table class="table mg-ca-backup-table" style="width:100%" id="cronBackupsList">
  88. <thead>
  89. <tr>
  90. <th>{$MGLANG->T('fileName')}</th>
  91. <th>{$MGLANG->T('amountOfZonesInFile')}</th>
  92. <th class="action-cell"></th>
  93. </tr>
  94. </thead>
  95. <tbody>
  96. </tbody>
  97. </table>
  98. </div>
  99. {literal}
  100. <script type="text/javascript">
  101. var backupListTable = '';
  102. jQuery(document).ready(function () {
  103. function dnsLoadButon() {
  104. if (!document.getElementById('addBackupFile')) {
  105. jQuery('#backupsList_filter').children().last().after('<a {/literal}{if !$caCanAddBackup}style="display: none"{/if}{literal} class="btn btn-primary" id="addBackupFile" style="" data-act="addBackupFile">{/literal}{$MGLANG->T('uploadFile')}{literal}</a>');
  106. $($('#backupsList_filter').find('input')).attr("placeholder", "{/literal}{$MGLANG->T('search')}{literal}");
  107. }
  108. }
  109. function dnsLoadHeader() {
  110. if (!document.getElementById('pageheader')) {
  111. jQuery('#backupsList_filter').parent().append('<div id="pageheader" class=""><div class="myheader-title"><h1 class="mg-backuplist-header">{/literal}{$MGLANG->T('manualBackupsList')} {$manualBackupLimitDisplay}{literal}</h1></div>');
  112. }
  113. }
  114. var last;
  115. jQuery('#table-filters').change(function () {
  116. jQuery('#backupsList').DataTable().ajax.reload();
  117. });
  118. backupListTable = jQuery('#backupsList').DataTable({
  119. // drawCallback: replaceEmptyRowDataTable,
  120. "columnDefs": [
  121. {"className": "dt-center", "targets": [2]}
  122. ],
  123. serverSide: true,
  124. searchDelay: 800,
  125. autoWidth: false,
  126. ajax: function (data, callback, settings) {
  127. if (last != data.length) {
  128. last = data.length;
  129. data.start = 0;
  130. jQuery('#backupsList').DataTable().page(0);
  131. }
  132. last = data.length;
  133. var filters = $('#table-filters :input').serializeArray();
  134. JSONParser.request(
  135. 'refreshBackupsTable'
  136. , $.merge(filters, [
  137. {name: 'order[column]', value: data.columns[data.order[0].column].name},
  138. {name: 'order[dir]', value: data.order[0].dir},
  139. {name: 'limit', value: data.length},
  140. {name: 'offset', value: data.start},
  141. {name: 'search', value: data.search.value},
  142. ])
  143. , function (data) {
  144. callback(data);
  145. jQuery('.mg-wrapper [title]').bstooltip();
  146. dnsLoadButon();
  147. dnsLoadHeader();
  148. // addCustomPagination('backupsList');
  149. }
  150. );
  151. },
  152. columns: [
  153. {name: 'name'},
  154. {name: 'type', type: 'num'},
  155. {orderable: false, targets: 0, name: 'actions'}
  156. ],
  157. // order: [[0, "desc"]],
  158. pagingType: "simple_numbers",
  159. aLengthMenu: [
  160. [5, 10, 25, 50, 75, 100],
  161. [5, 10, 25, 50, 75, 100]
  162. ],
  163. dom: '<"top"f>rt<"bottom"pl><"clear">',
  164. iDisplayLength: 10,
  165. "oLanguage": {
  166. "oPaginate" : {
  167. "sNext": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sNext')}{literal}",
  168. "sFirst": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sFirst')}{literal}",
  169. "sLast ": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sLast')}{literal}",
  170. "sPrevious": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sPrevious')}{literal}",
  171. },
  172. "sEmptyTable": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sEmptyTable')}{literal}",
  173. "sPrevious": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sPrevious')}{literal}",
  174. "sNext": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sNext')}{literal}",
  175. "sZeroRecords": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sZeroRecords')}{literal}",
  176. "sInfoEmpty": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sInfoEmpty')}{literal}",
  177. "sSearch": "",
  178. "sLengthMenu": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sLengthMenu')}{literal}",
  179. "sInfoFiltered": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sInfoFiltered')}{literal}",
  180. "sInfo": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sInfo')}{literal}"
  181. }
  182. });
  183. });
  184. // $('.dataTables_length').parent().addClass('col-xs-6');
  185. // $('.dataTables_filter').parent().addClass('col-xs-6');
  186. function showBackupZonesCallback(data, $obj) {
  187. var tr = $obj.closest('tr');
  188. var row = backupListTable.row( tr );
  189. if (row.child.isShown()) {
  190. row.child.hide();
  191. tr.removeClass('shown');
  192. }
  193. else {
  194. row.child(formatBackupData(data.result)).show();
  195. tr.addClass('shown');
  196. }
  197. if($obj.hasClass('btn-primary'))
  198. $obj.removeClass('btn-primary').addClass('btn-info');
  199. else
  200. $obj.removeClass('btn-info').addClass('btn-primary');
  201. }
  202. jQuery('#selectAllZone').change(function () {
  203. jQuery('td input:checkbox', '#zonesList').prop('checked', true);
  204. });
  205. function formatBackupData ( data ) {
  206. var html = '<br>';
  207. for(const mainProperty in data){
  208. html += '<table class="table"><thead><tr><th colspan="4"><center>{/literal}{$MGLANG->T('zone_name')}{literal} - '+ data[mainProperty].zoneName +'</center></th></tr><tr><th>{/literal}{$MGLANG->T('name')}{literal}</th><th>{/literal}{$MGLANG->T('type')}{literal}</th><th>{/literal}{$MGLANG->T('ttl')}{literal}</th><th>{/literal}{$MGLANG->T('rdata')}{literal}</th><th>&nbsp;</th></tr></thead><tbody>';
  209. if(Object.keys(data[mainProperty].zoneRecords).length == 0) {html += '<tr class="no-matches"><td colspan="5" class="text-center">{/literal}{$MGLANG->T('no_matches_found')}{literal}</td></tr>';};
  210. for(const property in data[mainProperty].zoneRecords){
  211. html += '<tr class="record"><td data-label="{/literal}{$MGLANG->T('name')}{literal}" class="cell-sm-12"><input type="text" class="form-control" value="'+ data[mainProperty].zoneRecords[property]['name'] +'" title="{/literal}{$MGLANG->absoluteT('addonAA','zones','record_info','name')}{literal}" disabled/></td>';
  212. html += '<td data-label="{/literal}{$MGLANG->T('type')}{literal}" class="cell-sm-12"><input class="form-control" type="text" value="'+ data[mainProperty].zoneRecords[property]['type'] +'" title="{/literal}{$MGLANG->absoluteT('addonAA','zones','record_type_info')}{literal}" disabled/></td>';
  213. html += '<td data-label="{/literal}{$MGLANG->T('ttl')}{literal}" class="cell-sm-12"><input class="form-control" type="text" value="'+ data[mainProperty].zoneRecords[property]['ttl'] +'" title="{/literal}{$MGLANG->absoluteT('addonAA','zones','record_info','ttl')}{literal}" disabled/></td>';
  214. html += '<td data-label="{/literal}{$MGLANG->T('rdata')}{literal}" class="cell-sm-12">';
  215. for(const rDataProperty in data[mainProperty].zoneRecords[property]['rdata']){
  216. html += '<input class="form-control table-input" type="text" value="'+ data[mainProperty].zoneRecords[property]['rdata'][rDataProperty] +'" title="'+ rDataProperty +'" disabled/>';
  217. }
  218. html += '</td>';
  219. }
  220. html += '<br><br>';
  221. }
  222. return html;
  223. }
  224. </script>
  225. {/literal}
  226. {literal}
  227. <script type="text/javascript">
  228. var cronBackupListTable = '';
  229. jQuery(document).ready(function () {
  230. function dnsLoadButon() {
  231. $($('#cronBackupsList_filter').find('input')).attr("placeholder", "{/literal}{$MGLANG->T('search')}{literal}");
  232. }
  233. function dnsLoadHeader() {
  234. if (!document.getElementById('cronpageheader')) {
  235. jQuery('#cronBackupsList_filter').parent().append('<div id="cronpageheader" class=""><div class="myheader-title"><h1 class="mg-backuplist-header">{/literal}{$MGLANG->T('automaticBackupsList')} {$cronBackupLimitDisplay}{literal}</h1></div>');
  236. }
  237. }
  238. var last;
  239. jQuery('#table-filters').change(function () {
  240. jQuery('#cronBackupsList').DataTable().ajax.reload();
  241. });
  242. cronBackupListTable = jQuery('#cronBackupsList').DataTable({
  243. // drawCallback: replaceEmptyRowDataTable,
  244. "columnDefs": [
  245. {"className": "dt-center", "targets": [2]}
  246. ],
  247. serverSide: true,
  248. searchDelay: 800,
  249. autoWidth: false,
  250. ajax: function (data, callback, settings) {
  251. if (last != data.length) {
  252. last = data.length;
  253. data.start = 0;
  254. jQuery('#cronBackupsList').DataTable().page(0);
  255. }
  256. last = data.length;
  257. var filters = $('#table-filters :input').serializeArray();
  258. JSONParser.request(
  259. 'refreshCronBackupsTable'
  260. , $.merge(filters, [
  261. {name: 'order[column]', value: data.columns[data.order[0].column].name},
  262. {name: 'order[dir]', value: data.order[0].dir},
  263. {name: 'limit', value: data.length},
  264. {name: 'offset', value: data.start},
  265. {name: 'search', value: data.search.value},
  266. ])
  267. , function (data) {
  268. callback(data);
  269. jQuery('.mg-wrapper [title]').bstooltip();
  270. dnsLoadButon();
  271. dnsLoadHeader();
  272. }
  273. );
  274. },
  275. columns: [
  276. {name: 'name'},
  277. {name: 'type', type: 'num'},
  278. {orderable: false, targets: 0, name: 'actions'}
  279. ],
  280. // order: [[0, "desc"]],
  281. pagingType: "simple_numbers",
  282. aLengthMenu: [
  283. [5, 10, 25, 50, 75, 100],
  284. [5, 10, 25, 50, 75, 100]
  285. ],
  286. dom: '<"top"f>rt<"bottom"pl><"clear">',
  287. iDisplayLength: 10,
  288. "oLanguage": {
  289. "oPaginate" : {
  290. "sNext": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sNext')}{literal}",
  291. "sFirst": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sFirst')}{literal}",
  292. "sLast ": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sLast')}{literal}",
  293. "sPrevious": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sPrevious')}{literal}",
  294. },
  295. "sEmptyTable": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sEmptyTable')}{literal}",
  296. "sPrevious": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sPrevious')}{literal}",
  297. "sNext": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sNext')}{literal}",
  298. "sZeroRecords": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sZeroRecords')}{literal}",
  299. "sInfoEmpty": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sInfoEmpty')}{literal}",
  300. "sSearch": "",
  301. "sLengthMenu": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sLengthMenu')}{literal}",
  302. "sInfoFiltered": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sInfoFiltered')}{literal}",
  303. "sInfo": "{/literal}{$MGLANG->absoluteT('addonAA','datatables','sInfo')}{literal}"
  304. }
  305. });
  306. });
  307. function showCronBackupZonesCallback(data, $obj) {
  308. var tr = $obj.closest('tr');
  309. var row = cronBackupListTable.row( tr );
  310. if (row.child.isShown()) {
  311. row.child.hide();
  312. tr.removeClass('shown');
  313. }
  314. else {
  315. row.child(formatBackupData(data.result)).show();
  316. tr.addClass('shown');
  317. }
  318. if($obj.hasClass('btn-primary'))
  319. $obj.removeClass('btn-primary').addClass('btn-info');
  320. else
  321. $obj.removeClass('btn-info').addClass('btn-primary');
  322. }
  323. jQuery('#selectAllZone').change(function () {
  324. jQuery('td input:checkbox', '#zonesList').prop('checked', true);
  325. });
  326. function formatBackupData ( data ) {
  327. var html = '<br>';
  328. for(const mainProperty in data){
  329. html += '<table class="table"><thead><tr><th colspan="4"><center>{/literal}{$MGLANG->T('zone_name')}{literal} - '+ data[mainProperty].zoneName +'</center></th></tr><tr><th>{/literal}{$MGLANG->T('name')}{literal}</th><th>{/literal}{$MGLANG->T('type')}{literal}</th><th>{/literal}{$MGLANG->T('ttl')}{literal}</th><th>{/literal}{$MGLANG->T('rdata')}{literal}</th><th>&nbsp;</th></tr></thead><tbody>';
  330. if(Object.keys(data[mainProperty].zoneRecords).length == 0) {html += '<tr class="no-matches"><td colspan="5" class="text-center">{/literal}{$MGLANG->T('no_matches_found')}{literal}</td></tr>';};
  331. for(const property in data[mainProperty].zoneRecords){
  332. html += '<tr class="record"><td data-label="{/literal}{$MGLANG->T('name')}{literal}" class="cell-sm-12"><input type="text" class="form-control" value="'+ data[mainProperty].zoneRecords[property]['name'] +'" title="{/literal}{$MGLANG->absoluteT('addonAA','zones','record_info','name')}{literal}" disabled/></td>';
  333. html += '<td data-label="{/literal}{$MGLANG->T('type')}{literal}" class="cell-sm-12"><input class="form-control" type="text" value="'+ data[mainProperty].zoneRecords[property]['type'] +'" title="{/literal}{$MGLANG->absoluteT('addonAA','zones','record_type_info')}{literal}" disabled/></td>';
  334. html += '<td data-label="{/literal}{$MGLANG->T('ttl')}{literal}" class="cell-sm-12"><input class="form-control" type="text" value="'+ data[mainProperty].zoneRecords[property]['ttl'] +'" title="{/literal}{$MGLANG->absoluteT('addonAA','zones','record_info','ttl')}{literal}" disabled/></td>';
  335. html += '<td data-label="{/literal}{$MGLANG->T('rdata')}{literal}" class="cell-sm-12">';
  336. for(const rDataProperty in data[mainProperty].zoneRecords[property]['rdata']){
  337. html += '<input class="form-control table-input" type="text" value="'+ data[mainProperty].zoneRecords[property]['rdata'][rDataProperty] +'" title="'+ rDataProperty +'" disabled/>';
  338. }
  339. html += '</td>';
  340. }
  341. html += '<br><br>';
  342. }
  343. return html;
  344. }
  345. </script>
  346. {/literal}