diff --git a/src/components/EmptyStateCard.tsx b/src/components/EmptyStateCard.tsx new file mode 100644 index 0000000..0996f87 --- /dev/null +++ b/src/components/EmptyStateCard.tsx @@ -0,0 +1,25 @@ +import type { LucideIcon } from "lucide-react"; + +interface EmptyStateCardProps { + icon: LucideIcon; + title: string; + description: string; + className?: string; +} + +export default function EmptyStateCard({ + icon: Icon, + title, + description, + className = "", +}: EmptyStateCardProps) { + return ( +
+ +

{title}

+

{description}

+
+ ); +} diff --git a/src/pages/Clients.tsx b/src/pages/Clients.tsx index de226c8..9b9bd35 100644 --- a/src/pages/Clients.tsx +++ b/src/pages/Clients.tsx @@ -16,6 +16,7 @@ import { getClients } from "../api/clients" import CreateClientModal from "../components/CreateClientModal" import EditClientModal from "../components/EditClientModal" import DeleteClientModal from "../components/DeleteClientModal" +import EmptyStateCard from "../components/EmptyStateCard" import FilterBar from "../components/FilterBar" import { ListPageSkeleton } from "../components/ListPageSkeleton" import { Button } from "../components/ui/button" @@ -169,13 +170,11 @@ export default function Clients() { ) : (
{clients.length === 0 ? ( -
- -

{t.clients.noClients}

-

- {searchQuery ? t.clients.noClientsSearch : t.clients.noClientsAdd} -

-
+ ) : (
{clients.map((client) => { diff --git a/src/pages/Projects.tsx b/src/pages/Projects.tsx index 371a219..c0ce6cd 100644 --- a/src/pages/Projects.tsx +++ b/src/pages/Projects.tsx @@ -10,6 +10,7 @@ import { ProjectEditModal } from "../components/projects/ProjectEditModal"; import { Pagination } from "../components/Pagination"; import { Plus, Archive, Building2, Pencil, Trash2, X } from "lucide-react"; +import EmptyStateCard from "../components/EmptyStateCard"; import FilterBar from "../components/FilterBar"; import { ListPageSkeleton } from "../components/ListPageSkeleton"; import { Button } from "../components/ui/button"; @@ -329,11 +330,11 @@ export const Projects: React.FC = () => { ) : (
{projects.length === 0 ? ( -
- -

{t.projects?.emptyState || 'No projects found'}

-

{t.projects?.noProjectsSearch}

-
+ ) : (
{projects.map((project) => { diff --git a/src/pages/Tags.tsx b/src/pages/Tags.tsx index 8b30130..70ab7b8 100644 --- a/src/pages/Tags.tsx +++ b/src/pages/Tags.tsx @@ -4,6 +4,7 @@ import { Edit2, Plus, Tag as TagIcon, Trash2 } from "lucide-react"; import { toast } from "sonner"; import { createTag, deleteTag, getTags, type Tag, updateTag } from "../api/tags"; +import EmptyStateCard from "../components/EmptyStateCard"; import { useAppContext } from "../context/AppContext"; import { useWorkspace } from "../context/WorkspaceContext"; import { useTranslation } from "../hooks/useTranslation"; @@ -193,82 +194,85 @@ export default function Tags() {
{isLoading ? ( - + ) : (
-
- {tags.map((tag) => { - const canDeleteTag = canDeleteWorkspaceResource({ - workspaceRole, - currentUserId: user?.id, - createdById: tag.created_by?.id, - }); - return ( - - -
-
-
-
- {tag.name} -
-
+ {tags.length === 0 ? ( + + ) : ( +
+ {tags.map((tag) => { + const canDeleteTag = canDeleteWorkspaceResource({ + workspaceRole, + currentUserId: user?.id, + createdById: tag.created_by?.id, + }); - {(canEditTag || canDeleteTag) && ( -
- {canEditTag && ( - - )} - {canDeleteTag && ( - - )} -
- )} -
- - - ); - })} + return ( + + +
+
+
+
+ {tag.name} +
+
- {tags.length === 0 && ( -
- -

{t.tags?.emptyState || "No tags found"}

-

- {searchQuery ? t.tags?.noTagsSearch : t.tags?.emptyState} -

+ {(canEditTag || canDeleteTag) && ( +
+ {canDeleteTag && ( + + )} + + {canEditTag && ( + + )} +
+ )} +
+ + + ); + })}
)} -
- updateListParams({ page })} - onLimitChange={(pageLimit) => updateListParams({ limit: pageLimit, page: 1 })} - /> -
- )} + updateListParams({ page })} + onLimitChange={(pageLimit) => updateListParams({ limit: pageLimit, page: 1 })} + /> +
+ )}
- -

{t.workspace.noWorkspace}

-

- {searchQuery ? t.workspace.noWorkspaceSearch : t.workspace?.emptyState} -

-
- )} + {workspaces.length === 0 && ( + + )}