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) {
|
|
|
|
method = typeof method !== 'undefined' ? method : 'GET';
|
|
|
|
data = typeof data !== 'undefined' ? data : {};
|
|
|
|
auth = "Basic "+ btoa(store.get('user') +':'+ atob(store.get('password')));
|
2013-09-22 21:31:51 +02:00
|
|
|
//this.swap('<img src="img/ajax-loader.gif" />');
|
2013-07-01 19:32:11 +02:00
|
|
|
jQuery.ajax({
|
|
|
|
url: store.get('url') + uri,
|
|
|
|
type: method,
|
|
|
|
crossdomain: true,
|
|
|
|
data: data,
|
|
|
|
dataType: 'json',
|
|
|
|
beforeSend: function(req) {
|
|
|
|
req.setRequestHeader('Authorization', auth);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.done(function(data) {
|
|
|
|
console.log(data);
|
|
|
|
result = data;
|
|
|
|
})
|
|
|
|
.fail(function() {
|
2013-09-22 21:31:51 +02:00
|
|
|
req.redirect('#/login');
|
2013-07-01 19:32:11 +02:00
|
|
|
result = false;
|
|
|
|
})
|
|
|
|
.always(function() {
|
|
|
|
callback(result);
|
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-21 20:59:47 +02:00
|
|
|
blockSize = $('#slider').width();
|
|
|
|
|
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-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
|
2013-07-02 12:35:31 +02:00
|
|
|
if (!store.get('password')) {
|
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) {
|
2013-09-22 21:31:51 +02:00
|
|
|
$('#disconnect-button').hide();
|
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) {
|
2013-07-01 15:56:32 +02:00
|
|
|
if (data.error) {
|
2013-07-01 19:32:11 +02:00
|
|
|
c.flash('fail', 'Error: '+ data.error);
|
2013-07-01 15:56:32 +02:00
|
|
|
} else {
|
2013-09-22 21:31:51 +02:00
|
|
|
$('#disconnect-button').fadeIn();
|
2013-07-01 19:32:11 +02:00
|
|
|
c.flash('success', 'Connected :)');
|
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
|
|
|
|
2013-09-22 21:31:51 +02:00
|
|
|
sam.get('#/users', function (c) {
|
|
|
|
c.api('/users', function(data) {
|
|
|
|
console.log(data);
|
|
|
|
c.view('user_list', data);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2013-07-02 12:35:31 +02:00
|
|
|
sam.get('#/users/:user', function (c) {
|
|
|
|
c.api('/users/'+ c.params['user'], function(data) {
|
|
|
|
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) {
|
|
|
|
c.view('user_edit', data);
|
|
|
|
});
|
|
|
|
});
|
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('#/');
|
|
|
|
});
|