Complete architecture for a ClickUp/Notion/Miro-class project management app: - Turborepo monorepo with Next.js 15, TypeScript, PostgreSQL (Drizzle ORM) - Object-centered database schema (everything is an Object: tasks, projects, docs, whiteboards) - NextAuth v5 authentication with credentials + OAuth providers - tRPC v11 API layer with full CRUD for objects, properties, relations, templates, search - Three-panel UI: collapsible sidebar, center content area, push-in right panel - Purple/teal theme with light/dark mode via Shadcn/ui + Tailwind CSS - Multiple views: List, Kanban board (dnd-kit), Table (spreadsheet), Embedded iframe - TipTap rich text editor with slash commands, custom blocks (callout, toggle, mention, embed, divider), AI block - Real-time collaboration via Yjs + Hocuspocus with presence/cursors - tldraw whiteboard with custom shape cards (task, document, project) - MCP server exposing all app data/tools for AI agents - AI chat panel, editor AI slash commands, Cmd+K command palette - Template system with built-in templates (Bug Report, Meeting Notes, Sprint) - Full-text search with result highlighting - Docker Compose for full-stack deployment (web + collab + postgres + redis) Made-with: Cursor
31 lines
1 KiB
TypeScript
31 lines
1 KiB
TypeScript
"use client";
|
|
|
|
import { FilterBadges, FilterBar } from "@/components/views/config/filter-bar";
|
|
import { GroupConfig } from "@/components/views/config/group-config";
|
|
import { SortConfig } from "@/components/views/config/sort-config";
|
|
import { ViewSwitcher } from "@/components/views/config/view-switcher";
|
|
|
|
export interface ViewToolbarProps {
|
|
/** Total item count shown at the end of the toolbar. */
|
|
totalCount: number;
|
|
/** Optional label for the count (default "items"). */
|
|
countLabel?: string;
|
|
}
|
|
|
|
export function ViewToolbar({ totalCount, countLabel = "items" }: ViewToolbarProps) {
|
|
return (
|
|
<div className="flex min-w-0 flex-col gap-2">
|
|
<div className="flex flex-wrap items-center gap-x-2 gap-y-1.5">
|
|
<ViewSwitcher />
|
|
<FilterBar />
|
|
<SortConfig />
|
|
<GroupConfig />
|
|
<div className="min-w-[0.5rem] flex-1" aria-hidden />
|
|
<span className="shrink-0 text-xs tabular-nums text-muted-foreground">
|
|
{totalCount} {countLabel}
|
|
</span>
|
|
</div>
|
|
<FilterBadges />
|
|
</div>
|
|
);
|
|
}
|