root / templates / user_routes.html @ 25e4ec84
History | View | Annotate | Download (15.8 kB)
1 |
{% extends "b3theme/base.html" %} |
---|---|
2 |
{% load i18n %} |
3 |
{% block extrahead %} |
4 |
<link href="{{STATIC_URL}}b3theme/css/plugins/dataTables/dataTables.bootstrap.css" rel="stylesheet"> |
5 |
{% endblock %} |
6 |
{% block pagejsbodttom %} |
7 |
|
8 |
<script type="text/javascript" src="{{STATIC_URL}}js/jquery.dataTables.js"></script> |
9 |
<script type="text/javascript" src="{{STATIC_URL}}js/datatables_bootstrap.js"></script> |
10 |
|
11 |
|
12 |
{% endblock %} |
13 |
{% block title %}{% trans "My rules" %}{% endblock %} |
14 |
{% block contentplaceholder %} |
15 |
{% csrf_token %} |
16 |
<div class="row"> |
17 |
<div class="col-md-12"> |
18 |
<h1 class="page-header">{% trans "My rules" %} </h1> |
19 |
</div>
|
20 |
<!-- /.col-lg-12 -->
|
21 |
</div>
|
22 |
|
23 |
|
24 |
<div class="row"> |
25 |
<div class="col-md-10"> |
26 |
<div class="panel panel-primary"> |
27 |
<div class="panel-heading"> <i class="fa fa-shield"></i> Firewall Rules |
28 |
</div>
|
29 |
|
30 |
<div class="panel-body"> |
31 |
|
32 |
|
33 |
<div class="table-responsive"> |
34 |
<table class="table table-striped table-bordered" id="routes_table"> |
35 |
<thead>
|
36 |
<tr>
|
37 |
<th>Id</th> |
38 |
<th>{% trans "Name" %}</th> |
39 |
<th>{% trans "Match" %}</th> |
40 |
<th style="text-align: center;">{% trans "Then" %}</th> |
41 |
<th style="text-align: center; ">{% trans "Status" %}</th> |
42 |
<th style="text-align: center;">{% trans "Applier" %}</th> |
43 |
<th style="text-align: center;">{% trans "Expires" %}</th> |
44 |
<th style="text-align: center;">{% trans "Response" %}</th> |
45 |
<th style="text-align: center;">{% trans "Actions" %}</th> |
46 |
</tr>
|
47 |
</thead>
|
48 |
|
49 |
<tbody>
|
50 |
</tbody>
|
51 |
</table>
|
52 |
</div></div> |
53 |
</div></div> |
54 |
|
55 |
|
56 |
<div class="col-md-2"> |
57 |
<div class="panel panel-default"> |
58 |
<div class="panel-heading"> |
59 |
<i class="fa fa-tags"></i> {% trans "Shortcuts" %} |
60 |
</div>
|
61 |
<!-- /.panel-heading -->
|
62 |
<div class="panel-body"> |
63 |
<a class="btn btn-sm btn-outline btn-success" id="routebutton" href="{% url add-route %}"><i class="fa fa-plus-circle"></i> {% trans "Add Rule" %}</a> |
64 |
<a class="btn btn-sm btn-outline btn-info" href="{% url user-profile %}"><i class="fa fa-user"></i> {% trans "My Profile" %}</a> |
65 |
</div>
|
66 |
<!-- /.panel-body -->
|
67 |
</div>
|
68 |
<!-- /.panel -->
|
69 |
|
70 |
<div class="chat-panel panel panel-info"> |
71 |
<div class="panel-heading"> |
72 |
<i class="fa fa-comment fa-fw"></i> Live status |
73 |
</div>
|
74 |
<!-- /.panel-heading -->
|
75 |
<div class="panel-body"> |
76 |
{% include "polldash.html" %} |
77 |
</div>
|
78 |
<!-- /.panel-body -->
|
79 |
</div>
|
80 |
<!-- /.panel -->
|
81 |
</div>
|
82 |
</div>
|
83 |
|
84 |
|
85 |
{% endblock %} |
86 |
|
87 |
{% block pagejsbottom %} |
88 |
<script src="{{STATIC_URL}}js/dataTableslatest/jquery.dataTables.min.js"></script> |
89 |
<script src="{{STATIC_URL}}js/dataTableslatest/dataTables.bootstrap.js"></script> |
90 |
{% if user.is_authenticated %} |
91 |
<script type="text/javascript" src="{% url load-js 'poller' %}"></script> |
92 |
{% endif %} |
93 |
|
94 |
<script type="text/javascript"> |
95 |
var filterbtns = '<div class="btn-group col-centered">\
|
96 |
<button type="button" class="btn btn-outline btn-sm btn-success" name="status_filter" value="ACTIVE" id="show_active">ACTIVE</button>\
|
97 |
<button type="button" class="btn btn-outline btn-sm btn-info" name="status_filter" value="PENDING" id="show_pending">PENDING</button>\
|
98 |
<button type="button" class="btn btn-outline btn-sm btn-warning" name="status_filter" value="ERROR" id="show_error">ERROR</button>\
|
99 |
<button type="button" class="btn btn-outline btn-sm btn-default" name="status_filter" value="DEACTIVATED" id="show_deactivated">DEACTIVATED</button>\
|
100 |
</div>';
|
101 |
|
102 |
|
103 |
$.fn.dataTableExt.oApi.fnReloadAjax = function ( oSettings, sNewSource, fnCallback, bStandingRedraw )
|
104 |
{
|
105 |
// DataTables 1.10 compatibility - if 1.10 then versionCheck exists.
|
106 |
// 1.10s API has ajax reloading built in, so we use those abilities
|
107 |
// directly.
|
108 |
if ( $.fn.dataTable.versionCheck ) {
|
109 |
var api = new $.fn.dataTable.Api( oSettings );
|
110 |
|
111 |
if ( sNewSource ) {
|
112 |
api.ajax.url( sNewSource ).load( fnCallback, !bStandingRedraw );
|
113 |
}
|
114 |
else {
|
115 |
api.ajax.reload( fnCallback, !bStandingRedraw );
|
116 |
}
|
117 |
return;
|
118 |
}
|
119 |
|
120 |
if ( sNewSource !== undefined && sNewSource !== null ) {
|
121 |
oSettings.sAjaxSource = sNewSource;
|
122 |
}
|
123 |
|
124 |
// Server-side processing should just call fnDraw
|
125 |
if ( oSettings.oFeatures.bServerSide ) {
|
126 |
this.fnDraw();
|
127 |
return;
|
128 |
}
|
129 |
|
130 |
this.oApi._fnProcessingDisplay( oSettings, true );
|
131 |
var that = this;
|
132 |
var iStart = oSettings._iDisplayStart;
|
133 |
var aData = [];
|
134 |
|
135 |
this.oApi._fnServerParams( oSettings, aData );
|
136 |
|
137 |
oSettings.fnServerData.call( oSettings.oInstance, oSettings.sAjaxSource, aData, function(json) {
|
138 |
/* Clear the old information from the table */
|
139 |
that.oApi._fnClearTable( oSettings );
|
140 |
|
141 |
/* Got the data - add it to the table */
|
142 |
var aData = (oSettings.sAjaxDataProp !== "") ?
|
143 |
that.oApi._fnGetObjectDataFn( oSettings.sAjaxDataProp )( json ) : json;
|
144 |
|
145 |
for ( var i=0 ; i<aData.length ; i++ )
|
146 |
{
|
147 |
that.oApi._fnAddData( oSettings, aData[i] );
|
148 |
}
|
149 |
|
150 |
oSettings.aiDisplay = oSettings.aiDisplayMaster.slice();
|
151 |
|
152 |
that.fnDraw();
|
153 |
|
154 |
if ( bStandingRedraw === true )
|
155 |
{
|
156 |
oSettings._iDisplayStart = iStart;
|
157 |
that.oApi._fnCalculateEnd( oSettings );
|
158 |
that.fnDraw( false );
|
159 |
}
|
160 |
|
161 |
that.oApi._fnProcessingDisplay( oSettings, false );
|
162 |
|
163 |
/* Callback user function - for event handlers etc */
|
164 |
if ( typeof fnCallback == 'function' && fnCallback !== null )
|
165 |
{
|
166 |
fnCallback( oSettings );
|
167 |
}
|
168 |
}, oSettings );
|
169 |
};
|
170 |
var oTable;
|
171 |
var start;
|
172 |
var end;
|
173 |
var oldhtml;
|
174 |
var last_element = false;
|
175 |
var refreshUrl = "{% url group-routes-ajax %}";
|
176 |
$(document).ready( function(){
|
177 |
|
178 |
|
179 |
|
180 |
oTable = $('#routes_table').dataTable( {
|
181 |
"bPaginate": true,
|
182 |
"bFilter": true,
|
183 |
"bAutoWidth": true,
|
184 |
"aLengthMenu" : [
|
185 |
[5, 15, 20, -1],
|
186 |
[5, 15, 20, "All"]
|
187 |
],
|
188 |
"sDom": "<'row'<'col-xs-4'l><'col-xs-4'<'#filterplaceholder'>><'col-xs-4'f>><'row'<'col-xs-6'i><'col-xs-6'p>>tr<'row'<'col-xs-6'i><'col-xs-6'p>>",
|
189 |
"iDisplayLength": 20,
|
190 |
"bProcessing": true,
|
191 |
"sAjaxSource": refreshUrl,
|
192 |
"bDeferRender": true,
|
193 |
"fnInitComplete": function(oSettings, json) {
|
194 |
oTable.fnSetColumnVis( 0,false );
|
195 |
update_size();
|
196 |
|
197 |
$('body').on('click', '.revertbutton', function () {
|
198 |
var my = $(this);
|
199 |
my.parent().html(oldhtml);
|
200 |
last_element = false;
|
201 |
return false;
|
202 |
});
|
203 |
$('body').on('click', ".del_buttonpre", function(){
|
204 |
var my = $(this);
|
205 |
if (last_element != false){
|
206 |
last_element.html(oldhtml);
|
207 |
}
|
208 |
oldhtml = my.parent().html();
|
209 |
last_element = my.parent();
|
210 |
var routename = $(this).data("routename");
|
211 |
var btn = '<a href="#" data-toggle="tooltip" title="This will deactivate your rule" data-routename="'+routename+'" class="del_button btn btn-sm btn-warning"> {% trans "Deactivate" %}</a>'
|
212 |
var back = '<a href="#" class="revertbutton btn btn-sm btn-info"><i class="fa fa-undo"></i></a>';
|
213 |
my.parent().html(back+" "+btn);
|
214 |
return false;
|
215 |
});
|
216 |
|
217 |
$('body').on('click', ".del_button", function(){
|
218 |
last_element = false;
|
219 |
var my = $(this);
|
220 |
my.html('Deactivating...')
|
221 |
var routename = $(this).data("routename");
|
222 |
var delurl = "{% url delete-route 'route_placeholder'%}".replace('route_placeholder', routename.toString());
|
223 |
$.ajax({
|
224 |
type: 'POST',
|
225 |
url: delurl,
|
226 |
cache: false,
|
227 |
success: function(data) {
|
228 |
oTable.fnReloadAjax(refreshUrl);
|
229 |
}
|
230 |
});
|
231 |
return false;
|
232 |
});
|
233 |
},
|
234 |
"aoColumns":[
|
235 |
{"mData":"id", "bSearchable": false,"bSortable": false, "bvisible":false},
|
236 |
{"mData":"name", "sClass" : "alignCenter","bSearchable": true,"bSortable": true,
|
237 |
"mRender": function (data, type, full) {
|
238 |
if (full.comments !== null) {
|
239 |
if (!full.comments.trim()) {
|
240 |
return '<small>'+data+'</small>';
|
241 |
}
|
242 |
return '<a rel="tooltip" href="#" data-toggle="tooltip" data-placement="top" title='+full.comments+'><small>'+data+'</small>'
|
243 |
} else {
|
244 |
return 'No comments'
|
245 |
}
|
246 |
}
|
247 |
},
|
248 |
{"mData":"match", "sClass" : "alignCenter","bSearchable": true,"bSortable": true,
|
249 |
"mRender": function (data, type, full) {
|
250 |
return '<small>'+data+'</small>';
|
251 |
}
|
252 |
},
|
253 |
{"mData":"then", "sClass" : "alignCenter","bSearchable": true,"bSortable": true,
|
254 |
"mRender": function (data, type, full) {
|
255 |
return '<small>'+data+'</small>';
|
256 |
}
|
257 |
},
|
258 |
{"mData":"status", "sClass" : "alignCenter","bSearchable": true,"bSortable": true,
|
259 |
"mRender": function (data, type, full) {
|
260 |
var status = data;
|
261 |
if (status == "EXPIRED" ||status == "ADMININACTIVE" || status == "INACTIVE" || status == "OUTOFSYNC"){
|
262 |
if (status == "EXPIRED" ||status == "ADMININACTIVE" || status == "INACTIVE" ){
|
263 |
return '<span class="label label-default">DEACTIVATED</span>';
|
264 |
}
|
265 |
else
|
266 |
{
|
267 |
if (status == "OUTOFSYNC"){
|
268 |
return '<span class="label label-danger">ERROR</span>';
|
269 |
}
|
270 |
else{
|
271 |
return status;
|
272 |
}
|
273 |
}
|
274 |
}
|
275 |
else{
|
276 |
if (status == 'ACTIVE'){
|
277 |
return '<span class="label label-success">'+status+'</span>';
|
278 |
}
|
279 |
else{
|
280 |
if (status == 'PENDING'){
|
281 |
return '<span class="label label-info">'+status+'</span>';
|
282 |
}
|
283 |
else{
|
284 |
return '<span class="label label-danger">'+status+'</span>';
|
285 |
}
|
286 |
}
|
287 |
}
|
288 |
}
|
289 |
},
|
290 |
{"mData":"applier", "sClass" : "alignCenter","bSearchable": true,"bSortable": true,
|
291 |
"mRender": function (data, type, full) {
|
292 |
return '<small>'+data+' ('+full.peer+')</small>';
|
293 |
}
|
294 |
},
|
295 |
{"mData":"expires", "sClass" : "alignCenter","bSearchable": true,"bSortable": true,
|
296 |
"mRender": function (data, type, full) {
|
297 |
return '<small>'+data+'</small>';
|
298 |
}},
|
299 |
{"mData":"response", "sClass" : "alignCenter","bSearchable": true,"bSortable": true,
|
300 |
"mRender": function (data, type, full) {
|
301 |
status = full.status;
|
302 |
toolt = '<a rel="tooltip" href="#" data-toggle="tooltip" data-placement="top"';
|
303 |
if (status == "EXPIRED" ||status == "ADMININACTIVE" || status == "INACTIVE" || status == "OUTOFSYNC"){
|
304 |
if (status == "INACTIVE" ){
|
305 |
title = "{% trans 'Deactivated by user' %}";
|
306 |
}
|
307 |
if (status == "ADMININACTIVE" ){
|
308 |
title = "{% trans 'Deactivated by administrator' %}";
|
309 |
}
|
310 |
if (status == "EXPIRED" ){
|
311 |
title = "{% trans 'Deactivated due to expiration' %}";
|
312 |
}
|
313 |
if (status == "OUTOFSYNC" ){
|
314 |
title = "{% trans 'Syncronization error. Configuration in device differs from rule' %}";
|
315 |
}
|
316 |
return toolt+" title=\""+title+"\">"+"<small>{% trans 'Rule expired' %}</small>"+"</a>";
|
317 |
}
|
318 |
if (status == "PENDING"){
|
319 |
return '<img src="{{STATIC_URL}}dots.gif">';
|
320 |
}
|
321 |
return "<small>"+full.response+"</small>";
|
322 |
|
323 |
}
|
324 |
},
|
325 |
{"mData":"comments", "sClass" : "alignCenter","bSearchable": true,"bSortable": true,
|
326 |
"mRender": function (data, type, full) {
|
327 |
status = full.status;
|
328 |
btn = '';
|
329 |
editurl = "{% url edit-route 'routename' %}".replace('routename', full.name.toString());
|
330 |
if (status == "ACTIVE" ){
|
331 |
btn = '<a href="'+editurl+'" class="btn-info btn btn-sm btn-outline">{% trans "Edit" %}</a>';
|
332 |
btn = btn + ' <button class="del_buttonpre btn-warning btn btn-sm btn-outline" id="'+full.name+'" data-routename="'+full.name+'">{% trans "Deactivate" %}</button>';
|
333 |
}
|
334 |
if (status == 'EXPIRED' || status == 'ADMININACTIVE' || status == 'INACTIVE' ){
|
335 |
btn = '<a href="'+editurl+'" class="btn-info btn btn-sm btn-outline" id="edit_button_{{route.pk}}">{% trans "Reactivate" %}</a>';
|
336 |
}
|
337 |
if (status == "OUTOFSYNC" ){
|
338 |
btn = '<a href="'+editurl+'" class="btn-info btn btn-sm btn-outline" id="edit_button_{{route.pk}}">{% trans "Resync" %}</a>';
|
339 |
}
|
340 |
if (status == "ERROR" ){
|
341 |
btn = '<a href="'+editurl+'" class="btn-info btn btn-sm btn-outline" id="edit_button_{{route.pk}}">{% trans "Fix it!" %}</a>';
|
342 |
}
|
343 |
return btn;
|
344 |
},
|
345 |
}
|
346 |
|
347 |
]
|
348 |
} );
|
349 |
$('#filterplaceholder').html(filterbtns);
|
350 |
|
351 |
|
352 |
|
353 |
$('body').on('click', 'button[name="status_filter"]', function(){
|
354 |
var reg_exp = '';
|
355 |
var checkboxs = document.getElementsByName('status_filter');
|
356 |
$(this).button('toggle');
|
357 |
for (var i = 0, inp; inp = checkboxs[i]; i++) {
|
358 |
if (inp.type.toLowerCase() == 'button' && $(inp).hasClass('active')) {
|
359 |
reg_exp = reg_exp + inp.value + '|';
|
360 |
}
|
361 |
}
|
362 |
//passing an empty string will result in no filter
|
363 |
//thus, it must be set to something that will not exist in the column
|
364 |
if (reg_exp == '') {
|
365 |
reg_exp = '|'
|
366 |
}
|
367 |
oTable.fnFilter(reg_exp.slice(0, -1), 4, true, false, false);
|
368 |
console.log(reg_exp.slice(0, -1))
|
369 |
return false;
|
370 |
});
|
371 |
|
372 |
$(window).resize(function() {
|
373 |
clearTimeout(window.refresh_size);
|
374 |
window.refresh_size = setTimeout(function() { update_size(); }, 250);
|
375 |
});
|
376 |
|
377 |
var update_size = function() {
|
378 |
$(oTable).css({ width: $(oTable).parent().width() });
|
379 |
pw=$(oTable).parent().width();
|
380 |
tw=$(oTable).width();
|
381 |
if (tw>pw){
|
382 |
oTable.fnSetColumnVis( 7,false );
|
383 |
oTable.fnSetColumnVis( 5,false );
|
384 |
}else{
|
385 |
oTable.fnSetColumnVis( 7,true );
|
386 |
oTable.fnSetColumnVis( 5,true );
|
387 |
}
|
388 |
oTable.fnAdjustColumnSizing();
|
389 |
}
|
390 |
|
391 |
$("body").tooltip({ selector: '[data-toggle="tooltip"]' });
|
392 |
});
|
393 |
</script>
|
394 |
<style type="text/css"> |
395 |
|
396 |
|
397 |
.dl-horizontal dt { |
398 |
width: 70px; |
399 |
} |
400 |
.dl-horizontal dd { |
401 |
margin-left: 90px; |
402 |
} |
403 |
|
404 |
th{ |
405 |
font-size: 12px; |
406 |
} |
407 |
</style>
|
408 |
|
409 |
{% endblock %} |
410 |
|