import { useState, useEffect, useMemo, memo } from 'react';
// Router
import { useNavigate } from 'react-router-dom';
// Cloudscape
import {
Button,
ColumnLayout,
Form,
Header,
Input,
Link,
Popover,
Select,
SpaceBetween,
Spinner,
} from '@cloudscape-design/components';
// Dates
import dayjs from 'dayjs';
// App
import SelectDatastore from '../../common/SelectDatastore';
import KeyValuePair from '../../common/KeyValuePair';
import { getImageSet } from '../../utils/AwsHealthImagingApi';
// Metadata header description. Not exported
const HeaderDescription = memo(function HeaderDescription() {
const navigate = useNavigate();
return (
<>
Select a data store and specify and ImageSet ID or use the{' '}
navigate('/search')}>search feature.
The latest metadata version can be
edited.
>
);
});
// Metadata header
const MetadataViewerHeader = memo(function MetadataViewerHeader({
isSomethingLoading,
handleRetrieveMetadata,
editEnabled,
resetEnabled,
handleReset,
navigate,
}) {
return (
}
actions={
}
>
Metadata
);
});
// Create a option object from an imageSetVersion object
function buildVersionOption(imageSetVersion) {
let tags = [
`Updated at: ${dayjs.unix(imageSetVersion.updatedAt).format('YYYY-MM-DD H:mm')}`,
// `Created at: ${dayjs.unix(imageSetVersion.createdAt).format('YYYY-MM-DD H:mm')}`,
];
if (imageSetVersion.ImageSetWorkflowStatus === 'UPDATING')
tags.push(`Status: ${imageSetVersion.ImageSetWorkflowStatus}`);
if (imageSetVersion.message) tags.push(`Message: ${imageSetVersion.message}`);
let selectOption = {
label: `Version ${imageSetVersion.versionId}`,
value: imageSetVersion.versionId,
tags: tags,
};
if (imageSetVersion.ImageSetWorkflowStatus === 'UPDATING') selectOption.disabled = true;
return selectOption;
}
// Image set ID object
// When metadata is not loaded (versionsLoaded = false) -
// When metadata is loaded (versionsLoaded = true) - popover with imageset information
function ImageSetId({ selectedDatastore, isSomethingLoading, imageSetId, setImageSetId, versionsLoaded }) {
const [imageSetDetails, setImageSetDetails] = useState();
useEffect(() => {
async function getImageSetDetails() {
if (!selectedDatastore?.value || !imageSetId) return;
const imageSetDetails = await getImageSet({
datastoreId: selectedDatastore.value,
imageSetId: imageSetId,
});
setImageSetDetails(
{imageSetDetails.data.imageSetId}
{imageSetDetails.data.datastoreId}
{imageSetDetails.data.imageSetState}
{imageSetDetails.data.imageSetWorkflowStatus || '---'}
{dayjs.unix(imageSetDetails.data.createdAt).format('YYYY-MM-DD H:mm')}
{dayjs.unix(imageSetDetails.data.updatedAt).format('YYYY-MM-DD H:mm')}
{imageSetDetails.data.message && (
{imageSetDetails.data.message}
)}
);
}
if (selectedDatastore == null || !imageSetId) return;
getImageSetDetails();
}, [selectedDatastore, imageSetId]);
if (versionsLoaded) {
return (
);
} else {
return (
setImageSetId(detail.value)}
/>
);
}
}
// Metadata search row
const MetadataViewerSearch = memo(function MetadataViewerSearch({
selectedDatastore,
setSelectedDatastore,
imageSetId,
setImageSetId,
imageSetVersions,
selectedVersion,
handleChangeVersion,
errorText,
isSomethingLoading,
}) {
const versionOptions = useMemo(
() => imageSetVersions.map((v) => buildVersionOption(v)).sort((a, b) => Number(b.value) - Number(a.value)),
[imageSetVersions]
);
return (
);
});
export { buildVersionOption, MetadataViewerHeader, MetadataViewerSearch };