ui/app/application/route.js

212 lines
5.6 KiB
JavaScript

import { cancel, next, scheduleOnce, schedule } from '@ember/runloop';
import { inject as service } from '@ember/service';
import Route from '@ember/routing/route';
import C from 'ui/utils/constants';
import { get, set } from '@ember/object';
export default Route.extend({
access: service(),
cookies: service(),
github: service(),
language: service('user-language'),
modal: service(),
prefs: service(),
settings: service(),
previousParams: null,
previousRoute: null,
loadingShown: false,
loadingId: 0,
hideTimer: null,
previousLang: null,
shortcuts: { 'shift+l': 'langToggle', },
beforeModel() {
this._super(...arguments);
this.updateWindowTitle();
let agent = window.navigator.userAgent.toLowerCase();
if ( agent.indexOf('msie ') >= 0 || agent.indexOf('trident/') >= 0 ) {
this.replaceWith('ie');
return;
}
// Find out if auth is enabled
return get(this, 'access').detect();
},
model(params, transition) {
transition.finally(() => {
get(this, 'language').initLanguage();
this.controllerFor('application').setProperties({
state: null,
code: null,
error_description: null,
redirectTo: null,
});
})
if ( params.redirectTo ) {
let path = params.redirectTo;
if ( path.substr(0, 1) === '/' ) {
get(this, 'session').set(C.SESSION.BACK_TO, path);
}
}
if (params.isPopup) {
this.controllerFor('application').set('isPopup', true);
}
},
actions: {
loading(transition) {
this.incrementProperty('loadingId');
let id = get(this, 'loadingId');
cancel(get(this, 'hideTimer'));
// console.log('Loading', id);
if ( !get(this, 'loadingShown') ) {
set(this, 'loadingShown', true);
// console.log('Loading Show', id);
schedule('afterRender', () => {
$('#loading-underlay').stop().show().fadeIn({// eslint-disable-line
duration: 100,
queue: false,
easing: 'linear',
complete: function() { // eslint-disable-line
$('#loading-overlay').stop().show().fadeIn({duration: 200, queue: false, easing: 'linear'}); // eslint-disable-line
}
});
});
}
transition.finally(() => {
var self = this;
function hide() {
// console.log('Loading hide', id);
set(self, 'loadingShown', false);
schedule('afterRender', () => {
$('#loading-overlay').stop().fadeOut({// eslint-disable-line
duration: 200,
queue: false,
easing: 'linear',
complete: function() { // eslint-disable-line
$('#loading-underlay').stop().fadeOut({duration: 100, queue: false, easing: 'linear'}); // eslint-disable-line
}
});
});
}
if ( get(this, 'loadingId') === id ) {
if ( transition.isAborted ) {
// console.log('Loading aborted', id, get(this, 'loadingId'));
set(this, 'hideTimer', next(hide));
} else {
// console.log('Loading finished', id, get(this, 'loadingId'));
// needed to set this to run after render as there was wierdness wiht new register page
scheduleOnce('afterRender', () => {
hide();
});
}
}
});
return true;
},
error(err, transition) {
/* if we dont abort the transition we'll call the model calls again and fail transition correctly*/
transition.abort();
const status = parseInt(err.status, 10);
if ( err && [401, 403].includes(status) ) {
this.send('logout', transition);
return;
}
this.controllerFor('application').set('error', err);
this.transitionTo('failWhale');
// console.log('Application Error', (err ? err.stack : undefined));
},
goToPrevious(def) {
this.goToPrevious(def);
},
finishLogin() {
this.finishLogin();
},
logout(transition, errorMsg) {
let session = get(this, 'session');
let access = get(this, 'access');
access.clearToken().finally(() => {
get(this, 'tab-session').clear();
set(this, `session.${ C.SESSION.CONTAINER_ROUTE }`, undefined);
set(this, `session.${ C.SESSION.CLUSTER_ROUTE }`, undefined);
set(this, `session.${ C.SESSION.PROJECT_ROUTE }`, undefined);
if ( transition && !session.get(C.SESSION.BACK_TO) ) {
session.set(C.SESSION.BACK_TO, window.location.href);
}
if ( get(this, 'modal.modalVisible') ) {
get(this, 'modal').toggleModal();
}
let params = { queryParams: {} };
if ( errorMsg ) {
params.queryParams.errorMsg = errorMsg;
}
this.transitionTo('login', params);
});
},
langToggle() {
let svc = get(this, 'language');
let cur = svc.getLocale();
if ( cur === 'none' ) {
svc.sideLoadLanguage(get(this, 'previousLang') || 'en-us');
} else {
set(this, 'previousLang', cur);
svc.sideLoadLanguage('none');
}
},
},
updateWindowTitle: function() {
document.title = get(this, 'settings.appName');
}.observes('settings.appName'),
finishLogin() {
let session = get(this, 'session');
let backTo = session.get(C.SESSION.BACK_TO);
session.set(C.SESSION.BACK_TO, undefined);
if ( backTo ) {
// console.log('Going back to', backTo);
window.location.href = backTo;
} else {
this.replaceWith('authenticated');
}
},
});