import * as plugins from '../plugins.js'; import { DeesElement, customElement, html, state, css, cssManager } from '@design.estate/dees-element'; import * as appstate from '../appstate.js'; @customElement('cloudly-view-secretsgroups') export class CloudlyViewSecretGroups extends DeesElement { @state() private data: appstate.IDataState = { secretGroups: [], secretBundles: [], }; constructor() { super(); appstate.dataState .select((stateArg) => stateArg) .subscribe((dataArg) => { this.data = dataArg; }); } public static styles = [ cssManager.defaultStyles, css` :host { display: block; margin: auto; max-width: 1280px; padding: 16px 16px; } `, ]; public render() { return html` SecretGroups { return { name: secretGroup.data.name, priority: secretGroup.data.priority, tags: html``, key: secretGroup.data.key, history: (() => { const allHistory = []; for (const environment in secretGroup.data.environments) { allHistory.push(...secretGroup.data.environments[environment].history); } return allHistory.length; })(), }; }} .dataActions=${[ { name: 'add SecretGroup', type: ['header', 'footer'], iconName: 'plus', actionFunc: async () => { plugins.deesCatalog.DeesModal.createAndShow({ heading: 'create new SecretGroup', content: html` { dataArg.table.data.push({ environment: 'new environment', value: '', }); dataArg.table.requestUpdate('data'); }, }, { name: 'delete environment', iconName: 'trash', type: ['inRow'], actionFunc: async (dataArg) => { dataArg.table.data.splice(dataArg.table.data.indexOf(dataArg.item), 1); dataArg.table.requestUpdate('data'); }, }, ] as plugins.deesCatalog.ITableAction[]} .editableFields=${['environment', 'value']} > `, menuOptions: [ { name: 'cancel', action: async (modalArg) => { await modalArg.destroy(); }, }, { name: 'save', action: async (modalArg) => { const deesForm = modalArg.shadowRoot.querySelector('dees-form'); const formData = await deesForm.collectFormData(); console.log(`Prepare saving of data:`); console.log(formData); const environments: plugins.interfaces.data.ISecretGroup['data']['environments'] = {}; for (const itemArg of formData['environments'] as any[]) { environments[itemArg.environment] = { value: itemArg.value, history: [], lastUpdated: Date.now(), }; } await appstate.dataState.dispatchAction(appstate.createSecretGroupAction, { id: null, data: { name: formData['data.name'] as string, description: formData['data.description'] as string, key: formData['data.key'] as string, environments, tags: [], }, }); await modalArg.destroy(); }, }, ], }); }, }, { name: 'edit', type: ['contextmenu', 'inRow', 'doubleClick'], iconName: 'penToSquare', actionFunc: async ( dataArg: plugins.deesCatalog.ITableActionDataArg ) => { const environmentsArray: Array< plugins.interfaces.data.ISecretGroup['data']['environments'][any] & { environment: string; } > = []; for (const environmentName of Object.keys(dataArg.item.data.environments)) { environmentsArray.push({ environment: environmentName, ...dataArg.item.data.environments[environmentName], }); } await plugins.deesCatalog.DeesModal.createAndShow({ heading: 'Edit Secret', content: html` { return { environment: itemArg.environment, value: itemArg.value, }; })} .editableFields=${['environment', 'value']} .dataActions=${[ { name: 'delete', iconName: 'trash', type: ['inRow'], actionFunc: async (actionDataArg) => { actionDataArg.table.data.splice( actionDataArg.table.data.indexOf(actionDataArg.item), 1 ); }, }, ] as plugins.deesCatalog.ITableAction[]} > `, menuOptions: [ { name: 'Cancel', iconName: null, action: async (modalArg) => { await modalArg.destroy(); }, }, { name: 'Save', iconName: null, action: async (modalArg) => { const data = await modalArg.shadowRoot .querySelector('dees-form') .collectFormData(); console.log(data); const updatedSecretGroup: plugins.interfaces.data.ISecretGroup = { id: dataArg.item.id, data: { name: data['data.name'] as string, description: data['data.description'] as string, key: data['data.key'] as string, environments: {}, tags: dataArg.item.data.tags, }, }; const environments: plugins.interfaces.data.ISecretGroup['data']['environments'] = {}; for (const itemArg of data['environments'] as any[]) { } }, }, ], }); }, }, { name: 'history', iconName: 'clockRotateLeft', type: ['contextmenu', 'inRow'], actionFunc: async ( dataArg: plugins.deesCatalog.ITableActionDataArg ) => { const historyArray: Array<{ environment: string; value: string; }> = []; for (const environment of Object.keys(dataArg.item.data.environments)) { for (const historyItem of dataArg.item.data.environments[environment].history) { historyArray.push({ environment, value: historyItem.value, }); } } await plugins.deesCatalog.DeesModal.createAndShow({ heading: `history for ${dataArg.item.data.key}`, content: html` ) => { console.log('delete', itemArg); }, }, ] as plugins.deesCatalog.ITableAction[]} > `, menuOptions: [ { name: 'close', action: async (modalArg) => { await modalArg.destroy(); }, }, ], }); }, }, { name: 'delete', iconName: 'trash', type: ['contextmenu', 'inRow'], actionFunc: async ( itemArg: plugins.deesCatalog.ITableActionDataArg ) => { plugins.deesCatalog.DeesModal.createAndShow({ heading: `Delete ${itemArg.item.data.key}`, content: html`
Do you really want to delete the secret?
${itemArg.item.data.key}
`, menuOptions: [ { name: 'cancel', action: async (modalArg) => { await modalArg.destroy(); }, }, { name: 'delete', action: async (modalArg) => { console.log(`Delete ${itemArg.item.id}`); await appstate.dataState.dispatchAction(appstate.deleteSecretGroupAction, { secretGroupId: itemArg.item.id, }); await modalArg.destroy(); }, }, ], }); }, }, ] as plugins.deesCatalog.ITableAction[]} >
`; } }