spreed/js/admin/stun-server.js

135 строки
3.4 KiB
JavaScript

/* global OC, OCP, OCA, $, _, Handlebars */
(function(OC, OCP, OCA, $, _, Handlebars) {
'use strict';
OCA.VideoCalls = OCA.VideoCalls || {};
OCA.VideoCalls.Admin = OCA.VideoCalls.Admin || {};
OCA.VideoCalls.Admin.StunServer = {
TEMPLATE: '<div class="stun-server">' +
' <input type="text" name="stun_server" placeholder="stunserver:port" value="{{server}}" />' +
' <a class="icon icon-delete" title="' + t('spreed', 'Delete server') + '"></a>' +
' <a class="icon icon-add" title="' + t('spreed', 'Add new server') + '"></a>' +
' <span class="icon icon-checkmark-color hidden" title="' + t('spreed', 'Saved') + '"></span>' +
'</div>',
$list: undefined,
template: undefined,
init: function() {
this.template = Handlebars.compile(this.TEMPLATE);
this.$list = $('div.stun-servers');
this.renderList();
},
renderList: function() {
var servers = this.$list.data('servers');
_.each(servers, function(server) {
this.$list.append(
this.renderServer(server)
);
}.bind(this));
if (servers.length === 0) {
this.addNewTemplate('stun.nextcloud.com:443');
}
},
addNewTemplate: function(server) {
server = _.isString(server) ? server : '';
var $server = this.renderServer(server);
this.$list.append($server);
return $server;
},
deleteServer: function(e) {
e.stopPropagation();
var $server = $(e.currentTarget).parents('div.stun-server').first();
$server.remove();
this.saveServers();
if (this.$list.find('div.stun-server').length === 0) {
var $newServer = this.addNewTemplate('stun.nextcloud.com:443');
this.temporaryShowSuccess($newServer);
}
},
saveServers: function() {
var servers = [],
$error = [],
$success = [],
self = this;
this.$list.find('input').removeClass('error');
this.$list.find('.icon-checkmark-color').addClass('hidden');
this.$list.find('input').each(function() {
var server = this.value;
// Remove HTTP or HTTPS protocol, if provided
if (server.startsWith('https://')) {
server = server.substr(8);
} else if (server.startsWith('http://')) {
server = server.substr(7);
}
var parts = server.split(':');
if (parts.length !== 2) {
$(this).addClass('error');
} else {
if (parts[1].match(/^([1-9]\d{0,4})$/) === null ||
parseInt(parts[1]) > Math.pow(2, 16)) { //65536
$error.push($(this));
} else {
servers.push(this.value);
$success.push($(this).parent('div.stun-server'));
}
}
});
OCP.AppConfig.setValue('spreed', 'stun_servers', JSON.stringify(servers), {
success: function() {
_.each($error, function($server) {
$server.addClass('error');
});
_.each($success, function($server) {
self.temporaryShowSuccess($server);
});
}
});
},
temporaryShowSuccess: function($server) {
var $icon = $server.find('.icon-checkmark-color');
$icon.removeClass('hidden');
setTimeout(function() {
$icon.addClass('hidden');
}, 2000);
},
renderServer: function(server) {
var $template = $(this.template({
server: server
}));
$template.find('a.icon-add').on('click', this.addNewTemplate.bind(this));
$template.find('a.icon-delete').on('click', this.deleteServer.bind(this));
$template.find('input').on('change', this.saveServers.bind(this));
return $template;
}
};
})(OC, OCP, OCA, $, _, Handlebars);
$(document).ready(function(){
OCA.VideoCalls.Admin.StunServer.init();
});