/*******************************************************************************
* 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 ApprovedSiteModel = Backbone.Model.extend({
idAttribute: 'id',
initialize: function() {
},
urlRoot: 'api/approved'
});
var ApprovedSiteCollection = Backbone.Collection.extend({
initialize: function() {
},
model: ApprovedSiteModel,
url: 'api/approved'
});
var ApprovedSiteListView = Backbone.View.extend({
tagName: 'span',
initialize: function(options) {
this.options = options;
},
load: function(callback) {
if (this.model.isFetched && this.options.clientList.isFetched && this.options.systemScopeList.isFetched) {
callback();
return;
}
$('#loadingbox').sheet('show');
$('#loading').html('' + $.t('grant.grant-table.approved-sites') + ' ' + '' + $.t('common.clients') + ' ' + '' + $.t('common.scopes') + ' ');
$.when(this.model.fetchIfNeeded({
success: function(e) {
$('#loading-grants').addClass('label-success');
},
error: app.errorHandlerView.handleError()
}), this.options.clientList.fetchIfNeeded({
success: function(e) {
$('#loading-clients').addClass('label-success');
},
error: app.errorHandlerView.handleError()
}), this.options.systemScopeList.fetchIfNeeded({
success: function(e) {
$('#loading-scopes').addClass('label-success');
},
error: app.errorHandlerView.handleError()
})).done(function() {
$('#loadingbox').sheet('hide');
callback();
});
},
events: {
"click .refresh-table": "refreshTable"
},
render: function(eventName) {
$(this.el).html($('#tmpl-grant-table').html());
var approvedSiteCount = 0;
var _self = this;
_.each(this.model.models, function(approvedSite) {
// look up client
var client = this.options.clientList.getByClientId(approvedSite.get('clientId'));
if (client != null) {
var view = new ApprovedSiteView({
model: approvedSite,
client: client,
systemScopeList: this.options.systemScopeList
});
view.parentView = _self;
$('#grant-table', this.el).append(view.render().el);
approvedSiteCount = approvedSiteCount + 1;
}
}, this);
this.togglePlaceholder();
$(this.el).i18n();
return this;
},
togglePlaceholder: function() {
// count entries
if (this.model.length > 0) {
$('#grant-table', this.el).show();
$('#grant-table-empty', this.el).hide();
} else {
$('#grant-table', this.el).hide();
$('#grant-table-empty', this.el).show();
}
},
refreshTable: function(e) {
e.preventDefault();
var _self = this;
$('#loadingbox').sheet('show');
$('#loading').html('' + $.t('grant.grant-table.approved-sites') + ' ' + '' + $.t('common.clients') + ' ' + '' + $.t('common.scopes') + ' ');
$.when(this.model.fetch({
success: function(e) {
$('#loading-grants').addClass('label-success');
},
error: app.errorHandlerView.handleError()
}), this.options.clientList.fetch({
success: function(e) {
$('#loading-clients').addClass('label-success');
},
error: app.errorHandlerView.handleError()
}), this.options.systemScopeList.fetch({
success: function(e) {
$('#loading-scopes').addClass('label-success');
},
error: app.errorHandlerView.handleError()
})).done(function() {
$('#loadingbox').sheet('hide');
_self.render();
});
}
});
var ApprovedSiteView = Backbone.View.extend({
tagName: 'tr',
initialize: function(options) {
this.options = options;
if (!this.template) {
this.template = _.template($('#tmpl-grant').html());
}
if (!this.scopeTemplate) {
this.scopeTemplate = _.template($('#tmpl-scope-list').html());
}
if (!this.moreInfoTemplate) {
this.moreInfoTemplate = _.template($('#tmpl-client-more-info-block').html());
}
},
render: function() {
var creationDate = this.model.get("creationDate");
var accessDate = this.model.get("accessDate");
var timeoutDate = this.model.get("timeoutDate");
var displayCreationDate = $.t('grant.grant-table.unknown');
var hoverCreationDate = "";
if ((creationDate != null) && moment(creationDate).isValid()) {
creationDate = moment(creationDate);
if (moment().diff(creationDate, 'months') < 6) {
displayCreationDate = creationDate.fromNow();
} else {
displayCreationDate = creationDate.format("LL");
}
hoverCreationDate = creationDate.format("LLL");
}
var displayAccessDate = $.t('grant.grant-table.unknown');
var hoverAccessDate = "";
if ((accessDate != null) && moment(accessDate).isValid()) {
accessDate = moment(accessDate);
if (moment().diff(accessDate, 'months') < 6) {
displayAccessDate = accessDate.fromNow();
} else {
displayAccessDate = accessDate.format("LL");
}
hoverAccessDate = accessDate.format("LLL");
}
var displayTimeoutDate = $.t('grant.grant-table.unknown');
var hoverTimeoutDate = "";
if (timeoutDate == null) {
displayTimeoutDate = $.t('grant.grant-table.never');
} else if (moment(timeoutDate).isValid()) {
timeoutDate = moment(timeoutDate);
if (moment().diff(timeoutDate, 'months') < 6) {
displayTimeoutDate = timeoutDate.fromNow();
} else {
displayTimeoutDate = timeoutDate.format("LL");
}
hoverTimeoutDate = timeoutDate.format("LLL");
}
var formattedDate = {
displayCreationDate: displayCreationDate,
hoverCreationDate: hoverCreationDate,
displayAccessDate: displayAccessDate,
hoverAccessDate: hoverAccessDate,
displayTimeoutDate: displayTimeoutDate,
hoverTimeoutDate: hoverTimeoutDate
};
var json = {
grant: this.model.toJSON(),
client: this.options.client.toJSON(),
formattedDate: formattedDate
};
this.$el.html(this.template(json));
$('.scope-list', this.el).html(this.scopeTemplate({
scopes: this.model.get('allowedScopes'),
systemScopes: this.options.systemScopeList
}));
$('.client-more-info-block', this.el).html(this.moreInfoTemplate({
client: this.options.client.toJSON()
}));
this.$('.dynamically-registered').tooltip({
title: $.t('grant.grant-table.dynamically-registered')
});
this.$('.tokens').tooltip({
title: $.t('grant.grant-table.active-tokens')
});
$(this.el).i18n();
return this;
},
events: {
'click .btn-delete': 'deleteApprovedSite',
'click .toggleMoreInformation': 'toggleMoreInformation'
},
deleteApprovedSite: function(e) {
e.preventDefault();
if (confirm("Are you sure you want to revoke access to this site?")) {
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()
});
this.parentView.delegateEvents();
}
return false;
},
toggleMoreInformation: function(e) {
e.preventDefault();
if ($('.moreInformation', this.el).is(':visible')) {
// hide it
$('.moreInformation', this.el).hide('fast');
$('.toggleMoreInformation i', this.el).attr('class', 'icon-chevron-right');
$('.moreInformationContainer', this.el).removeClass('alert').removeClass('alert-info').addClass('muted');
} else {
// show it
$('.moreInformation', this.el).show('fast');
$('.toggleMoreInformation i', this.el).attr('class', 'icon-chevron-down');
$('.moreInformationContainer', this.el).addClass('alert').addClass('alert-info').removeClass('muted');
}
},
close: function() {
$(this.el).unbind();
$(this.el).empty();
}
});
ui.routes.push({
path: "user/approved",
name: "approvedSites",
callback:
function() {
this.breadCrumbView.collection.reset();
this.breadCrumbView.collection.add([{
text: $.t('admin.home'),
href: ""
}, {
text: $.t('grant.manage-approved-sites'),
href: "manage/#user/approve"
}]);
this.updateSidebar('user/approved');
var view = new ApprovedSiteListView({
model: this.approvedSiteList,
clientList: this.clientList,
systemScopeList: this.systemScopeList
});
view.load(function(collection, response, options) {
$('#content').html(view.render().el);
setPageTitle($.t('grant.manage-approved-sites'));
});
}
});
ui.templates.push('resources/template/grant.html');
ui.init.push(function(app) {
app.approvedSiteList = new ApprovedSiteCollection();
});