mirror of https://github.com/rancher/ui.git
156 lines
4.4 KiB
JavaScript
156 lines
4.4 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.project.projectRoleTemplateBindings'),
|
|
|
|
actions: {
|
|
cancel() {
|
|
this.goBack();
|
|
},
|
|
addMember(kind) {
|
|
this.get('memberArray').pushObject(this.get('authzStore').createRecord({
|
|
type: 'projectRoleTemplateBinding',
|
|
subjectKind: kind,
|
|
subjectName: '',
|
|
projectRoleTemplateId: '',
|
|
projectId: '',
|
|
}));
|
|
},
|
|
removeMember(obj) {
|
|
this.get('memberArray').removeObject(obj);
|
|
},
|
|
},
|
|
|
|
didInsertElement() {
|
|
if (!this.get('editing')) {
|
|
this.send('addMember', 'User');
|
|
}
|
|
},
|
|
|
|
goBack: function () {
|
|
this.get('router').transitionTo('authenticated.cluster.projects.index');
|
|
},
|
|
|
|
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() {
|
|
if (this.get('editing')) {
|
|
return this.setMembers(this.get('primaryResource'));
|
|
} else {
|
|
return this._super.apply(this, arguments).then((project) => {
|
|
return this.setMembers(project);
|
|
});
|
|
}
|
|
},
|
|
|
|
doneSaving() {
|
|
this.goBack();
|
|
},
|
|
|
|
setMembers(project) {
|
|
const projectId = project.id;
|
|
const members = this.get('memberArray');
|
|
const promises = [];
|
|
// TODO - wait for setMembers API suppot.
|
|
return this.get('authzStore').findAll('projectRoleTemplateBinding', { forceReload: true })
|
|
.then(bindings => {
|
|
const currentBindings = bindings.filter(b => b.projectId === projectId);
|
|
|
|
members.forEach(member => {
|
|
const found = currentBindings.any(m => m.subjectName === member.subjectName &&
|
|
m.projectRoleTemplateId === member.projectRoleTemplateId &&
|
|
m.subjectKind === member.subjectKind
|
|
);
|
|
if (!found) {
|
|
member.projectId = projectId;
|
|
const promise = this.get('authzStore').rawRequest({
|
|
url: 'projectroletemplatebinding',
|
|
method: 'POST',
|
|
data: member,
|
|
});
|
|
promises.push(promise);
|
|
}
|
|
});
|
|
|
|
currentBindings.forEach(currentMember => {
|
|
const found = members.any(m => m.subjectName === currentMember.subjectName &&
|
|
m.projectRoleTemplateId === currentMember.projectRoleTemplateId &&
|
|
m.subjectKind === currentMember.subjectKind
|
|
);
|
|
if (!found) {
|
|
const promise = this.get('authzStore').rawRequest({
|
|
url: `projectroletemplatebinding/${currentMember.id}`,
|
|
method: 'DELETE',
|
|
});
|
|
promises.push(promise);
|
|
}
|
|
});
|
|
|
|
return PromiseAll(promises).catch((error) => {
|
|
return reject(error.body.message);
|
|
});
|
|
});
|
|
},
|
|
});
|