mirror of https://github.com/rancher/ui.git
166 lines
4.1 KiB
JavaScript
166 lines
4.1 KiB
JavaScript
import { inject as service } from '@ember/service';
|
|
import Component from '@ember/component';
|
|
import C from 'ui/utils/constants';
|
|
import layout from './template';
|
|
import { get, set, setProperties, computed } from '@ember/object';
|
|
|
|
export default Component.extend({
|
|
access: service(),
|
|
intl: service(),
|
|
globalStore: service(),
|
|
layout,
|
|
allowTeams: true,
|
|
checking: false,
|
|
addInput: '',
|
|
allPrincipals: null,
|
|
selected: null,
|
|
selectExactOnBlur: true,
|
|
includeLocal: true,
|
|
searchOnlyGroups: false,
|
|
|
|
init() {
|
|
this._super(...arguments);
|
|
|
|
set(this, 'allPrincipals', get(this, 'globalStore').all('principal'));
|
|
|
|
if (this.initialPrincipal) {
|
|
setProperties(this, {
|
|
selected: this.initialPrincipal,
|
|
filter: this.initialPrincipal.name,
|
|
});
|
|
}
|
|
},
|
|
|
|
actions: {
|
|
add() {
|
|
if ( get(this, 'checking') ) {
|
|
return;
|
|
}
|
|
|
|
const addInput = get(this, 'addInput');
|
|
|
|
if ( !addInput ) {
|
|
set(this, 'selected', null);
|
|
|
|
if (this.action) {
|
|
this.action(null);
|
|
}
|
|
|
|
// console.log('@add:Cleared principal');
|
|
|
|
return;
|
|
}
|
|
|
|
set(this, 'checking', true);
|
|
|
|
var input = get(addInput, 'value').trim();
|
|
let match = get(this, 'allPrincipals').findBy('id', input);
|
|
|
|
if (match) {
|
|
this.send('selectExact', match);
|
|
|
|
set(this, 'checking', false);
|
|
} else {
|
|
get(this, 'globalStore').rawRequest({
|
|
url: `principals/${ encodeURIComponent(input) }`,
|
|
method: 'GET',
|
|
}).then((xhr) => {
|
|
if ( xhr.status === 204 ) {
|
|
return;
|
|
}
|
|
|
|
if ( xhr.body && typeof xhr.body === 'object' ) {
|
|
let principal = get(xhr, 'body');
|
|
|
|
this.send('selectExact', principal);
|
|
}
|
|
}).catch((xhr) => {
|
|
if (this.onError) {
|
|
this.onError(`Principal not found: ${ xhr.statusText }`);
|
|
}
|
|
})
|
|
.finally(() => {
|
|
set(this, 'checking', false);
|
|
});
|
|
}
|
|
},
|
|
|
|
addObject(info) {
|
|
if (this.action) {
|
|
this.action(info);
|
|
}
|
|
|
|
setProperties(this, {
|
|
selected: info,
|
|
filter: get(info, 'name')
|
|
});
|
|
// console.log('@addObject:Set principal:', JSON.stringify(info));
|
|
},
|
|
|
|
selectExact(match) {
|
|
const cur = get(this, 'selected');
|
|
|
|
if ( !cur ) {
|
|
if (this.action) {
|
|
this.action(match);
|
|
}
|
|
|
|
setProperties(this, {
|
|
addInput: '',
|
|
selected: match
|
|
});
|
|
// console.log('@selectExact:Set principal:', JSON.stringify(match));
|
|
}
|
|
},
|
|
},
|
|
|
|
showDropdown: computed('access.provider', function() {
|
|
return get(this, 'access.provider') !== 'localauthconfig';
|
|
}),
|
|
|
|
addDisabled: computed('addInput.value', 'checking', function() {
|
|
let input = get(this, 'addInput.value') || '';
|
|
|
|
return get(this, 'checking') || input.trim().length === 0;
|
|
}),
|
|
|
|
dropdownChoices: computed('allPrincipals.@each.{logicalType,id}', 'allowTeams', function() {
|
|
var allowTeams = get(this, 'allowTeams');
|
|
|
|
return get(this, 'allPrincipals').filter((principal) => {
|
|
var type = get(principal, 'parsedExternalType');
|
|
var logicalType = get(principal, 'logicalType');
|
|
|
|
// Don't show other junk that was added to the store after load
|
|
if ( !get(principal, '_mine') ) {
|
|
return false;
|
|
}
|
|
|
|
// Don't show people
|
|
if ( logicalType === C.PROJECT.PERSON ) {
|
|
return false;
|
|
}
|
|
|
|
// Don't show teams if disabled
|
|
if ( !allowTeams && type === C.PROJECT.TYPE_GITHUB_TEAM ) {
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}).sortBy('logicalTypeSort', 'profileUrl', 'name');
|
|
}),
|
|
|
|
dropdownLabel: computed('access.provider', 'intl.locale', function() {
|
|
let out = '';
|
|
let intl = get(this, 'intl');
|
|
|
|
if ( get(this, 'access.provider') === 'githubconfig' ) {
|
|
out = intl.t('inputIdentity.dropdownLabel.teams');
|
|
} else {
|
|
out = intl.t('inputIdentity.dropdownLabel.groups');
|
|
}
|
|
|
|
return out;
|
|
}),
|
|
});
|