import Component from '@ember/component'; import { setProperties, set, get } from '@ember/object'; export default Component.extend({ tagName: '', ondelete: function() { this.onsubmit(...arguments); }, oncancel: function() { this.onsubmit(...arguments); }, onsubmit: function() {}, actions: { createServices: function(item, e) { // Services in the menus should: // 1. Be unique (they potentially could be duplicated due to services from different namespaces) // 2. Only include services that shold have intentions // 3. Include an 'All Services' option // 4. Include the current Source and Destination incase they are virtual services/don't exist yet let items = e.data .uniqBy('Name') .toArray() .filter( item => !['connect-proxy', 'mesh-gateway', 'terminating-gateway'].includes(item.Kind) ) .sort((a, b) => a.Name.localeCompare(b.Name)); items = [{ Name: '*' }].concat(items); let source = items.findBy('Name', item.SourceName); if (!source) { source = { Name: item.SourceName }; items = [source].concat(items); } let destination = items.findBy('Name', item.DestinationName); if (!destination) { destination = { Name: item.DestinationName }; items = [destination].concat(items); } setProperties(this, { services: items, SourceName: source, DestinationName: destination, }); }, createNspaces: function(item, e) { // Nspaces in the menus should: // 1. Include an 'All Namespaces' option // 2. Include the current SourceNS and DestinationNS incase they don't exist yet let items = e.data.toArray().sort((a, b) => a.Name.localeCompare(b.Name)); items = [{ Name: '*' }].concat(items); let source = items.findBy('Name', item.SourceNS); if (!source) { source = { Name: item.SourceNS }; items = [source].concat(items); } let destination = items.findBy('Name', item.DestinationNS); if (!destination) { destination = { Name: item.DestinationNS }; items = [destination].concat(items); } setProperties(this, { nspaces: items, SourceNS: source, DestinationNS: destination, }); }, createNewLabel: function(template, term) { return template.replace(/{{term}}/g, term); }, isUnique: function(items, term) { return !items.findBy('Name', term); }, change: function(e, form, item) { const target = e.target; let name, selected, match; switch (target.name) { case 'SourceName': case 'DestinationName': case 'SourceNS': case 'DestinationNS': name = selected = target.value; // Names can be selected Service EmberObjects or typed in strings // if its not a string, use the `Name` from the Service EmberObject if (typeof name !== 'string') { name = get(target.value, 'Name'); } // mutate the value with the string name // which will be handled by the form target.value = name; // these are 'non-form' variables so not on `item` // these variables also exist in the template so we know // the current selection // basically the difference between // `item.DestinationName` and just `DestinationName` // see if the name is already in the list match = this.services.filterBy('Name', name); if (match.length === 0) { // if its not make a new 'fake' Service that doesn't exist yet // and add it to the possible services to make an intention between selected = { Name: name }; switch (target.name) { case 'SourceName': case 'DestinationName': set(this, 'services', [selected].concat(this.services.toArray())); break; case 'SourceNS': case 'DestinationNS': set(this, 'nspaces', [selected].concat(this.nspaces.toArray())); break; } } set(this, target.name, selected); break; } form.handleEvent(e); }, }, });