Skip to content

Commit b1654bc

Browse files
jaalah-akamaijaalahbnussman-akamai
authored
upcoming: [M3-10453] - Improve maintenance banner datetime display and formatting (linode#12663)
* upcoming: [M3-10453] - Maintenance Banner DateTime Fix * Style fixes * Remove dev tools for later time * Update changelog * Update packages/manager/package.json Co-authored-by: Banks Nussman <[email protected]> * Review updates * Revert type change --------- Co-authored-by: Jaalah Ramos <[email protected]> Co-authored-by: Banks Nussman <[email protected]>
1 parent 19f1af2 commit b1654bc

File tree

5 files changed

+47
-42
lines changed

5 files changed

+47
-42
lines changed

packages/manager/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this p
8383
- ACLP-Alerting: change the `aclpAlerting` to include alert and metric limits and other relevant changes ([#12624](https://github.com/linode/manager/pull/12624))
8484
- ACLP-Alerting: add custom config_id validation, dynamic schema resolver, helperText map, TextField logic, and mock API for nodebalancer metrics added ([#12629](https://github.com/linode/manager/pull/12629))
8585
- Update VM Host Maintenance GPU Notice Text ([#12632](https://github.com/linode/manager/pull/12632))
86+
- Improve maintenance banner datetime display and formatting ([#12663](https://github.com/linode/manager/pull/12663))
8687

8788
## [2025-07-29] - v1.147.0
8889

packages/manager/src/components/MaintenanceBanner/LinodeMaintenanceBanner.tsx

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ export const LinodeMaintenanceBanner = ({ linodeId }: Props) => {
2828
);
2929

3030
const maintenanceTypeLabel = linodeMaintenance?.type.split('_').join(' ');
31+
const maintenanceStartTime =
32+
linodeMaintenance?.start_time || linodeMaintenance?.when;
3133

3234
if (!linodeMaintenance) return null;
3335

@@ -36,23 +38,27 @@ export const LinodeMaintenanceBanner = ({ linodeId }: Props) => {
3638
<Typography>
3739
Linode {linodeMaintenance.entity.label} {linodeMaintenance.description}{' '}
3840
maintenance {maintenanceTypeLabel} will begin{' '}
39-
<strong>
40-
<DateTimeDisplay
41-
format="MM/dd/yyyy"
42-
sx={(theme) => ({
43-
font: theme.font.bold,
44-
})}
45-
value={linodeMaintenance.start_time}
46-
/>{' '}
47-
at{' '}
48-
<DateTimeDisplay
49-
format="HH:mm"
50-
sx={(theme) => ({
51-
font: theme.font.bold,
52-
})}
53-
value={linodeMaintenance.start_time}
54-
/>
55-
</strong>
41+
{maintenanceStartTime ? (
42+
<strong>
43+
<DateTimeDisplay
44+
format="MM/dd/yyyy"
45+
sx={(theme) => ({
46+
font: theme.font.bold,
47+
})}
48+
value={maintenanceStartTime}
49+
/>{' '}
50+
at{' '}
51+
<DateTimeDisplay
52+
format="HH:mm"
53+
sx={(theme) => ({
54+
font: theme.font.bold,
55+
})}
56+
value={maintenanceStartTime}
57+
/>
58+
</strong>
59+
) : (
60+
<strong>soon</strong>
61+
)}
5662
. For more details, view{' '}
5763
<Link to="/account/maintenance">Account Maintenance</Link>.
5864
</Typography>

packages/manager/src/features/Account/Maintenance/MaintenanceTableRow.tsx

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ export const MaintenanceTableRow = (props: MaintenanceTableRowProps) => {
115115
{(tableType === 'upcoming' || tableType === 'completed') && (
116116
<Hidden mdDown>
117117
<TableCell data-testid="relative-date">
118-
{parseAPIDate(when).toRelative()}
118+
{when ? parseAPIDate(when).toRelative() : '—'}
119119
</TableCell>
120120
</Hidden>
121121
)}
@@ -130,13 +130,15 @@ export const MaintenanceTableRow = (props: MaintenanceTableRowProps) => {
130130
{!flags.vmHostMaintenance?.enabled && (
131131
<>
132132
<TableCell noWrap>
133-
{formatDate(when, {
134-
timezone: profile?.timezone,
135-
})}
133+
{when
134+
? formatDate(when, {
135+
timezone: profile?.timezone,
136+
})
137+
: '—'}
136138
</TableCell>
137139
<Hidden mdDown>
138140
<TableCell data-testid="relative-date">
139-
{parseAPIDate(when).toRelative()}
141+
{when ? parseAPIDate(when).toRelative() : '—'}
140142
</TableCell>
141143
</Hidden>
142144
</>

packages/manager/src/features/Linodes/LinodeEntityDetailHeaderMaintenancePolicy.tsx

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,6 @@ import * as React from 'react';
66
import { statusTooltipIcons } from 'src/features/Linodes/LinodeEntityDetailHeaderMaintenancePolicy.utils';
77
import { LinodeMaintenanceText } from 'src/features/Linodes/LinodeMaintenanceText';
88

9-
import { parseMaintenanceStartTime } from './LinodesLanding/utils';
10-
119
import type { MaintenancePolicySlug } from '@linode/api-v4';
1210
import type { LinodeMaintenance } from 'src/utilities/linodes';
1311

@@ -20,9 +18,7 @@ export const LinodeEntityDetailHeaderMaintenancePolicy = (
2018
props: LinodeEntityDetailHeaderMaintenancePolicyProps
2119
) => {
2220
const { linodeMaintenancePolicySet, maintenance } = props;
23-
const parsedMaintenanceStartTime = parseMaintenanceStartTime(
24-
maintenance?.start_time || maintenance?.when
25-
);
21+
const maintenanceStartTime = maintenance?.start_time || maintenance?.when;
2622

2723
const isPendingOrScheduled =
2824
maintenance?.status === 'pending' || maintenance?.status === 'scheduled';
@@ -63,7 +59,7 @@ export const LinodeEntityDetailHeaderMaintenancePolicy = (
6359
? 'Migrating'
6460
: 'Migrate'}
6561
</Typography>
66-
{isInProgress && (
62+
{isInProgress && maintenanceStartTime && (
6763
<TooltipIcon
6864
className="ui-TooltipIcon ui-TooltipIcon-isActive"
6965
icon={statusTooltipIcons.active}
@@ -76,7 +72,7 @@ export const LinodeEntityDetailHeaderMaintenancePolicy = (
7672
text={
7773
<LinodeMaintenanceText
7874
isOpened
79-
maintenanceStartTime={parsedMaintenanceStartTime}
75+
maintenanceStartTime={maintenanceStartTime}
8076
/>
8177
}
8278
tooltipPosition="top"
@@ -101,11 +97,13 @@ export const LinodeEntityDetailHeaderMaintenancePolicy = (
10197
text={
10298
maintenance?.status === 'pending' ? (
10399
"This Linode's maintenance window is pending."
104-
) : (
100+
) : maintenanceStartTime ? (
105101
<LinodeMaintenanceText
106102
isOpened={false}
107-
maintenanceStartTime={parsedMaintenanceStartTime}
103+
maintenanceStartTime={maintenanceStartTime}
108104
/>
105+
) : (
106+
"This Linode's maintenance window is scheduled."
109107
)
110108
}
111109
tooltipPosition="top"

packages/manager/src/features/Linodes/LinodesLanding/LinodeRow/LinodeRow.tsx

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { useInProgressEvents } from 'src/queries/events/events';
2323
import { LinodeMaintenanceText } from '../../LinodeMaintenanceText';
2424
import { IPAddress } from '../IPAddress';
2525
import { RegionIndicator } from '../RegionIndicator';
26-
import { getLinodeIconStatus, parseMaintenanceStartTime } from '../utils';
26+
import { getLinodeIconStatus } from '../utils';
2727
import {
2828
StyledButton,
2929
StyledIpTableCell,
@@ -65,9 +65,7 @@ export const LinodeRow = (props: Props) => {
6565

6666
const isTransitioning = linodeInTransition(status, recentEvent);
6767

68-
const parsedMaintenanceStartTime = parseMaintenanceStartTime(
69-
maintenance?.start_time || maintenance?.when
70-
);
68+
const maintenanceStartTime = maintenance?.start_time || maintenance?.when;
7169

7270
const iconStatus = getLinodeIconStatus(status);
7371

@@ -96,9 +94,7 @@ export const LinodeRow = (props: Props) => {
9694
onMouseLeave={handleMouseLeave}
9795
>
9896
<TableCell noWrap>
99-
<Link tabIndex={0} to={`/linodes/${id}`}>
100-
{label}
101-
</Link>
97+
<Link to={`/linodes/${id}`}>{label}</Link>
10298
</TableCell>
10399
<StyledMaintenanceTableCell
104100
data-qa-status
@@ -117,15 +113,15 @@ export const LinodeRow = (props: Props) => {
117113
/>
118114
</StyledButton>
119115
)}
120-
{isInProgress && (
116+
{isInProgress && maintenanceStartTime && (
121117
<TooltipIcon
122118
className="ui-TooltipIcon ui-TooltipIcon-isActive"
123119
icon={statusTooltipIcons.active}
124120
sx={{ tooltip: { maxWidth: 300 } }}
125121
text={
126122
<LinodeMaintenanceText
127123
isOpened
128-
maintenanceStartTime={parsedMaintenanceStartTime}
124+
maintenanceStartTime={maintenanceStartTime}
129125
/>
130126
}
131127
tooltipPosition="top"
@@ -143,11 +139,13 @@ export const LinodeRow = (props: Props) => {
143139
text={
144140
maintenance?.status === 'pending' ? (
145141
"This Linode's maintenance window is pending."
146-
) : (
142+
) : maintenanceStartTime ? (
147143
<LinodeMaintenanceText
148144
isOpened={false}
149-
maintenanceStartTime={parsedMaintenanceStartTime}
145+
maintenanceStartTime={maintenanceStartTime}
150146
/>
147+
) : (
148+
"This Linode's maintenance window is scheduled."
151149
)
152150
}
153151
tooltipPosition="top"

0 commit comments

Comments
 (0)