ui/lib/shared/addon/scope/service.js

199 lines
5.2 KiB
JavaScript

import { all } from 'rsvp';
import Service, { inject as service } from '@ember/service';
import { get, set, setProperties } from '@ember/object';
import SubscribeGlobal from 'shared/utils/subscribe-global';
import SubscribeCluster from 'shared/utils/subscribe-cluster';
import SubscribeProject from 'shared/utils/subscribe-project';
export default Service.extend({
access: service(),
intl: service(),
growl: service(),
prefs: service(),
store: service(),
globalStore: service(),
clusterStore: service(),
cookies: service(),
app: service(),
currentProject: null,
currentCluster: null,
currentPageScope: 'none',
allProjects: null,
allClusters: null,
init() {
const globalStore = get(this, 'globalStore');
this._super(...arguments);
setProperties(this, {
allClusters: globalStore.all('cluster'),
allProjects: globalStore.all('project'),
});
this.initSubscribe();
},
// Subscribe
subscribeGlobal: null,
subscribeCluster: null,
subscribeProject: null,
initSubscribe() {
const deps = {
app: get(this, 'app'),
store: get(this, 'store'),
clusterStore: get(this, 'clusterStore'),
globalStore: get(this, 'globalStore'),
intl: get(this, 'intl'),
growl: get(this, 'growl'),
scope: this,
};
const g = SubscribeGlobal.create(deps);
const c = SubscribeCluster.create(deps);
const p = SubscribeProject.create(deps);
g.set('label', 'Global');
g.set('label', 'Cluster');
p.set('label', 'Project');
setProperties(this, {
subscribeGlobal: g,
subscribeCluster: c,
subscribeProject: p
});
},
// End: Subscribe
startSwitchToNothing() {
this._setPageScope('global');
return get(this, 'subscribeGlobal').disconnect().then(() => {
return this._startSwitchTo(null,null).then(() => {
get(this, 'globalStore').reset();
});
});
},
finishSwitchToNothing() {
this._finishSwitchTo(null,null);
},
startSwitchToGlobal(connect=true) {
this._setPageScope('global');
if ( connect ) {
get(this, 'subscribeGlobal').connect(false);
}
return this._startSwitchTo(null,null, connect);
},
finishSwitchToGlobal() {
this._finishSwitchTo(null,null);
},
startSwitchToCluster(cluster, connect=true) {
this._setPageScope('cluster');
return this._startSwitchTo(cluster, null, connect);
},
finishSwitchToCluster(cluster) {
this._finishSwitchTo(cluster,null);
},
startSwitchToProject(project, connect=true) {
this._setPageScope('project');
return this._startSwitchTo(get(project,'cluster'), project, connect);
},
finishSwitchToProject(project) {
return this._finishSwitchTo(get(project,'cluster'), project);
},
_setPageScope(scope) {
set(this, 'currentPageScope', scope);
},
_startSwitchTo(cluster, project, connect=true) {
const clusterOld = get(this, 'currentCluster');
const clusterSubscribe = get(this, 'subscribeCluster');
const clusterStore = get(this, 'clusterStore');
const clusterId = (cluster && get(cluster, 'id')) || null;
let clusterReset = false;
const projectOld = get(this, 'currentProject');
const projectSubscribe = get(this, 'subscribeProject');
const projectStore = get(this, 'store');
const projectId = (project && get(project, 'id')) || null;
let projectReset = false;
const cleanupPromises = [];
set(this, 'pendingCluster', cluster);
set(this, 'pendingProject', project);
if ( cluster !== clusterOld ) {
if ( cluster ) {
set(clusterStore, 'baseUrl', `${get(this, 'app.apiEndpoint')}/clusters/${clusterId}`);
}
cleanupPromises.push(clusterSubscribe.disconnect());
clusterReset = true;
}
if (!get(clusterSubscribe, 'wasConnected')) {
clusterReset = true;
}
if ( project !== projectOld ) {
if ( project ) {
set(projectStore, 'baseUrl', `${get(this, 'app.apiEndpoint')}/projects/${projectId}`);
}
cleanupPromises.push(projectSubscribe.disconnect());
projectReset = true;
}
return all(cleanupPromises).then(() => {
if ( clusterReset ) {
clusterStore.reset();
if ( cluster && connect ) {
clusterSubscribe.connect(true, clusterId, projectId);
}
}
if ( projectReset ) {
projectStore.reset();
if ( project && connect ) {
projectSubscribe.connect(true, clusterId, projectId);
}
}
});
},
_finishSwitchTo(cluster, project) {
set(this, 'currentCluster', cluster);
set(this, 'currentProject', project);
},
getAllProjects(moreOpt={}) {
var opt = {
url: 'projects', // This is called in authenticated/route before schemas are loaded
forceReload: true,
};
Object.assign(opt, moreOpt);
return get(this,'globalStore').findAll('project', opt);
},
getAllClusters(moreOpt={}) {
var opt = {
url: 'clusters', // This is called in authenticated/route before schemas are loaded
forceReload: true,
};
Object.assign(opt, moreOpt);
return get(this, 'globalStore').findAll('cluster', opt);
},
});