From 24adddd29ff84e75738beeea3d52003dafa969c4 Mon Sep 17 00:00:00 2001
From: Anmol Singh Bhatia <121005188+anmolsinghbhatia@users.noreply.github.com>
Date: Thu, 20 Jun 2024 16:08:14 +0530
Subject: [PATCH] [WEB-1647] chore: breadcrumb items loader (#4887)
* chore: breadcrumb item loader added
* chore: breadcrumb item loader implementation
---
packages/ui/src/breadcrumbs/breadcrumbs.tsx | 16 +++++++++++++---
.../(detail)/[projectId]/archives/header.tsx | 4 ++--
.../archives/issues/(detail)/header.tsx | 4 ++--
.../[projectId]/cycles/(detail)/header.tsx | 16 +++++++++++-----
.../[projectId]/cycles/(list)/header.tsx | 4 ++--
.../(detail)/[projectId]/draft-issues/header.tsx | 11 ++++++++---
.../(detail)/[projectId]/inbox/header.tsx | 4 ++--
.../[projectId]/issues/(detail)/header.tsx | 4 ++--
.../[projectId]/issues/(list)/header.tsx | 14 ++++++++++----
.../[projectId]/modules/(detail)/header.tsx | 16 +++++++++++-----
.../[projectId]/modules/(list)/header.tsx | 4 ++--
.../[projectId]/pages/(detail)/header.tsx | 4 ++--
.../(detail)/[projectId]/pages/(list)/header.tsx | 4 ++--
.../(detail)/[projectId]/settings/header.tsx | 4 ++--
.../views/(detail)/[viewId]/header.tsx | 11 ++++++++---
.../(detail)/[projectId]/views/(list)/header.tsx | 4 ++--
.../(projects)/settings/header.tsx | 4 ++--
17 files changed, 83 insertions(+), 45 deletions(-)
diff --git a/packages/ui/src/breadcrumbs/breadcrumbs.tsx b/packages/ui/src/breadcrumbs/breadcrumbs.tsx
index 253e8308e..031825691 100644
--- a/packages/ui/src/breadcrumbs/breadcrumbs.tsx
+++ b/packages/ui/src/breadcrumbs/breadcrumbs.tsx
@@ -4,9 +4,10 @@ import { ChevronRight } from "lucide-react";
type BreadcrumbsProps = {
children: React.ReactNode;
onBack?: () => void;
+ isLoading?: boolean;
};
-const Breadcrumbs = ({ children, onBack }: BreadcrumbsProps) => {
+const Breadcrumbs = ({ children, onBack, isLoading = false }: BreadcrumbsProps) => {
const [isSmallScreen, setIsSmallScreen] = React.useState(false);
React.useEffect(() => {
@@ -21,6 +22,13 @@ const Breadcrumbs = ({ children, onBack }: BreadcrumbsProps) => {
const childrenArray = React.Children.toArray(children);
+ const BreadcrumbItemLoader = (
+
+
+
+
+ );
+
return (
{!isSmallScreen && (
@@ -33,7 +41,7 @@ const Breadcrumbs = ({ children, onBack }: BreadcrumbsProps) => {
)}
0 ? "hidden sm:flex" : "flex"}`}>
- {child}
+ {isLoading ? BreadcrumbItemLoader : child}
))}
@@ -50,7 +58,9 @@ const Breadcrumbs = ({ children, onBack }: BreadcrumbsProps) => {
)}
- {childrenArray[childrenArray.length - 1]}
+
+ {isLoading ? BreadcrumbItemLoader : childrenArray[childrenArray.length - 1]}
+
>
)}
{isSmallScreen && childrenArray.length === 1 && childrenArray}
diff --git a/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/header.tsx b/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/header.tsx
index adc662640..8d7e93406 100644
--- a/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/header.tsx
+++ b/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/archives/header.tsx
@@ -25,7 +25,7 @@ export const ProjectArchivesHeader: FC = observer(() => {
const {
issuesFilter: { issueFilters },
} = useIssues(EIssuesStoreType.ARCHIVED);
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
// hooks
const { isMobile } = usePlatformOS();
@@ -42,7 +42,7 @@ export const ProjectArchivesHeader: FC = observer(() => {
-
+
{
// router
const { workspaceSlug, projectId, archivedIssueId } = useParams();
// store hooks
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
const { data: issueDetails } = useSWR(
workspaceSlug && projectId && archivedIssueId ? ISSUE_DETAILS(archivedIssueId as string) : null,
@@ -39,7 +39,7 @@ export const ProjectArchivedIssueDetailsHeader = observer(() => {
-
+
{
const {
membership: { currentProjectRole },
} = useUser();
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
const { projectStates } = useProjectState();
const { projectLabels } = useLabel();
const {
@@ -160,7 +165,7 @@ export const CycleIssuesHeader: React.FC = observer(() => {
-
+
{
{issuesCount && issuesCount > 0 ? (
1 ? "issues" : "issue"
- } in this cycle`}
+ tooltipContent={`There are ${issuesCount} ${
+ issuesCount > 1 ? "issues" : "issue"
+ } in this cycle`}
position="bottom"
>
diff --git a/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/header.tsx b/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/header.tsx
index 664284c84..f38fe94f2 100644
--- a/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/header.tsx
+++ b/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/cycles/(list)/header.tsx
@@ -24,7 +24,7 @@ export const CyclesListHeader: FC = observer(() => {
const {
membership: { currentProjectRole },
} = useUser();
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
const canUserCreateCycle =
currentProjectRole && [EUserProjectRoles.ADMIN, EUserProjectRoles.MEMBER].includes(currentProjectRole);
@@ -33,7 +33,7 @@ export const CyclesListHeader: FC = observer(() => {
-
+
{
const {
issuesFilter: { issueFilters, updateFilters },
} = useIssues(EIssuesStoreType.DRAFT);
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
const { projectStates } = useProjectState();
const { projectLabels } = useLabel();
const {
@@ -91,7 +96,7 @@ export const ProjectDraftIssueHeader: FC = observer(() => {
-
+
{
// router
const { workspaceSlug, projectId } = useParams();
// store hooks
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader: currentProjectDetailsLoader } = useProject();
const { loader } = useProjectInbox();
return (
-
+
{
const router = useAppRouter();
const { workspaceSlug, projectId, issueId } = useParams();
// store hooks
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
const { issueDetailSidebarCollapsed, toggleIssueDetailSidebar } = useAppTheme();
const {
issue: { getIssueById },
@@ -32,7 +32,7 @@ export const ProjectIssueDetailsHeader = observer(() => {
-
+
{
const {
membership: { currentProjectRole },
} = useUser();
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
const { projectStates } = useProjectState();
const { projectLabels } = useLabel();
const { isMobile } = usePlatformOS();
@@ -122,7 +127,7 @@ export const ProjectIssuesHeader = observer(() => {
- router.back()}>
+ router.back()} isLoading={loader}>
{
{
const {
membership: { currentProjectRole },
} = useUser();
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
const { projectLabels } = useLabel();
const { projectStates } = useProjectState();
const {
@@ -160,7 +165,7 @@ export const ModuleIssuesHeader: React.FC = observer(() => {
-
+
{
{issuesCount && issuesCount > 0 ? (
1 ? "issues" : "issue"
- } in this module`}
+ tooltipContent={`There are ${issuesCount} ${
+ issuesCount > 1 ? "issues" : "issue"
+ } in this module`}
position="bottom"
>
diff --git a/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(list)/header.tsx b/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(list)/header.tsx
index c2b0a6cc5..87747e29f 100644
--- a/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(list)/header.tsx
+++ b/web/app/[workspaceSlug]/(projects)/projects/(detail)/[projectId]/modules/(list)/header.tsx
@@ -23,7 +23,7 @@ export const ModulesListHeader: React.FC = observer(() => {
const {
membership: { currentProjectRole },
} = useUser();
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
// auth
const canUserCreateModule =
@@ -33,7 +33,7 @@ export const ModulesListHeader: React.FC = observer(() => {
-
+
{
// state
const [isOpen, setIsOpen] = useState(false);
// store hooks
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
const { isContentEditable, isSubmitting, name, logo_props, updatePageLogo } = usePage(pageId?.toString() ?? "");
// use platform
const { platform } = usePlatformOS();
@@ -59,7 +59,7 @@ export const PageDetailsHeader = observer(() => {
-
+
{
const {
membership: { currentProjectRole },
} = useUser();
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
const { setTrackElement } = useEventTracker();
const canUserCreatePage =
@@ -33,7 +33,7 @@ export const PagesListHeader = observer(() => {
-
+
{
const {
membership: { currentProjectRole },
} = useUser();
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
if (currentProjectRole && currentProjectRole <= EUserProjectRoles.VIEWER) return null;
@@ -31,7 +31,7 @@ export const ProjectSettingHeader: FC = observer(() => {
-
+
{
const {
membership: { currentProjectRole },
} = useUser();
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
const { projectViewIds, getViewById } = useProjectView();
const { projectStates } = useProjectState();
const { projectLabels } = useLabel();
@@ -131,7 +136,7 @@ export const ProjectViewIssuesHeader: React.FC = observer(() => {
return (
-
+
{
const {
membership: { currentProjectRole },
} = useUser();
- const { currentProjectDetails } = useProject();
+ const { currentProjectDetails, loader } = useProject();
const canUserCreateIssue =
currentProjectRole && [EUserProjectRoles.ADMIN, EUserProjectRoles.MEMBER].includes(currentProjectRole);
@@ -30,7 +30,7 @@ export const ProjectViewsHeader = observer(() => {
-
+
{
- const { currentWorkspace } = useWorkspace();
+ const { currentWorkspace, loader } = useWorkspace();
return (