yunohost-admin/js/app.js

314 lines
9.9 KiB
JavaScript
Raw Normal View History

2013-07-01 15:56:32 +02:00
app = Sammy('#main', function (sam) {
2013-07-02 12:35:31 +02:00
/**
* Sammy Configuration
*
*/
// Plugins
2013-07-01 15:56:32 +02:00
sam.use('Mustache', 'ms');
2013-07-02 12:35:31 +02:00
// Initialize storage
2013-07-01 15:56:32 +02:00
var store = new Sammy.Store({name: 'storage', type: 'session'});
2013-07-02 12:35:31 +02:00
/**
* Helpers
*
*/
2013-07-01 19:32:11 +02:00
sam.helpers({
2013-07-02 12:35:31 +02:00
// Flash helper to diplay instant notifications
2013-07-01 19:32:11 +02:00
flash: function (level, message) {
flashs = store.get('flash');
if (!flashs) { flashs = {'info': [], 'fail': [], 'success': [] } }
flashs[level].push(message);
store.set('flash', flashs);
2013-07-01 15:56:32 +02:00
2013-07-01 19:32:11 +02:00
html = '';
for(lvl in flashs) {
flashs[lvl].forEach( function(msg) {
html += '<div class="'+ lvl +'">'+ msg +'</div>';
});
}
2013-09-22 21:31:51 +02:00
if (level == 'fail') { alertClass = 'alert-danger'; }
else if (level == 'success') { alertClass = 'alert-success'; }
else { alertClass = 'alert-info'; }
$('#flash').removeClass().addClass('alert '+ alertClass).html(html).fadeIn();
2013-07-01 19:32:11 +02:00
},
2013-07-02 12:35:31 +02:00
// API connection helper
2013-07-01 19:32:11 +02:00
api: function (uri, callback, method, data) {
2013-09-23 21:18:51 +02:00
c = this;
2013-07-01 19:32:11 +02:00
method = typeof method !== 'undefined' ? method : 'GET';
data = typeof data !== 'undefined' ? data : {};
auth = "Basic "+ btoa(store.get('user') +':'+ atob(store.get('password')));
jQuery.ajax({
url: store.get('url') + uri,
type: method,
crossdomain: true,
data: data,
2013-09-23 12:31:35 +02:00
traditional: true,
2013-07-01 19:32:11 +02:00
dataType: 'json',
beforeSend: function(req) {
req.setRequestHeader('Authorization', auth);
}
})
2013-09-23 21:18:51 +02:00
.success(function(data) {
data = typeof data !== 'undefined' ? data : {};
if (typeof data.win !== 'undefined') {
$.each(data.win, function(k, v) {
c.flash('success', v);
});
}
callback(data);
2013-07-01 19:32:11 +02:00
})
2013-09-23 21:18:51 +02:00
.fail(function(xhr) {
console.log(xhr);
if (xhr.status == 401) {
c.flash('fail', 'Wrong password');
} else if (typeof xhr.responseJSON !== 'undefined') {
c.flash('fail', xhr.responseJSON.error);
} else {
c.flash('fail', 'Server error');
}
2013-09-23 21:18:51 +02:00
c.redirect(store.get('path-1'));
store.clear('slide');
2013-07-01 19:32:11 +02:00
})
2013-09-23 21:18:51 +02:00
.done(function(data) {
console.log(data);
2013-07-01 15:56:32 +02:00
});
2013-07-01 19:32:11 +02:00
},
2013-07-02 12:35:31 +02:00
// Render view (cross-browser)
2013-07-01 19:32:11 +02:00
view: function (view, data) {
2013-09-21 19:46:26 +02:00
rendered = this.render('views/'+ view +'.ms', data);
function leSwap() {
$('#slideBack').hide().html('');
$('#slideTo').hide().html('');
rendered.swap(function() {
$('.slide').on('click', function() {
2013-09-22 21:31:51 +02:00
$(this).addClass('active');
2013-09-21 19:46:26 +02:00
if ($(this).hasClass('back')) {
store.set('slide', 'back');
} else {
store.set('slide', 'to');
}
});
});
}
2013-09-23 12:31:35 +02:00
blockSize = $('#slider').innerWidth();
2013-09-21 20:59:47 +02:00
2013-09-21 19:46:26 +02:00
if (store.get('slide') == 'back') {
2013-09-23 00:40:14 +02:00
$('#slideBack').css('display', 'inline-block').css('margin-left', '-'+ 2*blockSize +'px');
2013-09-21 19:46:26 +02:00
rendered.appendTo($('#slideBack'));
2013-09-23 00:40:14 +02:00
$('#main').animate({marginLeft: blockSize +'px'}, 500, function() {
2013-09-21 19:46:26 +02:00
$('#main').html($('#slideBack').html());
$('#main').css('margin-left', '0');
leSwap();
});
2013-09-22 21:31:51 +02:00
store.clear('slide');
2013-09-21 19:46:26 +02:00
} else if (store.get('slide') == 'to') {
2013-09-23 00:40:14 +02:00
$('#slideTo').css('display', 'inline-block');
2013-09-21 19:46:26 +02:00
rendered.appendTo($('#slideTo'));
2013-09-21 20:59:47 +02:00
$('#main').animate({marginLeft: '-'+ blockSize +'px'}, 500, function() {
2013-09-21 19:46:26 +02:00
$('#main').html($('#slideTo').html());
$('#main').css('margin-left', '0');
leSwap();
});
2013-09-22 21:31:51 +02:00
store.clear('slide');
2013-09-21 19:46:26 +02:00
} else {
leSwap();
}
2013-07-01 15:56:32 +02:00
}
2013-07-01 19:32:11 +02:00
});
2013-07-01 15:56:32 +02:00
2013-07-02 12:35:31 +02:00
/**
* Filters
*
*/
2013-07-01 15:56:32 +02:00
sam.before({except: {path: '#/login'}}, function (req) {
2013-07-02 12:35:31 +02:00
// Store path for further redirections
2013-09-23 21:18:51 +02:00
store.set('path-1', store.get('path'));
2013-07-01 15:56:32 +02:00
store.set('path', req.path);
2013-07-02 12:35:31 +02:00
2013-09-21 12:10:54 +02:00
// Redirect to login page if no credentials stored
if (!store.get('connected')) {
2013-07-01 15:56:32 +02:00
req.redirect('#/login');
return false;
}
2013-07-02 12:35:31 +02:00
// Clear flash display
if (!store.get('flash')) {
2013-09-22 21:31:51 +02:00
$('#flash').fadeOut(function() { $('#flash').html(''); });
2013-07-02 12:35:31 +02:00
}
2013-07-01 15:56:32 +02:00
});
2013-07-02 12:35:31 +02:00
sam.after(function () {
// Clear flash notifications
store.clear('flash');
2013-07-01 15:56:32 +02:00
});
2013-07-02 12:35:31 +02:00
/**
* Routes
*
* Note: var "c" is Sammy's route context
* @doc http://sammyjs.org/docs/api/#Sammy.EventContext
*
*/
sam.get('#/', function (c) {
c.view('home');
2013-07-01 15:56:32 +02:00
});
sam.get('#/login', function (c) {
$('#logout-button').hide();
store.set('path-1', '#/login');
2013-07-01 19:32:11 +02:00
c.view('login');
2013-07-01 15:56:32 +02:00
});
sam.post('#/login', function (c) {
2013-09-22 21:31:51 +02:00
store.set('url', 'http://'+ c.params['url']);
2013-07-02 12:35:31 +02:00
store.set('user', 'admin');
2013-07-01 15:56:32 +02:00
store.set('password', btoa(c.params['password']));
2013-07-01 19:32:11 +02:00
c.api('/users', function(data) {
store.set('connected', true);
$('#logout-button').fadeIn();
c.flash('success', 'Logged in');
2013-07-01 15:56:32 +02:00
if (store.get('path')) {
c.redirect(store.get('path'));
} else {
c.redirect('#/');
}
});
});
2013-07-02 12:35:31 +02:00
sam.get('#/logout', function (c) {
store.clear('url');
store.clear('user');
store.clear('password');
store.clear('connected');
store.set('path', '#/');
c.flash('success', 'Logged out');
c.redirect('#/login');
});
/**
* Users
*
*/
2013-09-22 21:31:51 +02:00
sam.get('#/users', function (c) {
c.api('/users', function(data) { // http://api.yunohost.org/#!/user/user_list_get_3
2013-09-22 21:31:51 +02:00
c.view('user_list', data);
});
});
2013-09-23 13:31:57 +02:00
sam.get('#/users/create', function (c) {
c.api('/domains', function(data) { // http://api.yunohost.org/#!/domain/domain_list_get_2
2013-09-23 13:31:57 +02:00
c.view('user_create', data);
});
});
sam.post('#/users', function (c) {
if (c.params['password'] == c.params['confirmation']) {
c.params['mail'] = c.params['email'] + c.params['domain'];
c.api('/users', function(data) { // http://api.yunohost.org/#!/user/user_create_post_2
2013-09-23 13:31:57 +02:00
c.redirect('#/users');
}, 'POST', c.params.toHash());
} else {
c.flash('fail', "Passwords don't match");
store.clear('slide');
//c.redirect('#/users/create');
}
});
2013-07-02 12:35:31 +02:00
sam.get('#/users/:user', function (c) {
c.api('/users/'+ c.params['user'], function(data) { // http://api.yunohost.org/#!/user/user_info_get_0
2013-07-02 12:35:31 +02:00
c.view('user_info', data);
});
});
2013-09-23 00:40:14 +02:00
sam.get('#/users/:user/edit', function (c) {
c.api('/users/'+ c.params['user'], function(data) { // http://api.yunohost.org/#!/user/user_info_get_0
2013-09-23 00:40:14 +02:00
c.view('user_edit', data);
});
});
2013-09-23 12:31:35 +02:00
sam.put('#/users/:user', function (c) {
params = {}
$.each(c.params.toHash(), function(key, value) {
2013-09-23 12:43:11 +02:00
if (value !== '' && value !== 'user') { params[key] = value; }
2013-09-23 12:31:35 +02:00
});
if ($.isEmptyObject(params)) {
c.flash('fail', 'You should modify something');
store.clear('slide');
c.redirect('#/users/'+ c.params['user'] + '/edit');
} else {
c.api('/users/'+ c.params['user'], function(data) { // http://api.yunohost.org/#!/user/user_update_put_1
2013-09-23 12:31:35 +02:00
c.redirect('#/users/'+ c.params['user']);
}, 'PUT', params);
}
});
2013-09-23 13:31:57 +02:00
2013-09-23 12:43:11 +02:00
sam.get('#/users/:user/delete', function (c) {
if (confirm('Are you sure you want to delete '+ c.params['user'] +' ?')) {
c.api('/users/'+ c.params['user'], function(data) { // http://api.yunohost.org/#!/user/user_delete_delete_4
2013-09-23 12:43:11 +02:00
c.redirect('#/users');
}, 'DELETE');
} else {
store.clear('slide');
c.redirect('#/users/'+ c.params['user']);
}
});
/**
* Domains
*
*/
sam.get('#/domains', function (c) {
c.api('/domains', function(data) { // http://api.yunohost.org/#!/domain/domain_list_get_2
c.view('domain_list', data);
});
});
sam.get('#/domains/add', function (c) {
c.view('domain_add', {'DDomains': ['.nohost.me', '.noho.st']});
});
sam.post('#/domains', function (c) {
if (c.params['domain'] == '') {
if (c.params['ddomain'] == '') {
c.flash('fail', "You should indicate a domain");
store.clear('slide');
c.redirect('#/domains/add');
}
params = { 'domains': c.params['ddomain'] + c.params['ddomain-ext'] }
} else {
params = { 'domains': c.params['domain'] }
}
c.api('/domains', function(data) { // http://api.yunohost.org/#!/domain/domain_add_post_1
c.redirect('#/domains');
}, 'POST', params);
});
2013-07-01 15:56:32 +02:00
});
2013-07-02 12:35:31 +02:00
/**
* Run the app
*
*/
2013-07-01 15:56:32 +02:00
$(document).ready(function () {
app.run('#/');
2013-09-24 19:02:12 +02:00
$('#slider-container').width(2*$('#slider').innerWidth() +'px');
$(window).resize(function() {
$('#slider-container').width(2*$('#slider').innerWidth() +'px');
});
2013-07-01 15:56:32 +02:00
});