ui/lib/pipeline/addon/components/enable-repositories/component.js

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,
})));
},
});