blob: 234a452866c834cd56d53637fc46cb34a37c732e [file] [log] [blame]
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
import * as React from 'react'
import {
Box, Button,
Dialog, DialogActions, DialogContent,
DialogTitle,
IconButton,
} from '@mui/material'
import EnhancedTableToolbar from '../EnhancedTableToolbar'
import OsLogo from '../common/OsLogo'
import { Size } from '../../models/size'
import BrowserLogo from '../common/BrowserLogo'
import browserVersion from '../../util/browser-version'
import Grid from '@mui/material/Grid';
import { experimentalStyled as styled } from '@mui/material/styles';
import Paper from '@mui/material/Paper';
import { Info as InfoIcon } from '@mui/icons-material'
import { useState } from 'react'
import Typography from '@mui/material/Typography'
const Item = styled(Paper)(({ theme }) => ({
backgroundColor: theme.palette.mode === 'dark' ? '#1A2027' : '#fff',
...theme.typography.body2,
padding: theme.spacing(2),
textAlign: 'center',
color: theme.palette.text.secondary,
}));
function QueuedSessions (props) {
const [itemOpen, setItemOpen] = useState('')
const { sessionQueueRequests } = props
const queue = sessionQueueRequests.map((sessionQueueRequest) => {
return JSON.parse(sessionQueueRequest)
});
const displayRequestInfo = (id: string): JSX.Element => {
const handleInfoIconClick = (): void => {
setItemOpen(id)
}
return (
<IconButton
sx={{ padding: '1px' }}
onClick={handleInfoIconClick}
size='large'
>
<InfoIcon />
</IconButton>
)
}
return (
<Box
paddingTop='30px'
width='100%'
bgcolor='background.paper'
marginTop='30px'
marginBottom='20px'
sx={{flexGrow: 1}}
>
{queue.length > 0 && (
<Box minWidth='750px'>
<EnhancedTableToolbar title={`Queue (${queue.length})`} />
<Grid container spacing={{ xs: 2, md: 3 }} columns={{ xs: 4, sm: 8, md: 12 }}>
{queue.map((queueItem, index) => (
<Grid item xs={2} sm={4} md={4} key={index}>
<Item>
{displayRequestInfo(index as string)}
{(queueItem.platformName ?? '' as string).length > 0 &&
<OsLogo
osName={queueItem.platformName as string}
size={Size.S}
/>
}
{(queueItem.browserName ?? '' as string).length > 0 &&
<BrowserLogo
browserName={queueItem.browserName as string}
/>
}
{browserVersion(queueItem.browserVersion as string)}
<Dialog
onClose={() => setItemOpen('')}
aria-labelledby='session-info-dialog'
open={itemOpen === index}
fullWidth
maxWidth='md'
>
<DialogTitle id='session-info-dialog'>
<Typography
gutterBottom component='span'
sx={{ paddingX: '10px' }}
>
<Box
fontWeight='fontWeightBold'
mr={1}
display='inline'
>
Session Request
</Box>
</Typography>
{(queueItem.platformName ?? '' as string).length > 0 &&
<OsLogo
osName={queueItem.platformName as string}
size={Size.S}
/>
}
{(queueItem.browserName ?? '' as string).length > 0 &&
<BrowserLogo
browserName={queueItem.browserName as string}
/>
}
{browserVersion(queueItem.browserVersion as string)}
</DialogTitle>
<DialogContent dividers>
<Typography gutterBottom>
Capabilities:
</Typography>
<Typography gutterBottom component='span'>
<pre>
{JSON.stringify(queueItem,null, 2)}
</pre>
</Typography>
</DialogContent>
<DialogActions>
<Button
onClick={() => setItemOpen('')}
color='primary'
variant='contained'
>
Close
</Button>
</DialogActions>
</Dialog>
</Item>
</Grid>
))}
</Grid>
</Box>
)}
</Box>
)
}
export default QueuedSessions