edit.tpl 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  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. {if $nameservers}
  7. <div class="panel panel-default">
  8. <div class="panel-heading">
  9. <h1>{$MGLANG->T('nameservers')}</h1>
  10. </div>
  11. <div class="panel-body">
  12. <ul>
  13. {foreach from=$nameservers item="nameserver" key="record"}
  14. <li class="mgNameServerListItem">{$nameserver}</li>
  15. {/foreach}
  16. </ul>
  17. </div>
  18. </div>
  19. {/if}
  20. <div class="module-header">
  21. {if $tpl neq 'standard'}
  22. {if $tpl eq 'pending'}
  23. {include file='status/pending.tpl'}
  24. {elseif $tpl eq 'notRegistered'}
  25. {include file='status/domainAvailable.tpl'}
  26. {elseif $tpl eq 'soaWarning'}
  27. {include file='status/soaWarning.tpl'}
  28. {elseif $tpl eq 'active'}
  29. {include file='status/active.tpl'}
  30. {/if}
  31. <div class="header-search">
  32. <div class="row-fluid-xs">
  33. <div class="fluid-100">
  34. <div class="input-icon">
  35. <input class="form-control searchTable" type="text" placeholder="{$MGLANG->T('search')}" data-search="">
  36. </div>
  37. </div>
  38. <div class="fluid-0">
  39. <button class="btn btn-primary" data-act="addRecord" data-query="zone_id={$zoneid}{foreach from=$records_count item="count" key="record"}&records[{$record}]={$count}{/foreach}"
  40. {if $limits.total <= $records_count.total}disabled=""{/if}>{$MGLANG->T('add_record')}</button>
  41. {if $enable_dnssec}
  42. <a class="btn btn-danger" href="index.php?m=DNSManager2&zone_id={$zoneid}&mg-action=dnssec" >{$MGLANG->T('dnssec')}</a>
  43. {/if}
  44. </div>
  45. </div>
  46. </div>
  47. {else}
  48. <div class="header-title">
  49. <h1>{$MGLANG->T('edit_zone')} - {$zone_name}</h1>
  50. </div>
  51. <div class="header-actions">
  52. <div class="header-search">
  53. <div class="row-fluid-xs">
  54. <div class="fluid-100">
  55. <div class="input-icon">
  56. <input class="form-control searchTable" type="text" placeholder="{$MGLANG->T('search')}" data-search="">
  57. </div>
  58. </div>
  59. <div class="fluid-0">
  60. <button class="btn btn-primary" data-act="addRecord" data-query="zone_id={$zoneid}{foreach from=$records_count item="count" key="record"}&records[{$record}]={$count}{/foreach}"
  61. {if $limits.total <= $records_count.total}disabled=""{/if}>{$MGLANG->T('add_record')}</button>
  62. {if $enable_dnssec}
  63. <a class="btn btn-danger" href="index.php?m=DNSManager2&zone_id={$zoneid}&mg-action=dnssec" >{$MGLANG->T('dnssec')}</a>
  64. {/if}
  65. </div>
  66. </div>
  67. </div>
  68. </div>
  69. {/if}
  70. </div>
  71. <div class="module-body">
  72. <div class="row">
  73. {foreach from=$records_count item="count" key="record"}
  74. <div class="col-md-2 col-sm-4 col-xs-6" style="color: #45464C;"><b>{$record|strtoupper}</b> <span class="badge badge-success">{$count} / {if isset($limits[$record])}{$limits[$record]}{else}0{/if}</span></div>
  75. {/foreach}
  76. </div>
  77. <div class="section">
  78. <table class="table dataTable">
  79. <thead>
  80. <tr>
  81. <th id="column-name" class="sorting">{$MGLANG->T('name')}</th>
  82. <th id="column-type" class="sorting_asc">{$MGLANG->T('type')}</th>
  83. <th {if $ttl_disabled}style="display: none;"{/if}>{$MGLANG->T('ttl')}</th>
  84. <th>{$MGLANG->T('rdata')}</th>
  85. <th> </th>
  86. </tr>
  87. </thead>
  88. <tbody id="edit-form">
  89. <tr class="no-matches" style="display: none;"><td colspan="5" class="text-center">{$MGLANG->T('no_matches_found')}</td></tr>
  90. {foreach from=$records item="record"}
  91. <tr id="record{$counter}" class="record">
  92. <td data-label="{$MGLANG->T('name')}" class="cell-sm-12 form-group">
  93. <input type="text" class="form-control" name="record[{$counter}][name]" value="{if $record->type neq 'PTR'}{if $show_full_record_name eq 'on'}{$record->nameToAbsolute($zone_name)}{else}{$record->nameToRelative($zone_name)}{/if}{else}{$record->name}{/if}" title="{$MGLANG->absoluteT('addonAA','zones','record_info','name')}" placeholder="{$MGLANG->T('name')}" required="" {if $record->type|strtoupper eq 'PTR'}disabled=""{/if}/>
  94. </td>
  95. <td data-label="{$MGLANG->T('type')}" class="cell-sm-12">
  96. <input type="hidden" name="record[{$counter}][type]" value="{$record->type}"/>
  97. <input class="form-control" type="text" value="{$record->type}" disabled="" title="{$MGLANG->absoluteT('addonAA','zones','record_type_info', $record->type)}"/>
  98. </td>
  99. <td data-label="{$MGLANG->T('ttl')}" class="cell-sm-12 form-group" {if $ttl_disabled}style="display: none;"{/if}>
  100. <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" {if $record->type|strtoupper eq 'PTR' || $record->type|strtoupper eq 'ALIAS'}readonly{/if}/></td>
  101. <td data-label="{$MGLANG->T('rdata')}" class="cell-sm-12">
  102. {foreach from=$record->rdata key="field" item="value"}
  103. <input class="form-control table-input" type="text" name="record[{$counter}][field][{$field}]" value="{$value}" title="{$MGLANG->absoluteT('addonAA','zones','record_field_info',$record->type, $field)}" placeholder="{$MGLANG->absoluteT('addonCA','zones','record_field_placeholder',$record->type, $field)}" {if $record->type|strtoupper eq 'PTR'}disabled=""{/if}/>
  104. {/foreach}
  105. </td>
  106. <td data-label="{$MGLANG->T('actions')}" class="cell-sm-12 cell-actions">
  107. {if $record->type|strtoupper neq 'PTR'}<input name="record[{$counter}][line]" type="hidden" value="{$record->line}" />
  108. {else}<input name="record[{$counter}][ip]" type="hidden" value="{$record->ip}" />
  109. {/if}
  110. <button type="button" class="btn btn-danger btn-icon" data-act="removeRecord" data-formid="record{$counter}" data-query="zone_id={$zoneid}" data-confirm-body="{$MGLANG->T('remove_zone_record_confirm')}" title="{$MGLANG->T('remove_record')}">
  111. <i class="fa fa-trash"></i>
  112. </button>
  113. </td>
  114. </tr>
  115. {assign var="counter" value=$counter+1}
  116. {foreachelse}
  117. <tr class="empty-record"><td colspan="5" align="center">{$MGLANG->T('there_is_no_record_within_this_zone')}</td></tr>
  118. {/foreach}
  119. </tbody>
  120. </table>
  121. <button class="btn btn-success" type="button" data-act="editZoneSave" data-formid="edit-form" data-query="zone_id={$zoneid}">{$MGLANG->T('save_changes')}</button>
  122. </div>
  123. </div>
  124. </div>
  125. {/if}
  126. {literal}
  127. <script data-cfasync="false" type="text/javascript">
  128. MGVONLYEDITED = true;
  129. (function($){
  130. $(document).ready(function() {
  131. $(document).delegate("#edit-form [name^=record]", 'keydown', function() {
  132. $(this).parents('tr').find(':input').attr('name', function() {
  133. if(this.name.indexOf('edit_') !== 0)
  134. return 'edit_' + this.name;
  135. return this.name;
  136. });
  137. });
  138. $(document).delegate("[data-search]", 'keyup', function() {
  139. var search = $(this).val().toLowerCase();
  140. if(!search.length) {
  141. $('.no-matches').hide();
  142. $('#edit-form > tr.record').show().css('display', "");
  143. $('.no-matches').css('display', 'none');
  144. if($('#edit-form > tr.record').length == 0){
  145. $('.empty-record').removeClass('hidden');
  146. }
  147. return ;
  148. return ;
  149. }
  150. $('#edit-form > tr.record').each(function() {
  151. if ($('input', this).filter(function() {return this.value.toLowerCase().indexOf(search) > -1;}).length) {
  152. $(this).show();
  153. } else {
  154. $(this).hide();
  155. }
  156. });
  157. $('#edit-form > tr.no-matches').toggle(!$('#edit-form > tr.record:visible').length);
  158. if(!$('#edit-form > tr.record:visible').length == true){
  159. $('.empty-record').addClass('hidden');
  160. }
  161. if(!search && $('#edit-form > tr.record').length == 0){
  162. $('.empty-record').removeClass('hidden');
  163. }
  164. });
  165. });
  166. })(jQuery);
  167. let FormSort = {
  168. toggle: 0,
  169. arrayOfRecords:[],
  170. sortByName(a,b){
  171. let children1name = a.children[0].children[0].value;
  172. let children2name = b.children[0].children[0].value;
  173. if(FormSort.toggle){
  174. return (children1name > children2name)? -1 : 1;
  175. }else{
  176. return (children1name > children2name)? 1 : -1;
  177. }
  178. },
  179. sortByType(a,b){
  180. let children1type = a.children[1].children[0].value;
  181. let children2type = b.children[1].children[0].value;
  182. if(FormSort.toggle){
  183. return (children1type > children2type)? -1 : 1;
  184. }else{
  185. return (children1type > children2type)? 1 : -1;
  186. }
  187. },
  188. getRecords(){
  189. this.arrayOfRecords = $('#edit-form').children('.record');
  190. },
  191. updateForm(){
  192. let newHtml = '';
  193. let index = 0;
  194. for(let i in this.arrayOfRecords) {
  195. if(this.arrayOfRecords[i].innerHTML) {
  196. newHtml += `<tr id="record${index}" class="record"> ${this.arrayOfRecords[i].innerHTML}</tr>`
  197. index++;
  198. }
  199. }
  200. $('#edit-form').html(newHtml);
  201. this.toggle = 1 - this.toggle;
  202. },
  203. updateTableHeadIcons(column){
  204. if(column === 'column-name'){
  205. document.getElementById('column-type').className = 'sorting';
  206. }else if(column === 'column-type'){
  207. document.getElementById('column-name').className = 'sorting';
  208. }else{
  209. column = false;
  210. }
  211. if(column){
  212. document.getElementById(column).className = (this.toggle)? 'sorting_asc' : 'sorting_desc';
  213. }
  214. }
  215. };
  216. FormSort.getRecords();
  217. document.getElementById('column-name').addEventListener('click',()=>{
  218. FormSort.arrayOfRecords.sort(FormSort.sortByName);
  219. FormSort.updateForm();
  220. FormSort.updateTableHeadIcons('column-name');
  221. });
  222. document.getElementById('column-type').addEventListener('click',()=>{
  223. FormSort.arrayOfRecords.sort(FormSort.sortByType);
  224. FormSort.updateForm();
  225. FormSort.updateTableHeadIcons('column-type');
  226. });
  227. </script>
  228. {/literal}