forked from github/plane
style: empty state for analytics, views and pages (#2967)
This commit is contained in:
parent
ef14f00777
commit
ca8e685c9c
@ -46,7 +46,7 @@ export const NewEmptyState: React.FC<Props> = ({
|
|||||||
<h3 className="font-semibold text-2xl">{title}</h3>
|
<h3 className="font-semibold text-2xl">{title}</h3>
|
||||||
{description && <p className=" text-lg">{description}</p>}
|
{description && <p className=" text-lg">{description}</p>}
|
||||||
<div className="relative w-full max-w-6xl">
|
<div className="relative w-full max-w-6xl">
|
||||||
<Image src={image} className="w-52 sm:w-60" alt={primaryButton?.text || "button image"} />
|
<Image src={image} className="w-full" alt={primaryButton?.text || "button image"} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="flex justify-center items-start relative">
|
<div className="flex justify-center items-start relative">
|
||||||
|
@ -5,12 +5,12 @@ import { Plus } from "lucide-react";
|
|||||||
// mobx store
|
// mobx store
|
||||||
import { useMobxStore } from "lib/mobx/store-provider";
|
import { useMobxStore } from "lib/mobx/store-provider";
|
||||||
// components
|
// components
|
||||||
import { EmptyState } from "components/common";
|
|
||||||
import { PagesListItem } from "./list-item";
|
import { PagesListItem } from "./list-item";
|
||||||
|
import { NewEmptyState } from "components/common/new-empty-state";
|
||||||
// ui
|
// ui
|
||||||
import { Loader } from "@plane/ui";
|
import { Loader } from "@plane/ui";
|
||||||
// images
|
// images
|
||||||
import emptyPage from "public/empty-state/page.svg";
|
import emptyPage from "public/empty-state/empty_page.webp";
|
||||||
// types
|
// types
|
||||||
import { IPage } from "types";
|
import { IPage } from "types";
|
||||||
|
|
||||||
@ -41,13 +41,19 @@ export const PagesListView: FC<IPagesListView> = observer(({ pages }) => {
|
|||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
) : (
|
) : (
|
||||||
<EmptyState
|
<NewEmptyState
|
||||||
title="Have your thoughts in place"
|
title="Write a note, a doc, or a full knowledge base. Get Galileo, Plane’s AI assistant, to help you get started."
|
||||||
description="You can think of Pages as an AI-powered notepad."
|
description="Pages are thoughtspotting space in Plane. Take down meeting notes, format them easily, embed issues, lay them out using a library of components, and keep them all in your project’s context. To make short work of any doc, invoke Galileo, Plane’s AI, with a shortcut or the click of a button."
|
||||||
image={emptyPage}
|
image={emptyPage}
|
||||||
|
comicBox={{
|
||||||
|
title: "A page can be a doc or a doc of docs.",
|
||||||
|
description:
|
||||||
|
"We wrote Parth and Meera’s love story. You could write your project’s mission, goals, and eventual vision.",
|
||||||
|
direction: "right",
|
||||||
|
}}
|
||||||
primaryButton={{
|
primaryButton={{
|
||||||
icon: <Plus className="h-4 w-4" />,
|
icon: <Plus className="h-4 w-4" />,
|
||||||
text: "New Page",
|
text: "Create your first page",
|
||||||
onClick: () => commandPaletteStore.toggleCreatePageModal(true),
|
onClick: () => commandPaletteStore.toggleCreatePageModal(true),
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
@ -5,11 +5,11 @@ import { Plus } from "lucide-react";
|
|||||||
import { useMobxStore } from "lib/mobx/store-provider";
|
import { useMobxStore } from "lib/mobx/store-provider";
|
||||||
// components
|
// components
|
||||||
import { PagesListView } from "components/pages/pages-list";
|
import { PagesListView } from "components/pages/pages-list";
|
||||||
import { EmptyState } from "components/common";
|
import { NewEmptyState } from "components/common/new-empty-state";
|
||||||
// ui
|
// ui
|
||||||
import { Loader } from "@plane/ui";
|
import { Loader } from "@plane/ui";
|
||||||
// assets
|
// assets
|
||||||
import emptyPage from "public/empty-state/page.svg";
|
import emptyPage from "public/empty-state/empty_page.webp";
|
||||||
// helpers
|
// helpers
|
||||||
import { replaceUnderscoreIfSnakeCase } from "helpers/string.helper";
|
import { replaceUnderscoreIfSnakeCase } from "helpers/string.helper";
|
||||||
|
|
||||||
@ -51,13 +51,19 @@ export const RecentPagesList: FC = observer(() => {
|
|||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<EmptyState
|
<NewEmptyState
|
||||||
title="Have your thoughts in place"
|
title="Write a note, a doc, or a full knowledge base. Get Galileo, Plane’s AI assistant, to help you get started."
|
||||||
description="You can think of Pages as an AI-powered notepad."
|
description="Pages are thoughtspotting space in Plane. Take down meeting notes, format them easily, embed issues, lay them out using a library of components, and keep them all in your project’s context. To make short work of any doc, invoke Galileo, Plane’s AI, with a shortcut or the click of a button."
|
||||||
image={emptyPage}
|
image={emptyPage}
|
||||||
|
comicBox={{
|
||||||
|
title: "A page can be a doc or a doc of docs.",
|
||||||
|
description:
|
||||||
|
"We wrote Parth and Meera’s love story. You could write your project’s mission, goals, and eventual vision.",
|
||||||
|
direction: "right",
|
||||||
|
}}
|
||||||
primaryButton={{
|
primaryButton={{
|
||||||
icon: <Plus className="h-4 w-4" />,
|
icon: <Plus className="h-4 w-4" />,
|
||||||
text: "New Page",
|
text: "Create your first page",
|
||||||
onClick: () => commandPaletteStore.toggleCreatePageModal(true),
|
onClick: () => commandPaletteStore.toggleCreatePageModal(true),
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
@ -6,11 +6,11 @@ import { observer } from "mobx-react-lite";
|
|||||||
import { useMobxStore } from "lib/mobx/store-provider";
|
import { useMobxStore } from "lib/mobx/store-provider";
|
||||||
// components
|
// components
|
||||||
import { ProjectViewListItem } from "components/views";
|
import { ProjectViewListItem } from "components/views";
|
||||||
import { EmptyState } from "components/common";
|
import { NewEmptyState } from "components/common/new-empty-state";
|
||||||
// ui
|
// ui
|
||||||
import { Input, Loader } from "@plane/ui";
|
import { Input, Loader } from "@plane/ui";
|
||||||
// assets
|
// assets
|
||||||
import emptyView from "public/empty-state/view.svg";
|
import emptyView from "public/empty-state/empty_view.webp";
|
||||||
// icons
|
// icons
|
||||||
import { Plus, Search } from "lucide-react";
|
import { Plus, Search } from "lucide-react";
|
||||||
|
|
||||||
@ -59,13 +59,18 @@ export const ProjectViewsList = observer(() => {
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<EmptyState
|
<NewEmptyState
|
||||||
title="Get focused with views"
|
title="Save filtered views for your project. Create as many as you need."
|
||||||
description="Views aid in saving your issues by applying various filters and grouping options."
|
description="Views are a set of saved filters that you use frequently or want easy access to. All your colleagues in a project can see everyone’s views and choose whichever suits their needs best."
|
||||||
image={emptyView}
|
image={emptyView}
|
||||||
|
comicBox={{
|
||||||
|
title: "Views work atop Issue properties.",
|
||||||
|
description: "You can create a view from here with as many properties as filters as you see fit.",
|
||||||
|
direction: "right",
|
||||||
|
}}
|
||||||
primaryButton={{
|
primaryButton={{
|
||||||
icon: <Plus size={14} strokeWidth={2} />,
|
icon: <Plus size={14} strokeWidth={2} />,
|
||||||
text: "New View",
|
text: "Build your first view",
|
||||||
onClick: () => commandPaletteStore.toggleCreateViewModal(true),
|
onClick: () => commandPaletteStore.toggleCreateViewModal(true),
|
||||||
}}
|
}}
|
||||||
/>
|
/>
|
||||||
|
@ -8,11 +8,11 @@ import { AppLayout } from "layouts/app-layout";
|
|||||||
// components
|
// components
|
||||||
import { CustomAnalytics, ScopeAndDemand } from "components/analytics";
|
import { CustomAnalytics, ScopeAndDemand } from "components/analytics";
|
||||||
import { WorkspaceAnalyticsHeader } from "components/headers";
|
import { WorkspaceAnalyticsHeader } from "components/headers";
|
||||||
import { EmptyState } from "components/common";
|
import { NewEmptyState } from "components/common/new-empty-state";
|
||||||
// icons
|
// icons
|
||||||
import { Plus } from "lucide-react";
|
import { Plus } from "lucide-react";
|
||||||
// assets
|
// assets
|
||||||
import emptyAnalytics from "public/empty-state/analytics.svg";
|
import emptyAnalytics from "public/empty-state/empty_analytics.webp";
|
||||||
// constants
|
// constants
|
||||||
import { ANALYTICS_TABS } from "constants/analytics";
|
import { ANALYTICS_TABS } from "constants/analytics";
|
||||||
// type
|
// type
|
||||||
@ -58,13 +58,20 @@ const AnalyticsPage: NextPageWithLayout = observer(() => {
|
|||||||
</div>
|
</div>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<EmptyState
|
<NewEmptyState
|
||||||
title="You can see your all projects' analytics here"
|
title="Track progress, workloads, and allocations. Spot trends, remove blockers, and move work faster."
|
||||||
description="Let's create your first project and analyze the stats with various graphs."
|
description="See scope versus demand, estimates, and scope creep. Get performance by team members and teams, and make sure your project runs on time."
|
||||||
image={emptyAnalytics}
|
image={emptyAnalytics}
|
||||||
|
comicBox={{
|
||||||
|
title: "Analytics works best with Cycles + Modules",
|
||||||
|
description:
|
||||||
|
"First, timebox your issues into Cycles and, if you can, group issues that span more than a cycle into Modules. Check out both on the left nav.",
|
||||||
|
direction: "right",
|
||||||
|
extraPadding: true,
|
||||||
|
}}
|
||||||
primaryButton={{
|
primaryButton={{
|
||||||
icon: <Plus className="h-4 w-4" />,
|
icon: <Plus className="h-4 w-4" />,
|
||||||
text: "New Project",
|
text: "Create Cycles and Modules first",
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
setTrackElement("ANALYTICS_EMPTY_STATE");
|
setTrackElement("ANALYTICS_EMPTY_STATE");
|
||||||
toggleCreateProjectModal(true);
|
toggleCreateProjectModal(true);
|
||||||
|
BIN
web/public/empty-state/empty_analytics.webp
Normal file
BIN
web/public/empty-state/empty_analytics.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 12 KiB |
Binary file not shown.
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 18 KiB |
BIN
web/public/empty-state/empty_page.webp
Normal file
BIN
web/public/empty-state/empty_page.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 46 KiB |
BIN
web/public/empty-state/empty_view.webp
Normal file
BIN
web/public/empty-state/empty_view.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 30 KiB |
Loading…
Reference in New Issue
Block a user