mirror of https://github.com/rancher/ui.git
256 lines
6.6 KiB
JavaScript
256 lines
6.6 KiB
JavaScript
import Errors from 'ui/utils/errors';
|
|
import Component from '@ember/component';
|
|
import layout from './template';
|
|
import {
|
|
computed, get, set, setProperties, observer
|
|
} from '@ember/object';
|
|
import { inject as service } from '@ember/service';
|
|
import { alias } from '@ember/object/computed';
|
|
import { next } from '@ember/runloop';
|
|
import C from 'ui/utils/constants';
|
|
import Identicon from 'identicon.js';
|
|
|
|
const BASIC_ROLES = [
|
|
{
|
|
label: 'Owner',
|
|
value: 'owner',
|
|
typePrefix: true,
|
|
},
|
|
{
|
|
label: 'Member',
|
|
value: 'member',
|
|
typePrefix: true,
|
|
},
|
|
{
|
|
label: 'Read Only',
|
|
value: 'read-only',
|
|
scope: 'project',
|
|
},
|
|
{
|
|
label: 'Custom',
|
|
value: 'custom',
|
|
virtual: true,
|
|
},
|
|
];
|
|
|
|
export default Component.extend({
|
|
modalService: service('modal'),
|
|
globalStore: service(),
|
|
layout,
|
|
tagName: 'TR',
|
|
classNames: 'main-row',
|
|
|
|
member: null,
|
|
roles: null,
|
|
type: null,
|
|
pageType: null,
|
|
editing: false,
|
|
// customRoles: null,
|
|
_customRole: null,
|
|
errors: null,
|
|
principal: null,
|
|
external: null,
|
|
noUpdate: false,
|
|
isCreatorMember: false,
|
|
principalId: null,
|
|
principalGravatarSrc: null,
|
|
|
|
|
|
role: alias('member.role'),
|
|
init() {
|
|
this._super(...arguments);
|
|
let member = get(this, 'member');
|
|
|
|
if (get(this, 'member.bindings.length') === 1) {
|
|
set(this, 'roleTemplateId', get(this, 'member.bindings.firstObject'));
|
|
}
|
|
|
|
if (member) {
|
|
if (get(member, 'bindings.length') !== 0) { // new
|
|
set(this, 'noUpdate', true);
|
|
}
|
|
if ( get(member, 'principalId') ) {
|
|
get(this, 'globalStore').rawRequest({
|
|
url: `principals/${ encodeURIComponent(get(member, 'principalId')) }`,
|
|
method: 'GET',
|
|
}).then((xhr) => {
|
|
if ( xhr.status === 204 ) {
|
|
return;
|
|
}
|
|
|
|
if ( xhr.body && typeof xhr.body === 'object') {
|
|
let nuePrincipal = this.globalStore.createRecord(xhr.body);
|
|
|
|
set(this, 'principal', nuePrincipal);
|
|
|
|
this.principalChanged();
|
|
}
|
|
|
|
return xhr;
|
|
}).catch((xhr) => {
|
|
if (get(member, 'principalId')) {
|
|
set(this, 'principalId', get(member, 'principalId'));
|
|
set(this, 'principalGravatarSrc', `data:image/png;base64,${ new Identicon(AWS.util.crypto.md5(get(member, 'principalId') || 'Unknown', 'hex'), 80, 0.01).toString() }`)
|
|
}
|
|
|
|
return xhr;
|
|
});
|
|
}
|
|
this.principalChanged();
|
|
}
|
|
},
|
|
|
|
actions: {
|
|
gotError(err) {
|
|
set(this, 'errors', [Errors.stringify(err)]);
|
|
},
|
|
addAuthorized(principal) {
|
|
set(this, 'principal', principal);
|
|
},
|
|
onSelect(selected) {
|
|
if (selected.value === 'custom') {
|
|
next(() => {
|
|
this.openModal(false);
|
|
});
|
|
}
|
|
},
|
|
remove() {
|
|
this.remove(this.member);
|
|
},
|
|
},
|
|
|
|
principalChanged: observer('principal', 'member', function() {
|
|
let principal = (get(this, 'principal'));
|
|
|
|
if (principal) {
|
|
set(this, 'member.principalId', get(principal, 'id'));
|
|
set(this, 'member.memberType', get(principal, 'principalType'));
|
|
}
|
|
}),
|
|
|
|
roleTemplate: computed('roleTemplateId', 'roles.[]', function() {
|
|
return (get(this, 'roles') || []).findBy('id', get(this, 'roleTemplateId'));
|
|
}),
|
|
|
|
|
|
roleTemplateId: computed('member.bindings.firstObject', 'member.isCustom', {
|
|
get() {
|
|
return get(this, 'member.isCustom') ? 'custom' : get(this, 'member.bindings.firstObject');
|
|
},
|
|
|
|
set(key, value) {
|
|
if (value === 'custom') {
|
|
set(this, '_roleTemplateId', get(this, 'roleTemplateId'));
|
|
} else {
|
|
set(this, 'member.bindings', [value])
|
|
}
|
|
|
|
return value;
|
|
}
|
|
}),
|
|
|
|
builtInRoles: computed('roles.[]', function() {
|
|
return get(this, 'roles').filter((r) => ( r.builtin || r.external ) && r.id !== 'read-only');
|
|
}),
|
|
|
|
customRoles: computed('roles.[]', function() {
|
|
return get(this, 'roles').filter((r) => !r.builtin && !r.external && !r.hidden);
|
|
}),
|
|
|
|
choices: computed('customRoles', 'pageType', 'roleTemplateId', 'roles.[]', function() {
|
|
const pt = get(this, 'pageType');
|
|
const allRoles = get(this, 'globalStore').all('roleTemplate');
|
|
|
|
let neuRoles = BASIC_ROLES.map((r) => {
|
|
const id = (r.typePrefix ? `${ pt }-${ r.value }` : r.value);
|
|
const rt = allRoles.findBy('id', id )
|
|
|
|
if ( r.scope && r.scope !== pt ) {
|
|
return;
|
|
}
|
|
|
|
// If it's a real entry (i.e. not "custom")
|
|
if ( !r.virtual ) {
|
|
// And there's no corresponding role, or there is one but it's locked
|
|
if (!rt || get(rt, 'locked') === true) {
|
|
// And it's not the currently selected role
|
|
if ( id !== get(this, 'roleTemplateId') ) {
|
|
// Hide this entry (return nothing instead of a row)
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
label: r.label,
|
|
value: id,
|
|
};
|
|
}).filter((x) => !!x);
|
|
|
|
if ( pt ) {
|
|
let customRoles = get(this, 'customRoles').map( (r) => {
|
|
if (r.id === 'read-only') {
|
|
return;
|
|
} else {
|
|
return {
|
|
label: r.name || r.id,
|
|
value: r.id
|
|
}
|
|
}
|
|
});
|
|
|
|
neuRoles = neuRoles.concat(customRoles);
|
|
|
|
return neuRoles.filter((x) => !!x);
|
|
}
|
|
|
|
return neuRoles;
|
|
}),
|
|
|
|
modalCanceled() {
|
|
},
|
|
|
|
remove(/* member */) {
|
|
// remove is not required as the noUpdate case will not allow you to remove a member
|
|
},
|
|
|
|
doneAdding(customs) {
|
|
if (customs.length === 1) { // more then one? of course its custom
|
|
let match = customs[0];
|
|
|
|
if (C.BASIC_ROLE_TEMPLATE_ROLES.includes(match)) {
|
|
setProperties(this, {
|
|
'member.isCustom': false,
|
|
roleTemplateId: match,
|
|
});
|
|
} else {
|
|
setProperties(this, {
|
|
'member.isCustom': true,
|
|
roleTemplateId: 'custom',
|
|
});
|
|
}
|
|
} else {
|
|
setProperties(this, {
|
|
'member.isCustom': true,
|
|
roleTemplateId: 'custom',
|
|
});
|
|
}
|
|
set(this, 'member.bindings', customs);
|
|
},
|
|
|
|
|
|
openModal(isCustom = false) {
|
|
get(this, 'modalService').toggleModal('modal-add-custom-roles', {
|
|
current: get(this, 'member.bindings'),
|
|
done: this.doneAdding.bind(this),
|
|
editng: get(this, 'editing'),
|
|
modalCanceled: this.modalCanceled.bind(this),
|
|
model: get(this, 'member'),
|
|
roles: get(this, 'builtInRoles'),
|
|
type: get(this, 'pageType'),
|
|
isCustom,
|
|
});
|
|
},
|
|
|
|
});
|