diff --git a/pkg/app/web/src/components/app-sync-status.stories.tsx b/pkg/app/web/src/components/app-sync-status.stories.tsx new file mode 100644 index 0000000000..3b3c87f522 --- /dev/null +++ b/pkg/app/web/src/components/app-sync-status.stories.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import { dummyApplicationSyncState } from "../__fixtures__/dummy-application"; + +import { AppSyncStatus } from "./app-sync-status"; + +export default { + title: "application/AppSyncStatus", + component: AppSyncStatus, +}; + +export const overview: React.FC = () => ( + +); + +export const large: React.FC = () => ( + +); + +export const deploying: React.FC = () => ( + +); diff --git a/pkg/app/web/src/components/app-sync-status.tsx b/pkg/app/web/src/components/app-sync-status.tsx new file mode 100644 index 0000000000..ced522dd57 --- /dev/null +++ b/pkg/app/web/src/components/app-sync-status.tsx @@ -0,0 +1,62 @@ +import React, { FC } from "react"; +import { Box, makeStyles, Typography } from "@material-ui/core"; +import { SyncStatusIcon } from "./sync-status-icon"; +import { APPLICATION_SYNC_STATUS_TEXT } from "../constants/application-sync-status-text"; +import { + ApplicationSyncState, + ApplicationSyncStatus, +} from "../modules/applications"; +import { UI_TEXT_NOT_AVAILABLE_TEXT } from "../constants/ui-text"; + +const useStyles = makeStyles((theme) => ({ + statusText: { + marginLeft: theme.spacing(0.5), + }, +})); + +interface Props { + syncState?: ApplicationSyncState; + deploying: boolean; + className?: string; + size?: "medium" | "large"; +} + +export const AppSyncStatus: FC = ({ + syncState, + deploying, + className, + size = "medium", +}) => { + const classes = useStyles(); + const fontVariant = size === "medium" ? "body1" : "h6"; + + if (deploying) { + return ( + + + + {APPLICATION_SYNC_STATUS_TEXT[ApplicationSyncStatus.DEPLOYING]} + + + ); + } + + return ( + + {syncState ? : null} + + {syncState + ? APPLICATION_SYNC_STATUS_TEXT[syncState.status] + : UI_TEXT_NOT_AVAILABLE_TEXT} + + + ); +}; diff --git a/pkg/app/web/src/components/application-detail.tsx b/pkg/app/web/src/components/application-detail.tsx index 9c42402b74..aaa0b89709 100644 --- a/pkg/app/web/src/components/application-detail.tsx +++ b/pkg/app/web/src/components/application-detail.tsx @@ -16,7 +16,6 @@ import React, { FC, memo } from "react"; import { useDispatch, useSelector } from "react-redux"; import { Link as RouterLink } from "react-router-dom"; import { APPLICATION_KIND_TEXT } from "../constants/application-kind"; -import { APPLICATION_SYNC_STATUS_TEXT } from "../constants/application-sync-status-text"; import { APPLICATION_HEALTH_STATUS_TEXT } from "../constants/health-status-text"; import { PAGE_PATH_DEPLOYMENTS } from "../constants/path"; import { UI_TEXT_REFRESH } from "../constants/ui-text"; @@ -24,7 +23,6 @@ import { AppState } from "../modules"; import { Application, ApplicationDeploymentReference, - ApplicationSyncStatus, fetchApplication, selectById as selectApplicationById, syncApplication, @@ -39,11 +37,11 @@ import { selectById as selectEnvById, } from "../modules/environments"; import { Piped, selectById as selectPipeById } from "../modules/pipeds"; +import { AppSyncStatus } from "./app-sync-status"; import { DetailTableRow } from "./detail-table-row"; import { ApplicationHealthStatusIcon } from "./health-status-icon"; import { SplitButton } from "./split-button"; import { SyncStateReason } from "./sync-state-reason"; -import { SyncStatusIcon } from "./sync-status-icon"; const useStyles = makeStyles((theme) => ({ root: { @@ -63,10 +61,12 @@ const useStyles = makeStyles((theme) => ({ color: theme.palette.text.secondary, marginLeft: theme.spacing(1), }, - syncStatusText: { - marginLeft: theme.spacing(0.5), + appSyncState: { marginRight: theme.spacing(1), }, + liveStateText: { + marginLeft: theme.spacing(0.5), + }, buttonProgress: { color: theme.palette.primary.main, position: "absolute", @@ -233,29 +233,22 @@ export const ApplicationDetail: FC = memo(function ApplicationDetail({ - {app?.syncState ? ( + {app ? ( <> - - - - {app.deploying - ? APPLICATION_SYNC_STATUS_TEXT[ - ApplicationSyncStatus.DEPLOYING - ] - : APPLICATION_SYNC_STATUS_TEXT[app.syncState.status]} - - {liveState ? ( <> - + {APPLICATION_HEALTH_STATUS_TEXT[liveState.healthStatus]} @@ -264,10 +257,12 @@ export const ApplicationDetail: FC = memo(function ApplicationDetail({ )} - + {app.syncState && ( + + )} ) : ( diff --git a/pkg/app/web/src/components/application-list-item.tsx b/pkg/app/web/src/components/application-list-item.tsx index d05ee721d5..b9dc5320fb 100644 --- a/pkg/app/web/src/components/application-list-item.tsx +++ b/pkg/app/web/src/components/application-list-item.tsx @@ -7,7 +7,6 @@ import { MenuItem, TableCell, TableRow, - Typography, } from "@material-ui/core"; import MenuIcon from "@material-ui/icons/MoreVert"; import dayjs from "dayjs"; @@ -15,7 +14,6 @@ import React, { FC, memo, useState } from "react"; import { useSelector } from "react-redux"; import { Link as RouterLink } from "react-router-dom"; import { APPLICATION_KIND_TEXT } from "../constants/application-kind"; -import { APPLICATION_SYNC_STATUS_TEXT } from "../constants/application-sync-status-text"; import { PAGE_PATH_APPLICATIONS } from "../constants/path"; import { AppState } from "../modules"; import { Application, selectById } from "../modules/applications"; @@ -23,8 +21,9 @@ import { Environment, selectById as selectEnvById, } from "../modules/environments"; -import { SyncStatusIcon } from "./sync-status-icon"; import clsx from "clsx"; +import { AppSyncStatus } from "./app-sync-status"; +import { UI_TEXT_NOT_AVAILABLE_TEXT } from "../constants/ui-text"; const useStyles = makeStyles((theme) => ({ root: { @@ -32,9 +31,6 @@ const useStyles = makeStyles((theme) => ({ flex: 1, overflow: "auto", }, - statusText: { - marginLeft: theme.spacing(1), - }, disabled: { background: theme.palette.grey[200], }, @@ -42,15 +38,13 @@ const useStyles = makeStyles((theme) => ({ const EmptyDeploymentData: FC = () => ( <> - {NOT_AVAILABLE_TEXT} - {NOT_AVAILABLE_TEXT} - {NOT_AVAILABLE_TEXT} - {NOT_AVAILABLE_TEXT} + {UI_TEXT_NOT_AVAILABLE_TEXT} + {UI_TEXT_NOT_AVAILABLE_TEXT} + {UI_TEXT_NOT_AVAILABLE_TEXT} + {UI_TEXT_NOT_AVAILABLE_TEXT} ); -const NOT_AVAILABLE_TEXT = "N/A"; - interface Props { applicationId: string; onEdit: (id: string) => void; @@ -114,19 +108,10 @@ export const ApplicationListItem: FC = memo( - {app.syncState ? ( - <> - - - {APPLICATION_SYNC_STATUS_TEXT[app.syncState.status]} - - - ) : ( - NOT_AVAILABLE_TEXT - )} + @@ -144,12 +129,12 @@ export const ApplicationListItem: FC = memo( {recentlyDeployment.version} {recentlyDeployment.trigger?.commit?.hash.slice(0, 8) ?? - NOT_AVAILABLE_TEXT} + UI_TEXT_NOT_AVAILABLE_TEXT} {recentlyDeployment.trigger?.commander || recentlyDeployment.trigger?.commit?.author || - NOT_AVAILABLE_TEXT} + UI_TEXT_NOT_AVAILABLE_TEXT} {dayjs(recentlyDeployment.startedAt * 1000).fromNow()} diff --git a/pkg/app/web/src/components/sync-status-icon.stories.tsx b/pkg/app/web/src/components/sync-status-icon.stories.tsx index 2d0760d416..9464043ded 100644 --- a/pkg/app/web/src/components/sync-status-icon.stories.tsx +++ b/pkg/app/web/src/components/sync-status-icon.stories.tsx @@ -9,12 +9,9 @@ export default { export const overview: React.FC = () => ( <> - - - - + + + + ); diff --git a/pkg/app/web/src/components/sync-status-icon.tsx b/pkg/app/web/src/components/sync-status-icon.tsx index f8834130e9..46c42d0757 100644 --- a/pkg/app/web/src/components/sync-status-icon.tsx +++ b/pkg/app/web/src/components/sync-status-icon.tsx @@ -29,16 +29,11 @@ const useStyles = makeStyles((theme) => ({ interface Props { status: ApplicationSyncStatus; - deploying: boolean; } -export const SyncStatusIcon: FC = ({ status, deploying }) => { +export const SyncStatusIcon: FC = ({ status }) => { const classes = useStyles(); - if (deploying) { - return ; - } - switch (status) { case ApplicationSyncStatus.UNKNOWN: return ; diff --git a/pkg/app/web/src/constants/ui-text.ts b/pkg/app/web/src/constants/ui-text.ts index 4638a019d2..131e9f484d 100644 --- a/pkg/app/web/src/constants/ui-text.ts +++ b/pkg/app/web/src/constants/ui-text.ts @@ -8,3 +8,4 @@ export const UI_TEXT_DELETE = "Delete"; export const UI_TEXT_FILTER = "FILTER"; export const UI_TEXT_FILTERED = "FILTERED"; export const UI_TEXT_HIDE_FILTER = "HIDE FILTER"; +export const UI_TEXT_NOT_AVAILABLE_TEXT = "N/A";