mirror of https://github.com/rancher/ui.git
114 lines
3.1 KiB
JavaScript
114 lines
3.1 KiB
JavaScript
import { isArray } from '@ember/array';
|
|
import { next } from '@ember/runloop';
|
|
import { ucFirst } from 'shared/utils/util';
|
|
import { get, set, computed, observer } from '@ember/object';
|
|
import { inject as service } from '@ember/service';
|
|
import Component from '@ember/component';
|
|
import layout from './template';
|
|
|
|
export default Component.extend({
|
|
intl: service(),
|
|
|
|
layout,
|
|
// Inputs
|
|
type: 'secret',
|
|
namespace: null,
|
|
selectClass: 'form-control',
|
|
valueKey: 'name', // What to set the value as.. 'name' or 'id'
|
|
|
|
// For use as a catalog question
|
|
field: null, // Read default from a schema resourceField
|
|
value: null, // name or id output string
|
|
|
|
selected: null, // Selected secret ID
|
|
projectSecrets: null,
|
|
namespaceSecrets: null,
|
|
|
|
init() {
|
|
this._super(...arguments);
|
|
|
|
set(this, 'projectSecrets', get(this, 'store').all('secret').filterBy('type', get(this, 'type')));
|
|
set(this, 'namespaceSecrets', get(this, 'store').all('namespacedSecret').filterBy('type', `namespaced${ ucFirst(get(this, 'type')) }`));
|
|
|
|
let def = get(this, 'value') || get(this, 'field.default');
|
|
|
|
if ( def && !get(this, 'selected') ) {
|
|
var exact;
|
|
|
|
get(this, 'projectSecrets').forEach((secret) => {
|
|
if ( def === get(secret, get(this, 'valueKey')) ) {
|
|
exact = get(secret, 'id');
|
|
}
|
|
});
|
|
|
|
const namespaceId = get(this, 'namespace.id');
|
|
|
|
if ( !exact && namespaceId ) {
|
|
get(this, 'namespaceSecrets').forEach((secret) => {
|
|
if ( def === get(secret, get(this, 'valueKey')) && get(secret, 'namespaceId') === namespaceId) {
|
|
exact = get(secret, 'id');
|
|
}
|
|
});
|
|
}
|
|
|
|
next(() => {
|
|
set(this, 'selected', exact || null);
|
|
});
|
|
}
|
|
},
|
|
|
|
selectedChanged: observer('selected', function() {
|
|
let id = get(this, 'selected');
|
|
let str = null;
|
|
|
|
if ( id ) {
|
|
let secret = get(this, 'projectSecrets').findBy('id', id) || get(this, 'namespaceSecrets').findBy('id', id);
|
|
|
|
if ( secret ) {
|
|
set(this, 'selectedSecret', secret);
|
|
str = get(secret, get(this, 'valueKey'));
|
|
} else {
|
|
set(this, 'selectedSecret', null);
|
|
}
|
|
}
|
|
|
|
set(this, 'value', str);
|
|
}),
|
|
filtered: computed('exclude', 'namespace.id', 'namespaceSecrets.[]', 'projectSecrets.[]', function() {
|
|
const intl = get(this, 'intl');
|
|
|
|
let out = get(this, 'projectSecrets').map((secret) => {
|
|
return {
|
|
label: get(secret, 'name'),
|
|
value: get(secret, 'id'),
|
|
group: intl.t('generic.project'),
|
|
};
|
|
});
|
|
|
|
const namespaceId = get(this, 'namespace.id');
|
|
|
|
if ( namespaceId ) {
|
|
get(this, 'namespaceSecrets').filterBy('namespaceId', namespaceId).forEach((secret) => {
|
|
out.push({
|
|
label: get(secret, 'name'),
|
|
value: get(secret, 'id'),
|
|
group: intl.t('generic.namespace'),
|
|
});
|
|
});
|
|
}
|
|
|
|
let exclude = get(this, 'exclude');
|
|
|
|
if ( exclude ) {
|
|
if ( !isArray(exclude) ) {
|
|
exclude = [exclude];
|
|
}
|
|
|
|
out = out.filter((x) => !exclude.includes(x.value));
|
|
}
|
|
|
|
return out.sortBy('group', 'label');
|
|
}),
|
|
|
|
});
|