// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"). You may not use this file except in compliance // with the License. A copy of the License is located at // // http://aws.amazon.com/apache2.0/ // // or in the "LICENSE.txt" file accompanying this file. This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES // OR CONDITIONS OF ANY KIND, express or implied. See the License for the specific language governing permissions and // limitations under the License. import {ImageBuildStatus, ImageInfoSummary} from '../../../types/images' import React, {useCallback} from 'react' import {setState, getState, useState} from '../../../store' import {GetCustomImageConfiguration} from '../../../model' import {useCollection} from '@cloudscape-design/collection-hooks' import {useTranslation} from 'react-i18next' import Tabs from '@cloudscape-design/components/tabs' import { Button, ColumnLayout, Container, Header, Pagination, Link, Popover, SpaceBetween, StatusIndicator, Table, TextFilter, } from '@cloudscape-design/components' import Loading from '../../../components/Loading' import DateView from '../../../components/date/DateView' import CustomImageStackEvents from './CustomImageStackEvents' import {ValueWithLabel} from '../../../components/ValueWithLabel' import EmptyState from '../../../components/EmptyState' import {truncate} from 'lodash' import {ReadonlyConfigView} from '../../../components/ConfigView' import {extendCollectionsOptions} from '../../../shared/extendCollectionsOptions' import { AMIStatusIndicator, CustomImageStatusIndicator, } from '../../../components/Status' const customImagesPath = ['app', 'customImages'] function CustomImageConfiguration() { const configuration = useState([...customImagesPath, 'config']) React.useEffect(() => { const imageId = getState([...customImagesPath, 'selected']) GetCustomImageConfiguration(imageId, (configuration: any) => { setState([...customImagesPath, 'config'], configuration) }) }, []) return configuration ? ( ) : ( ) } function CustomImageProperties() { const {t} = useTranslation() const selected = useState([...customImagesPath, 'selected']) const image = useState(['customImages', 'index', selected]) const loadingText = t('global.loading') const copyImageConfigUrl = useCallback(() => { navigator.clipboard.writeText(image.imageConfiguration?.url) }, [image.imageConfiguration?.url]) const copyAmiId = useCallback(() => { navigator.clipboard.writeText(image.ec2AmiInfo?.amiId) }, [image.ec2AmiInfo?.amiId]) return ( {t('customImages.imageDetails.properties.header.title')} } > {image.creationTime ? : '-'} {image.ec2AmiInfo && image.ec2AmiInfo.architecture} {!image.ec2AmiInfo && loadingText} {image.ec2AmiInfo && ( )} {!image.ec2AmiInfo && loadingText} {t( 'customImages.imageDetails.properties.configurationUrl.tooltiptext', )} } > } /> ), }, sorting: { defaultState: { sortingColumn: { sortingField: 'key', }, }, }, selection: {}, }), ) return ( tag.key, sortingField: 'key', }, { id: 'value', header: t('customImages.imageDetails.tags.value'), cell: tag => tag.value, }, ]} loading={!image} items={items} loadingText={t('customImages.imageDetails.tags.filtering.loadingText')} pagination={} filter={ } /> ) } export default function CustomImageDetails() { const {t} = useTranslation() const selected = useState([...customImagesPath, 'selected']) const image: ImageInfoSummary = useState(['customImages', 'index', selected]) return ( : , }, { label: t('customImages.imageDetails.tabs.tags'), id: 'tags', content: image ? : , }, { label: t('customImages.imageDetails.tabs.configuration'), id: 'configuration', content: , }, ...(image && image.imageBuildStatus !== ImageBuildStatus.BuildComplete ? [ { label: t('customImages.imageDetails.tabs.stackEvents'), id: 'stack-events', content: , }, ] : []), ]} /> ) }