/*******************************************************************************
* Copyright 2018 The MIT Internet Trust Consortium
*
* Portions copyright 2011-2013 The MITRE Corporation
*
* 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 SystemScopeModel = Backbone.Model.extend({
idAttribute: 'id',
defaults: {
id: null,
description: null,
icon: null,
value: null,
defaultScope: false,
restricted: false
},
urlRoot: 'api/scopes'
});
var SystemScopeCollection = Backbone.Collection.extend({
idAttribute: 'id',
model: SystemScopeModel,
url: 'api/scopes',
defaultScopes: function() {
filtered = this.filter(function(scope) {
return scope.get("defaultScope") === true;
});
return new SystemScopeCollection(filtered);
},
unrestrictedScopes: function() {
filtered = this.filter(function(scope) {
return scope.get("restricted") !== true;
});
return new SystemScopeCollection(filtered);
},
defaultUnrestrictedScopes: function() {
filtered = this.filter(function(scope) {
return scope.get("defaultScope") === true && scope.get("restricted") !== true;
});
return new SystemScopeCollection(filtered);
},
getByValue: function(value) {
var scopes = this.where({
value: value
});
if (scopes.length == 1) {
return scopes[0];
} else {
return null;
}
}
});
var SystemScopeView = Backbone.View.extend({
tagName: 'tr',
initialize: function(options) {
this.options = options;
if (!this.template) {
this.template = _.template($('#tmpl-system-scope').html());
}
this.model.bind('change', this.render, this);
},
events: {
'click .btn-edit': 'editScope',
'click .btn-delete': 'deleteScope'
},
editScope: function(e) {
e.preventDefault();
app.navigate('admin/scope/' + this.model.id, {
trigger: true
});
},
render: function(eventName) {
this.$el.html(this.template(this.model.toJSON()));
$('.restricted', this.el).tooltip({
title: $.t('scope.system-scope-table.tooltip-restricted')
});
$('.default', this.el).tooltip({
title: $.t('scope.system-scope-table.tooltip-default')
});
$(this.el).i18n();
return this;
},
deleteScope: function(e) {
e.preventDefault();
if (confirm($.t("scope.system-scope-table.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;
},
close: function() {
$(this.el).unbind();
$(this.el).empty();
}
});
var SystemScopeListView = Backbone.View.extend({
tagName: 'span',
initialize: function(options) {
this.options = options;
},
load: function(callback) {
if (this.model.isFetched) {
callback();
return;
}
$('#loadingbox').sheet('show');
$('#loading').html('' + $.t('common.scopes') + ' ');
$.when(this.model.fetchIfNeeded({
success: function(e) {
$('#loading-scopes').addClass('label-success');
},
error: app.errorHandlerView.handleError()
})).done(function() {
$('#loadingbox').sheet('hide');
callback();
});
},
events: {
"click .new-scope": "newScope",
"click .refresh-table": "refreshTable"
},
newScope: function(e) {
this.remove();
app.navigate('admin/scope/new', {
trigger: true
});
},
refreshTable: function(e) {
var _self = this;
$('#loadingbox').sheet('show');
$('#loading').html('' + $.t('common.scopes') + ' ');
$.when(this.model.fetch({
success: function(e) {
$('#loading-scopes').addClass('label-success');
},
error: app.errorHandlerView.handleError()
})).done(function() {
$('#loadingbox').sheet('hide');
_self.render();
});
},
togglePlaceholder: function() {
if (this.model.length > 0) {
$('#scope-table', this.el).show();
$('#scope-table-empty', this.el).hide();
} else {
$('#scope-table', this.el).hide();
$('#scope-table-empty', this.el).show();
}
},
render: function(eventName) {
// append and render the table structure
$(this.el).html($('#tmpl-system-scope-table').html());
var _self = this;
_.each(this.model.models, function(scope) {
var view = new SystemScopeView({
model: scope
});
view.parentView = _self;
$("#scope-table", _self.el).append(view.render().el);
}, this);
this.togglePlaceholder();
$(this.el).i18n();
return this;
}
});
var SystemScopeFormView = Backbone.View
.extend({
tagName: 'span',
initialize: function(options) {
this.options = options;
if (!this.template) {
this.template = _.template($('#tmpl-system-scope-form').html());
}
if (!this.iconTemplate) {
this.iconTemplate = _.template($('#tmpl-system-scope-icon').html());
}
// initialize our icon set into slices for the selector
if (!this.bootstrapIcons) {
this.bootstrapIcons = [];
var iconList = ['glass', 'music', 'search', 'envelope', 'heart', 'star', 'star-empty', 'user', 'film', 'th-large', 'th', 'th-list', 'ok', 'remove', 'zoom-in', 'zoom-out', 'off', 'signal', 'cog', 'trash', 'home', 'file', 'time', 'road', 'download-alt', 'download', 'upload', 'inbox', 'play-circle', 'repeat', 'refresh', 'list-alt', 'lock',
'flag', 'headphones', 'volume-off', 'volume-down', 'volume-up', 'qrcode', 'barcode', 'tag', 'tags', 'book', 'bookmark', 'print', 'camera', 'font', 'bold', 'italic', 'text-height', 'text-width', 'align-left', 'align-center', 'align-right', 'align-justify', 'list', 'indent-left', 'indent-right', 'facetime-video', 'picture',
'pencil', 'map-marker', 'adjust', 'tint', 'edit', 'share', 'check', 'move', 'step-backward', 'fast-backward', 'backward', 'play', 'pause', 'stop', 'forward', 'fast-forward', 'step-forward', 'eject', 'chevron-left', 'chevron-right', 'plus-sign', 'minus-sign', 'remove-sign', 'ok-sign', 'question-sign', 'info-sign', 'screenshot',
'remove-circle', 'ok-circle', 'ban-circle', 'arrow-left', 'arrow-right', 'arrow-up', 'arrow-down', 'share-alt', 'resize-full', 'resize-small', 'plus', 'minus', 'asterisk', 'exclamation-sign', 'gift', 'leaf', 'fire', 'eye-open', 'eye-close', 'warning-sign', 'plane', 'calendar', 'random', 'comment', 'magnet', 'chevron-up',
'chevron-down', 'retweet', 'shopping-cart', 'folder-close', 'folder-open', 'resize-vertical', 'resize-horizontal', 'hdd', 'bullhorn', 'bell', 'certificate', 'thumbs-up', 'thumbs-down', 'hand-right', 'hand-left', 'hand-up', 'hand-down', 'circle-arrow-right', 'circle-arrow-left', 'circle-arrow-up', 'circle-arrow-down', 'globe',
'wrench', 'tasks', 'filter', 'briefcase', 'fullscreen'];
var size = 3;
while (iconList.length > 0) {
this.bootstrapIcons.push(iconList.splice(0, size));
}
}
},
events: {
'click .btn-save': 'saveScope',
'click .btn-cancel': function() {
app.navigate('admin/scope', {
trigger: true
});
},
'click .btn-icon': 'selectIcon'
},
load: function(callback) {
if (this.model.isFetched) {
callback();
return;
}
$('#loadingbox').sheet('show');
$('#loading').html('' + $.t("common.scopes") + ' ');
$.when(this.model.fetchIfNeeded({
success: function(e) {
$('#loading-scopes').addClass('label-success');
},
error: app.errorHandlerView.handleError()
})).done(function() {
$('#loadingbox').sheet('hide');
callback();
});
},
saveScope: function(e) {
e.preventDefault();
var value = $('#value input').val();
if (value == null || value.trim() == "") {
// error: can't have a blank scope
return false;
}
var valid = this.model.set({
value: value,
description: $('#description textarea').val(),
icon: $('#iconDisplay input').val(),
defaultScope: $('#defaultScope input').is(':checked'),
restricted: $('#restricted input').is(':checked')
});
if (valid) {
var _self = this;
this.model.save({}, {
success: function() {
app.systemScopeList.add(_self.model);
app.navigate('admin/scope', {
trigger: true
});
},
error: app.errorHandlerView.handleError()
});
}
return false;
},
selectIcon: function(e) {
e.preventDefault();
var icon = e.target.value;
$('#iconDisplay input').val(icon);
$('#iconDisplay #iconName').html(icon);
$('#iconDisplay i').removeClass();
$('#iconDisplay i').addClass('icon-' + icon);
$('#iconDisplay i').addClass('icon-white');
$('#iconSelector').modal('hide');
return false;
},
render: function(eventName) {
this.$el.html(this.template(this.model.toJSON()));
_.each(this.bootstrapIcons, function(items) {
$("#iconSelector .modal-body", this.el).append(this.iconTemplate({
items: items
}));
}, this);
$(this.el).i18n();
return this;
}
});
ui.routes.push({
path: "admin/scope",
name: "siteScope",
callback: function() {
if (!isAdmin()) {
this.root();
return;
}
this.breadCrumbView.collection.reset();
this.breadCrumbView.collection.add([{
text: $.t('admin.home'),
href: ""
}, {
text: $.t('scope.manage'),
href: "manage/#admin/scope"
}]);
this.updateSidebar('admin/scope');
var view = new SystemScopeListView({
model: this.systemScopeList
});
view.load(function() {
$('#content').html(view.render().el);
view.delegateEvents();
setPageTitle($.t('scope.manage'));
});
}
});
ui.routes.push({
path: "admin/scope/new",
name: "newScope",
callback: function() {
if (!isAdmin()) {
this.root();
return;
}
this.breadCrumbView.collection.reset();
this.breadCrumbView.collection.add([{
text: $.t('admin.home'),
href: ""
}, {
text: $.t('scope.manage'),
href: "manage/#admin/scope"
}, {
text: $.t('scope.system-scope-form.new'),
href: "manage/#admin/scope/new"
}]);
this.updateSidebar('admin/scope');
var scope = new SystemScopeModel();
var view = new SystemScopeFormView({
model: scope
});
view.load(function() {
$('#content').html(view.render().el);
setPageTitle($.t('scope.system-scope-form.new'));
});
}
});
ui.routes.push({
path: "admin/scope/:id",
name: "editScope",
callback: function(sid) {
if (!isAdmin()) {
this.root();
return;
}
this.breadCrumbView.collection.reset();
this.breadCrumbView.collection.add([{
text: $.t('admin.home'),
href: ""
}, {
text: $.t('scope.manage'),
href: "manage/#admin/scope"
}, {
text: $.t('scope.system-scope-form.edit'),
href: "manage/#admin/scope/" + sid
}]);
this.updateSidebar('admin/scope');
var scope = this.systemScopeList.get(sid);
if (!scope) {
scope = new SystemScopeModel({
id: sid
});
}
var view = new SystemScopeFormView({
model: scope
});
view.load(function() {
$('#content').html(view.render().el);
setPageTitle($.t('scope.system-scope-form.new'));
});
}
});
ui.templates.push('resources/template/scope.html');
ui.init.push(function(app) {
app.systemScopeList = new SystemScopeCollection();
});