@openshift-migration-advisor/shared-components 0.23.0 → 0.25.0-6a4104ca5ed2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/README.md +31 -0
  2. package/dist/charts/index.d.ts +1 -1
  3. package/dist/charts/index.d.ts.map +1 -1
  4. package/dist/forms/RadioButtonFormGroup.d.ts.map +1 -1
  5. package/dist/forms/RadioButtonFormGroup.js +2 -2
  6. package/dist/report/ChartDownloadButton.d.ts +11 -0
  7. package/dist/report/ChartDownloadButton.d.ts.map +1 -0
  8. package/dist/report/ChartDownloadButton.js +24 -0
  9. package/dist/report/ChartExportProvider.d.ts +22 -0
  10. package/dist/report/ChartExportProvider.d.ts.map +1 -0
  11. package/dist/report/ChartExportProvider.js +222 -0
  12. package/dist/report/ChartExportSurface.d.ts +12 -0
  13. package/dist/report/ChartExportSurface.d.ts.map +1 -0
  14. package/dist/report/ChartExportSurface.js +32 -0
  15. package/dist/report/FeatureStatusBadge.d.ts +7 -0
  16. package/dist/report/FeatureStatusBadge.d.ts.map +1 -0
  17. package/dist/report/FeatureStatusBadge.js +13 -0
  18. package/dist/report/HostPowerStates.d.ts +8 -0
  19. package/dist/report/HostPowerStates.d.ts.map +1 -0
  20. package/dist/report/HostPowerStates.js +11 -0
  21. package/dist/report/InfrastructureSummary.d.ts +7 -0
  22. package/dist/report/InfrastructureSummary.d.ts.map +1 -0
  23. package/dist/report/InfrastructureSummary.js +9 -0
  24. package/dist/report/OSDistribution.d.ts +0 -2
  25. package/dist/report/OSDistribution.d.ts.map +1 -1
  26. package/dist/report/OSDistribution.js +10 -15
  27. package/dist/report/OsSupportTiersHelpPopover.d.ts.map +1 -1
  28. package/dist/report/OsSupportTiersHelpPopover.js +2 -31
  29. package/dist/report/OsUpgradeNotice.d.ts.map +1 -1
  30. package/dist/report/OsUpgradeNotice.js +1 -5
  31. package/dist/report/OsUpgradeRecommendationPopover.d.ts +0 -1
  32. package/dist/report/OsUpgradeRecommendationPopover.d.ts.map +1 -1
  33. package/dist/report/OsUpgradeRecommendationPopover.js +4 -3
  34. package/dist/report/PowerStateCard.d.ts +16 -0
  35. package/dist/report/PowerStateCard.d.ts.map +1 -0
  36. package/dist/report/PowerStateCard.js +9 -0
  37. package/dist/report/ReportExportMenu.d.ts +19 -0
  38. package/dist/report/ReportExportMenu.d.ts.map +1 -0
  39. package/dist/report/ReportExportMenu.js +31 -0
  40. package/dist/report/SupportTierBadge.d.ts +0 -1
  41. package/dist/report/SupportTierBadge.d.ts.map +1 -1
  42. package/dist/report/SupportTierBadge.js +1 -19
  43. package/dist/report/VCenterClusterDetails.d.ts +9 -0
  44. package/dist/report/VCenterClusterDetails.d.ts.map +1 -0
  45. package/dist/report/VCenterClusterDetails.js +31 -0
  46. package/dist/report/VmPowerStates.d.ts +8 -0
  47. package/dist/report/VmPowerStates.d.ts.map +1 -0
  48. package/dist/report/VmPowerStates.js +11 -0
  49. package/dist/report/captureChartElement.d.ts +8 -0
  50. package/dist/report/captureChartElement.d.ts.map +1 -0
  51. package/dist/report/captureChartElement.js +264 -0
  52. package/dist/report/chartExport.d.ts +57 -0
  53. package/dist/report/chartExport.d.ts.map +1 -0
  54. package/dist/report/chartExport.js +159 -0
  55. package/dist/report/chartExportContext.d.ts +28 -0
  56. package/dist/report/chartExportContext.d.ts.map +1 -0
  57. package/dist/report/chartExportContext.js +36 -0
  58. package/dist/report/chartExportFilenames.d.ts +4 -0
  59. package/dist/report/chartExportFilenames.d.ts.map +1 -0
  60. package/dist/report/chartExportFilenames.js +16 -0
  61. package/dist/report/constants.d.ts +2 -0
  62. package/dist/report/constants.d.ts.map +1 -1
  63. package/dist/report/constants.js +2 -0
  64. package/dist/report/dashboardStyles.d.ts +0 -4
  65. package/dist/report/dashboardStyles.d.ts.map +1 -1
  66. package/dist/report/dashboardStyles.js +0 -19
  67. package/dist/report/htmlExport.d.ts +9 -0
  68. package/dist/report/htmlExport.d.ts.map +1 -0
  69. package/dist/report/htmlExport.js +67 -0
  70. package/dist/report/index.d.ts +23 -0
  71. package/dist/report/index.d.ts.map +1 -1
  72. package/dist/report/index.js +21 -0
  73. package/dist/report/infrastructureSummaryModel.d.ts +82 -0
  74. package/dist/report/infrastructureSummaryModel.d.ts.map +1 -0
  75. package/dist/report/infrastructureSummaryModel.js +139 -0
  76. package/dist/report/pdfExport.d.ts +3 -0
  77. package/dist/report/pdfExport.d.ts.map +1 -0
  78. package/dist/report/pdfExport.js +87 -0
  79. package/dist/report/pdfPage.d.ts +7 -0
  80. package/dist/report/pdfPage.d.ts.map +1 -0
  81. package/dist/report/pdfPage.js +27 -0
  82. package/dist/report/powerStates.d.ts +11 -0
  83. package/dist/report/powerStates.d.ts.map +1 -0
  84. package/dist/report/powerStates.js +113 -0
  85. package/dist/report/reportExportOptions.d.ts +17 -0
  86. package/dist/report/reportExportOptions.d.ts.map +1 -0
  87. package/dist/report/reportExportOptions.js +31 -0
  88. package/dist/report/zipChartPngs.d.ts +3 -0
  89. package/dist/report/zipChartPngs.d.ts.map +1 -0
  90. package/dist/report/zipChartPngs.js +8 -0
  91. package/package.json +7 -2
  92. package/src/charts/index.ts +1 -0
  93. package/src/forms/RadioButtonFormGroup.tsx +10 -3
  94. package/src/report/ChartDownloadButton.tsx +59 -0
  95. package/src/report/ChartExportProvider.tsx +384 -0
  96. package/src/report/ChartExportSurface.tsx +60 -0
  97. package/src/report/FeatureStatusBadge.tsx +30 -0
  98. package/src/report/HostPowerStates.tsx +38 -0
  99. package/src/report/InfrastructureSummary.tsx +73 -0
  100. package/src/report/OSDistribution.tsx +96 -99
  101. package/src/report/OsSupportTiersHelpPopover.tsx +32 -62
  102. package/src/report/OsUpgradeNotice.tsx +1 -7
  103. package/src/report/OsUpgradeRecommendationPopover.tsx +3 -4
  104. package/src/report/PowerStateCard.tsx +86 -0
  105. package/src/report/ReportExportMenu.tsx +119 -0
  106. package/src/report/SupportTierBadge.tsx +12 -38
  107. package/src/report/VCenterClusterDetails.tsx +233 -0
  108. package/src/report/VmPowerStates.tsx +38 -0
  109. package/src/report/__tests__/ChartExportProvider.test.tsx +474 -0
  110. package/src/report/__tests__/HostPowerStates.test.tsx +47 -0
  111. package/src/report/__tests__/InfrastructureSummary.test.tsx +126 -0
  112. package/src/report/__tests__/OSDistribution.test.tsx +10 -11
  113. package/src/report/__tests__/captureChartElement.test.ts +132 -0
  114. package/src/report/__tests__/chartExportPackagers.test.ts +185 -0
  115. package/src/report/__tests__/infrastructureSummaryModel.test.ts +224 -0
  116. package/src/report/__tests__/powerStates.test.ts +70 -0
  117. package/src/report/captureChartElement.ts +351 -0
  118. package/src/report/chartExport.ts +234 -0
  119. package/src/report/chartExportContext.tsx +84 -0
  120. package/src/report/chartExportFilenames.ts +21 -0
  121. package/src/report/constants.ts +2 -0
  122. package/src/report/dashboardStyles.ts +0 -23
  123. package/src/report/htmlExport.ts +85 -0
  124. package/src/report/index.ts +128 -0
  125. package/src/report/infrastructureSummaryModel.ts +281 -0
  126. package/src/report/pdfExport.ts +161 -0
  127. package/src/report/pdfPage.ts +54 -0
  128. package/src/report/powerStates.ts +169 -0
  129. package/src/report/reportExportOptions.ts +53 -0
  130. package/src/report/zipChartPngs.ts +10 -0
@@ -1,4 +1,3 @@
1
- import { css } from "@emotion/css";
2
1
  import { Label, Tooltip } from "@patternfly/react-core";
3
2
  import type { FC } from "react";
4
3
  import {
@@ -9,47 +8,22 @@ import {
9
8
  type SupportTier,
10
9
  } from "./osSupportTier.js";
11
10
 
12
- const exportBadgeStyle = css`
13
- display: inline-block;
14
- padding: var(--pf-t--global--spacer--xs) var(--pf-t--global--spacer--sm);
15
- border-radius: var(--pf-t--global--border--radius--pill);
16
- font-size: var(--pf-t--global--font--size--body--sm);
17
- line-height: var(--pf-t--global--font--line-height--body);
18
- white-space: nowrap;
19
- `;
20
-
21
11
  interface SupportTierBadgeProps {
22
12
  tier: SupportTier;
23
- isExportMode?: boolean;
24
13
  }
25
14
 
26
- const ExportSupportTierBadge: FC<{ tier: SupportTier }> = ({ tier }) => {
27
- const { backgroundColor, color } = getSupportTierBadgeInlineStyle(tier);
28
-
29
- return (
30
- <span className={exportBadgeStyle} style={{ backgroundColor, color }}>
31
- {getSupportTierLegendLabel(tier)}
15
+ export const SupportTierBadge: FC<SupportTierBadgeProps> = ({ tier }) => (
16
+ <Tooltip content={getSupportTierDefinition(tier)}>
17
+ <span>
18
+ <Label
19
+ color={getSupportTierBadgeColor(tier)}
20
+ isCompact
21
+ style={getSupportTierBadgeInlineStyle(tier)}
22
+ >
23
+ {getSupportTierLegendLabel(tier)}
24
+ </Label>
32
25
  </span>
33
- );
34
- };
35
-
36
- export const SupportTierBadge: FC<SupportTierBadgeProps> = ({
37
- tier,
38
- isExportMode = false,
39
- }) => {
40
- if (isExportMode) {
41
- return <ExportSupportTierBadge tier={tier} />;
42
- }
43
-
44
- return (
45
- <Tooltip content={getSupportTierDefinition(tier)}>
46
- <span>
47
- <Label color={getSupportTierBadgeColor(tier)} isCompact>
48
- {getSupportTierLegendLabel(tier)}
49
- </Label>
50
- </span>
51
- </Tooltip>
52
- );
53
- };
26
+ </Tooltip>
27
+ );
54
28
 
55
29
  SupportTierBadge.displayName = "SupportTierBadge";
@@ -0,0 +1,233 @@
1
+ import { css } from "@emotion/css";
2
+ import {
3
+ Card,
4
+ CardBody,
5
+ CardTitle,
6
+ Content,
7
+ DescriptionList,
8
+ DescriptionListDescription,
9
+ DescriptionListGroup,
10
+ DescriptionListTerm,
11
+ Flex,
12
+ FlexItem,
13
+ Grid,
14
+ GridItem,
15
+ Label,
16
+ LabelGroup,
17
+ } from "@patternfly/react-core";
18
+ import { Table, Tbody, Td, Th, Thead, Tr } from "@patternfly/react-table";
19
+ import type { FC } from "react";
20
+ import { ChartHeaderActions } from "./ChartDownloadButton.js";
21
+ import { ChartExportSurface } from "./ChartExportSurface.js";
22
+ import { chartExportScrollProps } from "./chartExport.js";
23
+ import { FeatureStatusBadge } from "./FeatureStatusBadge.js";
24
+ import type {
25
+ ClusterDetailRow,
26
+ ClusterDetailsModel,
27
+ FeatureStatus,
28
+ } from "./infrastructureSummaryModel.js";
29
+
30
+ export interface VCenterClusterDetailsProps {
31
+ isAggregateView: boolean;
32
+ rows: ClusterDetailRow[];
33
+ details?: ClusterDetailsModel;
34
+ }
35
+
36
+ const clusterDetailsTableScrollStyle = css`
37
+ max-height: 320px;
38
+ overflow: auto;
39
+ `;
40
+
41
+ const FeatureList: FC<{
42
+ items: { label: string; status: FeatureStatus }[];
43
+ }> = ({ items }) => (
44
+ <DescriptionList isHorizontal isCompact>
45
+ {items.map((item) => (
46
+ <DescriptionListGroup key={item.label}>
47
+ <DescriptionListTerm>{item.label}</DescriptionListTerm>
48
+ <DescriptionListDescription>
49
+ <FeatureStatusBadge status={item.status} />
50
+ </DescriptionListDescription>
51
+ </DescriptionListGroup>
52
+ ))}
53
+ </DescriptionList>
54
+ );
55
+
56
+ const AggregateClusterTable: FC<{
57
+ rows: ClusterDetailRow[];
58
+ }> = ({ rows }) => (
59
+ <Table
60
+ variant="compact"
61
+ borders={false}
62
+ isStickyHeader
63
+ data-testid="vcenter-cluster-details-table"
64
+ >
65
+ <Thead>
66
+ <Tr>
67
+ <Th>Cluster name</Th>
68
+ <Th>Hosts</Th>
69
+ <Th>VMs</Th>
70
+ <Th>vMotion</Th>
71
+ <Th>DRS</Th>
72
+ <Th>vSAN</Th>
73
+ </Tr>
74
+ </Thead>
75
+ <Tbody>
76
+ {rows.map((row) => (
77
+ <Tr key={row.id}>
78
+ <Td dataLabel="Cluster name">{row.name}</Td>
79
+ <Td dataLabel="Hosts">{row.hosts}</Td>
80
+ <Td dataLabel="VMs">{row.vms}</Td>
81
+ <Td dataLabel="vMotion">
82
+ <FeatureStatusBadge status={row.vmotion} />
83
+ </Td>
84
+ <Td dataLabel="DRS">
85
+ <FeatureStatusBadge status={row.drs} />
86
+ </Td>
87
+ <Td dataLabel="vSAN">
88
+ <FeatureStatusBadge status={row.vsan} />
89
+ </Td>
90
+ </Tr>
91
+ ))}
92
+ </Tbody>
93
+ </Table>
94
+ );
95
+
96
+ const AggregateCluster: FC<{
97
+ rows: ClusterDetailRow[];
98
+ }> = ({ rows }) => {
99
+ if (rows.length === 0) {
100
+ return <Content component="p">No vSphere clusters detected</Content>;
101
+ }
102
+
103
+ return (
104
+ <div
105
+ className={clusterDetailsTableScrollStyle}
106
+ data-scroll-constrained="true"
107
+ {...chartExportScrollProps}
108
+ >
109
+ <AggregateClusterTable rows={rows} />
110
+ </div>
111
+ );
112
+ };
113
+
114
+ const DetailedClusterView: FC<{ details: ClusterDetailsModel }> = ({
115
+ details,
116
+ }) => (
117
+ <Grid hasGutter>
118
+ <GridItem>
119
+ <DescriptionList isAutoFit displaySize="lg">
120
+ <DescriptionListGroup>
121
+ <DescriptionListTerm>Hosts</DescriptionListTerm>
122
+ <DescriptionListDescription>
123
+ {details.hosts}
124
+ </DescriptionListDescription>
125
+ </DescriptionListGroup>
126
+ <DescriptionListGroup>
127
+ <DescriptionListTerm>VMs</DescriptionListTerm>
128
+ <DescriptionListDescription>{details.vms}</DescriptionListDescription>
129
+ </DescriptionListGroup>
130
+ <DescriptionListGroup>
131
+ <DescriptionListTerm>Networks detected</DescriptionListTerm>
132
+ <DescriptionListDescription>
133
+ {details.networksDetected}
134
+ </DescriptionListDescription>
135
+ </DescriptionListGroup>
136
+ </DescriptionList>
137
+ </GridItem>
138
+ <GridItem md={4}>
139
+ <Card isFullHeight>
140
+ <CardTitle>Core infrastructure</CardTitle>
141
+ <CardBody>
142
+ <FeatureList
143
+ items={[
144
+ { label: "vMotion", status: details.vmotion },
145
+ { label: "DRS", status: details.drs },
146
+ { label: "HA", status: details.ha },
147
+ ]}
148
+ />
149
+ </CardBody>
150
+ </Card>
151
+ </GridItem>
152
+ <GridItem md={4}>
153
+ <Card isFullHeight>
154
+ <CardTitle>vSAN capabilities</CardTitle>
155
+ <CardBody>
156
+ <FeatureList items={[{ label: "vSAN", status: details.vsan }]} />
157
+ </CardBody>
158
+ </Card>
159
+ </GridItem>
160
+ <GridItem md={4}>
161
+ <Card isFullHeight>
162
+ <CardTitle>Network topology</CardTitle>
163
+ <CardBody>
164
+ {details.networks.length === 0 ? (
165
+ <Content component="p">No networks detected</Content>
166
+ ) : (
167
+ <>
168
+ <Content component="p">
169
+ {details.networksDetected}{" "}
170
+ {details.networksDetected === 1
171
+ ? "network detected"
172
+ : "networks detected"}
173
+ </Content>
174
+ <LabelGroup
175
+ isCompact
176
+ numLabels={details.networks.length}
177
+ aria-label="Detected networks"
178
+ >
179
+ {details.networks.map((network, index) => (
180
+ <Label
181
+ key={`${network.name}-${network.vlanId ?? index}`}
182
+ color="blue"
183
+ isCompact
184
+ >
185
+ {network.displayName}
186
+ </Label>
187
+ ))}
188
+ </LabelGroup>
189
+ </>
190
+ )}
191
+ </CardBody>
192
+ </Card>
193
+ </GridItem>
194
+ </Grid>
195
+ );
196
+
197
+ const CLUSTER_DETAILS_CHART_ID = "vcenter-cluster-details";
198
+ const CLUSTER_DETAILS_TITLE = "vCenter cluster details";
199
+
200
+ export const VCenterClusterDetails: FC<VCenterClusterDetailsProps> = ({
201
+ isAggregateView,
202
+ rows,
203
+ details,
204
+ }) => (
205
+ <ChartExportSurface
206
+ id={CLUSTER_DETAILS_CHART_ID}
207
+ title={CLUSTER_DETAILS_TITLE}
208
+ >
209
+ <Card isFullHeight>
210
+ <CardTitle>
211
+ <Flex
212
+ justifyContent={{ default: "justifyContentSpaceBetween" }}
213
+ alignItems={{ default: "alignItemsCenter" }}
214
+ >
215
+ <FlexItem>{CLUSTER_DETAILS_TITLE}</FlexItem>
216
+ <ChartHeaderActions
217
+ chartId={CLUSTER_DETAILS_CHART_ID}
218
+ title={CLUSTER_DETAILS_TITLE}
219
+ />
220
+ </Flex>
221
+ </CardTitle>
222
+ <CardBody>
223
+ {isAggregateView || !details ? (
224
+ <AggregateCluster rows={rows} />
225
+ ) : (
226
+ <DetailedClusterView details={details} />
227
+ )}
228
+ </CardBody>
229
+ </Card>
230
+ </ChartExportSurface>
231
+ );
232
+
233
+ VCenterClusterDetails.displayName = "VCenterClusterDetails";
@@ -0,0 +1,38 @@
1
+ import { VirtualMachineIcon } from "@patternfly/react-icons";
2
+ import type { FC } from "react";
3
+ import { useMemo } from "react";
4
+ import type { MigrationDonutChartLegendVariant } from "../charts/MigrationDonutChart.js";
5
+ import { REPORT_CARD_EMPTY_STATE_TITLES } from "./constants.js";
6
+ import { PowerStateCard } from "./PowerStateCard.js";
7
+ import { buildVmPowerStateChart } from "./powerStates.js";
8
+
9
+ export interface VmPowerStatesProps {
10
+ powerStates?: Record<string, number>;
11
+ legendVariant?: MigrationDonutChartLegendVariant;
12
+ }
13
+
14
+ export const VmPowerStates: FC<VmPowerStatesProps> = ({
15
+ powerStates,
16
+ legendVariant,
17
+ }) => {
18
+ const chart = useMemo(
19
+ () => buildVmPowerStateChart(powerStates),
20
+ [powerStates],
21
+ );
22
+
23
+ return (
24
+ <PowerStateCard
25
+ id="vm-power-states"
26
+ title="VM power states"
27
+ icon={<VirtualMachineIcon />}
28
+ emptyTitle={REPORT_CARD_EMPTY_STATE_TITLES.vmPowerStates}
29
+ slices={chart.slices}
30
+ legend={chart.legend}
31
+ total={chart.total}
32
+ subTitle="VMs"
33
+ legendVariant={legendVariant}
34
+ />
35
+ );
36
+ };
37
+
38
+ VmPowerStates.displayName = "VmPowerStates";