2016-05-18 19:25:05 +03:00
|
|
|
/* global Backbone, Handlebars, moment */
|
2016-05-18 13:03:22 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @author Christoph Wurst <christoph@owncloud.com>
|
|
|
|
*
|
|
|
|
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
|
|
|
* @license AGPL-3.0
|
|
|
|
*
|
|
|
|
* This code is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Affero General Public License, version 3,
|
|
|
|
* as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Affero General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
(function(OC, _, Backbone, $, Handlebars, moment) {
|
2016-05-18 13:03:22 +03:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
OC.Settings = OC.Settings || {};
|
|
|
|
|
|
|
|
var TEMPLATE_TOKEN =
|
2016-05-19 12:20:22 +03:00
|
|
|
'<tr data-id="{{id}}">'
|
2016-05-18 19:25:05 +03:00
|
|
|
+ '<td>{{name}}</td>'
|
2016-05-19 12:20:22 +03:00
|
|
|
+ '<td><span class="last-activity" title="{{lastActivityTime}}">{{lastActivity}}</span></td>'
|
|
|
|
+ '<td><a class="icon-delete" title="' + t('core', 'Disconnect') + '"></a></td>'
|
2016-05-18 19:25:05 +03:00
|
|
|
+ '<tr>';
|
2016-05-18 13:03:22 +03:00
|
|
|
|
|
|
|
var SubView = Backbone.View.extend({
|
|
|
|
collection: null,
|
2016-05-19 12:20:22 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* token type
|
|
|
|
* - 0: browser
|
|
|
|
* - 1: device
|
|
|
|
*
|
|
|
|
* @see OC\Authentication\Token\IToken
|
|
|
|
*/
|
2016-05-18 13:03:22 +03:00
|
|
|
type: 0,
|
2016-05-19 12:20:22 +03:00
|
|
|
|
|
|
|
_template: undefined,
|
|
|
|
|
|
|
|
template: function(data) {
|
|
|
|
if (_.isUndefined(this._template)) {
|
|
|
|
this._template = Handlebars.compile(TEMPLATE_TOKEN);
|
|
|
|
}
|
|
|
|
|
|
|
|
return this._template(data);
|
|
|
|
},
|
|
|
|
|
2016-05-18 13:03:22 +03:00
|
|
|
initialize: function(options) {
|
|
|
|
this.type = options.type;
|
|
|
|
this.collection = options.collection;
|
2016-05-19 12:20:22 +03:00
|
|
|
|
|
|
|
this.on(this.collection, 'change', this.render);
|
2016-05-18 13:03:22 +03:00
|
|
|
},
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 13:03:22 +03:00
|
|
|
render: function() {
|
|
|
|
var _this = this;
|
|
|
|
|
2016-05-19 12:20:22 +03:00
|
|
|
var list = this.$('.token-list');
|
2016-05-18 13:03:22 +03:00
|
|
|
var tokens = this.collection.filter(function(token) {
|
2016-05-19 12:20:22 +03:00
|
|
|
return parseInt(token.get('type'), 10) === _this.type;
|
2016-05-18 13:03:22 +03:00
|
|
|
});
|
|
|
|
list.html('');
|
|
|
|
|
2016-05-19 12:20:22 +03:00
|
|
|
// Show header only if there are tokens to show
|
|
|
|
console.log(tokens.length > 0);
|
|
|
|
this._toggleHeader(tokens.length > 0);
|
|
|
|
|
2016-05-18 13:03:22 +03:00
|
|
|
tokens.forEach(function(token) {
|
2016-05-18 19:25:05 +03:00
|
|
|
var viewData = token.toJSON();
|
2016-05-19 12:20:22 +03:00
|
|
|
var ts = viewData.lastActivity * 1000;
|
|
|
|
viewData.lastActivity = OC.Util.relativeModifiedDate(ts);
|
|
|
|
viewData.lastActivityTime = OC.Util.formatDate(ts, 'LLL');
|
2016-05-18 19:25:05 +03:00
|
|
|
var html = _this.template(viewData);
|
2016-05-19 12:20:22 +03:00
|
|
|
var $html = $(html);
|
|
|
|
$html.find('.last-activity').tooltip();
|
|
|
|
$html.find('.icon-delete').tooltip();
|
|
|
|
list.append($html);
|
2016-05-18 13:03:22 +03:00
|
|
|
});
|
|
|
|
},
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
toggleLoading: function(state) {
|
2016-05-19 12:20:22 +03:00
|
|
|
this.$('.token-list').toggleClass('icon-loading', state);
|
|
|
|
},
|
|
|
|
|
|
|
|
_toggleHeader: function(show) {
|
|
|
|
this.$('.hidden-when-empty').toggleClass('hidden', !show);
|
2016-05-18 19:25:05 +03:00
|
|
|
}
|
2016-05-18 13:03:22 +03:00
|
|
|
});
|
|
|
|
|
|
|
|
var AuthTokenView = Backbone.View.extend({
|
|
|
|
collection: null,
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
_views: [],
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
_form: undefined,
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
_tokenName: undefined,
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
_addTokenBtn: undefined,
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
_result: undefined,
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
_newToken: undefined,
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
_hideTokenBtn: undefined,
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
_addingToken: false,
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 13:03:22 +03:00
|
|
|
initialize: function(options) {
|
|
|
|
this.collection = options.collection;
|
|
|
|
|
|
|
|
var tokenTypes = [0, 1];
|
|
|
|
var _this = this;
|
|
|
|
_.each(tokenTypes, function(type) {
|
2016-05-19 12:20:22 +03:00
|
|
|
var el = type === 0 ? '#sessions' : '#devices';
|
2016-05-18 19:25:05 +03:00
|
|
|
_this._views.push(new SubView({
|
2016-05-19 12:20:22 +03:00
|
|
|
el: el,
|
2016-05-18 13:03:22 +03:00
|
|
|
type: type,
|
|
|
|
collection: _this.collection
|
|
|
|
}));
|
2016-05-19 12:20:22 +03:00
|
|
|
|
|
|
|
var $el = $(el);
|
|
|
|
$el.on('click', 'a.icon-delete', _.bind(_this._onDeleteToken, _this));
|
2016-05-18 13:03:22 +03:00
|
|
|
});
|
2016-05-18 19:25:05 +03:00
|
|
|
|
|
|
|
this._form = $('#device-token-form');
|
|
|
|
this._tokenName = $('#device-token-name');
|
|
|
|
this._addTokenBtn = $('#device-add-token');
|
|
|
|
this._addTokenBtn.click(_.bind(this._addDeviceToken, this));
|
|
|
|
|
|
|
|
this._result = $('#device-token-result');
|
|
|
|
this._newToken = $('#device-new-token');
|
2016-05-19 12:20:22 +03:00
|
|
|
this._newToken.on('focus', _.bind(this._onNewTokenFocus, this));
|
2016-05-18 19:25:05 +03:00
|
|
|
this._hideTokenBtn = $('#device-token-hide');
|
|
|
|
this._hideTokenBtn.click(_.bind(this._hideToken, this));
|
2016-05-18 13:03:22 +03:00
|
|
|
},
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 13:03:22 +03:00
|
|
|
render: function() {
|
2016-05-18 19:25:05 +03:00
|
|
|
_.each(this._views, function(view) {
|
2016-05-18 13:03:22 +03:00
|
|
|
view.render();
|
2016-05-18 19:25:05 +03:00
|
|
|
view.toggleLoading(false);
|
2016-05-18 13:03:22 +03:00
|
|
|
});
|
|
|
|
},
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 13:03:22 +03:00
|
|
|
reload: function() {
|
2016-05-18 19:25:05 +03:00
|
|
|
var _this = this;
|
|
|
|
|
|
|
|
_.each(this._views, function(view) {
|
|
|
|
view.toggleLoading(true);
|
|
|
|
});
|
|
|
|
|
2016-05-18 13:03:22 +03:00
|
|
|
var loadingTokens = this.collection.fetch();
|
|
|
|
|
|
|
|
$.when(loadingTokens).done(function() {
|
|
|
|
_this.render();
|
|
|
|
});
|
2016-05-18 19:25:05 +03:00
|
|
|
$.when(loadingTokens).fail(function() {
|
|
|
|
OC.Notification.showTemporary(t('core', 'Error while loading browser sessions and device tokens'));
|
|
|
|
});
|
|
|
|
},
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
_addDeviceToken: function() {
|
|
|
|
var _this = this;
|
|
|
|
this._toggleAddingToken(true);
|
|
|
|
|
|
|
|
var deviceName = this._tokenName.val();
|
|
|
|
var creatingToken = $.ajax(OC.generateUrl('/settings/personal/authtokens'), {
|
|
|
|
method: 'POST',
|
|
|
|
data: {
|
|
|
|
name: deviceName
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
$.when(creatingToken).done(function(resp) {
|
|
|
|
_this.collection.add(resp.deviceToken);
|
|
|
|
_this.render();
|
2016-05-19 12:20:22 +03:00
|
|
|
_this._newToken.val(resp.token);
|
2016-05-18 19:25:05 +03:00
|
|
|
_this._toggleFormResult(false);
|
2016-05-19 12:20:22 +03:00
|
|
|
_this._newToken.select();
|
2016-05-18 19:25:05 +03:00
|
|
|
_this._tokenName.val('');
|
|
|
|
});
|
|
|
|
$.when(creatingToken).fail(function() {
|
|
|
|
OC.Notification.showTemporary(t('core', 'Error while creating device token'));
|
|
|
|
});
|
|
|
|
$.when(creatingToken).always(function() {
|
|
|
|
_this._toggleAddingToken(false);
|
|
|
|
});
|
|
|
|
},
|
2016-05-19 12:20:22 +03:00
|
|
|
|
|
|
|
_onNewTokenFocus: function() {
|
|
|
|
this._newToken.select();
|
|
|
|
},
|
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
_hideToken: function() {
|
|
|
|
this._toggleFormResult(true);
|
|
|
|
},
|
2016-05-19 12:20:22 +03:00
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
_toggleAddingToken: function(state) {
|
|
|
|
this._addingToken = state;
|
|
|
|
this._addTokenBtn.toggleClass('icon-loading-small', state);
|
|
|
|
},
|
2016-05-19 12:20:22 +03:00
|
|
|
|
|
|
|
_onDeleteToken: function(event) {
|
|
|
|
var $target = $(event.target);
|
|
|
|
var $row = $target.closest('tr');
|
|
|
|
var id = $row.data('id');
|
|
|
|
|
|
|
|
var token = this.collection.get(id);
|
|
|
|
if (_.isUndefined(token)) {
|
|
|
|
// Ignore event
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
var destroyingToken = token.destroy();
|
|
|
|
|
|
|
|
var _this = this;
|
|
|
|
$.when(destroyingToken).fail(function() {
|
|
|
|
OC.Notification.showTemporary(t('core', 'Error while deleting the token'));
|
|
|
|
});
|
|
|
|
$.when(destroyingToken).always(function() {
|
|
|
|
_this.render();
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
_toggleFormResult: function(showForm) {
|
|
|
|
this._form.toggleClass('hidden', !showForm);
|
|
|
|
this._result.toggleClass('hidden', showForm);
|
2016-05-18 13:03:22 +03:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
OC.Settings.AuthTokenView = AuthTokenView;
|
|
|
|
|
2016-05-18 19:25:05 +03:00
|
|
|
})(OC, _, Backbone, $, Handlebars, moment);
|