Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
275 changes: 208 additions & 67 deletions src/components/WellShow/AssetPreviewWithOverlay.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,14 @@ const previewStyles = {
slideshow: {
image: {
width: '100%',
height: '100%',
maxWidth: '100%',
maxHeight: 400,
objectFit: 'contain',
display: 'block',
},
frame: {
width: '100%',
height: 400,
height: '100%',
border: 0,
bgcolor: 'background.paper',
pointerEvents: 'auto',
Expand Down Expand Up @@ -96,13 +96,17 @@ export const AssetPreviewWithOverlay = ({
variant,
refetchAssets,
canManageAsset = false,
onViewMore,
slideshowCaption,
}: {
asset: IAsset
variant: 'grid' | 'slideshow'
refetchAssets: () => Promise<
QueryObserverResult<GetListResponse<IAsset>, HttpError>
>
canManageAsset?: boolean
onViewMore?: () => void
slideshowCaption?: string
}) => {
const isSlideshow = variant === 'slideshow'

Expand Down Expand Up @@ -176,88 +180,225 @@ export const AssetPreviewWithOverlay = ({
sx={{
position: 'relative',
width: '100%',
height: isSlideshow ? '100%' : undefined,
display: isSlideshow ? 'flex' : 'block',
flexDirection: isSlideshow ? 'column' : undefined,
'&:hover .asset-overlay': {
opacity: 1,
},
}}
>
<AssetPreview asset={asset} variant={variant} />

<Box
className="asset-overlay"
sx={{
position: 'absolute',
inset: 0,
opacity: isSlideshow ? 1 : 0,
transition: 'opacity 0.2s ease-in-out',
background: isSlideshow
? undefined
: 'linear-gradient(to top, rgba(0,0,0,0.65), rgba(0,0,0,0.05))',
pointerEvents: 'none',
}}
/>

<Typography
className="asset-overlay"
variant="caption"
sx={{
position: 'absolute',
left: 8,
bottom: 8,
opacity: isSlideshow ? 1 : 0,
transition: 'opacity 0.2s ease-in-out',
color: isSlideshow ? 'black' : 'white',
maxWidth: canManageAsset ? '52%' : '70%',
position: 'relative',
minHeight: 0,
flex: isSlideshow ? '1 1 auto' : undefined,
display: isSlideshow ? 'flex' : 'block',
alignItems: isSlideshow ? 'center' : undefined,
justifyContent: isSlideshow ? 'center' : undefined,
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
}}
>
{asset.name}
</Typography>
<AssetPreview asset={asset} variant={variant} />

<Box
className="asset-overlay"
onClick={(event) => event.stopPropagation()}
onMouseDown={(event) => event.stopPropagation()}
onPointerDown={(event) => event.stopPropagation()}
sx={{
position: 'absolute',
right: 8,
bottom: 8,
opacity: isSlideshow ? 1 : 0,
transition: 'opacity 0.2s ease-in-out',
pointerEvents: 'auto',
display: 'flex',
gap: 1,
alignItems: 'center',
}}
>
{asset.signed_url && (
<Button
variant="outlined"
size="small"
onClick={(event) => {
event.stopPropagation()
<Box
className="asset-overlay"
sx={{
position: 'absolute',
inset: 0,
opacity: isSlideshow ? 1 : 0,
transition: 'opacity 0.2s ease-in-out',
background: isSlideshow
? undefined
: 'linear-gradient(to top, rgba(0,0,0,0.65), rgba(0,0,0,0.05))',
pointerEvents: 'none',
}}
/>
</Box>

if (!asset?.signed_url) return
void downloadAsset(asset, refetchAssets).catch(console.error)
{isSlideshow ? (
<Box
sx={{
borderTop: '1px solid',
borderColor: 'divider',
bgcolor: 'background.paper',
display: 'grid',
gridTemplateColumns: 'minmax(0, 1fr) auto minmax(0, 1fr)',
gridTemplateAreas: `
"name caption actions"
"label label label"
`,
gap: 1,
alignItems: 'center',
px: 1.5,
py: 1,
}}
>
<Typography
variant="body1"
title={asset.name}
sx={{
gridArea: 'name',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
fontWeight: 500,
}}
>
{asset.name}
</Typography>

{slideshowCaption && (
<Typography
variant="caption"
sx={{
gridArea: 'caption',
justifySelf: 'center',
bgcolor: 'rgba(0,0,0,0.5)',
color: 'white',
px: 1.5,
py: 0.5,
borderRadius: 1,
whiteSpace: 'nowrap',
}}
>
{slideshowCaption}
</Typography>
)}

<Box
sx={{
bgcolor: 'background.paper',
'&:hover': {
bgcolor: 'background.paper',
},
gridArea: 'actions',
display: 'flex',
gap: 1,
justifyContent: 'flex-end',
alignItems: 'center',
}}
onClick={(event) => event.stopPropagation()}
onMouseDown={(event) => event.stopPropagation()}
onPointerDown={(event) => event.stopPropagation()}
>
Download
</Button>
)}
{asset.signed_url && (
<Button
variant="outlined"
size="small"
onClick={(event) => {
event.stopPropagation()

{canManageAsset && (
<AssetActions asset={asset} refetchAssets={refetchAssets} />
)}
</Box>
if (!asset.signed_url) return
void downloadAsset(asset, refetchAssets).catch(
console.error
)
}}
>
Download
</Button>
)}

{canManageAsset && (
<AssetActions asset={asset} refetchAssets={refetchAssets} />
)}
</Box>

<Typography
variant="body2"
title={asset.label}
color="text.secondary"
sx={{
gridArea: 'label',
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
}}
>
{asset.label}
</Typography>
</Box>
) : (
<Box
sx={{
bgcolor: 'background.paper',
display: 'grid',
gridTemplateColumns: 'minmax(0, 1fr) auto',
gap: 1,
alignItems: 'center',
px: 1,
py: 0.75,
}}
>
<Typography
variant="caption"
title={asset?.name}
sx={{
minWidth: 0,
overflow: 'hidden',
textOverflow: 'ellipsis',
whiteSpace: 'nowrap',
}}
>
{asset?.name}
</Typography>

{onViewMore && (
<Button
size="small"
variant="text"
onClick={(event) => {
event.stopPropagation()
onViewMore()
}}
sx={{ minWidth: 'auto', px: 0.5, py: 0, fontSize: 12 }}
>
View more
</Button>
)}
</Box>
)}

{!isSlideshow && (
<Box
className="asset-overlay"
onClick={(event) => event.stopPropagation()}
onMouseDown={(event) => event.stopPropagation()}
onPointerDown={(event) => event.stopPropagation()}
sx={{
position: 'absolute',
right: 8,
top: 8,
opacity: isSlideshow ? 1 : 0,
transition: 'opacity 0.2s ease-in-out',
pointerEvents: 'auto',
display: 'flex',
gap: 1,
alignItems: 'center',
}}
>
{asset.signed_url && (
<Button
variant="outlined"
size="small"
onClick={(event) => {
event.stopPropagation()

if (!asset?.signed_url) return
void downloadAsset(asset, refetchAssets).catch(console.error)
}}
sx={{
bgcolor: 'background.paper',
'&:hover': {
bgcolor: 'background.paper',
},
}}
>
Download
</Button>
)}

{canManageAsset && (
<AssetActions asset={asset} refetchAssets={refetchAssets} />
)}
</Box>
)}
</Box>
</>
)
Expand Down
26 changes: 8 additions & 18 deletions src/components/WellShow/Attachments.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,7 @@ export const AttachmentsCard = ({
variant="grid"
refetchAssets={refetchAssets}
canManageAsset={canManageAmp}
onViewMore={() => openSlideshow(idx)}
/>
</Box>
))}
Expand All @@ -200,10 +201,12 @@ export const AttachmentsCard = ({
sx={{
position: 'relative',
borderRadius: 2,
overflow: 'hidden',
overflow: 'auto',
boxShadow: 2,
bgcolor: 'grey.100',
minHeight: 300,
minHeight: 360,
height: 480,
resize: 'vertical',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
Expand All @@ -215,6 +218,9 @@ export const AttachmentsCard = ({
variant="slideshow"
refetchAssets={refetchAssets}
canManageAsset={canManageAmp}
slideshowCaption={`${slideshowIndex + 1} / ${
previewAssets.length
}`}
/>
)}
{previewAssets.length > 1 && (
Expand Down Expand Up @@ -255,22 +261,6 @@ export const AttachmentsCard = ({
>
<ChevronRight />
</IconButton>
<Typography
variant="caption"
sx={{
position: 'absolute',
bottom: 8,
left: '50%',
transform: 'translateX(-50%)',
bgcolor: 'rgba(0,0,0,0.5)',
color: 'white',
px: 1.5,
py: 0.5,
borderRadius: 1,
}}
>
{slideshowIndex + 1} / {previewAssets.length}
</Typography>
</>
)}
</Box>
Expand Down
Loading
Loading