forked from github/plane
[WEB-545] chore: completed cycle empty state (#3931)
* chore: completed cycle issue transfer empty state added * chore: cycle empty state variable updated * chore: empty state config file updated
This commit is contained in:
parent
9c29ad1a28
commit
48c9b78397
@ -9,12 +9,12 @@ import { useUser } from "hooks/store";
|
|||||||
import { Button, TButtonVariant } from "@plane/ui";
|
import { Button, TButtonVariant } from "@plane/ui";
|
||||||
import { ComicBoxButton } from "./comic-box-button";
|
import { ComicBoxButton } from "./comic-box-button";
|
||||||
// constant
|
// constant
|
||||||
import { EMPTY_STATE_DETAILS, EmptyStateKeys } from "constants/empty-state";
|
import { EMPTY_STATE_DETAILS, EmptyStateType } from "constants/empty-state";
|
||||||
// helpers
|
// helpers
|
||||||
import { cn } from "helpers/common.helper";
|
import { cn } from "helpers/common.helper";
|
||||||
|
|
||||||
export type EmptyStateProps = {
|
export type EmptyStateProps = {
|
||||||
type: EmptyStateKeys;
|
type: EmptyStateType;
|
||||||
size?: "sm" | "md" | "lg";
|
size?: "sm" | "md" | "lg";
|
||||||
layout?: "widget-simple" | "screen-detailed" | "screen-simple";
|
layout?: "widget-simple" | "screen-detailed" | "screen-simple";
|
||||||
additionalPath?: string;
|
additionalPath?: string;
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { observer } from "mobx-react-lite";
|
import { observer } from "mobx-react-lite";
|
||||||
|
import isEmpty from "lodash/isEmpty";
|
||||||
// hooks
|
// hooks
|
||||||
import { useApplication, useEventTracker, useIssues } from "hooks/store";
|
import { useApplication, useCycle, useEventTracker, useIssues } from "hooks/store";
|
||||||
// ui
|
// ui
|
||||||
import { TOAST_TYPE, setToast } from "@plane/ui";
|
import { TOAST_TYPE, setToast } from "@plane/ui";
|
||||||
import { ExistingIssuesListModal } from "components/core";
|
import { ExistingIssuesListModal } from "components/core";
|
||||||
@ -27,12 +28,15 @@ export const CycleEmptyState: React.FC<Props> = observer((props) => {
|
|||||||
// states
|
// states
|
||||||
const [cycleIssuesListModal, setCycleIssuesListModal] = useState(false);
|
const [cycleIssuesListModal, setCycleIssuesListModal] = useState(false);
|
||||||
// store hooks
|
// store hooks
|
||||||
|
const { getCycleById } = useCycle();
|
||||||
const { issues } = useIssues(EIssuesStoreType.CYCLE);
|
const { issues } = useIssues(EIssuesStoreType.CYCLE);
|
||||||
const {
|
const {
|
||||||
commandPalette: { toggleCreateIssueModal },
|
commandPalette: { toggleCreateIssueModal },
|
||||||
} = useApplication();
|
} = useApplication();
|
||||||
const { setTrackElement } = useEventTracker();
|
const { setTrackElement } = useEventTracker();
|
||||||
|
|
||||||
|
const cycleDetails = cycleId ? getCycleById(cycleId.toString()) : undefined;
|
||||||
|
|
||||||
const handleAddIssuesToCycle = async (data: ISearchIssueResponse[]) => {
|
const handleAddIssuesToCycle = async (data: ISearchIssueResponse[]) => {
|
||||||
if (!workspaceSlug || !projectId || !cycleId) return;
|
if (!workspaceSlug || !projectId || !cycleId) return;
|
||||||
|
|
||||||
@ -56,8 +60,14 @@ export const CycleEmptyState: React.FC<Props> = observer((props) => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
const emptyStateType = isEmptyFilters ? EmptyStateType.PROJECT_EMPTY_FILTER : EmptyStateType.PROJECT_CYCLE_NO_ISSUES;
|
const isCompletedCycleSnapshotAvailable = !isEmpty(cycleDetails?.progress_snapshot ?? {});
|
||||||
const additionalPath = activeLayout ?? "list";
|
|
||||||
|
const emptyStateType = isCompletedCycleSnapshotAvailable
|
||||||
|
? EmptyStateType.PROJECT_CYCLE_COMPLETED_NO_ISSUES
|
||||||
|
: isEmptyFilters
|
||||||
|
? EmptyStateType.PROJECT_EMPTY_FILTER
|
||||||
|
: EmptyStateType.PROJECT_CYCLE_NO_ISSUES;
|
||||||
|
const additionalPath = isCompletedCycleSnapshotAvailable ? undefined : activeLayout ?? "list";
|
||||||
const emptyStateSize = isEmptyFilters ? "lg" : "sm";
|
const emptyStateSize = isEmptyFilters ? "lg" : "sm";
|
||||||
|
|
||||||
return (
|
return (
|
||||||
@ -76,14 +86,18 @@ export const CycleEmptyState: React.FC<Props> = observer((props) => {
|
|||||||
additionalPath={additionalPath}
|
additionalPath={additionalPath}
|
||||||
size={emptyStateSize}
|
size={emptyStateSize}
|
||||||
primaryButtonOnClick={
|
primaryButtonOnClick={
|
||||||
isEmptyFilters
|
!isCompletedCycleSnapshotAvailable && !isEmptyFilters
|
||||||
? undefined
|
? () => {
|
||||||
: () => {
|
|
||||||
setTrackElement("Cycle issue empty state");
|
setTrackElement("Cycle issue empty state");
|
||||||
toggleCreateIssueModal(true, EIssuesStoreType.CYCLE);
|
toggleCreateIssueModal(true, EIssuesStoreType.CYCLE);
|
||||||
}
|
}
|
||||||
|
: undefined
|
||||||
|
}
|
||||||
|
secondaryButtonOnClick={
|
||||||
|
!isCompletedCycleSnapshotAvailable && isEmptyFilters
|
||||||
|
? handleClearAllFilters
|
||||||
|
: () => setCycleIssuesListModal(true)
|
||||||
}
|
}
|
||||||
secondaryButtonOnClick={isEmptyFilters ? handleClearAllFilters : () => setCycleIssuesListModal(true)}
|
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
@ -2,7 +2,7 @@ import { EUserProjectRoles } from "./project";
|
|||||||
import { EUserWorkspaceRoles } from "./workspace";
|
import { EUserWorkspaceRoles } from "./workspace";
|
||||||
|
|
||||||
export interface EmptyStateDetails {
|
export interface EmptyStateDetails {
|
||||||
key: string;
|
key: EmptyStateType;
|
||||||
title?: string;
|
title?: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
path?: string;
|
path?: string;
|
||||||
@ -26,8 +26,6 @@ export interface EmptyStateDetails {
|
|||||||
access?: EUserWorkspaceRoles | EUserProjectRoles;
|
access?: EUserWorkspaceRoles | EUserProjectRoles;
|
||||||
}
|
}
|
||||||
|
|
||||||
export type EmptyStateKeys = keyof typeof emptyStateDetails;
|
|
||||||
|
|
||||||
export enum EmptyStateType {
|
export enum EmptyStateType {
|
||||||
WORKSPACE_DASHBOARD = "workspace-dashboard",
|
WORKSPACE_DASHBOARD = "workspace-dashboard",
|
||||||
WORKSPACE_ANALYTICS = "workspace-analytics",
|
WORKSPACE_ANALYTICS = "workspace-analytics",
|
||||||
@ -52,6 +50,7 @@ export enum EmptyStateType {
|
|||||||
PROJECT_CYCLE_NO_ISSUES = "project-cycle-no-issues",
|
PROJECT_CYCLE_NO_ISSUES = "project-cycle-no-issues",
|
||||||
PROJECT_CYCLE_ACTIVE = "project-cycle-active",
|
PROJECT_CYCLE_ACTIVE = "project-cycle-active",
|
||||||
PROJECT_CYCLE_ALL = "project-cycle-all",
|
PROJECT_CYCLE_ALL = "project-cycle-all",
|
||||||
|
PROJECT_CYCLE_COMPLETED_NO_ISSUES = "project-cycle-completed-no-issues",
|
||||||
PROJECT_EMPTY_FILTER = "project-empty-filter",
|
PROJECT_EMPTY_FILTER = "project-empty-filter",
|
||||||
PROJECT_ARCHIVED_EMPTY_FILTER = "project-archived-empty-filter",
|
PROJECT_ARCHIVED_EMPTY_FILTER = "project-archived-empty-filter",
|
||||||
PROJECT_DRAFT_EMPTY_FILTER = "project-draft-empty-filter",
|
PROJECT_DRAFT_EMPTY_FILTER = "project-draft-empty-filter",
|
||||||
@ -67,7 +66,7 @@ export enum EmptyStateType {
|
|||||||
PROJECT_VIEW = "project-view",
|
PROJECT_VIEW = "project-view",
|
||||||
PROJECT_PAGE = "project-page",
|
PROJECT_PAGE = "project-page",
|
||||||
PROJECT_PAGE_ALL = "project-page-all",
|
PROJECT_PAGE_ALL = "project-page-all",
|
||||||
PROJECT_PAGE_FAVORITE = "project-page-favorites",
|
PROJECT_PAGE_FAVORITES = "project-page-favorites",
|
||||||
PROJECT_PAGE_PRIVATE = "project-page-private",
|
PROJECT_PAGE_PRIVATE = "project-page-private",
|
||||||
PROJECT_PAGE_SHARED = "project-page-shared",
|
PROJECT_PAGE_SHARED = "project-page-shared",
|
||||||
PROJECT_PAGE_ARCHIVED = "project-page-archived",
|
PROJECT_PAGE_ARCHIVED = "project-page-archived",
|
||||||
@ -76,8 +75,8 @@ export enum EmptyStateType {
|
|||||||
|
|
||||||
const emptyStateDetails = {
|
const emptyStateDetails = {
|
||||||
// workspace
|
// workspace
|
||||||
"workspace-dashboard": {
|
[EmptyStateType.WORKSPACE_DASHBOARD]: {
|
||||||
key: "workspace-dashboard",
|
key: EmptyStateType.WORKSPACE_DASHBOARD,
|
||||||
title: "Overview of your projects, activity, and metrics",
|
title: "Overview of your projects, activity, and metrics",
|
||||||
description:
|
description:
|
||||||
" Welcome to Plane, we are excited to have you here. Create your first project and track your issues, and this page will transform into a space that helps you progress. Admins will also see items which help their team progress.",
|
" Welcome to Plane, we are excited to have you here. Create your first project and track your issues, and this page will transform into a space that helps you progress. Admins will also see items which help their team progress.",
|
||||||
@ -94,8 +93,8 @@ const emptyStateDetails = {
|
|||||||
accessType: "workspace",
|
accessType: "workspace",
|
||||||
access: EUserWorkspaceRoles.MEMBER,
|
access: EUserWorkspaceRoles.MEMBER,
|
||||||
},
|
},
|
||||||
"workspace-analytics": {
|
[EmptyStateType.WORKSPACE_ANALYTICS]: {
|
||||||
key: "workspace-analytics",
|
key: EmptyStateType.WORKSPACE_ANALYTICS,
|
||||||
title: "Track progress, workloads, and allocations. Spot trends, remove blockers, and move work faster",
|
title: "Track progress, workloads, and allocations. Spot trends, remove blockers, and move work faster",
|
||||||
description:
|
description:
|
||||||
"See scope versus demand, estimates, and scope creep. Get performance by team members and teams, and make sure your project runs on time.",
|
"See scope versus demand, estimates, and scope creep. Get performance by team members and teams, and make sure your project runs on time.",
|
||||||
@ -111,8 +110,8 @@ const emptyStateDetails = {
|
|||||||
accessType: "workspace",
|
accessType: "workspace",
|
||||||
access: EUserWorkspaceRoles.MEMBER,
|
access: EUserWorkspaceRoles.MEMBER,
|
||||||
},
|
},
|
||||||
"workspace-projects": {
|
[EmptyStateType.WORKSPACE_PROJECTS]: {
|
||||||
key: "workspace-projects",
|
key: EmptyStateType.WORKSPACE_PROJECTS,
|
||||||
title: "Start a Project",
|
title: "Start a Project",
|
||||||
description:
|
description:
|
||||||
"Think of each project as the parent for goal-oriented work. Projects are where Jobs, Cycles, and Modules live and, along with your colleagues, help you achieve that goal.",
|
"Think of each project as the parent for goal-oriented work. Projects are where Jobs, Cycles, and Modules live and, along with your colleagues, help you achieve that goal.",
|
||||||
@ -128,8 +127,8 @@ const emptyStateDetails = {
|
|||||||
access: EUserWorkspaceRoles.MEMBER,
|
access: EUserWorkspaceRoles.MEMBER,
|
||||||
},
|
},
|
||||||
// all-issues
|
// all-issues
|
||||||
"workspace-all-issues": {
|
[EmptyStateType.WORKSPACE_ALL_ISSUES]: {
|
||||||
key: "workspace-all-issues",
|
key: EmptyStateType.WORKSPACE_ALL_ISSUES,
|
||||||
title: "No issues in the project",
|
title: "No issues in the project",
|
||||||
description: "First project done! Now, slice your work into trackable pieces with issues. Let's go!",
|
description: "First project done! Now, slice your work into trackable pieces with issues. Let's go!",
|
||||||
path: "/empty-state/all-issues/all-issues",
|
path: "/empty-state/all-issues/all-issues",
|
||||||
@ -139,8 +138,8 @@ const emptyStateDetails = {
|
|||||||
accessType: "workspace",
|
accessType: "workspace",
|
||||||
access: EUserWorkspaceRoles.MEMBER,
|
access: EUserWorkspaceRoles.MEMBER,
|
||||||
},
|
},
|
||||||
"workspace-assigned": {
|
[EmptyStateType.WORKSPACE_ASSIGNED]: {
|
||||||
key: "workspace-assigned",
|
key: EmptyStateType.WORKSPACE_ASSIGNED,
|
||||||
title: "No issues yet",
|
title: "No issues yet",
|
||||||
description: "Issues assigned to you can be tracked from here.",
|
description: "Issues assigned to you can be tracked from here.",
|
||||||
path: "/empty-state/all-issues/assigned",
|
path: "/empty-state/all-issues/assigned",
|
||||||
@ -150,8 +149,8 @@ const emptyStateDetails = {
|
|||||||
accessType: "workspace",
|
accessType: "workspace",
|
||||||
access: EUserWorkspaceRoles.MEMBER,
|
access: EUserWorkspaceRoles.MEMBER,
|
||||||
},
|
},
|
||||||
"workspace-created": {
|
[EmptyStateType.WORKSPACE_CREATED]: {
|
||||||
key: "workspace-created",
|
key: EmptyStateType.WORKSPACE_CREATED,
|
||||||
title: "No issues yet",
|
title: "No issues yet",
|
||||||
description: "All issues created by you come here, track them here directly.",
|
description: "All issues created by you come here, track them here directly.",
|
||||||
path: "/empty-state/all-issues/created",
|
path: "/empty-state/all-issues/created",
|
||||||
@ -161,20 +160,20 @@ const emptyStateDetails = {
|
|||||||
accessType: "workspace",
|
accessType: "workspace",
|
||||||
access: EUserWorkspaceRoles.MEMBER,
|
access: EUserWorkspaceRoles.MEMBER,
|
||||||
},
|
},
|
||||||
"workspace-subscribed": {
|
[EmptyStateType.WORKSPACE_SUBSCRIBED]: {
|
||||||
key: "workspace-subscribed",
|
key: EmptyStateType.WORKSPACE_SUBSCRIBED,
|
||||||
title: "No issues yet",
|
title: "No issues yet",
|
||||||
description: "Subscribe to issues you are interested in, track all of them here.",
|
description: "Subscribe to issues you are interested in, track all of them here.",
|
||||||
path: "/empty-state/all-issues/subscribed",
|
path: "/empty-state/all-issues/subscribed",
|
||||||
},
|
},
|
||||||
"workspace-custom-view": {
|
[EmptyStateType.WORKSPACE_CUSTOM_VIEW]: {
|
||||||
key: "workspace-custom-view",
|
key: EmptyStateType.WORKSPACE_CUSTOM_VIEW,
|
||||||
title: "No issues yet",
|
title: "No issues yet",
|
||||||
description: "Issues that applies to the filters, track all of them here.",
|
description: "Issues that applies to the filters, track all of them here.",
|
||||||
path: "/empty-state/all-issues/custom-view",
|
path: "/empty-state/all-issues/custom-view",
|
||||||
},
|
},
|
||||||
"workspace-no-projects": {
|
[EmptyStateType.WORKSPACE_NO_PROJECTS]: {
|
||||||
key: "workspace-no-projects",
|
key: EmptyStateType.WORKSPACE_NO_PROJECTS,
|
||||||
title: "No project",
|
title: "No project",
|
||||||
description: "To create issues or manage your work, you need to create a project or be a part of one.",
|
description: "To create issues or manage your work, you need to create a project or be a part of one.",
|
||||||
path: "/empty-state/onboarding/projects",
|
path: "/empty-state/onboarding/projects",
|
||||||
@ -189,72 +188,72 @@ const emptyStateDetails = {
|
|||||||
access: EUserWorkspaceRoles.MEMBER,
|
access: EUserWorkspaceRoles.MEMBER,
|
||||||
},
|
},
|
||||||
// workspace settings
|
// workspace settings
|
||||||
"workspace-settings-api-tokens": {
|
[EmptyStateType.WORKSPACE_SETTINGS_API_TOKENS]: {
|
||||||
key: "workspace-settings-api-tokens",
|
key: EmptyStateType.WORKSPACE_SETTINGS_API_TOKENS,
|
||||||
title: "No API tokens created",
|
title: "No API tokens created",
|
||||||
description:
|
description:
|
||||||
"Plane APIs can be used to integrate your data in Plane with any external system. Create a token to get started.",
|
"Plane APIs can be used to integrate your data in Plane with any external system. Create a token to get started.",
|
||||||
path: "/empty-state/workspace-settings/api-tokens",
|
path: "/empty-state/workspace-settings/api-tokens",
|
||||||
},
|
},
|
||||||
"workspace-settings-webhooks": {
|
[EmptyStateType.WORKSPACE_SETTINGS_WEBHOOKS]: {
|
||||||
key: "workspace-settings-webhooks",
|
key: EmptyStateType.WORKSPACE_SETTINGS_WEBHOOKS,
|
||||||
title: "No webhooks added",
|
title: "No webhooks added",
|
||||||
description: "Create webhooks to receive real-time updates and automate actions.",
|
description: "Create webhooks to receive real-time updates and automate actions.",
|
||||||
path: "/empty-state/workspace-settings/webhooks",
|
path: "/empty-state/workspace-settings/webhooks",
|
||||||
},
|
},
|
||||||
"workspace-settings-export": {
|
[EmptyStateType.WORKSPACE_SETTINGS_EXPORT]: {
|
||||||
key: "workspace-settings-export",
|
key: EmptyStateType.WORKSPACE_SETTINGS_EXPORT,
|
||||||
title: "No previous exports yet",
|
title: "No previous exports yet",
|
||||||
description: "Anytime you export, you will also have a copy here for reference.",
|
description: "Anytime you export, you will also have a copy here for reference.",
|
||||||
path: "/empty-state/workspace-settings/exports",
|
path: "/empty-state/workspace-settings/exports",
|
||||||
},
|
},
|
||||||
"workspace-settings-import": {
|
[EmptyStateType.WORKSPACE_SETTINGS_IMPORT]: {
|
||||||
key: "workspace-settings-import",
|
key: EmptyStateType.WORKSPACE_SETTINGS_IMPORT,
|
||||||
title: "No previous imports yet",
|
title: "No previous imports yet",
|
||||||
description: "Find all your previous imports here and download them.",
|
description: "Find all your previous imports here and download them.",
|
||||||
path: "/empty-state/workspace-settings/imports",
|
path: "/empty-state/workspace-settings/imports",
|
||||||
},
|
},
|
||||||
// profile
|
// profile
|
||||||
"profile-assigned": {
|
[EmptyStateType.PROFILE_ASSIGNED]: {
|
||||||
key: "profile-assigned",
|
key: EmptyStateType.PROFILE_ASSIGNED,
|
||||||
title: "No issues are assigned to you",
|
title: "No issues are assigned to you",
|
||||||
description: "Issues assigned to you can be tracked from here.",
|
description: "Issues assigned to you can be tracked from here.",
|
||||||
path: "/empty-state/profile/assigned",
|
path: "/empty-state/profile/assigned",
|
||||||
},
|
},
|
||||||
"profile-created": {
|
[EmptyStateType.PROFILE_CREATED]: {
|
||||||
key: "profile-created",
|
key: EmptyStateType.PROFILE_CREATED,
|
||||||
title: "No issues yet",
|
title: "No issues yet",
|
||||||
description: "All issues created by you come here, track them here directly.",
|
description: "All issues created by you come here, track them here directly.",
|
||||||
path: "/empty-state/profile/created",
|
path: "/empty-state/profile/created",
|
||||||
},
|
},
|
||||||
"profile-subscribed": {
|
[EmptyStateType.PROFILE_SUBSCRIBED]: {
|
||||||
key: "profile-subscribed",
|
key: EmptyStateType.PROFILE_SUBSCRIBED,
|
||||||
title: "No issues yet",
|
title: "No issues yet",
|
||||||
description: "Subscribe to issues you are interested in, track all of them here.",
|
description: "Subscribe to issues you are interested in, track all of them here.",
|
||||||
path: "/empty-state/profile/subscribed",
|
path: "/empty-state/profile/subscribed",
|
||||||
},
|
},
|
||||||
// project settings
|
// project settings
|
||||||
"project-settings-labels": {
|
[EmptyStateType.PROJECT_SETTINGS_LABELS]: {
|
||||||
key: "project-settings-labels",
|
key: EmptyStateType.PROJECT_SETTINGS_LABELS,
|
||||||
title: "No labels yet",
|
title: "No labels yet",
|
||||||
description: "Create labels to help organize and filter issues in you project.",
|
description: "Create labels to help organize and filter issues in you project.",
|
||||||
path: "/empty-state/project-settings/labels",
|
path: "/empty-state/project-settings/labels",
|
||||||
},
|
},
|
||||||
"project-settings-integrations": {
|
[EmptyStateType.PROJECT_SETTINGS_INTEGRATIONS]: {
|
||||||
key: "project-settings-integrations",
|
key: EmptyStateType.PROJECT_SETTINGS_INTEGRATIONS,
|
||||||
title: "No integrations configured",
|
title: "No integrations configured",
|
||||||
description: "Configure GitHub and other integrations to sync your project issues.",
|
description: "Configure GitHub and other integrations to sync your project issues.",
|
||||||
path: "/empty-state/project-settings/integrations",
|
path: "/empty-state/project-settings/integrations",
|
||||||
},
|
},
|
||||||
"project-settings-estimate": {
|
[EmptyStateType.PROJECT_SETTINGS_ESTIMATE]: {
|
||||||
key: "project-settings-estimate",
|
key: EmptyStateType.PROJECT_SETTINGS_ESTIMATE,
|
||||||
title: "No estimates added",
|
title: "No estimates added",
|
||||||
description: "Create a set of estimates to communicate the amount of work per issue.",
|
description: "Create a set of estimates to communicate the amount of work per issue.",
|
||||||
path: "/empty-state/project-settings/estimates",
|
path: "/empty-state/project-settings/estimates",
|
||||||
},
|
},
|
||||||
// project cycles
|
// project cycles
|
||||||
"project-cycles": {
|
[EmptyStateType.PROJECT_CYCLES]: {
|
||||||
key: "project-cycles",
|
key: EmptyStateType.PROJECT_CYCLES,
|
||||||
title: "Group and timebox your work in Cycles.",
|
title: "Group and timebox your work in Cycles.",
|
||||||
description:
|
description:
|
||||||
"Break work down by timeboxed chunks, work backwards from your project deadline to set dates, and make tangible progress as a team.",
|
"Break work down by timeboxed chunks, work backwards from your project deadline to set dates, and make tangible progress as a team.",
|
||||||
@ -270,8 +269,8 @@ const emptyStateDetails = {
|
|||||||
accessType: "workspace",
|
accessType: "workspace",
|
||||||
access: EUserWorkspaceRoles.MEMBER,
|
access: EUserWorkspaceRoles.MEMBER,
|
||||||
},
|
},
|
||||||
"project-cycle-no-issues": {
|
[EmptyStateType.PROJECT_CYCLE_NO_ISSUES]: {
|
||||||
key: "project-cycle-no-issues",
|
key: EmptyStateType.PROJECT_CYCLE_NO_ISSUES,
|
||||||
title: "No issues added to the cycle",
|
title: "No issues added to the cycle",
|
||||||
description: "Add or create issues you wish to timebox and deliver within this cycle",
|
description: "Add or create issues you wish to timebox and deliver within this cycle",
|
||||||
path: "/empty-state/cycle-issues/",
|
path: "/empty-state/cycle-issues/",
|
||||||
@ -284,23 +283,30 @@ const emptyStateDetails = {
|
|||||||
accessType: "project",
|
accessType: "project",
|
||||||
access: EUserProjectRoles.MEMBER,
|
access: EUserProjectRoles.MEMBER,
|
||||||
},
|
},
|
||||||
"project-cycle-active": {
|
[EmptyStateType.PROJECT_CYCLE_ACTIVE]: {
|
||||||
key: "project-cycle-active",
|
key: EmptyStateType.PROJECT_CYCLE_ACTIVE,
|
||||||
title: "No active cycle",
|
title: "No active cycle",
|
||||||
description:
|
description:
|
||||||
"An active cycle includes any period that encompasses today's date within its range. Find the progress and details of the active cycle here.",
|
"An active cycle includes any period that encompasses today's date within its range. Find the progress and details of the active cycle here.",
|
||||||
path: "/empty-state/cycle/active",
|
path: "/empty-state/cycle/active",
|
||||||
},
|
},
|
||||||
"project-cycle-all": {
|
[EmptyStateType.PROJECT_CYCLE_COMPLETED_NO_ISSUES]: {
|
||||||
key: "project-cycle-all",
|
key: EmptyStateType.PROJECT_CYCLE_COMPLETED_NO_ISSUES,
|
||||||
|
title: "No issues in the cycle",
|
||||||
|
description:
|
||||||
|
"No issues in the cycle. Issues are either transferred or hidden. To see hidden issues if any, update your display properties accordingly.",
|
||||||
|
path: "/empty-state/cycle/completed-no-issues",
|
||||||
|
},
|
||||||
|
[EmptyStateType.PROJECT_CYCLE_ALL]: {
|
||||||
|
key: EmptyStateType.PROJECT_CYCLE_ALL,
|
||||||
title: "No cycles",
|
title: "No cycles",
|
||||||
description:
|
description:
|
||||||
"An active cycle includes any period that encompasses today's date within its range. Find the progress and details of the active cycle here.",
|
"An active cycle includes any period that encompasses today's date within its range. Find the progress and details of the active cycle here.",
|
||||||
path: "/empty-state/cycle/active",
|
path: "/empty-state/cycle/active",
|
||||||
},
|
},
|
||||||
// empty filters
|
// empty filters
|
||||||
"project-empty-filter": {
|
[EmptyStateType.PROJECT_EMPTY_FILTER]: {
|
||||||
key: "project-empty-filter",
|
key: EmptyStateType.PROJECT_EMPTY_FILTER,
|
||||||
title: "No issues found matching the filters applied",
|
title: "No issues found matching the filters applied",
|
||||||
path: "/empty-state/empty-filters/",
|
path: "/empty-state/empty-filters/",
|
||||||
secondaryButton: {
|
secondaryButton: {
|
||||||
@ -309,8 +315,8 @@ const emptyStateDetails = {
|
|||||||
accessType: "project",
|
accessType: "project",
|
||||||
access: EUserProjectRoles.MEMBER,
|
access: EUserProjectRoles.MEMBER,
|
||||||
},
|
},
|
||||||
"project-archived-empty-filter": {
|
[EmptyStateType.PROJECT_ARCHIVED_EMPTY_FILTER]: {
|
||||||
key: "project-archived-empty-filter",
|
key: EmptyStateType.PROJECT_ARCHIVED_EMPTY_FILTER,
|
||||||
title: "No issues found matching the filters applied",
|
title: "No issues found matching the filters applied",
|
||||||
path: "/empty-state/empty-filters/",
|
path: "/empty-state/empty-filters/",
|
||||||
secondaryButton: {
|
secondaryButton: {
|
||||||
@ -319,8 +325,8 @@ const emptyStateDetails = {
|
|||||||
accessType: "project",
|
accessType: "project",
|
||||||
access: EUserProjectRoles.MEMBER,
|
access: EUserProjectRoles.MEMBER,
|
||||||
},
|
},
|
||||||
"project-draft-empty-filter": {
|
[EmptyStateType.PROJECT_DRAFT_EMPTY_FILTER]: {
|
||||||
key: "project-draft-empty-filter",
|
key: EmptyStateType.PROJECT_DRAFT_EMPTY_FILTER,
|
||||||
title: "No issues found matching the filters applied",
|
title: "No issues found matching the filters applied",
|
||||||
path: "/empty-state/empty-filters/",
|
path: "/empty-state/empty-filters/",
|
||||||
secondaryButton: {
|
secondaryButton: {
|
||||||
@ -330,8 +336,8 @@ const emptyStateDetails = {
|
|||||||
access: EUserProjectRoles.MEMBER,
|
access: EUserProjectRoles.MEMBER,
|
||||||
},
|
},
|
||||||
// project issues
|
// project issues
|
||||||
"project-no-issues": {
|
[EmptyStateType.PROJECT_NO_ISSUES]: {
|
||||||
key: "project-no-issues",
|
key: EmptyStateType.PROJECT_NO_ISSUES,
|
||||||
title: "Create an issue and assign it to someone, even yourself",
|
title: "Create an issue and assign it to someone, even yourself",
|
||||||
description:
|
description:
|
||||||
"Think of issues as jobs, tasks, work, or JTBD. Which we like. An issue and its sub-issues are usually time-based actionables assigned to members of your team. Your team creates, assigns, and completes issues to move your project towards its goal.",
|
"Think of issues as jobs, tasks, work, or JTBD. Which we like. An issue and its sub-issues are usually time-based actionables assigned to members of your team. Your team creates, assigns, and completes issues to move your project towards its goal.",
|
||||||
@ -347,8 +353,8 @@ const emptyStateDetails = {
|
|||||||
accessType: "project",
|
accessType: "project",
|
||||||
access: EUserProjectRoles.MEMBER,
|
access: EUserProjectRoles.MEMBER,
|
||||||
},
|
},
|
||||||
"project-archived-no-issues": {
|
[EmptyStateType.PROJECT_ARCHIVED_NO_ISSUES]: {
|
||||||
key: "project-archived-no-issues",
|
key: EmptyStateType.PROJECT_ARCHIVED_NO_ISSUES,
|
||||||
title: "No archived issues yet",
|
title: "No archived issues yet",
|
||||||
description:
|
description:
|
||||||
"Archived issues help you remove issues you completed or cancelled from focus. You can set automation to auto archive issues and find them here.",
|
"Archived issues help you remove issues you completed or cancelled from focus. You can set automation to auto archive issues and find them here.",
|
||||||
@ -359,39 +365,39 @@ const emptyStateDetails = {
|
|||||||
accessType: "project",
|
accessType: "project",
|
||||||
access: EUserProjectRoles.MEMBER,
|
access: EUserProjectRoles.MEMBER,
|
||||||
},
|
},
|
||||||
"project-draft-no-issues": {
|
[EmptyStateType.PROJECT_DRAFT_NO_ISSUES]: {
|
||||||
key: "project-draft-no-issues",
|
key: EmptyStateType.PROJECT_DRAFT_NO_ISSUES,
|
||||||
title: "No draft issues yet",
|
title: "No draft issues yet",
|
||||||
description:
|
description:
|
||||||
"Quickly stepping away but want to keep your place? No worries – save a draft now. Your issues will be right here waiting for you.",
|
"Quickly stepping away but want to keep your place? No worries – save a draft now. Your issues will be right here waiting for you.",
|
||||||
path: "/empty-state/draft/draft-issues-empty",
|
path: "/empty-state/draft/draft-issues-empty",
|
||||||
},
|
},
|
||||||
"views-empty-search": {
|
[EmptyStateType.VIEWS_EMPTY_SEARCH]: {
|
||||||
key: "views-empty-search",
|
key: EmptyStateType.VIEWS_EMPTY_SEARCH,
|
||||||
title: "No matching views",
|
title: "No matching views",
|
||||||
description: "No views match the search criteria. Create a new view instead.",
|
description: "No views match the search criteria. Create a new view instead.",
|
||||||
path: "/empty-state/search/search",
|
path: "/empty-state/search/search",
|
||||||
},
|
},
|
||||||
"projects-empty-search": {
|
[EmptyStateType.PROJECTS_EMPTY_SEARCH]: {
|
||||||
key: "projects-empty-search",
|
key: EmptyStateType.PROJECTS_EMPTY_SEARCH,
|
||||||
title: "No matching projects",
|
title: "No matching projects",
|
||||||
description: "No projects detected with the matching criteria. Create a new project instead.",
|
description: "No projects detected with the matching criteria. Create a new project instead.",
|
||||||
path: "/empty-state/search/project",
|
path: "/empty-state/search/project",
|
||||||
},
|
},
|
||||||
"commandK-empty-search": {
|
[EmptyStateType.COMMANDK_EMPTY_SEARCH]: {
|
||||||
key: "commandK-empty-search",
|
key: EmptyStateType.COMMANDK_EMPTY_SEARCH,
|
||||||
title: "No results found. ",
|
title: "No results found. ",
|
||||||
path: "/empty-state/search/search",
|
path: "/empty-state/search/search",
|
||||||
},
|
},
|
||||||
"members-empty-search": {
|
[EmptyStateType.MEMBERS_EMPTY_SEARCH]: {
|
||||||
key: "members-empty-search",
|
key: EmptyStateType.MEMBERS_EMPTY_SEARCH,
|
||||||
title: "No matching members",
|
title: "No matching members",
|
||||||
description: "Add them to the project if they are already a part of the workspace",
|
description: "Add them to the project if they are already a part of the workspace",
|
||||||
path: "/empty-state/search/member",
|
path: "/empty-state/search/member",
|
||||||
},
|
},
|
||||||
// project module
|
// project module
|
||||||
"project-module-issues": {
|
[EmptyStateType.PROJECT_MODULE_ISSUES]: {
|
||||||
key: "project-modules-issues",
|
key: EmptyStateType.PROJECT_MODULE_ISSUES,
|
||||||
title: "No issues in the module",
|
title: "No issues in the module",
|
||||||
description: "Create or add issues which you want to accomplish as part of this module",
|
description: "Create or add issues which you want to accomplish as part of this module",
|
||||||
path: "/empty-state/module-issues/",
|
path: "/empty-state/module-issues/",
|
||||||
@ -404,8 +410,8 @@ const emptyStateDetails = {
|
|||||||
accessType: "project",
|
accessType: "project",
|
||||||
access: EUserProjectRoles.MEMBER,
|
access: EUserProjectRoles.MEMBER,
|
||||||
},
|
},
|
||||||
"project-module": {
|
[EmptyStateType.PROJECT_MODULE]: {
|
||||||
key: "project-module",
|
key: EmptyStateType.PROJECT_MODULE,
|
||||||
title: "Map your project milestones to Modules and track aggregated work easily.",
|
title: "Map your project milestones to Modules and track aggregated work easily.",
|
||||||
description:
|
description:
|
||||||
"A group of issues that belong to a logical, hierarchical parent form a module. Think of them as a way to track work by project milestones. They have their own periods and deadlines as well as analytics to help you see how close or far you are from a milestone.",
|
"A group of issues that belong to a logical, hierarchical parent form a module. Think of them as a way to track work by project milestones. They have their own periods and deadlines as well as analytics to help you see how close or far you are from a milestone.",
|
||||||
@ -421,8 +427,8 @@ const emptyStateDetails = {
|
|||||||
access: EUserProjectRoles.MEMBER,
|
access: EUserProjectRoles.MEMBER,
|
||||||
},
|
},
|
||||||
// project views
|
// project views
|
||||||
"project-view": {
|
[EmptyStateType.PROJECT_VIEW]: {
|
||||||
key: "project-view",
|
key: EmptyStateType.PROJECT_VIEW,
|
||||||
title: "Save filtered views for your project. Create as many as you need",
|
title: "Save filtered views for your project. Create as many as you need",
|
||||||
description:
|
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.",
|
"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.",
|
||||||
@ -438,8 +444,8 @@ const emptyStateDetails = {
|
|||||||
access: EUserProjectRoles.MEMBER,
|
access: EUserProjectRoles.MEMBER,
|
||||||
},
|
},
|
||||||
// project pages
|
// project pages
|
||||||
"project-page": {
|
[EmptyStateType.PROJECT_PAGE]: {
|
||||||
key: "pages",
|
key: EmptyStateType.PROJECT_PAGE,
|
||||||
title: "Write a note, a doc, or a full knowledge base. Get Galileo, Plane’s AI assistant, to help you get started",
|
title: "Write a note, a doc, or a full knowledge base. Get Galileo, Plane’s AI assistant, to help you get started",
|
||||||
description:
|
description:
|
||||||
"Pages are thoughts potting 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.",
|
"Pages are thoughts potting 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.",
|
||||||
@ -455,39 +461,39 @@ const emptyStateDetails = {
|
|||||||
accessType: "project",
|
accessType: "project",
|
||||||
access: EUserProjectRoles.MEMBER,
|
access: EUserProjectRoles.MEMBER,
|
||||||
},
|
},
|
||||||
"project-page-all": {
|
[EmptyStateType.PROJECT_PAGE_ALL]: {
|
||||||
key: "project-page-all",
|
key: EmptyStateType.PROJECT_PAGE_ALL,
|
||||||
title: "Write a note, a doc, or a full knowledge base",
|
title: "Write a note, a doc, or a full knowledge base",
|
||||||
description:
|
description:
|
||||||
"Pages help you organise your thoughts to create wikis, discussions or even document heated takes for your project. Use it wisely!",
|
"Pages help you organise your thoughts to create wikis, discussions or even document heated takes for your project. Use it wisely!",
|
||||||
path: "/empty-state/pages/all",
|
path: "/empty-state/pages/all",
|
||||||
},
|
},
|
||||||
"project-page-favorites": {
|
[EmptyStateType.PROJECT_PAGE_FAVORITES]: {
|
||||||
key: "project-page-favorites",
|
key: EmptyStateType.PROJECT_PAGE_FAVORITES,
|
||||||
title: "No favorite pages yet",
|
title: "No favorite pages yet",
|
||||||
description: "Favorites for quick access? mark them and find them right here.",
|
description: "Favorites for quick access? mark them and find them right here.",
|
||||||
path: "/empty-state/pages/favorites",
|
path: "/empty-state/pages/favorites",
|
||||||
},
|
},
|
||||||
"project-page-private": {
|
[EmptyStateType.PROJECT_PAGE_PRIVATE]: {
|
||||||
key: "project-page-private",
|
key: EmptyStateType.PROJECT_PAGE_PRIVATE,
|
||||||
title: "No private pages yet",
|
title: "No private pages yet",
|
||||||
description: "Keep your private thoughts here. When you're ready to share, the team's just a click away.",
|
description: "Keep your private thoughts here. When you're ready to share, the team's just a click away.",
|
||||||
path: "/empty-state/pages/private",
|
path: "/empty-state/pages/private",
|
||||||
},
|
},
|
||||||
"project-page-shared": {
|
[EmptyStateType.PROJECT_PAGE_SHARED]: {
|
||||||
key: "project-page-shared",
|
key: EmptyStateType.PROJECT_PAGE_SHARED,
|
||||||
title: "No shared pages yet",
|
title: "No shared pages yet",
|
||||||
description: "See pages shared with everyone in your project right here.",
|
description: "See pages shared with everyone in your project right here.",
|
||||||
path: "/empty-state/pages/shared",
|
path: "/empty-state/pages/shared",
|
||||||
},
|
},
|
||||||
"project-page-archived": {
|
[EmptyStateType.PROJECT_PAGE_ARCHIVED]: {
|
||||||
key: "project-page-archived",
|
key: EmptyStateType.PROJECT_PAGE_ARCHIVED,
|
||||||
title: "No archived pages yet",
|
title: "No archived pages yet",
|
||||||
description: "Archive pages not on your radar. Access them here when needed.",
|
description: "Archive pages not on your radar. Access them here when needed.",
|
||||||
path: "/empty-state/pages/archived",
|
path: "/empty-state/pages/archived",
|
||||||
},
|
},
|
||||||
"project-page-recent": {
|
[EmptyStateType.PROJECT_PAGE_RECENT]: {
|
||||||
key: "project-page-recent",
|
key: EmptyStateType.PROJECT_PAGE_RECENT,
|
||||||
title: "Write a note, a doc, or a full knowledge base",
|
title: "Write a note, a doc, or a full knowledge base",
|
||||||
description:
|
description:
|
||||||
"Pages help you organise your thoughts to create wikis, discussions or even document heated takes for your project. Use it wisely! Pages will be sorted and grouped by last updated",
|
"Pages help you organise your thoughts to create wikis, discussions or even document heated takes for your project. Use it wisely! Pages will be sorted and grouped by last updated",
|
||||||
@ -500,4 +506,4 @@ const emptyStateDetails = {
|
|||||||
},
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const EMPTY_STATE_DETAILS: Record<EmptyStateKeys, EmptyStateDetails> = emptyStateDetails;
|
export const EMPTY_STATE_DETAILS: Record<EmptyStateType, EmptyStateDetails> = emptyStateDetails;
|
||||||
|
BIN
web/public/empty-state/cycle/completed-no-issues-dark.webp
Normal file
BIN
web/public/empty-state/cycle/completed-no-issues-dark.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 86 KiB |
BIN
web/public/empty-state/cycle/completed-no-issues-light.webp
Normal file
BIN
web/public/empty-state/cycle/completed-no-issues-light.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 88 KiB |
Loading…
Reference in New Issue
Block a user