ui/lib/shared/addon/components/new-edit-project/component.js

113 lines
2.9 KiB
JavaScript

import { alias } from '@ember/object/computed';
import { inject as service } from '@ember/service';
import { reject, all as PromiseAll } from 'rsvp';
import Component from '@ember/component';
import NewOrEdit from 'ui/mixins/new-or-edit';
import layout from './template';
export default Component.extend(NewOrEdit, {
layout,
intl: service(),
router: service(),
authzStore: service('authz-store'),
model: null,
primaryResource: alias('model.project'),
memberArray: alias('model.projectRoleTemplateBindings'),
actions: {
cancel() {
this.goBack();
},
addMember(kind) {
this.get('memberArray').pushObject({
subjectKind: kind,
subjectName: '',
projectRoleTemplateId: '',
projectId: '',
});
},
removeMember(obj) {
this.get('memberArray').removeObject(obj);
},
},
goBack: function () {
this.get('router').transitionTo('/projects');
},
doesNameExist() {
const project = this.get('primaryResource');
const currentProjects = this.get('model.projects');
if (currentProjects.findBy('name', project.get('name'))) {
return true;
}
return false;
},
doseMemberNameInvalid() {
const members = this.get('memberArray');
return members.any(r => r.subjectName.length === 0);
},
doseMemberRoleInvalid() {
const members = this.get('memberArray');
return members.any(r => r.projectRoleTemplateId.length === 0);
},
validate: function () {
var errors = this.get('errors', errors) || [];
if ((this.get('model.project.name') || '').trim().length === 0) {
errors.push(this.get('intl').findTranslationByKey('projectsPage.new.errors.nameReq'));
}
if (!this.get('editing') && this.doesNameExist()) {
errors.push(this.get('intl').findTranslationByKey('projectsPage.new.errors.nameInExists'));
}
if (this.doseMemberNameInvalid()) {
errors.push(this.get('intl').findTranslationByKey('projectsPage.new.errors.memberNameReq'));
}
if (this.doseMemberRoleInvalid()) {
errors.push(this.get('intl').findTranslationByKey('projectsPage.new.errors.memberRoleReq'));
}
if (errors.length) {
this.set('errors', errors.uniq());
return false;
}
else {
this.set('errors', null);
}
return true;
},
doSave() {
return this._super.apply(this, arguments).then((project) => {
const projectId = project.id;
const members = this.get('memberArray');
const promises = [];
members.forEach(member => {
member.projectId = projectId;
const promise = this.get('authzStore').rawRequest({
url: 'projectroletemplatebinding',
method: 'POST',
data: member,
});
promises.push(promise);
});
return PromiseAll(promises).catch((error) => {
return reject(error.body.message);
});
});
},
doneSaving() {
this.goBack();
},
});