Skip to content

Commit 5d30df1

Browse files
Simplify mission scheduling component interfaces
1 parent 5cf37cf commit 5d30df1

6 files changed

Lines changed: 109 additions & 266 deletions

File tree

Lines changed: 28 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,66 @@
11
import { InspectionArea } from 'models/InspectionArea'
2-
import { MissionDefinition } from 'models/MissionDefinition'
3-
import { InspectionAreaInspectionTuple } from './InspectionSection'
42
import { useLanguageContext } from 'components/Contexts/LanguageContext'
53
import {
64
CardComponent,
75
Content,
86
InspectionAreaText,
9-
Placeholder,
107
StyledCard,
118
StyledInspectionAreaCard,
12-
StyledInspectionAreaCards,
139
TopInspectionAreaText,
1410
} from './InspectionUtilities'
1511
import { Button, Icon, Tooltip, Typography } from '@equinor/eds-core-react'
1612
import { Icons } from 'utils/icons'
1713
import { tokens } from '@equinor/eds-tokens'
18-
import { useMissionsContext } from 'components/Contexts/MissionRunsContext'
1914
import { useAssetContext } from 'components/Contexts/AssetContext'
2015

2116
interface InspectionAreaCardProps {
22-
inspectionAreaData: InspectionAreaInspectionTuple
17+
inspectionArea: InspectionArea
18+
nMissions: number
2319
onClickInspectionArea: (inspectionArea: InspectionArea) => void
24-
selectedInspectionArea: InspectionArea | undefined
25-
handleScheduleAll: (missionDefinitions: MissionDefinition[]) => void
20+
isSelected: boolean
21+
isMissionOngoing: boolean
22+
onClickScheduleAll: (inspectionArea: InspectionArea) => void
2623
}
2724

28-
const InspectionAreaCard = ({
29-
inspectionAreaData,
25+
export const InspectionAreaCard = ({
26+
inspectionArea,
27+
nMissions,
3028
onClickInspectionArea,
31-
selectedInspectionArea,
32-
handleScheduleAll,
29+
isSelected,
30+
isMissionOngoing,
31+
onClickScheduleAll,
3332
}: InspectionAreaCardProps) => {
3433
const { TranslateText } = useLanguageContext()
35-
const { ongoingMissions } = useMissionsContext()
3634
const { enabledRobots } = useAssetContext()
3735

38-
const isScheduleMissionsDisabled = enabledRobots.length === 0 || inspectionAreaData.missionDefinitions.length === 0
36+
const isScheduleMissionsDisabled = enabledRobots.length === 0 || nMissions === 0
3937

4038
let queueMissionsTooltip = ''
41-
if (inspectionAreaData.missionDefinitions.length === 0) queueMissionsTooltip = TranslateText('No available mission')
39+
if (nMissions === 0) queueMissionsTooltip = TranslateText('No available mission')
4240
else if (isScheduleMissionsDisabled) queueMissionsTooltip = TranslateText('No robot available')
4341

4442
return (
45-
<StyledInspectionAreaCard key={inspectionAreaData.inspectionArea.inspectionAreaName}>
43+
<StyledInspectionAreaCard key={inspectionArea.inspectionAreaName}>
4644
<StyledCard
47-
key={inspectionAreaData.inspectionArea.inspectionAreaName}
48-
onClick={() => onClickInspectionArea(inspectionAreaData.inspectionArea)}
49-
style={
50-
selectedInspectionArea === inspectionAreaData.inspectionArea
51-
? { border: `solid ${tokens.colors.interactive.focus.hex} 1px` }
52-
: {}
53-
}
45+
key={inspectionArea.inspectionAreaName}
46+
onClick={() => onClickInspectionArea(inspectionArea)}
47+
style={isSelected ? { border: `solid ${tokens.colors.interactive.focus.hex} 1px` } : {}}
5448
>
5549
<InspectionAreaText>
5650
<TopInspectionAreaText>
5751
<Typography variant={'body_short_bold'}>
58-
{inspectionAreaData.inspectionArea.inspectionAreaName.toString()}
52+
{inspectionArea.inspectionAreaName.toString()}
5953
</Typography>
60-
{inspectionAreaData.missionDefinitions
61-
.filter((m) => ongoingMissions.find((om) => om.missionId === m.id))
62-
.map((mission) => (
63-
<Content key={mission.id}>
64-
<Icon name={Icons.Ongoing} size={16} />
65-
{TranslateText('InProgress')}
66-
</Content>
67-
))}
54+
{isMissionOngoing && (
55+
<Content>
56+
<Icon name={Icons.Ongoing} size={16} />
57+
{TranslateText('InProgress')}
58+
</Content>
59+
)}
6860
</TopInspectionAreaText>
6961
<Typography color={tokens.colors.text.static_icons__secondary.hex}>
70-
{inspectionAreaData.missionDefinitions.length}{' '}
71-
{inspectionAreaData.missionDefinitions.length === 1
62+
{nMissions}{' '}
63+
{nMissions === 1
7264
? TranslateText('Mission').toLowerCase()
7365
: TranslateText('Missions').toLowerCase()}
7466
</Typography>
@@ -78,13 +70,10 @@ const InspectionAreaCard = ({
7870
<Button
7971
disabled={isScheduleMissionsDisabled}
8072
variant="ghost"
81-
onClick={() => handleScheduleAll(inspectionAreaData.missionDefinitions)}
73+
onClick={() => onClickScheduleAll(inspectionArea)}
8274
color="secondary"
8375
>
84-
<Icon
85-
name={Icons.Add}
86-
color={inspectionAreaData.missionDefinitions.length > 0 ? '' : 'grey'}
87-
/>
76+
<Icon name={Icons.Add} color={nMissions > 0 ? '' : 'grey'} />
8877
<Typography color={tokens.colors.text.static_icons__secondary.hex}>
8978
{TranslateText('Queue the missions')}
9079
</Typography>
@@ -95,43 +84,3 @@ const InspectionAreaCard = ({
9584
</StyledInspectionAreaCard>
9685
)
9786
}
98-
99-
interface IInspectionAreaCardProps {
100-
inspectionAreaMissions: InspectionAreaInspectionTuple[]
101-
onClickInspectionArea: (inspectionArea: InspectionArea) => void
102-
selectedInspectionArea: InspectionArea | undefined
103-
handleScheduleAll: (missionDefinitions: MissionDefinition[]) => void
104-
}
105-
106-
export const InspectionAreaCards = ({
107-
inspectionAreaMissions,
108-
onClickInspectionArea,
109-
selectedInspectionArea,
110-
handleScheduleAll,
111-
}: IInspectionAreaCardProps) => {
112-
const { TranslateText } = useLanguageContext()
113-
114-
return (
115-
<>
116-
{Object.keys(inspectionAreaMissions).length > 0 ? (
117-
<StyledInspectionAreaCards>
118-
{inspectionAreaMissions.map((inspectionAreaMission) => (
119-
<InspectionAreaCard
120-
key={'inspectionAreaCard' + inspectionAreaMission.inspectionArea.inspectionAreaName}
121-
inspectionAreaData={inspectionAreaMission}
122-
onClickInspectionArea={onClickInspectionArea}
123-
selectedInspectionArea={selectedInspectionArea}
124-
handleScheduleAll={handleScheduleAll}
125-
/>
126-
))}
127-
</StyledInspectionAreaCards>
128-
) : (
129-
<Placeholder>
130-
<Typography variant="h4" color="disabled">
131-
{TranslateText('No inspections available')}
132-
</Typography>
133-
</Placeholder>
134-
)}
135-
</>
136-
)
137-
}

frontend/src/pages/MissionSchedulingComponents/InspectionSection.tsx

Lines changed: 0 additions & 7 deletions
This file was deleted.

frontend/src/pages/MissionSchedulingComponents/InspectionUtilities.tsx

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import { Card } from '@equinor/eds-core-react'
22
import styled from 'styled-components'
33
import { MissionDefinition } from 'models/MissionDefinition'
4-
import { tokens } from '@equinor/eds-tokens'
54
import { cardShadow } from 'components/Styles/StyledComponents'
65

76
export const StyledCard = styled(Card)`
@@ -52,11 +51,6 @@ export const InspectionAreaOverview = styled.div`
5251
flex-direction: column;
5352
gap: 48px;
5453
`
55-
export const Placeholder = styled.div`
56-
padding: 24px;
57-
border: 1px solid ${tokens.colors.ui.background__medium.hex};
58-
border-radius: 4px;
59-
`
6054
export const Content = styled.div`
6155
display: flex;
6256
align-items: centre;

frontend/src/pages/MissionSchedulingComponents/MissionSchedulingTable.tsx

Lines changed: 21 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@ import { useNavigate } from 'react-router'
88
import { Icons } from 'utils/icons'
99
import { compareMissionDefinitions } from './InspectionUtilities'
1010
import { formatDateTime } from 'utils/StringFormatting'
11-
import { AlreadyScheduledMissionDialog } from './ScheduleMissionDialogs'
12-
import { useContext, useState } from 'react'
13-
import { useMissionsContext } from 'components/Contexts/MissionRunsContext'
11+
import { useContext } from 'react'
1412
import { useAssetContext } from 'components/Contexts/AssetContext'
1513
import { FrontPageSectionId } from 'models/FrontPageSectionId'
1614
import { SmallScreenInfoText } from 'utils/InfoText'
@@ -74,37 +72,23 @@ const HideColumnsOnSmallScreen = styled.div`
7472
}
7573
`
7674

77-
interface IProps {
78-
inspectionArea: InspectionArea
79-
missionDefinitions: MissionDefinition[]
80-
scrollOnToggle: boolean
81-
openDialog: () => void
82-
setSelectedMissions: (selectedMissions: MissionDefinition[]) => void
83-
}
84-
8575
interface IMissionRowProps {
8676
mission: MissionDefinition
87-
openDialog: () => void
8877
setMissions: (selectedMissions: MissionDefinition[]) => void
89-
openScheduledDialog: () => void
9078
}
9179

92-
const MissionRow = ({ mission, openDialog, setMissions, openScheduledDialog }: IMissionRowProps) => {
80+
const MissionRow = ({ mission, setMissions }: IMissionRowProps) => {
9381
const { TranslateText } = useLanguageContext()
94-
const { missionQueue } = useMissionsContext()
9582
const { enabledRobots } = useAssetContext()
9683
const { installation } = useContext(InstallationContext)
9784
const navigate = useNavigate()
9885

99-
const isScheduled = missionQueue.map((m) => m.missionId).includes(mission.id)
10086
const isScheduleButtonDisabled = enabledRobots.length === 0
10187

10288
const lastCompleted = mission.lastSuccessfulRun?.endTime
10389
? formatDateTime(mission.lastSuccessfulRun.endTime)
10490
: TranslateText('Never')
10591

106-
const noRobotReadyForMissionsText = TranslateText('No robot available')
107-
10892
return (
10993
<StyledTableRow key={mission.id}>
11094
<Table.Cell id={Columns.Name}>
@@ -121,55 +105,31 @@ const MissionRow = ({ mission, openDialog, setMissions, openScheduledDialog }: I
121105
<Table.Cell id={Columns.LastCompleted}>{lastCompleted}</Table.Cell>
122106
<Table.Cell id={Columns.AddToQueue}>
123107
<Centered>
124-
{!isScheduled && (
125-
<Button
126-
style={{ width: isScheduleButtonDisabled ? '110px' : '' }}
127-
variant="ghost_icon"
128-
disabled={isScheduleButtonDisabled}
129-
onClick={() => {
130-
openDialog()
131-
setMissions([mission])
132-
}}
133-
>
134-
<StyledIcon color={`${tokens.colors.interactive.focus.hex}`} name={Icons.Add} size={24} />
135-
{isScheduleButtonDisabled && noRobotReadyForMissionsText}
136-
</Button>
137-
)}
138-
{isScheduled && (
139-
<Button
140-
variant="ghost_icon"
141-
disabled={enabledRobots.length === 0}
142-
onClick={() => {
143-
openScheduledDialog()
144-
setMissions([mission])
145-
}}
146-
>
147-
<StyledIcon color={`${tokens.colors.interactive.focus.hex}`} name={Icons.Add} size={24} />
148-
</Button>
149-
)}
108+
<Button
109+
style={{ width: isScheduleButtonDisabled ? '110px' : '' }}
110+
variant="ghost_icon"
111+
disabled={isScheduleButtonDisabled}
112+
onClick={() => {
113+
setMissions([mission])
114+
}}
115+
>
116+
<StyledIcon color={`${tokens.colors.interactive.focus.hex}`} name={Icons.Add} size={24} />
117+
{isScheduleButtonDisabled && <>{TranslateText('No robot available')}</>}
118+
</Button>
150119
</Centered>
151120
</Table.Cell>
152121
</StyledTableRow>
153122
)
154123
}
155124

156-
export const MissionSchedulingTable = ({
157-
inspectionArea,
158-
missionDefinitions,
159-
openDialog,
160-
setSelectedMissions,
161-
}: IProps) => {
162-
const { TranslateText } = useLanguageContext()
163-
164-
const [isScheduledDialogOpen, setIsScheduledDialogOpen] = useState<boolean>(false)
165-
166-
const openScheduleDialog = () => {
167-
setIsScheduledDialogOpen(true)
168-
}
125+
interface IProps {
126+
inspectionArea: InspectionArea
127+
missionDefinitions: MissionDefinition[]
128+
setSelectedMissions: (selectedMissions: MissionDefinition[]) => void
129+
}
169130

170-
const closeScheduleDialog = () => {
171-
setIsScheduledDialogOpen(false)
172-
}
131+
export const MissionSchedulingTable = ({ inspectionArea, missionDefinitions, setSelectedMissions }: IProps) => {
132+
const { TranslateText } = useLanguageContext()
173133

174134
return (
175135
<StyledTable id={FrontPageSectionId.InspectionTable}>
@@ -190,20 +150,11 @@ export const MissionSchedulingTable = ({
190150
</Table.Head>
191151
<Table.Body style={{ backgroundColor: tokens.colors.ui.background__default.hex }}>
192152
{missionDefinitions.sort(compareMissionDefinitions).map((mission) => (
193-
<MissionRow
194-
key={mission.id}
195-
mission={mission}
196-
openDialog={openDialog}
197-
setMissions={setSelectedMissions}
198-
openScheduledDialog={openScheduleDialog}
199-
/>
153+
<MissionRow key={mission.id} mission={mission} setMissions={setSelectedMissions} />
200154
))}
201155
</Table.Body>
202156
</Table>
203157
</HideColumnsOnSmallScreen>
204-
{isScheduledDialogOpen && (
205-
<AlreadyScheduledMissionDialog openDialog={openDialog} closeDialog={closeScheduleDialog} />
206-
)}
207158
</StyledTable>
208159
)
209160
}

0 commit comments

Comments
 (0)