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";