11import * as React from 'react' ;
2+ import { Trans } from 'react-i18next' ;
23import { Button , DropdownItem , DropdownList , Nav , NavList } from '@patternfly/react-core' ;
34
4- import { Device , DeviceDecommission , DeviceDecommissionTargetType , ResourceKind } from '@flightctl/types' ;
5+ import {
6+ Device ,
7+ DeviceDecommission ,
8+ DeviceDecommissionTargetType ,
9+ DeviceSummaryStatusType ,
10+ ResourceKind ,
11+ } from '@flightctl/types' ;
512import { useFetchPeriodically } from '../../../hooks/useFetchPeriodically' ;
613import { useFetch } from '../../../hooks/useFetch' ;
714import { getDisabledTooltipProps } from '../../../utils/tooltip' ;
815import DetailsPage from '../../DetailsPage/DetailsPage' ;
9- import DetailsPageActions , { useDecommissionAction , useDeleteAction } from '../../DetailsPage/DetailsPageActions' ;
16+ import DetailsPageActions , {
17+ useDecommissionAction ,
18+ useDeleteAction ,
19+ useResumeAction ,
20+ } from '../../DetailsPage/DetailsPageActions' ;
1021import { useTranslation } from '../../../hooks/useTranslation' ;
1122import { ROUTE , useNavigate } from '../../../hooks/useNavigate' ;
1223import { useAppContext } from '../../../hooks/useAppContext' ;
1324import DeviceDetailsTab from './DeviceDetailsTab' ;
1425import TerminalTab from './TerminalTab' ;
1526import NavItem from '../../NavItem/NavItem' ;
16- import { getEditDisabledReason , isDeviceEnrolled } from '../../../utils/devices' ;
27+ import { getEditDisabledReason , getResumeDisabledReason , isDeviceEnrolled } from '../../../utils/devices' ;
1728import { RESOURCE , VERB } from '../../../types/rbac' ;
1829import { useAccessReview } from '../../../hooks/useAccessReview' ;
1930import EventsCard from '../../Events/EventsCard' ;
2031import PageWithPermissions from '../../common/PageWithPermissions' ;
2132import YamlEditor from '../../common/CodeEditor/YamlEditor' ;
2233import DeviceAliasEdit from './DeviceAliasEdit' ;
34+ import { SystemRestoreBanners } from '../../SystemRestore/SystemRestoreBanners' ;
2335
2436type DeviceDetailsPageProps = React . PropsWithChildren < { hideTerminal ?: boolean } > ;
2537
@@ -35,12 +47,14 @@ const DeviceDetailsPage = ({ children, hideTerminal }: DeviceDetailsPageProps) =
3547
3648 const deviceLabels = device ?. metadata . labels ;
3749 const deviceAlias = deviceLabels ?. alias ;
50+ const deviceNameOrAlias = deviceAlias || deviceId ;
3851 const isEnrolled = ! device || isDeviceEnrolled ( device ) ;
3952
4053 const [ hasTerminalAccess ] = useAccessReview ( RESOURCE . DEVICE_CONSOLE , VERB . GET ) ;
4154 const [ canDelete ] = useAccessReview ( RESOURCE . DEVICE , VERB . DELETE ) ;
4255 const [ canEdit ] = useAccessReview ( RESOURCE . DEVICE , VERB . PATCH ) ;
4356 const [ canDecommission ] = useAccessReview ( RESOURCE . DEVICE_DECOMMISSION , VERB . UPDATE ) ;
57+ const [ canResume ] = useAccessReview ( RESOURCE . DEVICE_RESUME , VERB . UPDATE ) ;
4458
4559 const canOpenTerminal = hasTerminalAccess && isEnrolled ;
4660
@@ -49,7 +63,7 @@ const DeviceDetailsPage = ({ children, hideTerminal }: DeviceDetailsPageProps) =
4963 await remove ( `devices/${ deviceId } ` ) ;
5064 navigate ( ROUTE . DEVICES ) ;
5165 } ,
52- resourceName : deviceAlias || deviceId ,
66+ resourceName : deviceNameOrAlias ,
5367 resourceType : 'device' ,
5468 buttonLabel : isEnrolled ? undefined : t ( 'Delete forever' ) ,
5569 } ) ;
@@ -64,7 +78,33 @@ const DeviceDetailsPage = ({ children, hideTerminal }: DeviceDetailsPageProps) =
6478 } ,
6579 } ) ;
6680
81+ const { resumeAction, resumeModal } = useResumeAction ( {
82+ deviceId,
83+ alias : deviceAlias ,
84+ disabledReason : device ? getResumeDisabledReason ( device , t ) : undefined ,
85+ onResumeComplete : refetch ,
86+ } ) ;
87+
6788 const editActionProps = device ? getDisabledTooltipProps ( getEditDisabledReason ( device , t ) ) : undefined ;
89+ const resumeDevice = {
90+ actionText : t ( 'Resume device' ) ,
91+ title : (
92+ < Trans t = { t } >
93+ You are about to resume < strong > { deviceNameOrAlias } </ strong >
94+ </ Trans >
95+ ) ,
96+ requestSelector : {
97+ fieldSelector : `metadata.name=${ deviceId } ` ,
98+ } ,
99+ } ;
100+
101+ const deviceSummaryStatus = device ?. status ?. summary . status ;
102+ const deviceSummary = {
103+ [ DeviceSummaryStatusType . DeviceSummaryStatusConflictPaused ] :
104+ deviceSummaryStatus === DeviceSummaryStatusType . DeviceSummaryStatusConflictPaused ? 1 : 0 ,
105+ [ DeviceSummaryStatusType . DeviceSummaryStatusAwaitingReconnect ] :
106+ deviceSummaryStatus === DeviceSummaryStatusType . DeviceSummaryStatusAwaitingReconnect ? 1 : 0 ,
107+ } ;
68108
69109 return (
70110 < DetailsPage
@@ -86,6 +126,16 @@ const DeviceDetailsPage = ({ children, hideTerminal }: DeviceDetailsPageProps) =
86126 deviceAlias
87127 )
88128 }
129+ banner = {
130+ device && (
131+ < SystemRestoreBanners
132+ mode = "device"
133+ resumeAction = { resumeDevice }
134+ summaryStatus = { deviceSummary }
135+ onResumeComplete = { refetch }
136+ />
137+ )
138+ }
89139 resourceLink = { ROUTE . DEVICES }
90140 resourceType = "Devices"
91141 resourceTypeLabel = { t ( 'Devices' ) }
@@ -111,6 +161,7 @@ const DeviceDetailsPage = ({ children, hideTerminal }: DeviceDetailsPageProps) =
111161 { t ( 'Edit device configurations' ) }
112162 </ DropdownItem >
113163 ) }
164+ { canResume && resumeAction }
114165 { canDecommission && decommissionAction }
115166 </ DropdownList >
116167 </ DetailsPageActions >
@@ -143,7 +194,7 @@ const DeviceDetailsPage = ({ children, hideTerminal }: DeviceDetailsPageProps) =
143194 </ Routes >
144195 ) }
145196
146- { deleteModal || decommissionModal }
197+ { deleteModal || decommissionModal || resumeModal }
147198 </ DetailsPage >
148199 ) ;
149200} ;
0 commit comments