ui/lib/shared/addon/components/schema/input-secret/component.js

107 lines
2.9 KiB
JavaScript

import { isArray } from '@ember/array';
import { next } from '@ember/runloop';
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({
layout,
intl: service(),
// Inputs
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','secret'));
set(this,'namespaceSecrets', get(this,'store').all('namespacedSecret').filterBy('type','namespacedSecret'));
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,'name') ) {
exact = get(secret,'id');
}
});
const namespaceId = get(this,'namespace.id');
if ( !exact && namespaceId ) {
get(this,'namespaceSecrets').forEach((secret) => {
if ( def === get(secret,'name') && get(secret,'namespaceId') === namespaceId) {
exact = get(secret,'id');
}
});
}
next(() => {
set(this,'selected', exact || null);
});
}
},
filtered: computed('projectSecrets.[]','namespaceSecrets.[]','namespace.id', 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');
}),
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);
}),
});