diff --git a/web/components/headers/index.ts b/web/components/headers/index.ts
index 298658a2a..d38da5149 100644
--- a/web/components/headers/index.ts
+++ b/web/components/headers/index.ts
@@ -20,3 +20,4 @@ export * from "./project-archived-issue-details";
export * from "./project-archived-issues";
export * from "./project-issue-details";
export * from "./user-profile";
+export * from "./workspace-active-cycles";
diff --git a/web/components/headers/workspace-active-cycles.tsx b/web/components/headers/workspace-active-cycles.tsx
new file mode 100644
index 000000000..bb74447d1
--- /dev/null
+++ b/web/components/headers/workspace-active-cycles.tsx
@@ -0,0 +1,22 @@
+import { observer } from "mobx-react-lite";
+// ui
+import { Breadcrumbs, ContrastIcon } from "@plane/ui";
+// icons
+import { Crown } from "lucide-react";
+
+export const WorkspaceActiveCycleHeader = observer(() => (
+
+
+
+
+ }
+ label="Active Cycles"
+ />
+
+
+
+
+
+));
diff --git a/web/components/workspace/index.ts b/web/components/workspace/index.ts
index 9787487e1..579a4c752 100644
--- a/web/components/workspace/index.ts
+++ b/web/components/workspace/index.ts
@@ -8,3 +8,4 @@ export * from "./send-workspace-invitation-modal";
export * from "./sidebar-dropdown";
export * from "./sidebar-menu";
export * from "./sidebar-quick-action";
+export * from "./workspace-active-cycles-upgrade";
diff --git a/web/components/workspace/sidebar-menu.tsx b/web/components/workspace/sidebar-menu.tsx
index 640318980..ea06231b5 100644
--- a/web/components/workspace/sidebar-menu.tsx
+++ b/web/components/workspace/sidebar-menu.tsx
@@ -8,9 +8,12 @@ import { useApplication, useUser } from "hooks/store";
import { NotificationPopover } from "components/notifications";
// ui
import { Tooltip } from "@plane/ui";
+import { Crown } from "lucide-react";
// constants
import { EUserWorkspaceRoles } from "constants/workspace";
import { SIDEBAR_MENU_ITEMS } from "constants/dashboard";
+// helper
+import { cn } from "helpers/common.helper";
export const WorkspaceSidebarMenu = observer(() => {
// store hooks
@@ -44,8 +47,17 @@ export const WorkspaceSidebarMenu = observer(() => {
: "text-custom-sidebar-text-200 hover:bg-custom-sidebar-background-80 focus:bg-custom-sidebar-background-80"
} ${themeStore?.sidebarCollapsed ? "justify-center" : ""}`}
>
- {}
+ {
+
+ }
{!themeStore?.sidebarCollapsed && link.label}
+ {!themeStore?.sidebarCollapsed && link.key === "active-cycles" && (
+
+ )}
diff --git a/web/components/workspace/workspace-active-cycles-upgrade.tsx b/web/components/workspace/workspace-active-cycles-upgrade.tsx
new file mode 100644
index 000000000..31d31380d
--- /dev/null
+++ b/web/components/workspace/workspace-active-cycles-upgrade.tsx
@@ -0,0 +1,100 @@
+import React from "react";
+import Image from "next/image";
+import { observer } from "mobx-react";
+// hooks
+import { useUser } from "hooks/store";
+// ui
+import { getButtonStyling } from "@plane/ui";
+// icons
+import { Crown } from "lucide-react";
+// helper
+import { cn } from "helpers/common.helper";
+// constants
+import { WORKSPACE_ACTIVE_CYCLES_DETAILS } from "constants/cycle";
+
+export const WorkspaceActiveCyclesUpgrade = observer(() => {
+ // store hooks
+ const { currentUser } = useUser();
+
+ const isDarkMode = currentUser?.theme.theme === "dark";
+
+ return (
+
+
+
+
+
On-demand snapshots of all your cycles
+
+ Monitor cycles across projects, track high-priority issues, and zoom in cycles that need attention.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {WORKSPACE_ACTIVE_CYCLES_DETAILS.map((item) => (
+
+
+
{item.title}
+
+
+
{item.description}
+
+ ))}
+
+
+ );
+});
diff --git a/web/constants/cycle.ts b/web/constants/cycle.ts
index f93bfdf99..7a2c48634 100644
--- a/web/constants/cycle.ts
+++ b/web/constants/cycle.ts
@@ -1,4 +1,15 @@
-import { GanttChartSquare, LayoutGrid, List } from "lucide-react";
+import {
+ GanttChartSquare,
+ LayoutGrid,
+ List,
+ AlertOctagon,
+ BarChart4,
+ CircleDashed,
+ Folder,
+ Microscope,
+ Search,
+} from "lucide-react";
+
// types
import { TCycleLayout, TCycleView } from "@plane/types";
@@ -115,6 +126,43 @@ export const CYCLE_STATE_GROUPS_DETAILS = [
},
];
+export const WORKSPACE_ACTIVE_CYCLES_DETAILS = [
+ {
+ title: "10,000-feet view of all active cycles.",
+ description:
+ "Zoom out to see running cycles across all your projects at once instead of going from Cycle to Cycle in each project.",
+ icon: Folder,
+ },
+ {
+ title: "Get a snapshot of each active cycle.",
+ description:
+ "Track high-level metrics for all active cycles, see their state of progress, and get a sense of scope against deadlines.",
+ icon: CircleDashed,
+ },
+ {
+ title: "Compare burndowns.",
+ description: "Monitor how each of your teams are performing with a peek into each cycle’s burndown report.",
+ icon: BarChart4,
+ },
+ {
+ title: "Quickly see make-or-break issues. ",
+ description:
+ "Preview high-priority issues for each cycle against due dates. See all of them per cycle in one click.",
+ icon: AlertOctagon,
+ },
+ {
+ title: "Zoom into cycles that need attention. ",
+ description: "Investigate the state of any cycle that doesn’t conform to expectations in one click.",
+ icon: Search,
+ },
+ {
+ title: "Stay ahead of blockers.",
+ description:
+ "Spot challenges from one project to another and see inter-cycle dependencies that aren’t obvious from any other view.",
+ icon: Microscope,
+ },
+];
+
export const CYCLE_EMPTY_STATE_DETAILS = {
active: {
key: "active",
diff --git a/web/constants/dashboard.ts b/web/constants/dashboard.ts
index a563b83b0..5a2d1f542 100644
--- a/web/constants/dashboard.ts
+++ b/web/constants/dashboard.ts
@@ -19,6 +19,7 @@ import { Props } from "components/icons/types";
import { EUserWorkspaceRoles } from "./workspace";
// icons
import { BarChart2, Briefcase, CheckCircle, LayoutGrid } from "lucide-react";
+import { ContrastIcon } from "@plane/ui";
// gradients for issues by priority widget graph bars
export const PRIORITY_GRAPH_GRADIENTS = [
@@ -292,4 +293,12 @@ export const SIDEBAR_MENU_ITEMS: {
highlight: (pathname: string, baseUrl: string) => pathname === `${baseUrl}/workspace-views/all-issues`,
Icon: CheckCircle,
},
+ {
+ key: "active-cycles",
+ label: "Active Cycles",
+ href: `/active-cycles`,
+ access: EUserWorkspaceRoles.GUEST,
+ highlight: (pathname: string, baseUrl: string) => pathname === `${baseUrl}/active-cycles`,
+ Icon: ContrastIcon,
+ },
];
diff --git a/web/pages/[workspaceSlug]/active-cycles.tsx b/web/pages/[workspaceSlug]/active-cycles.tsx
new file mode 100644
index 000000000..c04789815
--- /dev/null
+++ b/web/pages/[workspaceSlug]/active-cycles.tsx
@@ -0,0 +1,16 @@
+import { ReactElement } from "react";
+// components
+import { WorkspaceActiveCycleHeader } from "components/headers";
+import { WorkspaceActiveCyclesUpgrade } from "components/workspace";
+// layouts
+import { AppLayout } from "layouts/app-layout";
+// types
+import { NextPageWithLayout } from "lib/types";
+
+const WorkspaceActiveCyclesPage: NextPageWithLayout = () => ;
+
+WorkspaceActiveCyclesPage.getLayout = function getLayout(page: ReactElement) {
+ return }>{page};
+};
+
+export default WorkspaceActiveCyclesPage;
diff --git a/web/public/workspace-active-cycles/cta-l-1-dark.webp b/web/public/workspace-active-cycles/cta-l-1-dark.webp
new file mode 100644
index 000000000..901f4b38d
Binary files /dev/null and b/web/public/workspace-active-cycles/cta-l-1-dark.webp differ
diff --git a/web/public/workspace-active-cycles/cta-l-1-light.webp b/web/public/workspace-active-cycles/cta-l-1-light.webp
new file mode 100644
index 000000000..7cce304c1
Binary files /dev/null and b/web/public/workspace-active-cycles/cta-l-1-light.webp differ
diff --git a/web/public/workspace-active-cycles/cta-r-1-dark.webp b/web/public/workspace-active-cycles/cta-r-1-dark.webp
new file mode 100644
index 000000000..3c3a32acf
Binary files /dev/null and b/web/public/workspace-active-cycles/cta-r-1-dark.webp differ
diff --git a/web/public/workspace-active-cycles/cta-r-1-light.webp b/web/public/workspace-active-cycles/cta-r-1-light.webp
new file mode 100644
index 000000000..4911a27b4
Binary files /dev/null and b/web/public/workspace-active-cycles/cta-r-1-light.webp differ
diff --git a/web/public/workspace-active-cycles/cta-r-2-dark.webp b/web/public/workspace-active-cycles/cta-r-2-dark.webp
new file mode 100644
index 000000000..012b6ecee
Binary files /dev/null and b/web/public/workspace-active-cycles/cta-r-2-dark.webp differ
diff --git a/web/public/workspace-active-cycles/cta-r-2-light.webp b/web/public/workspace-active-cycles/cta-r-2-light.webp
new file mode 100644
index 000000000..971d28fcb
Binary files /dev/null and b/web/public/workspace-active-cycles/cta-r-2-light.webp differ