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

117 lines
3.2 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';
const M_CONFIG = {
type: 'projectRoleTemplateBinding',
subjectKind: '',
subjectName: '',
projectRoleTemplateId: '',
projectId: '',
};
export default Component.extend(NewOrEdit, {
layout,
intl: service(),
router: service(),
globalStore: service(),
model: null,
memberConfig: M_CONFIG,
primaryResource: alias('model.project'),
memberArray: alias('model.project.projectRoleTemplateBindings'),
secPolicy: alias('model.project.defaultPodSecurityPolicyTemplateId'),
policies: alias('model.policies'),
actions: {
cancel() {
this.goBack();
},
expandFn() {
}
},
goBack() {
this.get('router').transitionTo('authenticated.cluster.projects.index');
},
validate() {
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 ( 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('globalStore').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('globalStore').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('globalStore').rawRequest({
url: `projectroletemplatebinding/${currentMember.id}`,
method: 'DELETE',
});
promises.push(promise);
}
});
return PromiseAll(promises).catch((error) => {
return reject(error.body.message);
});
});
},
});