project.js 5.99 KB
Newer Older
Bence Dányi committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie != '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            if (cookie.substring(0, name.length + 1) == (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

function csrfSafeMethod(method) {
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    crossDomain: false,
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type)) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

29
/**
30 31 32 33 34
 * List of firewall collections, controllers/routes will be dynamically created from them.
 *
 * E.g., from the `rule` controller, the RESTful url `/rules/` will be generated,
 * and the `/static/partials/rule-list.html` template will be used.
 * @type {Array}
35
 */
36
var listControllers = ['rule', 'host', 'vlan', 'vlangroup', 'hostgroup', 'firewall', 'domain', 'record', 'blacklist'];
37
var entityControllers = ['rule', 'host'];
38
var module = angular.module('firewall', []).config(
39
['$routeProvider', function($routeProvider) {
40 41 42 43 44
    for (var i in listControllers) {
        var c = listControllers[i];
        $routeProvider.when('/' + c + 's/', {
            templateUrl: '/static/partials/' + c + '-list.html',
            controller: ListController('/firewall/' + c + 's/')
45 46
        });
    }
47 48 49 50 51 52 53
    for (var i in entityControllers) {
        var c = entityControllers[i];
        $routeProvider.when('/' + c + 's/:id/', {
            templateUrl: '/static/partials/' + c + '-edit.html',
            controller: EntityController('/firewall/' + c + 's/')
        });
    }
54
    $routeProvider.otherwise({
55 56 57 58
        redirectTo: '/rules/'
    });
}]);

59 60 61 62 63 64 65
function range(a, b) {
    var res = [];
    do res.push(a++);
    while (a < b)
    return res;
}

66
function matchAnything(obj, query) {
67
    var expr = new RegExp(query, 'i')
68
    for (var i in obj) {
69
        var prop = obj[i];
70 71 72
        if (typeof prop === 'number' && prop == query) return true;
        if (typeof prop === 'string' && prop.match(expr)) return true;
        if (typeof prop === 'object' && matchAnything(prop, query)) return true;
73 74
    }
    return false;
75 76
}

77 78 79 80 81 82 83 84 85 86 87 88 89 90
function ListController(url) {
    return function($scope, $http) {
        $scope.page = 1;
        var rules = [];
        var pageSize = 10;
        var itemCount = 0;
        $scope.getPage = function() {
            var res = [];
            if ($scope.query) {
                for (var i in rules) {
                    var rule = rules[i];
                    if (matchAnything(rule, $scope.query)) {
                        res.push(rule);
                    }
91
                }
92

93 94
            } else {
                res = rules;
95
            }
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
            $scope.pages = range(1, Math.ceil(res.length / pageSize));
            $scope.page = Math.min($scope.page, $scope.pages.length);
            return res.slice(($scope.page - 1) * pageSize, $scope.page * pageSize);
        };
        $scope.setPage = function(page) {
            $scope.page = page;
        };
        $scope.nextPage = function() {
            $scope.page = Math.min($scope.page + 1, $scope.pages.length);
        };
        $scope.prevPage = function() {
            $scope.page = Math.max($scope.page - 1, 1);
        };
        $http.get(url).success(function success(data) {
            rules = data;
            $scope.pages = range(1, Math.ceil(data.length / pageSize));
        });
    }
114
}
115 116 117 118 119 120

function EntityController(url) {
    return function($scope, $http, $routeParams) {
        var id = $routeParams.id;
        $http.get(url + id + '/').success(function success(data) {
            console.log(data);
121
            $scope.entity = data;
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
            $('#targetName').typeahead({
                source: function(query, process) {
                    $.ajax({
                        url: '/firewall/autocomplete/' + data.target.type + '/',
                        type: 'post',
                        data: 'name=' + query,
                        success: function autocompleteSuccess(data) {
                            process(data.map(function(obj) {
                                return obj.name;
                            }));
                        }
                    });
                },
                matcher: function() {
                    return true;
                }
            });
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
            $('#foreignNetwork').typeahead({
                source: function(query, process) {
                    $.ajax({
                        url: '/firewall/autocomplete/vlangroup/',
                        type: 'post',
                        data: 'name=' + query,
                        success: function autocompleteSuccess(data) {
                            process(data.map(function(obj) {
                                return obj.name;
                            }));
                        }
                    });
                },
                matcher: function() {
                    return true;
                }
            });
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
            ['vlan', 'host', 'firewall'].forEach(function(t) {
                $('#' + t).typeahead({
                    source: function(query, process) {
                        $.ajax({
                            url: '/firewall/autocomplete/' + t + '/',
                            type: 'post',
                            data: 'name=' + query,
                            success: function autocompleteSuccess(data) {
                                process(data.map(function(obj) {
                                    return obj.name;
                                }));
                            }
                        });
                    },
                    matcher: function() {
                        return true;
                    }
                });
            })
175 176 177
        });
    }
}