Skip to content

Commit 1d7cae2

Browse files
committed
Added notification about fleets on project details page dstackai/dstack-cloud#373
1 parent b7d38d6 commit 1d7cae2

File tree

4 files changed

+47
-6
lines changed

4 files changed

+47
-6
lines changed

frontend/src/pages/Fleets/List/index.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ import { Alert, Button, Header, Loader, PropertyFilter, SpaceBetween, Table, Tog
66

77
import { DEFAULT_TABLE_PAGE_SIZE } from 'consts';
88
import { useBreadcrumbs, useCollection, useInfiniteScroll } from 'hooks';
9+
import { useCheckingForFleetsInProjects } from 'hooks/useCheckingForFleetsInProjectsOfMember';
910
import { goToUrl } from 'libs';
1011
import { ROUTES } from 'routes';
1112
import { useLazyGetFleetsQuery } from 'services/fleet';
1213

13-
import { useCheckingForFleetsInProjects } from '../../../hooks/useCheckingForFleetsInProjectsOfMember';
1414
import { useColumnsDefinitions, useEmptyMessages, useFilters } from './hooks';
1515
import { useDeleteFleet } from './useDeleteFleet';
1616

@@ -102,8 +102,8 @@ export const FleetList: React.FC = () => {
102102
</Button>
103103
}
104104
>
105-
Some of the projects (e.g. <code>{projectDontHasFleet}</code>) have no fleets. Create at least
106-
one before submitting a run
105+
The project <code>{projectDontHasFleet}</code> has no fleets. Create one before submitting a
106+
run.
107107
</Alert>
108108
</div>
109109
)}

frontend/src/pages/Project/Details/Settings/index.tsx

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,11 @@ import { useTranslation } from 'react-i18next';
33
import { useNavigate, useParams } from 'react-router-dom';
44
import { debounce } from 'lodash';
55
import { ExpandableSection, Tabs } from '@cloudscape-design/components';
6+
import { ButtonProps } from '@cloudscape-design/components/button';
67
import Wizard from '@cloudscape-design/components/wizard';
78

89
import {
10+
Alert,
911
Box,
1012
Button,
1113
ButtonWithConfirmation,
@@ -22,7 +24,7 @@ import {
2224
import { HotspotIds } from 'layouts/AppLayout/TutorialPanel/constants';
2325

2426
import { useBreadcrumbs, useNotifications } from 'hooks';
25-
import { riseRouterException } from 'libs';
27+
import { goToUrl, riseRouterException } from 'libs';
2628
import { copyToClipboard } from 'libs';
2729
import { ROUTES } from 'routes';
2830
import { useGetProjectQuery, useUpdateProjectMembersMutation, useUpdateProjectMutation } from 'services/project';
@@ -35,6 +37,7 @@ import { useDeleteProject } from 'pages/Project/hooks/useDeleteProject';
3537
import { ProjectMembers } from 'pages/Project/Members';
3638
import { getProjectRoleByUserName } from 'pages/Project/utils';
3739

40+
import { useCheckingForFleetsInProjects } from '../../../../hooks/useCheckingForFleetsInProjectsOfMember';
3841
import { useBackendsTable } from '../../Backends/hooks';
3942
import { BackendsTable } from '../../Backends/Table';
4043
import { GatewaysTable } from '../../Gateways';
@@ -60,6 +63,10 @@ export const ProjectSettings: React.FC = () => {
6063
const { deleteProject, isDeleting } = useDeleteProject();
6164
const { data: currentUser } = useGetUserDataQuery({});
6265

66+
const projectNames = useMemo(() => [paramProjectName], [paramProjectName]);
67+
68+
const projectHavingFleetMap = useCheckingForFleetsInProjects({ projectNames });
69+
6370
const { data, isLoading, error } = useGetProjectQuery({ name: paramProjectName });
6471

6572
const { data: runsData } = useGetRunsQuery({
@@ -180,6 +187,13 @@ export const ProjectSettings: React.FC = () => {
180187

181188
const [activeStepIndex, setActiveStepIndex] = React.useState(0);
182189

190+
const projectDontHasFleet = !projectHavingFleetMap?.[paramProjectName];
191+
192+
const onCreateAFleet: ButtonProps['onClick'] = (event) => {
193+
event.preventDefault();
194+
goToUrl('https://dstack.ai/docs/quickstart/#create-a-fleet', true);
195+
};
196+
183197
if (isLoadingPage)
184198
return (
185199
<Container>
@@ -191,6 +205,22 @@ export const ProjectSettings: React.FC = () => {
191205
<>
192206
{data && backendsData && gatewaysData && (
193207
<SpaceBetween size="l">
208+
{projectDontHasFleet && (
209+
<div className={styles.alertBox}>
210+
<Alert
211+
header={t('fleets.no_alert.title')}
212+
type="info"
213+
action={
214+
<Button iconName="external" formAction="none" onClick={onCreateAFleet}>
215+
{t('fleets.no_alert.button_title')}
216+
</Button>
217+
}
218+
>
219+
The project <code>{paramProjectName}</code> has no fleets. Create one before submitting a run.
220+
</Alert>
221+
</div>
222+
)}
223+
194224
{isProjectMember && (
195225
<ExpandableSection
196226
variant="container"

frontend/src/pages/Project/Details/Settings/styles.module.scss

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,17 @@
88
width: 300px;
99
}
1010

11+
.alertBox {
12+
:global {
13+
& [class^="awsui_alert"] {
14+
& [class^="awsui_action-slot"] {
15+
display: flex;
16+
align-items: center;
17+
}
18+
}
19+
}
20+
}
21+
1122
.codeWrapper {
1223
position: relative;
1324

frontend/src/pages/Runs/List/index.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,8 +154,8 @@ export const RunList: React.FC = () => {
154154
</Button>
155155
}
156156
>
157-
Some of the projects (e.g. <code>{projectDontHasFleet}</code>) have no fleets. Create at least
158-
one before submitting a run
157+
The project <code>{projectDontHasFleet}</code> has no fleets. Create one before submitting a
158+
run.
159159
</Alert>
160160
</div>
161161
)}

0 commit comments

Comments
 (0)