From d6e8b5b80e0ea1372712d2e5470efdd6c51c9244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=B8vring?= Date: Tue, 13 Aug 2024 10:08:39 +0200 Subject: [PATCH 1/6] Ensures project placeholders align with projects --- .../internal/sidebar/projects/ProjectList.tsx | 11 ++++++--- .../projects/ProjectListItemPlaceholder.tsx | 23 +++---------------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx b/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx index d96def6b..a0c0dcbb 100644 --- a/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx +++ b/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx @@ -9,17 +9,22 @@ const ProjectList = () => { const { projects, isLoading } = useContext(ProjectsContainerContext) const projectSelection = useProjectSelection() const loadingItemCount = 6 + const itemSpacing = 1 if (isLoading || projects.length > 0) { return ( {isLoading && - [...new Array(loadingItemCount)].map((_, index) => ( - + [...new Array(loadingItemCount)].map((_, idx) => ( + + + )) } {!isLoading && projects.map((project, idx) => ( { return ( - - + + Date: Tue, 13 Aug 2024 10:23:08 +0200 Subject: [PATCH 2/6] Extracts SpacedList to separate file --- src/common/ui/SpacedList.tsx | 24 +++++++++++ .../internal/sidebar/projects/ProjectList.tsx | 43 +++++++++---------- 2 files changed, 44 insertions(+), 23 deletions(-) create mode 100644 src/common/ui/SpacedList.tsx diff --git a/src/common/ui/SpacedList.tsx b/src/common/ui/SpacedList.tsx new file mode 100644 index 00000000..799af698 --- /dev/null +++ b/src/common/ui/SpacedList.tsx @@ -0,0 +1,24 @@ +import React from "react" +import { List, Box } from "@mui/material" + +const SpacedList = ({ + children, + itemSpacing +}: { + children: React.ReactNode + itemSpacing: number +}) => { + return ( + + {React.Children.map(children, (child, idx) => ( + + {child} + + ))} + + ) +} + +export default SpacedList diff --git a/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx b/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx index a0c0dcbb..82bdec1f 100644 --- a/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx +++ b/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx @@ -1,6 +1,7 @@ import { useContext } from "react" -import { List, Box, Typography } from "@mui/material" -import { ProjectsContainerContext } from "@/common" +import { Box, Typography } from "@mui/material" +import { ProjectsContainerContext } from "@/common" +import SpacedList from "@/common/ui/SpacedList" import { useProjectSelection } from "@/features/projects/data" import ProjectListItem from "./ProjectListItem" import ProjectListItemPlaceholder from "./ProjectListItemPlaceholder" @@ -8,32 +9,28 @@ import ProjectListItemPlaceholder from "./ProjectListItemPlaceholder" const ProjectList = () => { const { projects, isLoading } = useContext(ProjectsContainerContext) const projectSelection = useProjectSelection() - const loadingItemCount = 6 const itemSpacing = 1 - if (isLoading || projects.length > 0) { + if (isLoading) { return ( - - {isLoading && - [...new Array(loadingItemCount)].map((_, idx) => ( - - - + + { + [...new Array(6)].map((_, idx) => ( + )) } - {!isLoading && projects.map((project, idx) => ( - - - + + ) + } else if (projects.length > 0) { + return ( + + {projects.map(project => ( + ))} - + ) } else { return ( From 3fbcb21c5b7477eb0fbdfb53aab8a0f55fda9303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=B8vring?= Date: Tue, 13 Aug 2024 10:27:41 +0200 Subject: [PATCH 3/6] Adds missing key prop --- .../sidebar/view/internal/sidebar/projects/ProjectList.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx b/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx index 82bdec1f..9832ce18 100644 --- a/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx +++ b/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx @@ -25,6 +25,7 @@ const ProjectList = () => { {projects.map(project => ( Date: Tue, 13 Aug 2024 11:28:56 +0200 Subject: [PATCH 4/6] Simplifies ProjectListItem skeleton --- .../internal/sidebar/projects/ProjectList.tsx | 11 +- .../sidebar/projects/ProjectListItem.tsx | 153 +++++++++++++----- .../projects/ProjectListItemPlaceholder.tsx | 36 ----- 3 files changed, 118 insertions(+), 82 deletions(-) delete mode 100644 src/features/sidebar/view/internal/sidebar/projects/ProjectListItemPlaceholder.tsx diff --git a/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx b/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx index 9832ce18..87ea22e9 100644 --- a/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx +++ b/src/features/sidebar/view/internal/sidebar/projects/ProjectList.tsx @@ -1,10 +1,9 @@ import { useContext } from "react" import { Box, Typography } from "@mui/material" -import { ProjectsContainerContext } from "@/common" +import { ProjectsContainerContext } from "@/common" import SpacedList from "@/common/ui/SpacedList" import { useProjectSelection } from "@/features/projects/data" -import ProjectListItem from "./ProjectListItem" -import ProjectListItemPlaceholder from "./ProjectListItemPlaceholder" +import ProjectListItem, { Skeleton as ProjectListItemSkeleton } from "./ProjectListItem" const ProjectList = () => { const { projects, isLoading } = useContext(ProjectsContainerContext) @@ -15,7 +14,7 @@ const ProjectList = () => { { [...new Array(6)].map((_, idx) => ( - + )) } @@ -27,8 +26,8 @@ const ProjectList = () => { projectSelection.selectProject(project)} /> ))} diff --git a/src/features/sidebar/view/internal/sidebar/projects/ProjectListItem.tsx b/src/features/sidebar/view/internal/sidebar/projects/ProjectListItem.tsx index ba9c7291..1f7a9b60 100644 --- a/src/features/sidebar/view/internal/sidebar/projects/ProjectListItem.tsx +++ b/src/features/sidebar/view/internal/sidebar/projects/ProjectListItem.tsx @@ -1,67 +1,140 @@ import { Box, ListItem, - ListItemButton, ListItemText, + ListItemButton, + Skeleton as MuiSkeleton, Stack, Typography } from "@mui/material" import MenuItemHover from "@/common/ui/MenuItemHover" import { Project } from "@/features/projects/domain" import ProjectAvatar from "./ProjectAvatar" +import ProjectAvatarSquircle from "./ProjectAvatarSquircle" + +const AVATAR_SIZE = { width: 40, height: 40 } const ProjectListItem = ({ project, - isSelected, - onSelectProject + selected, + onSelect }: { project: Project - isSelected: boolean - onSelectProject: (project: Project) => void + selected: boolean + onSelect: () => void +}) => { + return ( + + ) +} + +export default ProjectListItem + +export const Skeleton = () => { + return ( + + ) +} + +const Template = ({ + disabled, + selected, + onSelect, + avatar, + children +}: { + disabled?: boolean + selected?: boolean + onSelect?: () => void + avatar: React.ReactNode + children?: React.ReactNode }) => { return ( + {disabled && + + {children} + + } + {!disabled && onSelectProject(project)} - selected={isSelected} + disabled={disabled} + onClick={onSelect} + selected={selected} disableGutters sx={{ padding: 0 }} > - - - - - - - {project.displayName} - - } - /> - - + + {children} + + } ) } -export default ProjectListItem +const ButtonLabel = ({ + disabled, + avatar, + children +}: { + disabled?: boolean + avatar: React.ReactNode + children?: React.ReactNode +}) => { + return ( + + + + + {avatar} + + + {children} + + + ) +} diff --git a/src/features/sidebar/view/internal/sidebar/projects/ProjectListItemPlaceholder.tsx b/src/features/sidebar/view/internal/sidebar/projects/ProjectListItemPlaceholder.tsx deleted file mode 100644 index 5b50c81f..00000000 --- a/src/features/sidebar/view/internal/sidebar/projects/ProjectListItemPlaceholder.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { ListItem, ListItemText, Stack, Skeleton } from "@mui/material" -import MenuItemHover from "@/common/ui/MenuItemHover" -import ProjectAvatarSquircle from "./ProjectAvatarSquircle" - -const ProjectListItemPlaceholder = () => { - return ( - - - - - - - - } - /> - - - - ) -} - -export default ProjectListItemPlaceholder \ No newline at end of file From b466dd9c71228b41ec6edcfa1732b7a49ac7d87a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Simon=20St=C3=B8vring?= Date: Tue, 13 Aug 2024 11:38:32 +0200 Subject: [PATCH 5/6] Uses AVATAR_SIZE --- .../view/internal/sidebar/projects/ProjectListItem.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/features/sidebar/view/internal/sidebar/projects/ProjectListItem.tsx b/src/features/sidebar/view/internal/sidebar/projects/ProjectListItem.tsx index 1f7a9b60..e5a33418 100644 --- a/src/features/sidebar/view/internal/sidebar/projects/ProjectListItem.tsx +++ b/src/features/sidebar/view/internal/sidebar/projects/ProjectListItem.tsx @@ -27,8 +27,13 @@ const ProjectListItem = ({