Skip to content

Commit f8a5baa

Browse files
committed
feat: [PROD-13346] disable Launch button when dataset has status ERROR or cannot be found
1 parent 692c82b commit f8a5baa

File tree

3 files changed

+41
-17
lines changed

3 files changed

+41
-17
lines changed

public/locales/en/translation.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
"discard": "DISCARD",
4242
"edit": "Edit parameters",
4343
"launch": "LAUNCH",
44+
"launchDisabled": "The scenario cannot be run because its dataset isn't found or its data ingestion has failed",
4445
"save": "SAVE",
4546
"update": {
4647
"launch": "SAVE AND LAUNCH"

public/locales/fr/translation.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
"discard": "ABANDONNER",
4242
"edit": "Éditer les parameters",
4343
"launch": "LANCER",
44+
"launchDisabled": "Le scénario ne peut pas être lancé parce que son dataset n'est pas trouvé ou l'ingestion des données a échoué",
4445
"save": "SAUVEGARDER",
4546
"update": {
4647
"launch": "SAUVEGARDER ET LANCER"

src/components/ScenarioParameters/components/ScenarioActions/components/LaunchButton/LaunchButton.js

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
// Copyright (c) Cosmo Tech.
22
// Licensed under the MIT license.
3-
import React, { useCallback } from 'react';
3+
import React, { useCallback, useMemo } from 'react';
44
import { useFormState } from 'react-hook-form';
55
import { useTranslation } from 'react-i18next';
66
import PlayCircleOutlineIcon from '@mui/icons-material/PlayCircleOutline';
77
import { Button, Grid } from '@mui/material';
8-
import { PermissionsGate } from '@cosmotech/ui';
8+
import { FadingTooltip, PermissionsGate } from '@cosmotech/ui';
99
import { useUpdateParameters } from '../../../../../../hooks/ScenarioParametersHooks';
1010
import { useUserAppAndCurrentScenarioPermissions } from '../../../../../../hooks/SecurityHooks';
11-
import { SCENARIO_RUN_STATE } from '../../../../../../services/config/ApiConstants';
11+
import { INGESTION_STATUS, SCENARIO_RUN_STATE } from '../../../../../../services/config/ApiConstants';
1212
import { ACL_PERMISSIONS } from '../../../../../../services/config/accessControl';
1313
import { useSetApplicationErrorMessage } from '../../../../../../state/hooks/ApplicationHooks';
14+
import { useDatasets } from '../../../../../../state/hooks/DatasetHooks';
1415
import {
16+
useCurrentScenarioDatasetList,
1517
useCurrentScenarioId,
1618
useCurrentScenarioState,
1719
useLaunchScenario,
@@ -29,6 +31,15 @@ export const LaunchButton = () => {
2931
const setApplicationErrorMessage = useSetApplicationErrorMessage();
3032
const launchScenario = useLaunchScenario();
3133
const userAppAndCurrentScenarioPermissions = useUserAppAndCurrentScenarioPermissions();
34+
const currentScenarioDatasetList = useCurrentScenarioDatasetList();
35+
const datasets = useDatasets();
36+
const isCurrentScenarioDatasetUnavailable = useMemo(() => {
37+
if (currentScenarioDatasetList && currentScenarioDatasetList?.length > 0) {
38+
const currentScenarioDataset = datasets?.find((dataset) => dataset.id === currentScenarioDatasetList?.[0]);
39+
return !currentScenarioDataset || currentScenarioDataset?.ingestionStatus === INGESTION_STATUS.ERROR;
40+
}
41+
return false;
42+
}, [currentScenarioDatasetList, datasets]);
3243

3344
const isCurrentScenarioRunning =
3445
currentScenarioState === SCENARIO_RUN_STATE.RUNNING ||
@@ -73,21 +84,32 @@ export const LaunchButton = () => {
7384
necessaryPermissions={[ACL_PERMISSIONS.SCENARIO.LAUNCH]}
7485
>
7586
<Grid item>
76-
<Button
77-
data-cy="launch-scenario-button"
78-
variant="contained"
79-
startIcon={<PlayCircleOutlineIcon />}
80-
onClick={launchCurrentScenario}
81-
disabled={!isValid}
87+
<FadingTooltip
88+
title={
89+
isCurrentScenarioDatasetUnavailable
90+
? t(
91+
'commoncomponents.button.scenario.parameters.launchDisabled',
92+
"The scenario cannot be run because its dataset isn't found or its data ingestion has failed"
93+
)
94+
: ''
95+
}
8296
>
83-
{isDirty ? (
84-
<span data-cy="save-and-launch-label">
85-
{t('commoncomponents.button.scenario.parameters.update.launch', 'SAVE AND LAUNCH')}
86-
</span>
87-
) : (
88-
<span data-cy="launch-label">{t('commoncomponents.button.scenario.parameters.launch', 'LAUNCH')}</span>
89-
)}
90-
</Button>
97+
<Button
98+
data-cy="launch-scenario-button"
99+
variant="contained"
100+
startIcon={<PlayCircleOutlineIcon />}
101+
onClick={launchCurrentScenario}
102+
disabled={!isValid || isCurrentScenarioDatasetUnavailable}
103+
>
104+
{isDirty ? (
105+
<span data-cy="save-and-launch-label">
106+
{t('commoncomponents.button.scenario.parameters.update.launch', 'SAVE AND LAUNCH')}
107+
</span>
108+
) : (
109+
<span data-cy="launch-label">{t('commoncomponents.button.scenario.parameters.launch', 'LAUNCH')}</span>
110+
)}
111+
</Button>
112+
</FadingTooltip>
91113
</Grid>
92114
</PermissionsGate>
93115
) : null;

0 commit comments

Comments
 (0)