summaryrefslogtreecommitdiff
path: root/opendc-web/opendc-web-ui/src/components/topologies/sidebar/machine/UnitListComponent.js
blob: daa3e7a715e764d13b41d0f8c50116ee9ca06022 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import PropTypes from 'prop-types'
import React from 'react'
import {
    Button,
    DataList,
    DataListAction,
    DataListCell,
    DataListItem,
    DataListItemCells,
    DataListItemRow,
    DescriptionList,
    DescriptionListDescription,
    DescriptionListGroup,
    DescriptionListTerm,
    EmptyState,
    EmptyStateBody,
    EmptyStateIcon,
    Popover,
    Title,
} from '@patternfly/react-core'
import { CubesIcon, InfoIcon, TrashIcon } from '@patternfly/react-icons'
import { ProcessingUnit, StorageUnit } from '../../../../shapes'

function UnitInfo({ unit, unitType }) {
    if (unitType === 'cpu' || unitType === 'gpu') {
        return (
            <DescriptionList>
                <DescriptionListGroup>
                    <DescriptionListTerm>Clock Frequency</DescriptionListTerm>
                    <DescriptionListDescription>{unit.clockRateMhz} MHz</DescriptionListDescription>
                </DescriptionListGroup>
                <DescriptionListGroup>
                    <DescriptionListTerm>Number of Cores</DescriptionListTerm>
                    <DescriptionListDescription>{unit.numberOfCores}</DescriptionListDescription>
                </DescriptionListGroup>
                <DescriptionListGroup>
                    <DescriptionListTerm>Energy Consumption</DescriptionListTerm>
                    <DescriptionListDescription>{unit.energyConsumptionW} W</DescriptionListDescription>
                </DescriptionListGroup>
            </DescriptionList>
        )
    }

    return (
        <DescriptionList>
            <DescriptionListGroup>
                <DescriptionListTerm>Speed</DescriptionListTerm>
                <DescriptionListDescription>{unit.speedMbPerS} Mb/s</DescriptionListDescription>
            </DescriptionListGroup>
            <DescriptionListGroup>
                <DescriptionListTerm>Capacity</DescriptionListTerm>
                <DescriptionListDescription>{unit.sizeMb} MB</DescriptionListDescription>
            </DescriptionListGroup>
            <DescriptionListGroup>
                <DescriptionListTerm>Energy Consumption</DescriptionListTerm>
                <DescriptionListDescription>{unit.energyConsumptionW} W</DescriptionListDescription>
            </DescriptionListGroup>
        </DescriptionList>
    )
}

UnitInfo.propTypes = {
    unitType: PropTypes.string.isRequired,
    unit: PropTypes.oneOfType([ProcessingUnit, StorageUnit]).isRequired,
}

function UnitListComponent({ unitType, units, onDelete }) {
    if (units.length === 0) {
        return (
            <EmptyState>
                <EmptyStateIcon icon={CubesIcon} />
                <Title headingLevel="h5" size="lg">
                    No units found
                </Title>
                <EmptyStateBody>You have not configured any units yet. Add some with the menu above!</EmptyStateBody>
            </EmptyState>
        )
    }

    return (
        <DataList aria-label="Machine Units" isCompact>
            {units.map((unit, index) => (
                <DataListItem key={index}>
                    <DataListItemRow>
                        <DataListItemCells dataListCells={[<DataListCell key="unit">{unit.name}</DataListCell>]} />
                        <DataListAction id="goto" aria-label="Goto Machine" aria-labelledby="goto">
                            <Popover
                                headerContent="Unit Information"
                                bodyContent={<UnitInfo unitType={unitType} unit={unit} />}
                            >
                                <Button isSmall variant="plain" className="pf-u-p-0">
                                    <InfoIcon />
                                </Button>
                            </Popover>
                            <Button isSmall variant="plain" className="pf-u-p-0" onClick={() => onDelete(units[index])}>
                                <TrashIcon />
                            </Button>
                        </DataListAction>
                    </DataListItemRow>
                </DataListItem>
            ))}
        </DataList>
    )
}

UnitListComponent.propTypes = {
    unitType: PropTypes.string.isRequired,
    units: PropTypes.arrayOf(PropTypes.oneOfType([ProcessingUnit, StorageUnit])).isRequired,
    onDelete: PropTypes.func,
}

export default UnitListComponent