/******************************************************************************* * 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(); });