backup.twig (7009B)
1 {{ header }}{{ column_left }} 2 <div id="content"> 3 <div class="page-header"> 4 <div class="container-fluid"> 5 <h1>{{ heading_title }}</h1> 6 <ul class="breadcrumb"> 7 {% for breadcrumb in breadcrumbs %} 8 <li><a href="{{ breadcrumb.href }}">{{ breadcrumb.text }}</a></li> 9 {% endfor %} 10 </ul> 11 </div> 12 </div> 13 <div class="container-fluid"> {% if error_warning %} 14 <div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> {{ error_warning }} 15 <button type="button" class="close" data-dismiss="alert">×</button> 16 </div> 17 {% endif %} 18 {% if success %} 19 <div class="alert alert-success alert-dismissible"><i class="fa fa-check-circle"></i> {{ success }} 20 <button type="button" class="close" data-dismiss="alert">×</button> 21 </div> 22 {% endif %} 23 <div class="panel panel-default"> 24 <div class="panel-heading"> 25 <h3 class="panel-title"><i class="fa fa-exchange"></i> {{ heading_title }}</h3> 26 </div> 27 <div class="panel-body"> 28 <ul class="nav nav-tabs"> 29 <li class="active"><a href="#tab-backup" data-toggle="tab">{{ tab_backup }}</a></li> 30 <li><a href="#tab-restore" data-toggle="tab">{{ tab_restore }}</a></li> 31 </ul> 32 <div class="tab-content"> 33 <div class="tab-pane active" id="tab-backup"> 34 <form action="{{ export }}" method="post" enctype="multipart/form-data" id="form-export" class="form-horizontal"> 35 <div class="form-group"> 36 <label class="col-sm-2 control-label">{{ entry_export }}</label> 37 <div class="col-sm-10"> 38 <div class="well well-sm" style="height: 150px; overflow: auto;"> {% for table in tables %} 39 <div class="checkbox"> 40 <label> 41 <input type="checkbox" name="backup[]" value="{{ table }}" checked="checked" /> 42 {{ table }}</label> 43 </div> 44 {% endfor %} </div> 45 <button type="button" onclick="$(this).parent().find(':checkbox').prop('checked', true);" class="btn btn-link">{{ text_select_all }}</button> 46 / 47 <button type="button" onclick="$(this).parent().find(':checkbox').prop('checked', false);" class="btn btn-link">{{ text_unselect_all }}</button> 48 </div> 49 </div> 50 <div class="form-group"> 51 <div class="col-sm-10 col-sm-offset-2"> 52 <button type="submit" form="form-export" class="btn btn-default"><i class="fa fa-download"></i> {{ button_export }}</button> 53 </div> 54 </div> 55 </form> 56 </div> 57 <div class="tab-pane" id="tab-restore"> 58 <form class="form-horizontal"> 59 <div class="form-group"> 60 <label class="col-sm-2 control-label">{{ entry_progress }}</label> 61 <div class="col-sm-10"> 62 <div id="progress-import" class="progress"> 63 <div class="progress-bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100"></div> 64 </div> 65 </div> 66 </div> 67 <div class="form-group"> 68 <div class="col-sm-10 col-sm-offset-2"> 69 <button type="button" id="button-import" class="btn btn-primary"><i class="fa fa-upload"></i> {{ button_import }}</button> 70 </div> 71 </div> 72 </form> 73 </div> 74 </div> 75 </div> 76 </div> 77 </div> 78 <script type="text/javascript"><!-- 79 $('#button-import').on('click', function() { 80 $('#form-upload').remove(); 81 82 $('body').prepend('<form enctype="multipart/form-data" id="form-upload" style="display: none;"><input type="file" name="import" /></form>'); 83 84 $('#form-upload input[name=\'import\']').trigger('click'); 85 86 if (typeof timer != 'undefined') { 87 clearInterval(timer); 88 } 89 90 timer = setInterval(function() { 91 if ($('#form-upload input[name=\'import\']').val() != '') { 92 clearInterval(timer); 93 94 $('#progress-import .progress-bar').attr('aria-valuenow', 0); 95 $('#progress-import .progress-bar').css('width', '0%'); 96 97 $.ajax({ 98 url: 'index.php?route=tool/backup/import&user_token={{ user_token }}', 99 type: 'post', 100 dataType: 'json', 101 data: new FormData($('#form-upload')[0]), 102 cache: false, 103 contentType: false, 104 processData: false, 105 beforeSend: function() { 106 $('#button-import').button('loading'); 107 }, 108 complete: function() { 109 $('#button-import').button('reset'); 110 }, 111 success: function(json) { 112 $('.alert-dismissible').remove(); 113 114 if (json['error']) { 115 $('#content > .container-fluid').prepend('<div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> ' + json['error'] + ' <button type="button" class="close" data-dismiss="alert">×</button></div>'); 116 } 117 118 if (json['success']) { 119 $('#content > .container-fluid').prepend('<div class="alert alert-success alert-dismissible"><i class="fa fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="close" data-dismiss="alert">×</button></div>'); 120 } 121 122 if (json['total']) { 123 $('#progress-import .progress-bar').attr('aria-valuenow', json['total']); 124 $('#progress-import .progress-bar').css('width', json['total'] + '%'); 125 } 126 127 if (json['next']) { 128 next(json['next']); 129 } 130 }, 131 error: function(xhr, ajaxOptions, thrownError) { 132 alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 133 } 134 }); 135 } 136 }, 500); 137 }); 138 139 function next(url) { 140 $.ajax({ 141 url: url, 142 dataType: 'json', 143 success: function(json) { 144 $('.alert-dismissible').remove(); 145 146 if (json['error']) { 147 $('#content > .container-fluid').prepend('<div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> ' + json['error'] + ' <button type="button" class="close" data-dismiss="alert">×</button></div>'); 148 } 149 150 if (json['success']) { 151 $('#content > .container-fluid').prepend('<div class="alert alert-success alert-dismissible"><i class="fa fa-check-circle"></i> ' + json['success'] + ' <button type="button" class="close" data-dismiss="alert">×</button></div>'); 152 } 153 154 if (json['total']) { 155 $('#progress-import .progress-bar').attr('aria-valuenow', json['total']); 156 $('#progress-import .progress-bar').css('width', json['total'] + '%'); 157 } 158 159 if (json['next']) { 160 next(json['next']); 161 } 162 }, 163 error: function(xhr, ajaxOptions, thrownError) { 164 alert(thrownError + "\r\n" + xhr.statusText + "\r\n" + xhr.responseText); 165 } 166 }); 167 } 168 //--></script> 169 </div> 170 {{ footer }}