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. +

+
+ + + l-1 + +
+
+ + r-1 + + + r-2 + +
+
+
+ {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