ui/lib/shared/addon/components/form-scoped-roles/component.js

118 lines
3.1 KiB
JavaScript

import Component from '@ember/component'
import { all as PromiseAll } from 'rsvp';
import { inject as service } from '@ember/service';
import { get, set, setProperties } from '@ember/object';
import layout from './template';
import NewOrEdit from 'ui/mixins/new-or-edit';
const CUSTOM = 'custom';
export default Component.extend(NewOrEdit,{
layout,
globalStore: service(),
intl: service(),
user: null,
primaryResource: null,
mode: null,
custom: null,
editing: false,
type: null,
cTyped: null,
stdUser: null,
admin: null,
init() {
this._super(...arguments);
let mode = null;
let editing = get(this, 'editing');
let dfu = get(this, 'defaultUser');
let current = dfu.get(`${get(this, 'type')}RoleBindings`);
let custom = get(this, 'model.roles').filterBy('hidden', false).filter((role) => {
return role.get('id') !== `${get(this, 'type')}-admin`
&& role.get('id') !== `${get(this, 'type')}-owner`
&& role.get('id') !== `${get(this, 'type')}-member`
&& role.get('context') === `${get(this, 'type')}`;
}).map((role) => {
const binding = current.findBy('roleTemplateId', get(role, 'id')) || null;
return {
role,
active: !!binding,
existing: binding,
}
});
if (editing && current.length === 1) {
mode = get(current, 'firstObject.roleTemplateId');
} else if (editing && current.length > 1){
mode = CUSTOM;
} else {
mode = `${get(this, 'type')}-member`;
}
let model = {
type: `${get(this, 'type')}RoleTemplateBinding`,
subjectKind: 'User',
userId: null,
};
set(model, `${get(this, 'type')}Id`, get(this, `model.${get(this, 'type')}.id`))
setProperties(this, {
primaryResource: this.make(model),
defaultUser: dfu,
custom: custom,
mode: mode,
stdUser: `${get(this, 'type')}-member`,
admin: `${get(this, 'type')}-owner`,
cTyped: get(this, 'type').capitalize()
});
},
make(role) {
return get(this, 'globalStore').createRecord(role);
},
actions: {
cancel() {
this.sendAction('cancel');
},
save(cb) {
let mode = get(this, 'mode');
let add = [];
let remove = [];
let pr = get(this, 'primaryResource');
const custom = get(this, 'custom');
switch ( mode ) {
case `${get(this, 'type')}-owner`:
case `${get(this, 'type')}-member`:
set(pr, 'roleTemplateId', mode);
add = [ pr ];
break;
case CUSTOM:
add = custom.filterBy('active',true ).filterBy('existing',null).map((x) => {
let neu = get(this, 'primaryResource').clone();
set(neu, 'roleTemplateId', get(x, 'role.id'));
return neu;
});
remove = custom.filterBy('active',false).filterBy('existing').map(y => y.existing);
break;
}
if(!this.validate()) {
if ( cb ) {
cb();
}
return;
}
return PromiseAll(add.map(x => x.save())).then(() => {
return PromiseAll(remove.map(x => x.delete())).then(() => {
return this.doneSaving();
});
});
},
}
});