1
0
mirror of https://github.com/OpenNebula/one.git synced 2025-03-16 22:50:10 +03:00

F OpenNebula/one#5422: Add skeleton to sunstone dashboard

This commit is contained in:
Sergio Betanzos 2021-06-30 17:31:18 +02:00
parent 631360caca
commit cfac4c9c0c
No known key found for this signature in database
GPG Key ID: E3E704F097737136
2 changed files with 64 additions and 41 deletions

View File

@ -7,8 +7,9 @@ import {
NetworkAlt as NetworkIcon
} from 'iconoir-react'
import { makeStyles } from '@material-ui/core'
import { Skeleton } from '@material-ui/lab'
import { useUser, useGroup, useImage, useVNetwork } from 'client/features/One'
import { RESOURCES, useOne } from 'client/features/One'
import Count from 'client/components/Count'
import { WavesCard } from 'client/components/Cards'
import { T } from 'client/constants'
@ -21,44 +22,57 @@ const useStyles = makeStyles({
}
})
const TotalProvisionInfrastructures = () => {
const TotalProvisionInfrastructures = ({ isLoading }) => {
const classes = useStyles()
const users = useUser()
const groups = useGroup()
const images = useImage()
const vnetworks = useVNetwork()
const {
[RESOURCES.user]: users = [],
[RESOURCES.group]: groups = [],
[RESOURCES.image]: images = [],
[RESOURCES.vn]: vNetworks = []
} = useOne()
return React.useMemo(() => (
<div
data-cy='dashboard-widget-total-sunstone-resources'
className={classes.root}
>
<WavesCard
text={T.Users}
value={<Count number={`${users.length}`} />}
bgColor='#fa7892'
icon={UserIcon}
/>
<WavesCard
text={T.Groups}
value={<Count number={`${groups.length}`} />}
bgColor='#b25aff'
icon={GroupIcon}
/>
<WavesCard
text={T.Images}
value={<Count number={`${images.length}`} />}
bgColor='#1fbbc6'
icon={ImageIcon}
/>
<WavesCard
text={T.VirtualNetwork}
value={<Count number={`${vnetworks.length}`} />}
bgColor='#f09d42'
icon={NetworkIcon}
/>
{!users?.length && isLoading ? (
<>
<Skeleton variant='rect' height={120} />
<Skeleton variant='rect' height={120} />
<Skeleton variant='rect' height={120} />
<Skeleton variant='rect' height={120} />
</>
) : (
<>
<WavesCard
text={T.Users}
value={<Count number={`${users.length}`} />}
bgColor='#fa7892'
icon={UserIcon}
/>
<WavesCard
text={T.Groups}
value={<Count number={`${groups.length}`} />}
bgColor='#b25aff'
icon={GroupIcon}
/>
<WavesCard
text={T.Images}
value={<Count number={`${images.length}`} />}
bgColor='#1fbbc6'
icon={ImageIcon}
/>
<WavesCard
text={T.VirtualNetwork}
value={<Count number={`${vNetworks.length}`} />}
bgColor='#f09d42'
icon={NetworkIcon}
/>
</>
)}
</div>
), [users.length, groups.length, images.length, vnetworks.length])
), [users?.length, isLoading])
}
TotalProvisionInfrastructures.displayName = 'TotalProvisionInfrastructures'

View File

@ -4,28 +4,35 @@ import clsx from 'clsx'
import { Container, Box, Grid } from '@material-ui/core'
import { useAuth } from 'client/features/Auth'
import { useUserApi, useGroupApi, useImageApi, useVNetworkApi } from 'client/features/One'
import { useFetchAll } from 'client/hooks'
import { useVmApi, useUserApi, useImageApi, useVNetworkApi } from 'client/features/One'
import * as Widgets from 'client/components/Widgets'
import dashboardStyles from 'client/containers/Dashboard/Provision/styles'
function Dashboard () {
const { status, fetchRequestAll, STATUS } = useFetchAll()
const { INIT, PENDING } = STATUS
const { getVms } = useVmApi()
const { getUsers } = useUserApi()
const { getGroups } = useGroupApi()
const { getImages } = useImageApi()
const { getVNetworks } = useVNetworkApi()
const { settings: { disableanimations } = {} } = useAuth()
const classes = dashboardStyles({ disableanimations })
React.useEffect(() => {
getUsers()
getGroups()
getImages()
getVNetworks()
}, [])
const withoutAnimations = String(disableanimations).toUpperCase() === 'YES'
React.useEffect(() => {
fetchRequestAll([
getVms(),
getUsers(),
getImages(),
getVNetworks()
])
}, [])
return (
<Container
disableGutters
@ -34,7 +41,9 @@ function Dashboard () {
<Box py={3}>
<Grid container spacing={3}>
<Grid item xs={12}>
<Widgets.TotalSunstoneResources />
<Widgets.TotalSunstoneResources
isLoading={[INIT, PENDING].includes(status)}
/>
</Grid>
</Grid>
</Box>