/* * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0 */ import { getNestedValue, sortAscendingComparator, returnLocaleDateTime, capitalize, getNestedValuePath } from '../resources/main.js' import { Button, StatusIndicator, } from "@awsui/components-react" import React from "react"; function status(value) { let component = undefined; let new_value = value.toLowerCase(); switch (new_value) { case 'timed-out': component = {value} break; case 'failed': component = {value} break; case 'running': component = {value} break; case 'complete': component = {value} break; case 'error': component = {value} break; case 'in-progress': component = {value} break; case 'success': component = {value} break; default: component = value; } return component; } export function getColumnDefinitions(schemaName, schema, provide_link = false){ let columnDefinitions = schema.attributes.map((attr, index) => { switch (attr.type) { case 'checkbox': return ({ id: attr.name, header: attr.description, cell: item => getNestedValuePath(item, attr.name) ? 'Yes' : 'No', minWidth: 180, sortingField: attr.name } ) case 'status': return ({ id: attr.name, header: attr.description, cell: item => status(getNestedValuePath(item, attr.name)), minWidth: 180, sortingField: attr.name } ) case 'password': return ({ id: attr.name, header: attr.description, cell: item => getNestedValuePath(item, attr.name) ? '[value set]' : '', minWidth: 180, sortingField: attr.name } ) case 'relationship': //Update last element in key name with __. let arrName = attr.name.split("."); arrName[arrName.length-1] = '__' + arrName[arrName.length-1]; let newName = arrName.join("."); return ({ id: newName, header: attr.description, cell: item => getNestedValuePath(item, newName) ? getNestedValuePath(item, newName) : getNestedValuePath(item, attr.name), minWidth: 180, sortingField: newName } ) case 'tag': return ({ id: attr.name, header: attr.description, cell: item => getNestedValuePath(item, attr.name) ? getNestedValuePath(item, attr.name).map((tag, index) => { return tag.key + '=' + tag.value}).join(';') : getNestedValuePath(item, attr.name), minWidth: 180, sortingField: attr.name } ) case 'policies': //Update last element in key name with __. let arrName1 = attr.name.split("."); arrName1[arrName1.length-1] = '__' + arrName1[arrName1.length-1]; let newName1 = arrName1.join("."); return ({ id: attr.name, header: attr.description, cell: item => getNestedValuePath(item, newName1) ? getNestedValuePath(item, newName1).join(', ') : getNestedValuePath(item, newName1), minWidth: 180, sortingField: attr.name } ) case 'policy': return ({ id: attr.name, header: attr.description, cell: item => getNestedValuePath(item, attr.name) ? getNestedValuePath(item, attr.name).map((policy, index) => { let finalMsg = []; if (policy.create) { finalMsg.push('C') } if (policy.read) { finalMsg.push('R') } if (policy.update) { finalMsg.push('U') } if (policy.delete) { finalMsg.push('D') } return
{policy.friendly_name ? policy.friendly_name : policy.schema_name + ' ['+ finalMsg.join('') +']'}
}) : getNestedValuePath(item, attr.name), minWidth: 180, sortingField: attr.name } ) case 'groups': return ({ id: attr.name, header: attr.description, cell: item => getNestedValuePath(item, attr.name) ? getNestedValuePath(item, attr.name).map((group, index) => { return group.group_name}).join(', ') : getNestedValuePath(item, attr.name), minWidth: 180, sortingField: attr.name } ) case 'json': return ({ id: attr.name, header: attr.description, cell: item => getNestedValuePath(item, attr.name) ? JSON.stringify(getNestedValuePath(item, attr.name)) : '', minWidth: 180, sortingField: attr.name } ) default: return ({ id: attr.name, header: attr.description, cell: item => attr.name === schemaName + '_name' && provide_link ?
: getNestedValuePath(item, attr.name), minWidth: 180, sortingField: attr.name } ) } }) defaultAuditColumns(columnDefinitions); //Remove any dynamic embedded_entity attributes as currently not supported in table. //TODO add support for embedded_entity in table column. columnDefinitions = columnDefinitions.filter(filterAttribute => {return filterAttribute.type !== 'embedded_entity'}); return columnDefinitions; }; function defaultAuditColumns(columnDefinitions){ columnDefinitions.push({ id: 'createdTimestamp', header: 'Created on', cell: item => returnLocaleDateTime(getNestedValue(item, '_history', 'createdTimestamp')), minWidth: 180, sortingField: 'createdTimestamp', sortingComparator: (item1, item2) => sortAscendingComparator(returnLocaleDateTime(getNestedValue(item1, '_history', 'createdTimestamp'),true), returnLocaleDateTime(getNestedValue(item2, '_history', 'createdTimestamp'),true)) }); columnDefinitions.push({ id: 'createdBy', header: 'Created by', cell: item => getNestedValue(item, '_history', 'createdBy', 'email'), minWidth: 180, sortingField: 'createdBy', sortingComparator: (item1, item2) => sortAscendingComparator(getNestedValue(item1, '_history', 'createdBy', 'email'), getNestedValue(item2, '_history', 'createdBy', 'email')) }); columnDefinitions.push({ id: 'lastModifiedTimestamp', header: 'Last modified on', cell: item => getNestedValue(item, '_history', 'lastModifiedTimestamp') ? returnLocaleDateTime(getNestedValue(item, '_history', 'lastModifiedTimestamp') ) : returnLocaleDateTime(getNestedValue(item, '_history', 'createdTimestamp')), minWidth: 180, sortingField: 'lastModifiedTimestamp', sortingComparator: (item1, item2) => sortAscendingComparator( getNestedValue(item1, '_history', 'lastModifiedTimestamp') ? returnLocaleDateTime(getNestedValue(item1, '_history', 'lastModifiedTimestamp'), true ) : returnLocaleDateTime(getNestedValue(item1, '_history', 'createdTimestamp'),true), getNestedValue(item2, '_history', 'lastModifiedTimestamp') ? returnLocaleDateTime(getNestedValue(item2, '_history', 'lastModifiedTimestamp'), true ) : returnLocaleDateTime(getNestedValue(item2, '_history', 'createdTimestamp'), true) ) }); columnDefinitions.push({ id: 'lastModifiedBy', header: 'Last modified by', cell: item => getNestedValue(item, '_history', 'lastModifiedBy', 'email') ? getNestedValue(item, '_history', 'lastModifiedBy', 'email') : getNestedValue(item, '_history', 'createdBy', 'email'), minWidth: 180, sortingField: 'lastModifiedBy', sortingComparator: (item1, item2) => sortAscendingComparator( getNestedValue(item1, '_history', 'lastModifiedBy', 'email') ? returnLocaleDateTime(getNestedValue(item1, '_history', 'lastModifiedBy', 'email'), true ) : returnLocaleDateTime(getNestedValue(item1, '_history', 'createdBy', 'email'),true), getNestedValue(item2, '_history', 'lastModifiedBy', 'email') ? returnLocaleDateTime(getNestedValue(item2, '_history', 'lastModifiedBy', 'email'), true ) : returnLocaleDateTime(getNestedValue(item2, '_history', 'createdBy', 'email'), true) ) }); } function defaultAuditSelectorOptions(options){ let auditSelectorOptions = []; auditSelectorOptions.push({ id: 'createdTimestamp', label: 'Created on', editable: true, }); auditSelectorOptions.push({ id: 'createdBy', label: 'Created by', editable: true, }); auditSelectorOptions.push({ id: 'lastModifiedTimestamp', label: 'Last modified on', editable: true, }); auditSelectorOptions.push({ id: 'lastModifiedBy', label: 'Last modified by', editable: true, }); return auditSelectorOptions; } export function getContentSelectorOptions(schema){ //Remove any dynamic embedded_entity attributes as currently not supported in table. //TODO add support for embedded_entity in table column. let cleansedSchema = schema.attributes.filter(filterAttribute => {return (filterAttribute.type !== 'embedded_entity' || filterAttribute.type !== 'policy' || filterAttribute.type !== 'policies'|| filterAttribute.type !== 'groups')}); let options = cleansedSchema.map((attr, index) => { let option = {}; if (attr.type === 'relationship'){ //Update last element in key name with __. let arrName = attr.name.split("."); arrName[arrName.length-1] = '__' + arrName[arrName.length-1]; let newName = arrName.join("."); option = { id: newName, label: attr.description, editable: attr.alwaysDisplay ? !attr.alwaysDisplay : true, }; } else if (attr.type === 'json' || attr.type === 'embedded_entity'){ option = { id: attr.name, label: attr.description, editable: false, }; } else { option = { id: attr.name, label: attr.description, editable: attr.alwaysDisplay ? !attr.alwaysDisplay : true, }; } return option; }) const contentSelectorOptions = [ { label: 'Main attributes', options: options }, { label: 'Audit', options: defaultAuditSelectorOptions() }]; return contentSelectorOptions; } export function getPageSelectorOptions(schemaName){ return [ { value: 10, label: '10 ' + capitalize(schemaName + 's') }, { value: 30, label: '30 ' + capitalize(schemaName + 's') }, { value: 50, label: '50 ' + capitalize(schemaName + 's') } ]; } export const CUSTOM_PREFERENCE_OPTIONS = [{ value: 'table', label: 'Table' }, { value: 'cards', label: 'Cards' }]; export function getDefaultPreferences(schema, table_key){ //Get all required attributes from schema. let visibleAttributes = schema.attributes.filter(attribute => { return attribute.required && !attribute.hidden && attribute.type !== 'embedded_entity' && attribute.type !== 'policy' && attribute.type !== 'policies'&& attribute.type !== 'groups'; }); visibleAttributes = visibleAttributes.map(attribute => { return attribute.name; }); //Add default audit attributes to display. visibleAttributes.push('lastModifiedTimestamp'); visibleAttributes.push('lastModifiedBy'); return { pageSize: 10, visibleContent: visibleAttributes, wraplines: false, trackBy: table_key }; }