/******************************************************************************* * Copyright 2018 The MIT Internet Trust Consortium * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *******************************************************************************/ var BlackListModel = Backbone.Model.extend({ idAttribute: 'id', urlRoot: 'api/blacklist' }); var BlackListCollection = Backbone.Collection.extend({ initialize: function() { }, url: "api/blacklist" }); var BlackListListView = Backbone.View.extend({ tagName: 'span', initialize: function(options) { this.options = options; }, load: function(callback) { if (this.collection.isFetched) { callback(); return; } $('#loadingbox').sheet('show'); $('#loading').html('' + $.t('admin.blacklist') + ' '); $.when(this.collection.fetchIfNeeded({ success: function(e) { $('#loading-blacklist').addClass('label-success'); }, error: app.errorHandlerView.handleError() })).done(function() { $('#loadingbox').sheet('hide'); callback(); }); }, events: { "click .refresh-table": "refreshTable", "click .btn-add": "addItem", "submit #add-blacklist form": "addItem" }, refreshTable: function(e) { e.preventDefault(); var _self = this; $('#loadingbox').sheet('show'); $('#loading').html('' + $.t('admin.blacklist') + ' '); $.when(this.collection.fetch()).done(function() { $('#loadingbox').sheet('hide'); _self.render(); }); }, togglePlaceholder: function() { if (this.collection.length > 0) { $('#blacklist-table', this.el).show(); $('#blacklist-table-empty', this.el).hide(); } else { $('#blacklist-table', this.el).hide(); $('#blacklist-table-empty', this.el).show(); } }, render: function(eventName) { $(this.el).html($('#tmpl-blacklist-table').html()); var _self = this; _.each(this.collection.models, function(blacklist) { var view = new BlackListWidgetView({ model: blacklist }); view.parentView = _self; $("#blacklist-table", _self.el).append(view.render().el); }, this); this.togglePlaceholder(); $(this.el).i18n(); return this; }, addItem: function(e) { e.preventDefault(); var input_value = $("#blacklist-uri", this.el).val().trim(); if (input_value === "") { return; } // TODO: URI/pattern validation, check against existing clients var item = new BlackListModel({ uri: input_value }); var _self = this; // closures... item.save({}, { success: function() { _self.collection.add(item); _self.render(); }, error: app.errorHandlerView.handleError() }); } }); var BlackListWidgetView = Backbone.View.extend({ tagName: 'tr', initialize: function(options) { this.options = options; if (!this.template) { this.template = _.template($('#tmpl-blacklist-item').html()); } }, render: function() { this.$el.html(this.template(this.model.toJSON())); return this; }, events: { 'click .btn-delete': 'deleteBlacklist' }, deleteBlacklist: function(e) { e.preventDefault(); if (confirm($.t("blacklist.confirm"))) { var _self = this; this.model.destroy({ dataType: false, processData: false, success: function() { _self.$el.fadeTo("fast", 0.00, function() { // fade $(this).slideUp("fast", function() { // slide up $(this).remove(); // then remove from the DOM _self.parentView.togglePlaceholder(); }); }); }, error: app.errorHandlerView.handleError() }); _self.parentView.delegateEvents(); } return false; } }); ui.routes.push({ path: "admin/blacklist", name: "blackList", callback: function() { if (!isAdmin()) { this.root(); return; } this.breadCrumbView.collection.reset(); this.breadCrumbView.collection.add([{ text: $.t('admin.home'), href: "" }, { text: $.t('admin.manage-blacklist'), href: "manage/#admin/blacklist" }]); this.updateSidebar('admin/blacklist'); var view = new BlackListListView({ collection: this.blackListList }); view.load(function(collection, response, options) { $('#content').html(view.render().el); setPageTitle($.t('admin.manage-blacklist')); }); } }); ui.templates.push('resources/template/blacklist.html'); ui.init.push(function(app) { app.blackListList = new BlackListCollection(); });