(function () { 'use strict'; angular .module('hyperion') .controller('system.MainController', ['$http', '$state', '$stateParams', '$scope', '$rootScope', '$sessionStorage', '$timeout', '$websocket', '$filter', '$location', 'authService', 'sysClock', 'timerange', 'CONFIG', function($http, $state, $stateParams, $scope, $rootScope, $sessionStorage, $timeout, $websocket, $filter, $location, authService, sysClock, timerange, CONFIG){ $scope.menuSmall = $sessionStorage.currentUser.smallMenu; $scope.current_title = $sessionStorage.currentUser.title; $scope.current_first_name = $sessionStorage.currentUser.first_name; $scope.current_last_name = $sessionStorage.currentUser.last_name; $scope.current_company = $sessionStorage.currentUser.company_name; $scope.current_last_signin = $sessionStorage.currentUser.last_signin; /////////////////////////////////////////////////////////////////////// // SCOPE STATUS var scopeIsActive = true; $scope.$on('$destroy', function() { scopeIsActive = false; }); /////////////////////////////////////////////////////////////////////// // CLOCK INIT FUNCTION $timeout(function() { clock_update(true); }); /////////////////////////////////////////////////////////////////////// // WEBSOCKET // https://github.com/wilk/ng-websocket $scope.connection = {state:'connecting', title:'CONNECTING...'}; console.log($sessionStorage.currentUser.wshost); var ws = $websocket.$new({ url: $sessionStorage.currentUser.wshost+'?token='+$sessionStorage.currentUser.auth_token_str, lazy: false, reconnect: true, enqueue: false, mock: false, protocols: ['binary', 'base64'] }); ws.$on('$open', function() { $scope.connection = {state:'open', title:'CONNECTED'}; }); ws.$on('$close', function() { $scope.connection = {state:'error', title:'CONNECTION ERROR'}; }); ws.$on('$error', function() { $scope.connection = {state:'error', title:'CONNECTION ERROR'}; }); ws.$on('$message', function(message) { //console.log('MainController ws.message: ', message); if(message.event) { switch(message.event.toLowerCase()) { case 'auth:update': $rootScope.$broadcast('auth:update', { id: message.data.location, status: message.data.status, expiration: message.data.token_exp }); break; case 'light:state': $rootScope.$broadcast('light:state', { id: message.object, state: message.data }); break; case 'light:request:new': case 'light:request:update': $rootScope.$broadcast('light:request', { id: message.object, request: message.data }); break; case 'socket:state': $rootScope.$broadcast('socket:state', { id: message.object, state: message.data }); break; case 'socket:request:update': $rootScope.$broadcast('socket:request', { id: message.object, request: message.data }); break; } } }); /////////////////////////////////////////////////////////////////////// // EVENTS MONITORING /* $scope.alert_off = function() { $scope.alarm_active = false; $scope.alarm_type = null; } $scope.alert_alarm = function() { $scope.alarm_active = true; $scope.alarm_type = 'alarm'; } $scope.alert_warning = function() { $scope.alarm_active = true; $scope.alarm_type = 'trouble'; } $sessionStorage.eventCache = { 'active':null, // currently active (highest priority) element or null if no active alert is set - set by trigger function 'trouble':[], // list of active troubles 'supervisory':[], // list of active supervisory 'alarm':[] // list of active alarms }; $scope.alarm_active = false; $scope.alarm_type = null; // Function to add element to eventCache table var addAlarm = function(event) { console.log('MainController::addAlarm', event); switch(event.event_code) { case '004': // TROUBLE console.log('MainController::addAlarm push trouble'); $sessionStorage.eventCache.trouble.push(event); break; case '005': // SUPERVISORY $sessionStorage.eventCache.supervisory.push(event); break; case '006': // ALARM $sessionStorage.eventCache.alarm.push(event); break; } }; // Function to remove element from eventCache table var clearAlarm = function(event_id) { //console.log($sessionStorage.eventCache); if($sessionStorage.eventCache.active.id == event_id) { //console.log('clear $sessionStorage.eventCache.active'); $sessionStorage.eventCache.active = null; } $.each($sessionStorage.eventCache.alarm, function(index, element){ if(element) { if(element.id == event_id) { //console.log('remove ALARM['+index+']'); $sessionStorage.eventCache.alarm.splice(index, 1); } } }); $.each($sessionStorage.eventCache.supervisory, function(index, element){ if(element) { if(element.id == event_id) { //console.log('remove SUPERVISORY['+index+']'); $sessionStorage.eventCache.supervisory.splice(index, 1); } } }); $.each($sessionStorage.eventCache.trouble, function(index, element){ if(element) { if(element.id == event_id) { //console.log('remove TROUBLE['+index+']'); $sessionStorage.eventCache.trouble.splice(index, 1); } } }); }; // Scan eventCache and decide if turn alert ON or OFF // .. this should be executed after any eventCache change var trigger = function() { console.log('MainController::trigger'); console.log('MainController::trigger > eventCache.alarm.length: ', $sessionStorage.eventCache.alarm.length); console.log('MainController::trigger > eventCache.supervisory.length: ', $sessionStorage.eventCache.supervisory.length); console.log('MainController::trigger > eventCache.trouble.length: ', $sessionStorage.eventCache.trouble.length); if($sessionStorage.eventCache.alarm.length > 0) { // show ALARM alert $scope.alarm_active = true; $scope.alarm_type = 'alarm'; $sessionStorage.eventCache.active = $sessionStorage.eventCache.alarm[0]; console.log($sessionStorage.eventCache.alarm); } else { if($sessionStorage.eventCache.supervisory.length > 0) { // show SUPERVISORY alert $scope.alarm_active = true; $scope.alarm_type = 'supervisory'; $sessionStorage.eventCache.active = $sessionStorage.eventCache.supervisory[0]; } else { if($sessionStorage.eventCache.trouble.length > 0) { console.log('MainController::trigger->trouble: ',$sessionStorage.eventCache.trouble[0]); // show TROUBLE alert $scope.alarm_active = true; $scope.alarm_type = 'trouble'; $sessionStorage.eventCache.active = $sessionStorage.eventCache.trouble[0]; } else { // clear all alerts $scope.alarm_active = false; $scope.alarm_type = ''; $sessionStorage.eventCache.active = null; } } } $rootScope.$broadcast('event-refresh', null); }; // Get current events status (all [active-not cleared] events) $http.get('/api/events/active').then(function(response) { $.each(response.data, function(index, event){ addAlarm(event); }); trigger(); }); // receive events from WebSocket $scope.$on('event', function(event, payload) { console.log('-----------------------'); console.log(payload.event); console.log('-----------------------'); addAlarm(payload.event); trigger(); }); $scope.$on('clear', function(event, payload) { //console.log('-----------------------'); //console.log('CLEAR: '+payload.id); //console.log('-----------------------'); clearAlarm(payload.id); trigger(); }); */ ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // CLOCK SETTINGS & PREREQUISITES // Cache some selectors var watchmaker = $('#watchmaker'); var date = watchmaker.find('#date'); var clock = watchmaker.find('#clock'); var ampm = clock.find('.ampm'); var weekday_holder = watchmaker.find('#weekdays'); // Map digits to their names (this will be an array) var digit_to_name = 'zero one two three four five six seven eight nine'.split(' '); // Add the weekday names var weekday_names = 'MON TUE WED THU FRI SAT SUN'.split(' '); $.each(weekday_names, function(){ weekday_holder.append('' + this + ''); }); var weekdays = weekday_holder.find('span'); // This object will hold the digit elements var digits = {}; // Positions for the hours, minutes, and seconds var positions = ['h1', 'h2', ':', 'm1', 'm2', ':', 's1', 's2']; // Generate the digits with the needed markup, and add them to the clock var digit_holder = clock.find('.digits'); $.each(positions, function(){ if(this === ':'){ digit_holder.append('
'); } else{ var pos = $('
'); for(var i=1; i<8; i++){ pos.append(''); } // Set the digits as key:value pairs in the digits object digits[this] = pos; // Add the digit elements to the page digit_holder.append(pos); } }); /////////////////////////////////////////////////////////////////////// // CLOCK FUNCTIONS // Return time zone abbreviation based on provided time zone - or wild guess ... var getTimeZoneAbbr = function(timezone) { if((typeof timezone !== 'undefined') && timezone) { // expecting something like 'Europe/Warsaw' return moment.tz.zone(timezone).abbr(moment()); } else { //return moment.tz.zone(moment.tz.guess()).abbr(moment()); return moment.tz.zone(sysClock.getTimeZone()).abbr(moment()); } }; // Return moment.js object based on provided time zone - or wild guess ... var getClockTime = function(timezone) { if((typeof timezone !== 'undefined') && timezone) { // expecting something like 'Europe/Warsaw' return moment.tz(timezone); } else { //return moment.tz.zone(moment.tz.guess()); return moment.tz(sysClock.getTimeZone()); } }; // Return 12H or 24H clock format based on settings var getClockFormat = function(){ var time = getClockTime(); if(sysClock.isClock12()) { // return true if clock is set to 12h return time.format("hhmmssdA"); //12h } else { return time.format("HHmmssd"); //24h } }; // Switch clock display between 12H and 24H $scope.flipClockSettings = function() { sysClock.flipClock(); clock_update(false); }; $scope.$on('clockUpdate', function() { clock_update(false); }); // Run a timer every second and update the clock function clock_update(runTimeout) { // Use moment.js to output the current time as a string // hh is for the hours in 12-hour format, // mm - minutes, ss-seconds (all with leading zeroes), // d is for day of week and A is for AM/PM //var now = moment(); var now = getClockFormat(); digits.h1.attr('class', digit_to_name[now[0]]); digits.h2.attr('class', digit_to_name[now[1]]); digits.m1.attr('class', digit_to_name[now[2]]); digits.m2.attr('class', digit_to_name[now[3]]); digits.s1.attr('class', digit_to_name[now[4]]); digits.s2.attr('class', digit_to_name[now[5]]); // The library returns Sunday as the first day of the week. // Stupid, I know. Lets shift all the days one position down, // and make Sunday last var dow = now[6]; dow--; // Sunday! if(dow < 0){ dow = 6; // Make it last } // Mark the active day of the week weekdays.removeClass('active').eq(dow).addClass('active'); // Set the am/pm text: var ampm_value = ''; if(typeof now[7] !== 'undefined' && typeof now[8] !== 'undefined') { ampm_value = now[7]+now[8]; } ampm.text(ampm_value); // Set timezone text: $('#timezone').text(getTimeZoneAbbr(sysClock.getTimeZone())); // Set date date.text(getClockTime().format('MMMM Do, YYYY').toUpperCase()); // Schedule this function to be run again in 1 sec // setTimeout(clock_update, 1000); if(runTimeout) { $timeout(function() { if(scopeIsActive) { // stop execution is scope is destroyed clock_update(runTimeout); } }, 1000); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // TIMEZONE var timezones = [ {name:"Coordinated Universal Time (UTC)",iana:"UTC",top:true}, {name:"Atlantic Time (Canada)",iana:"America/Halifax",top:true}, {name:"Eastern Time (US and Canada)",iana:"America/New_York",top:true}, {name:"Central Time (US and Canada)",iana:"America/Chicago",top:true}, {name:"Mountain Time (US and Canada)",iana:"America/Denver",top:true}, {name:"Pacific Time (US and Canada)",iana:"America/Los_Angeles",top:true}, {name:"Central European Time",iana:"Europe/Warsaw",top:true}, {name:'Azores',iana:'Atlantic/Azores',top:false}, {name:'Cape Verde Islands',iana:'Atlantic/Cape_Verde',top:false}, {name:'Brasilia',iana:'America/Sao_Paulo',top:false}, {name:'Georgetown',iana:'America/Guyana',top:false}, {name:'Greenland',iana:'America/Godthab',top:false}, {name:'Montevideo',iana:'America/Montevideo',top:false}, {name:'Newfoundland',iana:'America/St_Johns',top:false}, {name:'Georgetown, La Paz, San Juan',iana:'America/La_Paz',top:false}, {name:'Santiago',iana:'America/Santiago',top:false}, {name:'Manaus',iana:'America/Manaus',top:false}, {name:'Asuncion',iana:'America/Asuncion',top:false}, {name:'Caracas',iana:'America/Caracas',top:false}, {name:'Indiana (East)',iana:'America/Indiana/Indianapolis',top:false}, {name:'Bogota, Lima, Quito',iana:'America/Bogota',top:false}, {name:'Saskatchewan',iana:'America/Regina',top:false}, {name:'Guadalajara, Mexico City, Monterrey',iana:'America/Mexico_City',top:false}, {name:'Chihuahua, La Paz, Mazatlan',iana:'America/Mazatlan',top:false}, {name:'Arizona',iana:'America/Phoenix',top:false}, {name:'Chihuahua, La Paz, Mazatlan',iana:'America/Mazatlan',top:false}, {name:'Tijuana, Baja California',iana:'America/Tijuana',top:false}, {name:'Alaska',iana:'America/Juneau',top:false}, {name:'Hawaii',iana:'Pacific/Honolulu',top:false}, {name:'Midway Island, Samoa',iana:'Pacific/Pago_Pago',top:false}, {name:'Greenwich Mean Time: Dublin, Edinburgh, Lisbon, London',iana:'Europe/London',top:false}, {name:'Monrovia, Reykjavik',iana:'Africa/Monrovia',top:false}, {name:'Casablanca',iana:'Africa/Casablanca',top:false}, {name:'Belgrade, Bratislava, Budapest, Ljubljana, Prague',iana:'Europe/Prague',top:false}, {name:'Sarajevo, Skopje, Warsaw, Zagreb',iana:'Europe/Warsaw',top:false}, {name:'Brussels, Copenhagen, Madrid, Paris',iana:'Europe/Brussels',top:false}, {name:'Amsterdam, Berlin, Bern, Rome, Stockholm, Vienna',iana:'Europe/Amsterdam',top:false}, {name:'Minsk',iana:'Europe/Minsk',top:false}, {name:'Cairo',iana:'Africa/Cairo',top:false}, {name:'Helsinki, Kiev, Riga, Sofia, Tallinn, Vilnius',iana:'Europe/Helsinki',top:false}, {name:'Athens, Bucharest, Istanbul',iana:'Europe/Athens',top:false}, {name:'Jerusalem',iana:'Asia/Jerusalem',top:false}, {name:'Harare, Pretoria',iana:'Africa/Johannesburg',top:false}, {name:'Beirut',iana:'Asia/Beirut',top:false}, {name:'Amman',iana:'Asia/Amman',top:false}, {name:'Windhoek',iana:'Africa/Windhoek',top:false}, {name:'Moscow, St. Petersburg, Volgograd',iana:'Europe/Moscow',top:false}, {name:'Kuwait, Riyadh',iana:'Asia/Riyadh',top:false}, {name:'Nairobi',iana:'Africa/Nairobi',top:false}, {name:'Baghdad',iana:'Asia/Baghdad',top:false}, {name:'Tbilisi',iana:'Asia/Tbilisi',top:false}, {name:'Tehran',iana:'Asia/Tehran',top:false}, {name:'Abu Dhabi, Muscat',iana:'Asia/Dubai',top:false}, {name:'Baku, Tbilisi, Yerevan',iana:'Asia/Baku',top:false}, {name:'Yerevan',iana:'Asia/Yerevan',top:false}, {name:'Port Louis',iana:'Indian/Mauritius',top:false}, {name:'Kabul',iana:'Asia/Kabul',top:false}, {name:'Ekaterinburg',iana:'Asia/Yekaterinburg',top:false}, {name:'Tashkent',iana:'Asia/Tashkent',top:false}, {name:'Islamabad, Karachi',iana:'Asia/Karachi',top:false}, {name:'Chennai, Kolkata, Mumbai, New Delhi',iana:'Asia/Kolkata',top:false}, {name:'Kathmandu',iana:'Asia/Kathmandu',top:false}, {name:'Astana, Dhaka',iana:'Asia/Dhaka',top:false}, {name:'Almaty, Novosibirsk',iana:'Asia/Almaty',top:false}, {name:'Yangon (Rangoon)',iana:'Asia/Yangon',top:false}, {name:'Bangkok, Hanoi, Jakarta',iana:'Asia/Bangkok',top:false}, {name:'Krasnoyarsk',iana:'Asia/Krasnoyarsk',top:false}, {name:'Beijing, Chongqing, Hong Kong, Urumqi',iana:'Asia/Hong_Kong',top:false}, {name:'Kuala Lumpur, Singapore',iana:'Asia/Singapore',top:false}, {name:'Taipei',iana:'Asia/Taipei',top:false}, {name:'Perth',iana:'Australia/Perth',top:false}, {name:'Irkutsk, Ulaanbaatar',iana:'Asia/Irkutsk',top:false}, {name:'Seoul',iana:'Asia/Seoul',top:false}, {name:'Osaka, Sapporo, Tokyo',iana:'Asia/Tokyo',top:false}, {name:'Yakutsk',iana:'Asia/Yakutsk',top:false}, {name:'Darwin',iana:'Australia/Darwin',top:false}, {name:'Adelaide',iana:'Australia/Adelaide',top:false}, {name:'Canberra, Melbourne, Sydney',iana:'Australia/Melbourne',top:false}, {name:'Brisbane',iana:'Australia/Brisbane',top:false}, {name:'Hobart',iana:'Australia/Hobart',top:false}, {name:'Vladivostok',iana:'Asia/Vladivostok',top:false}, {name:'Guam, Port Moresby',iana:'Pacific/Guam',top:false}, {name:'Magadan, Solomon Islands, New Caledonia',iana:'Asia/Magadan',top:false}, {name:'Fiji, Kamchatka, Marshall Is.',iana:'Pacific/Fiji',top:false}, {name:'Auckland, Wellington',iana:'Pacific/Auckland',top:false}, {name:'Petropavlovsk-Kamchatsky',iana:'Asia/Almaty',top:false}, {name:'Nuku\'alofa',iana:'Pacific/Tongatapu',top:false} ]; Number.prototype.pad = function(size) { var sign = Math.sign(this) === -1 ? '-' : ''; return sign + new Array(size).concat([Math.abs(this)]).join('0').slice(-size); }; $scope.autotimezone = {}; var auto_utc_offset = moment.tz($sessionStorage.currentUser.timezone).utcOffset(); var auto_utc_offset_sign = auto_utc_offset.toString().charAt(0); auto_utc_offset_sign = auto_utc_offset_sign=='-'?'-':'+'; $scope.autotimezone.print = '(GMT'+auto_utc_offset_sign+''+Math.abs(auto_utc_offset/60).pad(2)+':'+Math.abs(auto_utc_offset%60).pad(2)+') ' + moment.tz($sessionStorage.currentUser.timezone).format('z'); $scope.autotimezone.iana = $sessionStorage.currentUser.timezone; $scope.timezones_top = []; $scope.timezones_bot = []; $.each(timezones, function(key, timezone){ //console.log(moment.tz(timezone.iana).format('z')); var utc_offset = moment.tz(timezone.iana).utcOffset(); var utc_offset_sign = utc_offset.toString().charAt(0); utc_offset_sign = utc_offset_sign=='-'?'-':'+'; timezone.print = '(GMT'+utc_offset_sign+''+Math.abs(utc_offset/60).pad(2)+':'+Math.abs(utc_offset%60).pad(2)+') ' + timezone.name; if(timezone.top) { $scope.timezones_top.push(timezone); } else { $scope.timezones_bot.push(timezone); } }); $scope.toggleTZ = function(iana) { console.log('toggleTZ: '+iana); sysClock.setTimeZone(iana); $rootScope.$broadcast('clockUpdate'); }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // TIME RANGE $scope.toggleTR = function(days) { console.log('toggleTR: ' + days); days = parseInt(days, 10); switch(days) { case 7: $sessionStorage.currentUser.timerange = days; $scope.timerange = '7D'; break; case 30: $sessionStorage.currentUser.timerange = days; $scope.timerange = '30D'; break; case 90: $sessionStorage.currentUser.timerange = days; $scope.timerange = '90D'; break; case 180: $sessionStorage.currentUser.timerange = days; $scope.timerange = '180D'; break; case 365: $sessionStorage.currentUser.timerange = days; $scope.timerange = '356D'; break; default: $sessionStorage.currentUser.timerange = 30; // default $scope.timerange = '30D'; } $rootScope.$broadcast('trUpdate'); //$rootScope.$broadcast('trUpdate', {range:$sessionStorage.currentUser.timerange}); }; $scope.toggleTR($sessionStorage.currentUser.timerange); //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // TEMPERATURE CONFIG.TEMPERATURE = $sessionStorage.currentUser.temperature; $scope.temperature = $sessionStorage.currentUser.temperature === 'F'?'°F':'°C'; $scope.toggleTemp = function() { console.log('toggleTemp'); $sessionStorage.currentUser.temperature = $sessionStorage.currentUser.temperature === 'F'?'C':'F'; CONFIG.TEMPERATURE = $sessionStorage.currentUser.temperature; $scope.temperature = $sessionStorage.currentUser.temperature === 'F'?'°F':'°C'; $rootScope.$broadcast('tempUpdate'); }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // PROJECTS $scope.projects = {}; console.log('$rootScope.project: ', $rootScope.project); authService.getJWTAuth().then(authHeader => { let time = timerange.calc($sessionStorage.currentUser.timerange); let time_start = moment(time.start).format('YYYY-MM-DDTHH:mm:ss'); let time_end = moment(time.today).format('YYYY-MM-DDTHH:mm:ss'); var request = {'query': 'query { ' + 'projects(time_start:"' + time_start + '", time_end:"' + time_end + '", timezone:"' + sysClock.getTimeZone() + '") { ' + 'id ' + 'name ' + '} ' + '}' }; $http({ method: 'POST', url: CONFIG.APP_API, data: request, headers: authHeader }).then( function(response){ // resolve $scope.projects = response.data.data.projects; if($rootScope.project) { $scope.project = $filter('filter')($scope.projects, {id: $rootScope.project})[0]; } }, (error) => { // failure console.error(error); } ); }); $scope.setProject = function(project_id) { $sessionStorage.currentUser.project_selected = $rootScope.project = project_id; $scope.project = $filter('filter')($scope.projects, {id: $rootScope.project})[0]; if($state.current.name !== 'system.dashboard') { $location.path('/system/dashboard'); } }; //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // MENU $scope.menuContent = null; var menuCleanUp = function(menuArray) { for(var i = 0; i < menuArray.length; i++) { if(menuArray[i].removeme) { menuArray.splice(i, 1); menuCleanUp(menuArray); break; } } }; authService.getJWTAuth().then(authHeader => { var request = {"query": "query { menu { level id parent position page_name page_link page_icon ismanagerial }}"}; $http({ method: 'POST', url: CONFIG.APP_API, data: request, headers: authHeader }).then( function(response){ // resolve let menu = response.data.data.menu; // Load $.each(menu, function(key, element){ if(element.parent === null) { element.submenu = []; element.nested = false; $.each(menu, function(skey, selement){ if(selement.parent === element.id) { element.submenu.push(selement); element.nested = true; selement.removeme = true; } }); } }); menuCleanUp(menu); $scope.menuContent = menu; },function(error) { // failure console.error(error); } ); }); // Animation $scope.menuAnimation = false; $scope.switchMenu = function() { // toggle and remember setting $scope.menuSmall = !$scope.menuSmall; $sessionStorage.currentUser.smallMenu = !$sessionStorage.currentUser.smallMenu; // set menuAnimation to true = animation in progress $scope.menuAnimation = true; // hide sidebar elements $("ul.menu").css('background', 'none'); // hide logo image $("ul.menu li").find("span.large, span.small").hide(); $("ul.menu li").hide(); // execute resize function with appropriate parameter if(!$sessionStorage.currentUser.smallMenu) { resizeContent(0); } else { resizeContent(-(parseInt($('#sidebar').width(),10)-50)); } }; var resizeContent = function(offset) { // animate sidebar $("#sidebar").animate({'left': offset}, CONFIG.UI_SPEED, function(){}); // animate content $("#content").animate({'margin-left': $('#sidebar').width() + offset}, { duration: CONFIG.UI_SPEED, step: function(now, fx){ //$scope.$apply(); //$state.reload(); }, complete: function(){ $scope.$apply(); $(".hyperion-highchart").each(function(){ if($(this).highcharts()){ $(this).highcharts().reflow(); } }); // show sidebar elements if(offset<0) { $("ul.menu").css('background', 'url(\'../image/sidebar_logo_small.svg\') no-repeat right bottom'); // show appropriate logo image $("ul.menu li").find("span.small").show(); // show appropriate elements in sidebar } else { $("ul.menu").css('background', 'url(\'../image/sidebar_logo.svg\') no-repeat center bottom'); // show appropriate logo image $("ul.menu li").find("span.large").show(); // show appropriate elements in sidebar } $("ul.menu li").not('.spinner').fadeIn(CONFIG.UI_SPEED); // show elements except spinner // re-set menuAnimation to false = animation finished $scope.menuAnimation = false; } }); }; }]); })();