mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: styled application environment boxes (#6296)
This commit is contained in:
		
							parent
							
								
									7baed29c07
								
							
						
					
					
						commit
						56cbe1485e
					
				| @ -1,24 +1,60 @@ | ||||
| import { usePageTitle } from 'hooks/usePageTitle'; | ||||
| import { Mermaid } from 'component/common/Mermaid/Mermaid'; | ||||
| import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; | ||||
| import { Alert, styled } from '@mui/material'; | ||||
| import { Alert, Box, Divider, styled, Typography } from '@mui/material'; | ||||
| import { useThemeMode } from 'hooks/useThemeMode'; | ||||
| import { useRequiredPathParam } from 'hooks/useRequiredPathParam'; | ||||
| import { useNavigate } from 'react-router-dom'; | ||||
| import Check from '@mui/icons-material/CheckCircle'; | ||||
| 
 | ||||
| const StyledMermaid = styled(Mermaid)(({ theme }) => ({ | ||||
|     '#mermaid .node rect': { | ||||
|         fill: theme.palette.secondary.light, | ||||
|         stroke: theme.palette.secondary.border, | ||||
|     }, | ||||
|     '#mermaid .application-container': { | ||||
|         // display: 'flex',
 | ||||
|         // padding: theme.spacing(4,3,3,3),
 | ||||
|         // flexDirection: 'column',
 | ||||
|         // alignItems: 'center',
 | ||||
|         // gap: theme.spacing(3),
 | ||||
|         backgroundColor: theme.palette.secondary.light, | ||||
|     }, | ||||
| const StyledTable = styled('table')(({ theme }) => ({ | ||||
|     fontSize: theme.fontSizes.smallerBody, | ||||
|     marginTop: theme.spacing(2), | ||||
| })); | ||||
| 
 | ||||
| const StyledCell = styled('td')(({ theme }) => ({ | ||||
|     verticalAlign: 'top', | ||||
|     paddingLeft: 0, | ||||
|     paddingRight: theme.spacing(1), | ||||
| })); | ||||
| 
 | ||||
| const StyleApplicationContainer = styled(Box)(({ theme }) => ({ | ||||
|     marginBottom: theme.spacing(18), | ||||
|     display: 'flex', | ||||
|     justifyContent: 'center', | ||||
| })); | ||||
| 
 | ||||
| const StyledApplicationBox = styled(Box)(({ theme }) => ({ | ||||
|     borderRadius: theme.shape.borderRadiusMedium, | ||||
|     border: '1px solid', | ||||
|     borderColor: theme.palette.success.border, | ||||
|     backgroundColor: theme.palette.success.light, | ||||
|     display: 'flex', | ||||
|     flexDirection: 'column', | ||||
|     alignItems: 'center', | ||||
|     padding: theme.spacing(1.5, 3, 2, 3), | ||||
| })); | ||||
| 
 | ||||
| const StyledOkStatus = styled(Typography)(({ theme }) => ({ | ||||
|     gap: theme.spacing(0.5), | ||||
|     fontSize: theme.fontSizes.smallBody, | ||||
|     color: theme.palette.success.dark, | ||||
|     display: 'flex', | ||||
|     alignItems: 'center', | ||||
| })); | ||||
| 
 | ||||
| const StyledEnvironmentBox = styled(Box)(({ theme }) => ({ | ||||
|     borderRadius: theme.shape.borderRadiusMedium, | ||||
|     border: '1px solid', | ||||
|     borderColor: theme.palette.secondary.border, | ||||
|     backgroundColor: theme.palette.secondary.light, | ||||
|     display: 'inline-block', | ||||
|     padding: theme.spacing(1.5, 2, 1.5, 2), | ||||
| })); | ||||
| 
 | ||||
| const StyledDivider = styled(Divider)(({ theme }) => ({ | ||||
|     marginTop: theme.spacing(2), | ||||
|     marginBottom: theme.spacing(2), | ||||
|     width: '100%', | ||||
| })); | ||||
| 
 | ||||
| export const ApplicationOverview = () => { | ||||
| @ -34,7 +70,10 @@ export const ApplicationOverview = () => { | ||||
|             { | ||||
|                 name: 'production', | ||||
|                 instanceCount: 34, | ||||
|                 sdks: ['unleash-client-node:5.4.0'], | ||||
|                 sdks: [ | ||||
|                     'unleash-client-node:5.4.0', | ||||
|                     'unleash-client-node:5.4.1', | ||||
|                 ], | ||||
|                 lastSeen: '2021-10-01T12:00:00Z', | ||||
|             }, | ||||
|             { | ||||
| @ -46,10 +85,6 @@ export const ApplicationOverview = () => { | ||||
|         ], | ||||
|     }; | ||||
| 
 | ||||
|     const applicationNode = ` | ||||
|     ${applicationName}[<span>${applicationName}</span>] | ||||
|     `;
 | ||||
| 
 | ||||
|     // @ts-ignore
 | ||||
|     window.navigateToInstances = (environment: string) => { | ||||
|         navigate( | ||||
| @ -57,26 +92,85 @@ export const ApplicationOverview = () => { | ||||
|         ); | ||||
|     }; | ||||
| 
 | ||||
|     const graph = ` | ||||
|     graph TD | ||||
|         subgraph _[ ] | ||||
|         direction BT | ||||
|             ${applicationNode} | ||||
|             ${app.environments | ||||
|                 .map( | ||||
|                     ({ name }, i) => | ||||
|                         `${name}("${name}")  --- ${applicationName} | ||||
|                         click ${name} navigateToInstances`,
 | ||||
|                 ) | ||||
|                 .join('\n')} | ||||
|         end | ||||
|     `;
 | ||||
| 
 | ||||
|     return ( | ||||
|         <ConditionallyRender | ||||
|             condition={1 === 2 + 1} | ||||
|             show={<Alert severity='warning'>No data available.</Alert>} | ||||
|             elseShow={<StyledMermaid>{graph}</StyledMermaid>} | ||||
|             elseShow={ | ||||
|                 <Box> | ||||
|                     <StyleApplicationContainer> | ||||
|                         <StyledApplicationBox> | ||||
|                             <Typography | ||||
|                                 sx={(theme) => ({ | ||||
|                                     fontSize: theme.fontSizes.smallerBody, | ||||
|                                 })} | ||||
|                                 color='text.secondary' | ||||
|                             > | ||||
|                                 Application | ||||
|                             </Typography> | ||||
|                             <Typography | ||||
|                                 sx={(theme) => ({ | ||||
|                                     fontSize: theme.fontSizes.bodySize, | ||||
|                                     fontWeight: theme.fontWeight.bold, | ||||
|                                 })} | ||||
|                             > | ||||
|                                 {applicationName} | ||||
|                             </Typography> | ||||
| 
 | ||||
|                             <StyledDivider /> | ||||
| 
 | ||||
|                             <StyledOkStatus> | ||||
|                                 <Check | ||||
|                                     sx={(theme) => ({ | ||||
|                                         color: theme.palette.success.main, | ||||
|                                     })} | ||||
|                                 />{' '} | ||||
|                                 Everything looks good! | ||||
|                             </StyledOkStatus> | ||||
|                         </StyledApplicationBox> | ||||
|                     </StyleApplicationContainer> | ||||
| 
 | ||||
|                     <Box | ||||
|                         sx={{ display: 'flex', justifyContent: 'space-evenly' }} | ||||
|                     > | ||||
|                         {app.environments.map((environment) => ( | ||||
|                             <StyledEnvironmentBox> | ||||
|                                 <Typography | ||||
|                                     sx={(theme) => ({ | ||||
|                                         fontSize: theme.fontSizes.smallerBody, | ||||
|                                         fontWeight: theme.fontWeight.bold, | ||||
|                                     })} | ||||
|                                 > | ||||
|                                     {environment.name} environment | ||||
|                                 </Typography> | ||||
| 
 | ||||
|                                 <StyledTable> | ||||
|                                     <tr> | ||||
|                                         <StyledCell>Instances:</StyledCell> | ||||
|                                         <StyledCell> | ||||
|                                             {environment.instanceCount} | ||||
|                                         </StyledCell> | ||||
|                                     </tr> | ||||
|                                     <tr> | ||||
|                                         <StyledCell>SDK:</StyledCell> | ||||
|                                         <StyledCell> | ||||
|                                             {environment.sdks.map((sdk) => ( | ||||
|                                                 <div>{sdk}</div> | ||||
|                                             ))} | ||||
|                                         </StyledCell> | ||||
|                                     </tr> | ||||
|                                     <tr> | ||||
|                                         <StyledCell>Last seen:</StyledCell> | ||||
|                                         <StyledCell> | ||||
|                                             {environment.lastSeen} | ||||
|                                         </StyledCell> | ||||
|                                     </tr> | ||||
|                                 </StyledTable> | ||||
|                             </StyledEnvironmentBox> | ||||
|                         ))} | ||||
|                     </Box> | ||||
|                 </Box> | ||||
|             } | ||||
|         /> | ||||
|     ); | ||||
| }; | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user