manage-rdns.tpl 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  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. {if !$error}
  5. <div class="module-content">
  6. <div class="module-header mg-custom-header">
  7. <div class="header-title">
  8. <h1>{$MGLANG->T('manage_rdns')}</h1>
  9. </div>
  10. <div class="header-actions">
  11. <div class="header-search">
  12. <div class="row-fluid-xs">
  13. <div class="fluid-100">
  14. <div class="input-icon">
  15. <input class="form-control searchTable" type="text" placeholder="{$MGLANG->T('search')}" data-search="">
  16. </div>
  17. </div>
  18. <div class="fluid-0">
  19. <button class="btn btn-primary mg-ca-header-actions" data-act="addRDNS" data-query="">{$MGLANG->T('add_ptr')}</button>
  20. </div>
  21. </div>
  22. </div>
  23. </div>
  24. </div>
  25. <div class="module-body">
  26. <div class="row">
  27. {foreach from=$records_count item="count" key="record"}
  28. <div class="col-xs-2" style="color: #45464C;"><b>{$record|strtoupper}</b> <span class="badge badge-{if $count > $limits[$record]}danger{else}primary{/if}">{$count} / {if isset($limits[$record])}{$limits[$record]}{else}0{/if}</span></div>
  29. {/foreach}
  30. </div>
  31. <div class="section">
  32. <table class="table dataTable">
  33. <thead>
  34. <tr>
  35. <th id="column-name" class="sorting_asc">{$MGLANG->T('name')}</th>
  36. <th>{$MGLANG->T('type')}</th>
  37. <th id="column-ttl" class="sorting" {if $ttl_disabled}style="display: none;"{/if}>{$MGLANG->T('ttl')}</th>
  38. <th id="column-rdata" class="sorting">{$MGLANG->T('rdata')}</th>
  39. <th>&nbsp;</th>
  40. </tr>
  41. </thead>
  42. <tbody id="edit-form">
  43. <tr class="no-matches" style="display: none;"><td colspan="5" class="text-center">{$MGLANG->T('no_matches_found')}</td></tr>
  44. {foreach from=$ptrs item="record"}
  45. <tr id="record{$counter}" class="record">
  46. <td data-label="{$MGLANG->T('name')}" class="cell-sm-12 form-group">
  47. <input type="text" class="form-control" name="record[{$counter}][name]" value="{$record.ip}" title="{$MGLANG->absoluteT('addonAA','zones','record_info','name')}" placeholder="{$MGLANG->T('name')}" required="" disabled=""/>
  48. </td>
  49. <td data-label="{$MGLANG->T('type')}" class="cell-sm-12">
  50. <input type="hidden" name="record[{$counter}][type]" value="PTR"/>
  51. <input class="form-control" type="text" value="PTR" disabled="" title="{$MGLANG->absoluteT('addonAA','zones','record_type_info', 'PTR')}"/>
  52. </td>
  53. <td data-label="{$MGLANG->T('ttl')}" class="cell-sm-12 form-group">
  54. <input class="form-control" type="number" name="record[{$counter}][ttl]" value="{$record.ttl}" title="{$MGLANG->absoluteT('addonAA','zones','record_info','ttl')}" placeholder="{$MGLANG->T('ttl')}" required="" min="1" disabled=""/></td>
  55. <td data-label="{$MGLANG->T('rdata')}" class="cell-sm-12">
  56. <input class="form-control table-input" type="text" name="record[{$counter}][field][ptrdname]" value="{if !empty($record.sub)}{$record.sub}.{/if}{$record.from}" title="{$MGLANG->absoluteT('addonAA','zones','record_field_info','PTR', 'ptrdname')}" placeholder="ptrdname" disabled=""/>
  57. </td>
  58. <td data-label="{$MGLANG->T('actions')}" class="cell-sm-12 cell-actions">
  59. <input name="record[{$counter}][ip]" type="hidden" value="{$record.ip}" />
  60. <button type="button" class="btn btn-primary btn-icon" data-act="editRDNS" data-query="rid={$record.id}" title="{$MGLANG->T('edit_record')}">
  61. <i class="fa fa-pencil"></i>
  62. </button>
  63. <button type="button" class="btn btn-danger btn-icon" data-act="removeRDNS" data-query="rid={$record.id}" data-confirm-body="{$MGLANG->T('remove_zone_record_confirm')}" title="{$MGLANG->T('remove_record')}" >
  64. <i class="fa fa-trash"></i>
  65. </button>
  66. </td>
  67. </tr>
  68. {assign var="counter" value=$counter+1}
  69. {foreachelse}
  70. <tr class="empty-record"><td colspan="5" align="center">{$MGLANG->T('there_is_no_ptr_record')}</td></tr>
  71. {/foreach}
  72. </tbody>
  73. </table>
  74. <div class="row">
  75. <div class="col-sm-12">
  76. <div class="dataTables_paginate paging_simple_numbers">
  77. <ul class="pagination">
  78. <li class="paginate_button previous {if $prev == $page}disabled{/if}">
  79. <a {if $prev != $page} href="{$query}&page={$prev}" {/if}>Previous</a>
  80. </li>
  81. {foreach from=$links item="link"}
  82. <li class="paginate_button {if $page eq $link}active{/if}">
  83. <a {if $page neq $link}href="{$query}&page={$link}"{/if}>{$link}</a>
  84. </li>
  85. {/foreach}
  86. <li class="paginate_button next {if $next == $page}disabled{/if}">
  87. <a {if $next != $page}href="{$query}&page={$next}"{/if}>Next</a>
  88. </li>
  89. </ul>
  90. </div>
  91. </div>
  92. </div>
  93. </div>
  94. </div>
  95. </div>
  96. {/if}
  97. {literal}
  98. <script data-cfasync="false" type="text/javascript">
  99. (function($){
  100. $(document).ready(function() {
  101. $(document).delegate("#edit-form [name^=record]", 'keydown', function() {
  102. $(this).parents('tr').find(':input').attr('name', function() {
  103. if(this.name.indexOf('edit_') !== 0)
  104. return 'edit_' + this.name;
  105. return this.name;
  106. });
  107. });
  108. $(document).delegate("[data-search]", 'keyup', function() {
  109. var search = $(this).val().toLowerCase();
  110. if(!search.length) {
  111. $('#edit-form > tr.record').show().css('display', "");
  112. $('.no-matches').css('display', 'none');
  113. if($('#edit-form > tr.record').length == 0){
  114. $('.empty-record').removeClass('hidden');
  115. }
  116. return ;
  117. }
  118. $('#edit-form > tr.record').each(function() {
  119. if ($('input', this).filter(function() {return this.value.toLowerCase().indexOf(search) > -1;}).length) {
  120. $(this).show();
  121. } else {
  122. $(this).hide();
  123. }
  124. });
  125. $('#edit-form > tr.no-matches').toggle(!$('#edit-form > tr.record:visible').length);
  126. if(!$('#edit-form > tr.record:visible').length == true){
  127. $('.empty-record').addClass('hidden');
  128. }
  129. if(!search && $('#edit-form > tr.record').length == 0){
  130. $('.empty-record').removeClass('hidden');
  131. }
  132. });
  133. });
  134. })(jQuery);
  135. let FormSort = {
  136. toggle: 0,
  137. arrayOfRecords:[],
  138. sortByName(a,b){
  139. let children1name = FormSort.ipConverter(a.children[0].children[0].value);
  140. let children2name = FormSort.ipConverter(b.children[0].children[0].value);
  141. if(FormSort.toggle){
  142. return ((children1name < children2name) ? 1 : ((children1name > children2name) ? -1 : 0));
  143. }else{
  144. return ((children1name < children2name) ? -1 : ((children1name > children2name) ? 1 : 0));
  145. }
  146. },
  147. sortByTTL(a,b){
  148. let children1ttl = a.children[2].children[0].value;
  149. let children2ttl = b.children[2].children[0].value;
  150. if(FormSort.toggle){
  151. return (children1ttl > children2ttl)? -1 : 1;
  152. }else{
  153. return (children1ttl > children2ttl)? 1 : -1;
  154. }
  155. },
  156. sortByRdata(a,b){
  157. let children1rdata = a.children[3].children[0].value;
  158. let children2rdata = b.children[3].children[0].value;
  159. if(FormSort.toggle){
  160. return (children1rdata > children2rdata)? -1 : 1;
  161. }else{
  162. return (children1rdata > children2rdata)? 1 : -1;
  163. }
  164. },
  165. getRecords(){
  166. this.arrayOfRecords = $('#edit-form').children('.record');
  167. },
  168. updateForm(){
  169. let newHtml = '';
  170. let index = 0;
  171. for(let i in this.arrayOfRecords) {
  172. if(this.arrayOfRecords[i].innerHTML) {
  173. newHtml += `<tr id="record${index}" class="record"> ${this.arrayOfRecords[i].innerHTML}</tr>`
  174. index++;
  175. }
  176. }
  177. $('#edit-form').html(newHtml);
  178. this.toggle = 1 - this.toggle;
  179. },
  180. updateTableHeadIcons(column){
  181. if(column === 'column-name'){
  182. document.getElementById('column-ttl').className = 'sorting';
  183. document.getElementById('column-rdata').className = 'sorting';
  184. }else if(column === 'column-ttl') {
  185. document.getElementById('column-name').className = 'sorting';
  186. document.getElementById('column-rdata').className = 'sorting';
  187. }else if(column === 'column-rdata') {
  188. document.getElementById('column-name').className = 'sorting';
  189. document.getElementById('column-ttl').className = 'sorting';
  190. }else{
  191. column = false;
  192. }
  193. if(column){
  194. document.getElementById(column).className = (this.toggle)? 'sorting_asc' : 'sorting_desc';
  195. }
  196. },
  197. ipConverter(a){
  198. var i, item;
  199. var m, n, t;
  200. var x, xa;
  201. if (!a) {
  202. return 0
  203. }
  204. a = a.replace(/<[\s\S]*?>/g, "");
  205. //IPv4:Port
  206. t = a.split(":");
  207. if (t.length == 2){
  208. m = t[0].split(".");
  209. }
  210. else {
  211. m = a.split(".");
  212. }
  213. n = a.split(":");
  214. x = "";
  215. xa = "";
  216. if (m.length == 4) {
  217. // IPV4
  218. for(i = 0; i < m.length; i++) {
  219. item = m[i];
  220. if(item.length == 1) {
  221. x += "00" + item;
  222. }
  223. else if(item.length == 2) {
  224. x += "0" + item;
  225. }
  226. else {
  227. x += item;
  228. }
  229. }
  230. }
  231. else if (n.length > 0) {
  232. // IPV6
  233. var count = 0;
  234. for(i = 0; i < n.length; i++) {
  235. item = n[i];
  236. if (i > 0) {
  237. xa += ":";
  238. }
  239. if(item.length === 0) {
  240. count += 0;
  241. }
  242. else if(item.length == 1) {
  243. xa += "000" + item;
  244. count += 4;
  245. }
  246. else if(item.length == 2) {
  247. xa += "00" + item;
  248. count += 4;
  249. }
  250. else if(item.length == 3) {
  251. xa += "0" + item;
  252. count += 4;
  253. }
  254. else {
  255. xa += item;
  256. count += 4;
  257. }
  258. }
  259. // Padding the ::
  260. n = xa.split(":");
  261. var paddDone = 0;
  262. for (i = 0; i < n.length; i++) {
  263. item = n[i];
  264. if (item.length === 0 && paddDone === 0) {
  265. for (var padding = 0 ; padding < (32-count) ; padding++) {
  266. x += "0";
  267. paddDone = 1;
  268. }
  269. }
  270. else {
  271. x += item;
  272. }
  273. }
  274. }
  275. return x;
  276. },
  277. };
  278. FormSort.getRecords();
  279. document.getElementById('column-name').addEventListener('click',()=>{
  280. FormSort.arrayOfRecords.sort(FormSort.sortByName);
  281. FormSort.updateForm();
  282. FormSort.updateTableHeadIcons('column-name');
  283. });
  284. document.getElementById('column-ttl').addEventListener('click',()=>{
  285. FormSort.arrayOfRecords.sort(FormSort.sortByTTL);
  286. FormSort.updateForm();
  287. FormSort.updateTableHeadIcons('column-ttl');
  288. });
  289. document.getElementById('column-rdata').addEventListener('click',()=>{
  290. FormSort.arrayOfRecords.sort(FormSort.sortByRdata);
  291. FormSort.updateForm();
  292. FormSort.updateTableHeadIcons('column-rdata');
  293. });
  294. </script>
  295. {/literal}