mirror of
https://github.com/serghey-rodin/vesta.git
synced 2024-12-25 05:21:12 -08:00
472 lines
15 KiB
JavaScript
472 lines
15 KiB
JavaScript
// Init kinda namespace object
|
|
var VE = { // Vesta Events object
|
|
core: {}, // core functions
|
|
navigation: {
|
|
state: {
|
|
active_menu: 1,
|
|
menu_selector: '.l-stat__col',
|
|
menu_active_selector: '.l-stat__col--active'
|
|
}
|
|
}, // menu and element navigation functions
|
|
notifications: {},
|
|
callbacks: { // events callback functions
|
|
click: {},
|
|
mouseover: {},
|
|
mouseout: {},
|
|
keypress: {}
|
|
},
|
|
helpers: {}, // simple handy methods
|
|
tmp: {
|
|
sort_par: 'sort-name',
|
|
sort_direction: -1,
|
|
sort_as_int: 0,
|
|
form_changed: 0,
|
|
search_activated: 0,
|
|
search_display_interval: 0,
|
|
search_hover_interval: 0
|
|
}
|
|
};
|
|
|
|
/*
|
|
* Main method that invokes further event processing
|
|
* @param root is root HTML DOM element that. Pass HTML DOM Element or css selector
|
|
* @param event_type (eg: click, mouseover etc..)
|
|
*/
|
|
VE.core.register = function(root, event_type) {
|
|
var root = !root ? 'body' : root; // if elm is not passed just bind events to body DOM Element
|
|
var event_type = !event_type ? 'click' : event_type; // set event type to "click" by default
|
|
$(root).bind(event_type, function(evt) {
|
|
var elm = $(evt.target);
|
|
VE.core.dispatch(evt, elm, event_type); // dispatch captured event
|
|
});
|
|
}
|
|
|
|
/*
|
|
* Dispatch event that was previously registered
|
|
* @param evt related event object
|
|
* @param elm that was catched
|
|
* @param event_type (eg: click, mouseover etc..)
|
|
*/
|
|
VE.core.dispatch = function(evt, elm, event_type) {
|
|
if ('undefined' == typeof VE.callbacks[event_type]) {
|
|
return VE.helpers.warn('There is no corresponding object that should contain event callbacks for "'+event_type+'" event type');
|
|
}
|
|
// get class of element
|
|
var classes = $(elm).attr('class');
|
|
// if no classes are attached, then just stop any further processings
|
|
if (!classes) {
|
|
return; // no classes assigned
|
|
}
|
|
// split the classes and check if it related to function
|
|
$(classes.split(/\s/)).each(function(i, key) {
|
|
VE.callbacks[event_type][key] && VE.callbacks[event_type][key](evt, elm);
|
|
});
|
|
}
|
|
|
|
//
|
|
// CALLBACKS
|
|
//
|
|
|
|
|
|
|
|
/*
|
|
* Suspend action
|
|
*/
|
|
VE.callbacks.click.do_suspend = function(evt, elm) {
|
|
var ref = elm.hasClass('actions-panel') ? elm : elm.parents('.actions-panel');
|
|
var url = $('input[name="suspend_url"]', ref).val();
|
|
var dialog_elm = ref.find('.confirmation-text-suspention');
|
|
VE.helpers.createConfirmationDialog(dialog_elm, '', url);
|
|
}
|
|
|
|
/*
|
|
* Unsuspend action
|
|
*/
|
|
VE.callbacks.click.do_unsuspend = function(evt, elm) {
|
|
var ref = elm.hasClass('actions-panel') ? elm : elm.parents('.actions-panel');
|
|
var url = $('input[name="unsuspend_url"]', ref).val();
|
|
var dialog_elm = ref.find('.confirmation-text-suspention');
|
|
VE.helpers.createConfirmationDialog(dialog_elm, '', url);
|
|
}
|
|
|
|
/*
|
|
* Delete action
|
|
*/
|
|
VE.callbacks.click.do_delete = function(evt, elm) {
|
|
var ref = elm.hasClass('actions-panel') ? elm : elm.parents('.actions-panel');
|
|
var url = $('input[name="delete_url"]', ref).val();
|
|
var dialog_elm = ref.find('.confirmation-text-delete');
|
|
VE.helpers.createConfirmationDialog(dialog_elm, '', url);
|
|
}
|
|
|
|
|
|
/*
|
|
* Create dialog box on the fly
|
|
* @param elm Element which contains the dialog contents
|
|
* @param dialog_title
|
|
* @param confirmed_location_url URL that will be redirected to if user hit "OK"
|
|
* @param custom_config Custom configuration parameters passed to dialog initialization (optional)
|
|
*/
|
|
VE.helpers.createConfirmationDialog = function(elm, dialog_title, confirmed_location_url, custom_config) {
|
|
|
|
var custom_config = !custom_config ? {} : custom_config;
|
|
var config = {
|
|
modal: true,
|
|
//autoOpen: true,
|
|
resizable: false,
|
|
width: 360,
|
|
title: dialog_title,
|
|
close: function() {
|
|
$(this).dialog("destroy");
|
|
},
|
|
buttons: {
|
|
"OK": function(event, ui) {
|
|
location.href = confirmed_location_url;
|
|
},
|
|
Cancel: function() {
|
|
$(this).dialog("close");
|
|
}
|
|
},
|
|
create:function () {
|
|
$(this).closest(".ui-dialog")
|
|
.find(".ui-button:first")
|
|
.addClass("submit");
|
|
$(this).closest(".ui-dialog")
|
|
.find(".ui-button")
|
|
.eq(1) // the first button
|
|
.addClass("cancel");
|
|
}
|
|
}
|
|
|
|
|
|
var reference_copied = $(elm[0]).clone();
|
|
console.log(reference_copied);
|
|
config = $.extend(config, custom_config);
|
|
$(reference_copied).dialog(config);
|
|
|
|
}
|
|
|
|
/*
|
|
* Simple debug output
|
|
*/
|
|
VE.helpers.warn = function(msg) {
|
|
alert('WARNING: ' + msg);
|
|
}
|
|
|
|
VE.helpers.extendPasswordFields = function() {
|
|
var references = ['.password'];
|
|
|
|
$(document).ready(function() {
|
|
$(references).each(function(i, ref) {
|
|
VE.helpers.initAdditionalPasswordFieldElements(ref);
|
|
});
|
|
});
|
|
}
|
|
|
|
VE.helpers.initAdditionalPasswordFieldElements = function(ref) {
|
|
var enabled = $.cookie('hide_passwords') == '1' ? true : false;
|
|
if (enabled) {
|
|
VE.helpers.hidePasswordFieldText(ref);
|
|
}
|
|
|
|
$(ref).prop('autocomplete', 'off');
|
|
|
|
var enabled_html = enabled ? '' : 'show-passwords-enabled-action';
|
|
var html = '<span class="hide-password"><img class="toggle-psw-visibility-icon ' + enabled_html + '" onClick="VE.helpers.toggleHiddenPasswordText(\'' + ref + '\', this)" src="/images/toggle_password.png" /></span>';
|
|
$(ref).after(html);
|
|
}
|
|
|
|
VE.helpers.hidePasswordFieldText = function(ref) {
|
|
$.cookie('hide_passwords', '1', { expires: 365, path: '/' });
|
|
$(ref).prop('type', 'password');
|
|
}
|
|
|
|
VE.helpers.revealPasswordFieldText = function(ref) {
|
|
$.cookie('hide_passwords', '0', { expires: 365, path: '/' });
|
|
$(ref).prop('type', 'text');
|
|
}
|
|
|
|
VE.helpers.toggleHiddenPasswordText = function(ref, triggering_elm) {
|
|
$(triggering_elm).toggleClass('show-passwords-enabled-action');
|
|
|
|
if ($(ref).prop('type') == 'text') {
|
|
VE.helpers.hidePasswordFieldText(ref);
|
|
}
|
|
else {
|
|
VE.helpers.revealPasswordFieldText(ref);
|
|
}
|
|
}
|
|
|
|
VE.helpers.refresh_timer = {
|
|
speed: 50,
|
|
degr: 180,
|
|
right: 0,
|
|
left: 0,
|
|
periodical: 0,
|
|
first: 1,
|
|
|
|
start: function(){
|
|
this.periodical = setInterval(function(){VE.helpers.refresh_timer.turn()}, this.speed);
|
|
},
|
|
|
|
stop: function(){
|
|
clearTimeout(this.periodical);
|
|
},
|
|
|
|
turn: function(){
|
|
this.degr += 1;
|
|
|
|
if (this.first && this.degr >= 361){
|
|
this.first = 0;
|
|
this.degr = 180;
|
|
this.left.css({'-webkit-transform': 'rotate(180deg)'});
|
|
this.left.css({'transform': 'rotate(180deg)'});
|
|
this.left.children('.loader-half').addClass('dark');
|
|
}
|
|
if (!this.first && this.degr >= 360){
|
|
this.first = 1;
|
|
this.degr = 180;
|
|
this.left.css({'-webkit-transform': 'rotate(0deg)'});
|
|
this.right.css({'-webkit-transform': 'rotate(180deg)'});
|
|
this.left.css({'transform': 'rotate(0deg)'});
|
|
this.right.css({'transform': 'rotate(180deg)'});
|
|
this.left.children('.loader-half').removeClass('dark');
|
|
|
|
this.stop();
|
|
location.reload();
|
|
}
|
|
|
|
if (this.first){
|
|
this.right.css({'-webkit-transform': 'rotate('+this.degr+'deg)'});
|
|
this.right.css({'transform': 'rotate('+this.degr+'deg)'});
|
|
}
|
|
else{
|
|
this.left.css({'-webkit-transform': 'rotate('+this.degr+'deg)'});
|
|
this.left.css({'transform': 'rotate('+this.degr+'deg)'});
|
|
}
|
|
}
|
|
}
|
|
|
|
VE.navigation.enter_focused = function() {
|
|
if($('.units').hasClass('active')){
|
|
location.href=($('.units.active .l-unit.focus .actions-panel__col.actions-panel__edit a').attr('href'));
|
|
} else {
|
|
if($(VE.navigation.state.menu_selector + '.focus a').attr('href')){
|
|
location.href=($(VE.navigation.state.menu_selector + '.focus a').attr('href'));
|
|
}
|
|
}
|
|
}
|
|
|
|
VE.navigation.move_focus_left = function(){
|
|
var index = parseInt($(VE.navigation.state.menu_selector).index($(VE.navigation.state.menu_selector+'.focus')));
|
|
if(index == -1)
|
|
index = parseInt($(VE.navigation.state.menu_selector).index($(VE.navigation.state.menu_active_selector)));
|
|
|
|
if($('.units').hasClass('active')){
|
|
$('.units').removeClass('active');
|
|
if(VE.navigation.state.active_menu == 0){
|
|
$('.l-menu').addClass('active');
|
|
} else {
|
|
$('.l-stat').addClass('active');
|
|
}
|
|
index++;
|
|
}
|
|
|
|
$(VE.navigation.state.menu_selector).removeClass('focus');
|
|
|
|
if(index > 0){
|
|
$($(VE.navigation.state.menu_selector)[index-1]).addClass('focus');
|
|
} else {
|
|
VE.navigation.switch_menu('last');
|
|
}
|
|
}
|
|
|
|
VE.navigation.move_focus_right = function(){
|
|
var max_index = $(VE.navigation.state.menu_selector).length-1;
|
|
var index = parseInt($(VE.navigation.state.menu_selector).index($(VE.navigation.state.menu_selector+'.focus')));
|
|
if(index == -1)
|
|
index = parseInt($(VE.navigation.state.menu_selector).index($(VE.navigation.state.menu_active_selector))) || 0;
|
|
$(VE.navigation.state.menu_selector).removeClass('focus');
|
|
|
|
if($('.units').hasClass('active')){
|
|
$('.units').removeClass('active');
|
|
if(VE.navigation.state.active_menu == 0){
|
|
$('.l-menu').addClass('active');
|
|
} else {
|
|
$('.l-stat').addClass('active');
|
|
}
|
|
index--;
|
|
}
|
|
|
|
if(index < max_index){
|
|
$($(VE.navigation.state.menu_selector)[index+1]).addClass('focus');
|
|
} else {
|
|
VE.navigation.switch_menu('first');
|
|
}
|
|
}
|
|
|
|
VE.navigation.move_focus_down = function(){
|
|
var max_index = $('.units .l-unit:not(.header)').length-1;
|
|
var index = parseInt($('.units .l-unit').index($('.units .l-unit.focus')));
|
|
|
|
if($('.l-menu').hasClass('active') || $('.l-stat').hasClass('active')){
|
|
$('.l-menu').removeClass('active');
|
|
$('.l-stat').removeClass('active');
|
|
$('.units').addClass('active');
|
|
index--;
|
|
|
|
if(index == -2)
|
|
index = -1;
|
|
}
|
|
|
|
if(index < max_index){
|
|
$('.units .l-unit.focus').removeClass('focus');
|
|
$($('.units .l-unit:not(.header)')[index+1]).addClass('focus');
|
|
|
|
$('html, body').animate({
|
|
scrollTop: $('.units .l-unit.focus').offset().top - 200
|
|
}, 80);
|
|
}
|
|
}
|
|
|
|
VE.navigation.move_focus_up = function(){
|
|
var index = parseInt($('.units .l-unit:not(.header)').index($('.units .l-unit.focus')));
|
|
|
|
if(index == -1)
|
|
index = 0;
|
|
|
|
if($('.l-menu').hasClass('active') || $('.l-stat').hasClass('active')){
|
|
$('.l-menu').removeClass('active');
|
|
$('.l-stat').removeClass('active');
|
|
$('.units').addClass('active');
|
|
index++;
|
|
}
|
|
|
|
if(index > 0){
|
|
$('.units .l-unit.focus').removeClass('focus');
|
|
$($('.units .l-unit:not(.header)')[index-1]).addClass('focus');
|
|
|
|
$('html, body').animate({
|
|
scrollTop: $('.units .l-unit.focus').offset().top - 200
|
|
}, 80);
|
|
}
|
|
}
|
|
|
|
VE.navigation.switch_menu = function(position){
|
|
position = position || 'first'; // last
|
|
|
|
if(VE.navigation.state.active_menu == 0){
|
|
VE.navigation.state.active_menu = 1;
|
|
VE.navigation.state.menu_selector = '.l-stat__col';
|
|
VE.navigation.state.menu_active_selector = '.l-stat__col--active';
|
|
$('.l-menu').removeClass('active');
|
|
$('.l-stat').addClass('active');
|
|
|
|
if(position == 'first'){
|
|
$($(VE.navigation.state.menu_selector)[0]).addClass('focus');
|
|
} else {
|
|
var max_index = $(VE.navigation.state.menu_selector).length-1;
|
|
$($(VE.navigation.state.menu_selector)[max_index]).addClass('focus');
|
|
}
|
|
} else {
|
|
VE.navigation.state.active_menu = 0;
|
|
VE.navigation.state.menu_selector = '.l-menu__item';
|
|
VE.navigation.state.menu_active_selector = '.l-menu__item--active';
|
|
$('.l-menu').addClass('active');
|
|
$('.l-stat').removeClass('active');
|
|
|
|
if(position == 'first'){
|
|
$($(VE.navigation.state.menu_selector)[0]).addClass('focus');
|
|
} else {
|
|
var max_index = $(VE.navigation.state.menu_selector).length-1;
|
|
$($(VE.navigation.state.menu_selector)[max_index]).addClass('focus');
|
|
}
|
|
}
|
|
}
|
|
|
|
VE.notifications.get_list = function(){
|
|
/// TODO get notifications only once
|
|
$.ajax({
|
|
url: "/list/notifications/?ajax=1",
|
|
dataType: "json"
|
|
}).done(function(data) {
|
|
var acc = [];
|
|
|
|
$.each(data, function(i, elm){
|
|
var tpl = Tpl.get('notification', 'WEB');
|
|
if(elm.ACK == 'no')
|
|
tpl.set(':UNSEEN', 'unseen');
|
|
else
|
|
tpl.set(':UNSEEN', '');
|
|
|
|
tpl.set(':ID', elm.ID);
|
|
tpl.set(':TYPE', elm.TYPE);
|
|
tpl.set(':TOPIC', elm.TOPIC);
|
|
tpl.set(':NOTICE', elm.NOTICE);
|
|
acc.push(tpl.finalize());
|
|
});
|
|
|
|
if(!Object.keys(data).length){
|
|
var tpl = Tpl.get('notification_empty', 'WEB');
|
|
acc.push(tpl.finalize());
|
|
}
|
|
|
|
$('.notification-container').html(acc.done()).show();
|
|
|
|
$('.notification-container .mark-seen').click(function(event){
|
|
// VE.notifications.mark_seen($(event.target).attr('id').replace("notification-", ""));
|
|
VE.notifications.delete($(event.target).attr('id').replace("notification-", ""));
|
|
});
|
|
|
|
});
|
|
}
|
|
|
|
|
|
VE.notifications.delete = function(id){
|
|
$('#notification-'+id).parents('li').hide();
|
|
$.ajax({
|
|
url: "/delete/notification/?delete=1¬ification_id="+id+"&token="+$('#token').attr('token')
|
|
});
|
|
if($('.notification-container li:visible').length == 0)
|
|
$('.l-profile__notifications').removeClass('updates').removeClass('active');
|
|
}
|
|
|
|
VE.notifications.mark_seen = function(id){
|
|
$('#notification-'+id).parents('li').removeClass('unseen');
|
|
$.ajax({
|
|
url: "/delete/notification/?notification_id="+id+"&token="+$('#token').attr('token')
|
|
});
|
|
if($('.notification-container .unseen').length == 0)
|
|
$('.l-profile__notifications').removeClass('updates');
|
|
}
|
|
|
|
|
|
VE.navigation.init = function(){
|
|
if($('.l-menu__item.l-menu__item--active').length){
|
|
// VE.navigation.switch_menu();
|
|
VE.navigation.state.active_menu = 0;
|
|
VE.navigation.state.menu_selector = '.l-menu__item';
|
|
VE.navigation.state.menu_active_selector = '.l-menu__item--active';
|
|
$('.l-menu').addClass('active');
|
|
$('.l-stat').removeClass('active');
|
|
} else {
|
|
$('.l-stat').addClass('active');
|
|
}
|
|
}
|
|
|
|
VE.navigation.shortcut = function(elm){
|
|
var action = elm.attr('key-action');
|
|
|
|
if(action == 'js'){
|
|
var e = elm.find('.data-controls');
|
|
VE.core.dispatch(true, e, 'click');
|
|
}
|
|
if(action == 'href') {
|
|
location.href=elm.find('a').attr('href');
|
|
}
|
|
}
|
|
|
|
VE.helpers.extendPasswordFields();
|
|
|
|
|