mirror of https://github.com/rancher/ui.git
191 lines
5.0 KiB
JavaScript
191 lines
5.0 KiB
JavaScript
import Component from '@ember/component';
|
|
import { inject as service } from '@ember/service';
|
|
import EmberObject, {
|
|
set,
|
|
get,
|
|
computed,
|
|
observer
|
|
} from '@ember/object';
|
|
import { alias } from '@ember/object/computed';
|
|
import C from 'shared/utils/pipeline-constants';
|
|
|
|
const headers = [
|
|
{
|
|
translationKey: 'repositories.table.repository',
|
|
name: 'url',
|
|
sort: ['url'],
|
|
},
|
|
{ width: 200, },
|
|
]
|
|
|
|
export default Component.extend({
|
|
growl: service(),
|
|
modalService: service('modal'),
|
|
router: service(),
|
|
scope: service(),
|
|
providerService: service('pipeline-github'),
|
|
|
|
repositories: null,
|
|
headers,
|
|
errors: null,
|
|
authorizing: false,
|
|
loggingout: false,
|
|
refreshing: false,
|
|
filteredRepositories: null,
|
|
sortBy: 'url',
|
|
|
|
accounts: alias('model.accounts'),
|
|
pipeline: alias('model.pipeline'),
|
|
pipelines: alias('model.pipelines'),
|
|
providers: alias('model.providers'),
|
|
canConfig: alias('model.canConfig'),
|
|
|
|
init() {
|
|
this._super(...arguments);
|
|
|
|
if ( get(this, 'accountsInfo') ) {
|
|
set(this, 'repositories', get(this, 'model.repositories'));
|
|
} else {
|
|
this.initDemoRepo();
|
|
}
|
|
this.repositoriesDidChange();
|
|
},
|
|
|
|
actions: {
|
|
logout() {
|
|
set(this, 'loggingout', true);
|
|
get(this, 'accountsInfo').doAction('logout')
|
|
.then(() => {
|
|
set(this, 'accountsInfo', null);
|
|
this.initDemoRepo();
|
|
})
|
|
.finally(() => {
|
|
set(this, 'loggingout', false);
|
|
});
|
|
},
|
|
|
|
refresh() {
|
|
set(this, 'refreshing', true);
|
|
get(this, 'accountsInfo').doAction('refreshrepos')
|
|
.then((res) => {
|
|
set(this, 'repositories', res.content);
|
|
})
|
|
.finally(() => {
|
|
set(this, 'refreshing', false);
|
|
});
|
|
},
|
|
|
|
authorize() {
|
|
const provider = get(this, 'providers.firstObject');
|
|
|
|
if ( !provider ) {
|
|
get(this, 'modalService').toggleModal('modal-pipeline-enable', {
|
|
canConfig: get(this, 'canConfig'),
|
|
escToClose: true,
|
|
});
|
|
|
|
return;
|
|
}
|
|
set(this, 'authorizing', true);
|
|
|
|
if ( get(provider, 'type') === 'bitbucketServerProvider' ) {
|
|
provider.doAction('requestLogin', {}).then((res) => {
|
|
const url = get(res, 'loginUrl');
|
|
|
|
get(this, 'providerService').authorizeTest(url, () => {
|
|
const code = url.slice(url.lastIndexOf('=') + 1 );
|
|
|
|
this.doLogin(provider, code);
|
|
}, true);
|
|
})
|
|
} else {
|
|
get(this, 'providerService').authorizeTest(provider.redirectUrl, (err, code) => {
|
|
if ( err ) {
|
|
this.showErrors(err);
|
|
set(this, 'authorizing', false);
|
|
} else {
|
|
this.doLogin(provider, code);
|
|
}
|
|
});
|
|
}
|
|
},
|
|
|
|
cancel() {
|
|
get(this, 'router').transitionTo('authenticated.project.pipeline.pipelines');
|
|
}
|
|
},
|
|
|
|
repositoriesDidChange: observer('repositories', 'pipelines.[]', function() {
|
|
const out = [];
|
|
const pipelines = get(this, 'pipelines');
|
|
const sourceCodeCredentialId = get(this, 'accountsInfo.id');
|
|
|
|
get(this, 'repositories').forEach((repo) => {
|
|
out.push(EmberObject.create({
|
|
isExample: !!repo.isExample,
|
|
url: repo.url,
|
|
pipeline: pipelines.findBy('repositoryUrl', repo.url),
|
|
sourceCodeCredentialId,
|
|
}));
|
|
});
|
|
set(this, 'filteredRepositories', out);
|
|
}),
|
|
principal: computed('accountsInfo', function() {
|
|
const account = get(this, 'accountsInfo');
|
|
|
|
if ( !account ) {
|
|
return
|
|
}
|
|
const profile = Object.assign({}, account);
|
|
|
|
profile.name = profile.loginName;
|
|
profile.username = profile.displayName;
|
|
profile.profilePicture = profile.avatarUrl;
|
|
profile.avatarSrc = profile.avatarUrl;
|
|
|
|
return profile;
|
|
}),
|
|
|
|
accountsInfo: computed('accounts.@each.logout', 'pipeline.sourceCodeCredential', function() {
|
|
const accounts = get(this, 'accounts').filter((account) => !account.logout);
|
|
|
|
if ( get(accounts, 'length') === 0 ) {
|
|
return get(this, 'pipeline.sourceCodeCredential');
|
|
}
|
|
|
|
const out = get(accounts, 'firstObject');
|
|
|
|
return out ? out : null;
|
|
}),
|
|
|
|
doLogin(provider, code) {
|
|
provider.doAction('login', { code, }).then((user) => {
|
|
set(this, 'accountsInfo', user);
|
|
user.followLink('sourceCodeRepositories').then((repositories) => {
|
|
set(this, 'repositories', repositories);
|
|
});
|
|
set(this, 'authorizing', false);
|
|
})
|
|
.catch((err) => {
|
|
this.showErrors(err);
|
|
set(this, 'authorizing', false);
|
|
});
|
|
},
|
|
|
|
showErrors(err) {
|
|
if ( err.message ) {
|
|
set(this, 'errors', [`${ err.message }${ err.detail ? `(${ err.detail })` : '' }`]);
|
|
} else {
|
|
set(this, 'errors', [`Error (${ err.status } - ${ err.code })`]);
|
|
}
|
|
},
|
|
|
|
initDemoRepo() {
|
|
set(this, 'repositories', C.DEMO_REPOSITORIES.map((repo) => EmberObject.create({
|
|
url: repo.url,
|
|
isExample: true,
|
|
})));
|
|
},
|
|
|
|
});
|