From d9d62c2d5af59140860edc69db61762162adc098 Mon Sep 17 00:00:00 2001 From: rahulramesha <71900764+rahulramesha@users.noreply.github.com> Date: Tue, 2 Jul 2024 16:21:28 +0530 Subject: [PATCH] Add empty state when view is not available (#5002) --- .../workspace-views/[globalViewId]/page.tsx | 2 +- .../roots/all-issue-layout-root.tsx | 32 +++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/web/app/[workspaceSlug]/(projects)/workspace-views/[globalViewId]/page.tsx b/web/app/[workspaceSlug]/(projects)/workspace-views/[globalViewId]/page.tsx index 554e82b10..95fb113cd 100644 --- a/web/app/[workspaceSlug]/(projects)/workspace-views/[globalViewId]/page.tsx +++ b/web/app/[workspaceSlug]/(projects)/workspace-views/[globalViewId]/page.tsx @@ -34,7 +34,7 @@ const GlobalViewIssuesPage = observer(() => {
{globalViewId && } - +
diff --git a/web/core/components/issues/issue-layouts/roots/all-issue-layout-root.tsx b/web/core/components/issues/issue-layouts/roots/all-issue-layout-root.tsx index d51f61460..6f1c5156b 100644 --- a/web/core/components/issues/issue-layouts/roots/all-issue-layout-root.tsx +++ b/web/core/components/issues/issue-layouts/roots/all-issue-layout-root.tsx @@ -6,6 +6,7 @@ import useSWR from "swr"; import { IIssueDisplayFilterOptions } from "@plane/types"; // hooks // components +import { EmptyState } from "@/components/common"; import { SpreadsheetView } from "@/components/issues/issue-layouts"; import { AllIssueQuickActions } from "@/components/issues/issue-layouts/quick-action-dropdowns"; import { SpreadsheetLayoutLoader } from "@/components/ui"; @@ -20,17 +21,25 @@ import { import { EUserProjectRoles } from "@/constants/project"; // hooks import { useGlobalView, useIssues, useUser } from "@/hooks/store"; +import { useAppRouter } from "@/hooks/use-app-router"; import { IssuesStoreContext } from "@/hooks/use-issue-layout-store"; import { useIssuesActions } from "@/hooks/use-issues-actions"; import { useWorkspaceIssueProperties } from "@/hooks/use-workspace-issue-properties"; // store +import emptyView from "@/public/empty-state/view.svg"; import { IssuePeekOverview } from "../../peek-overview"; import { IssueLayoutHOC } from "../issue-layout-HOC"; import { TRenderQuickActions } from "../list/list-view-types"; -export const AllIssueLayoutRoot: React.FC = observer(() => { +type Props = { + isDefaultView: boolean; +}; + +export const AllIssueLayoutRoot: React.FC = observer((props: Props) => { + const { isDefaultView } = props; // router const { workspaceSlug, globalViewId } = useParams(); + const router = useAppRouter(); const searchParams = useSearchParams(); const routeFilters: { [key: string]: string; @@ -50,7 +59,9 @@ export const AllIssueLayoutRoot: React.FC = observer(() => { const { membership: { currentWorkspaceAllProjectsRole }, } = useUser(); - const { fetchAllGlobalViews } = useGlobalView(); + const { fetchAllGlobalViews, getViewDetailsById } = useGlobalView(); + + const viewDetails = getViewDetailsById(globalViewId?.toString()); // filter init from the query params const routerFilterParams = () => { @@ -86,7 +97,7 @@ export const AllIssueLayoutRoot: React.FC = observer(() => { if (workspaceSlug && globalViewId) fetchNextIssues(workspaceSlug.toString(), globalViewId.toString()); }, [fetchNextIssues, workspaceSlug, globalViewId]); - useSWR( + const { isLoading } = useSWR( workspaceSlug ? `WORKSPACE_GLOBAL_VIEWS_${workspaceSlug}` : null, async () => { if (workspaceSlug) { @@ -162,6 +173,21 @@ export const AllIssueLayoutRoot: React.FC = observer(() => { [canEditProperties, removeIssue, updateIssue, archiveIssue] ); + // when the call is not loading and the view does not exist and the view is not a default view, show empty state + if (!isLoading && !viewDetails && !isDefaultView) { + return ( + router.push(`/${workspaceSlug}/workspace-views/all-issues`), + }} + /> + ); + } + if (getIssueLoader() === "init-loader" || !globalViewId || !groupedIssueIds) { return ; }