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
113
|
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'
import UnitType from './UnitType'
function UnitInfo({ unit, unitType }) {
if (unitType === 'cpus' || unitType === 'gpus') {
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: UnitType.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: UnitType.isRequired,
units: PropTypes.arrayOf(PropTypes.oneOfType([ProcessingUnit, StorageUnit])).isRequired,
onDelete: PropTypes.func,
}
export default UnitListComponent
|