// 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'
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.ec2AmiInfo && image.ec2AmiInfo.architecture}
{!image.ec2AmiInfo && loadingText}
{image.ec2AmiInfo && image.ec2AmiInfo.state}
{!image.ec2AmiInfo && loadingText}
{t(
'customImages.imageDetails.properties.configurationUrl.tooltiptext',
)}
}
>
{truncate(image.imageConfiguration.url, {
length: 100,
})}
{image.imageBuildStatus}
{image.ec2AmiInfo && (
{t(
'customImages.imageDetails.properties.amiId.tooltiptext',
)}
}
>
{image.ec2AmiInfo.amiId}
)}
{!image.ec2AmiInfo && loadingText}
{image.imageId}
{image.region}
{image.version}
)
}
type CustomImageTagsProps = {
image: ImageInfoSummary
}
function CustomImageTags({image}: CustomImageTagsProps) {
const {t} = useTranslation()
const tags = image.ec2AmiInfo ? image.ec2AmiInfo.tags : []
const {
items,
actions,
filteredItemsCount,
collectionProps,
filterProps,
paginationProps,
} = useCollection(tags || [], {
filtering: {
empty: (
),
noMatch: (
actions.setFiltering('')}>
{t('customImages.imageDetails.tags.filtering.noMatch.action')}
}
/>
),
},
pagination: {pageSize: 10},
sorting: {},
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: ,
},
]
: []),
]}
/>
)
}