Org Workspace Collection UX
Why This Exists
The current org pages prove the product model, but they do not yet express the intended day-to-day agency operating experience.
The main issue is not one page. It is the collection pattern across the org surface.
Today, projects, time, and billing mostly render as vertically stacked cards. That was acceptable for proving the schema and workflow spine, but it will break down once an agency has real volume.
Examples of the current gap:
- project collections are too tall and do not support board-style planning
- time entries behave like manual notes, not like a true running timer workflow
- billing and other record-heavy pages do not yet share a stronger dense collection shell
- quick actions are buried inside page-local buttons instead of staying available as workspace controls
This doc is the product-direction source of truth for the next org-surface UX step.
Non-Negotiable Outcome
The org workspace must feel like a real operations product, not a stack of admin cards.
That means:
- dense enough to handle dozens of records without becoming visually tall and exhausting
- consistent between customers, projects, time, billing, and the global drive finder
- flexible enough to support different collection modes per domain
- fast to act from, with persistent creation and workflow shortcuts
Shared Collection System
Every record-heavy org page should converge on the same collection shell.
Core parts:
- page top bar for title and page-level actions
- collection toolbar for search, segment filters, and view switching
- density-aware record presentation instead of tall freeform cards
- selection and bulk-action affordances where the workflow benefits from them
- empty states that still preserve the surrounding shell
- a persistent quick-action dock for high-frequency org actions
The styling should remain minimal and restrained, but it should look intentional and operational.
Sidebar Grouping Note
For now, the org sidebar should stay on this grouped structure:
Home:Overview,AnalyticsAccounts:Clients,PortalsWork:Projects,Entries,Drive,ContractsRevenue:Quotes,Invoices,Subscriptions
This keeps the primary navigation simple while still separating account management from delivery work.
A lighter alternative IA was explored and is intentionally parked for later evaluation:
Home:Overview,AnalyticsWork:Clients,Portals,Projects,Entries,Drive,ContractsRevenue:Quotes,Invoices,Subscriptions
That three-group version is still a valid future option if the org surface needs a lighter, flatter navigation again.
Explicit Collection Taxonomy
Do not treat every org collection as the same kind of page.
The org workspace now has three collection types. New work should choose one of these deliberately instead of mixing patterns ad hoc.
1. Queue-switched record lists
Use this when the page is still fundamentally a records table, but operators need a small number of durable workflow queues across the top.
Current examples:
timeentriesbilling/invoicesportals
Rules:
- the secondary bar owns the fixed queue switch
- the queue order is semantic and stable, not user-reorderable
- search and heavier filters stay in the local collection toolbar
- the content area is a dense list or table, not a board
- drag-and-drop is not the interaction model
Examples:
- entries:
All approvals,Draft,Submitted,Approved - invoices:
All invoices,Draft,Open,Past due,Paid - portals:
All portals,Live,Unlinked,Disabled,Attention
2. Hybrid list/organize collections
Use this when the same domain has two genuinely different jobs:
- a dense review/browse job
- an explicit move-between-states organizing job
Current example:
customers
Rules:
- the secondary bar owns the mode switch, for example
ListandOrganize Listis the default modeListuses a dense table with scan-first columns and row actionsOrganizeuses visible state lanes and drag-and-drop- search may exist in both modes when it helps find records
- filters that duplicate the board itself must not appear in organize mode
Example:
- customers list: dense table with business name, primary contact, email, status, assigned summary, and actions
- customers organize:
Active,Paused,Inactive,Archivedlanes with drag-and-drop
3. Pure record lists
Use this when the page is a dense operational list without a meaningful board mode or queue switch.
Current examples:
billing/subscriptions- most detail-adjacent record collections
Rules:
- the secondary bar is usually absent or reserved for page context, not list filtering
- search, filters, sort, and bulk actions stay local to the collection toolbar
- the content area uses dense rows, compact cards, or tables
- drag-and-drop is not used
Drive-specific extension:
- the org global drive route may add a client finder rail because retrieval across client workspaces is part of the job
- that client rail does not make the page a hybrid list/organize collection
- folder organization belongs primarily inside the client-specific drive tab, not the global finder
Guardrail:
- do not add drag-and-drop just to make a page feel more interactive
- only use drag-and-drop when moving items between visible states is itself the primary job
Collection Modes By Surface
Projects
Projects need multiple views, not one canonical tall list.
Required modes:
Boardas the primary planning viewListas the dense operational view
Board expectations:
- status columns such as planned, active, blocked, complete, archived
- drag-and-drop between columns
- compact project cards with only the fields needed for scanning
- visible tags such as client, priority, target date, owner, visibility, and at-risk signals
- archived work should not dominate the active board
List expectations:
- dense row height
- sortable columns
- quick filters for active, blocked, complete, archived
- visible tags instead of verbose body copy
- rows should open detail quickly without needing tall card bodies
Time
Time should stop behaving like a note-taking list and start behaving like time tracking software.
Time is not a hybrid list/organize collection. It is a queue-switched record list plus a timer utility route.
Timer expectations:
- start, pause, resume, stop
- active timer visible globally while working in the org surface
- quick project and client assignment
- running note field that does not require opening a full page dialog
- timer state should be obvious, persistent, and hard to lose
Entries expectations:
- secondary bar queue switch for
All approvals,Draft,Submitted,Approved - dense list or table for review and correction
- approval state, billable state, project, client, duration, and user shown clearly
- manual entry still supported, but secondary to live timing
- easy correction of recent entries without expanding large cards
- approval changes should use fast inline controls, not drag-and-drop lanes
Timer route expectations:
- lives as a utility route and shell-level utility affordance, not as a peer collection mode inside the entries workspace
Billing, Drive, Customers, Portals
These should share the same collection shell, but not the same collection type.
Expected behavior:
- dense rows or compact cards depending on the record type
- active filters and status segments at the top
- minimal repeated copy
- important flags and next actions visible at scan speed
Specific direction:
- invoices are queue-switched record lists
- portals are queue-switched record lists for agency-side client portal operations
- subscriptions are pure record lists
- the org global drive route is a client-first finder with a client rail plus a dense recent-items table
- customers are hybrid list/organize collections
These pages do not all need kanban, but they should still feel like they belong to the same workspace system.
Customers And Portals Ownership Rule
The customer and portal surfaces must not drift into parallel identity models.
Canonical ownership is:
clientAccountis the company-level client recordclientContactis a person inside that company- portal access is state on that person
Surface responsibilities:
Customers/[clientId]/peopleis the canonical company people directory and access-management surfacePortalsis the cross-client operations workspace that summarizes and filters the same underlying person-level portal access state- the portals workspace must not infer readiness from only the client-account toggle or only the primary contact email when person-level access data exists
Quick Action Dock
The org surface should have a persistent quick-action dock in the bottom-right corner.
This is not decorative. It is a workspace control surface.
Initial actions should include:
- new project
- track time
- new client
- upload file
- create invoice or open billing action when that workflow exists
Design rules:
- desktop: floating vertical dock in the lower-right corner
- mobile: convert to a more compact sticky action surface instead of covering content
- keep labels concise and action-first
- avoid turning this into a noisy speed-dial full of rarely used actions
Density Rules
The current tall-card pattern should not remain the default for record-heavy pages.
Collection density rules:
- prefer rows, tables, board cards, or compact tiles over full-height narrative cards
- summary text should be optional metadata, not the main layout driver
- archived or inactive records should move behind a segment, filter, or collapsed group
- pages with dozens of records must still be scannable without feeling vertically punishing
- if a page is a record list, default to a dense table first and require a workflow reason before introducing board mechanics
Package Direction
If packages make this materially better, use them.
The likely direction is:
@dnd-kit/coreand@dnd-kit/sortablefor board and drag interactions@tanstack/react-tableif the current table primitives are too thin for dense collection views
The current internal DataTable wrapper is too primitive on its own for the intended end state. It can either be evolved around a stronger table engine or replaced by a better internal abstraction.
Implementation Order
Do not redesign every list independently.
Implementation order:
- build the shared org collection shell
- build the org quick-action dock
- migrate
projectsfirst with board plus dense list - migrate
timesecond with real timer workflow plus dense entries view - move
billing, the global drive finder, andcustomersonto the same collection language
Guardrail
Do not keep adding more route-specific list UIs on top of the current stacked-card pattern.
Do not blur collection types once chosen.
- if a page is a queue-switched record list, do not smuggle organize-board behavior into the table
- if a page is a hybrid list/organize collection, keep the two modes distinct instead of letting list filters fight the board
- if a page is a pure record list, do not add a secondary bar queue switch unless there is a durable workflow slice that truly deserves it
Before further heavy org workspace expansion, collection UX needs to become a deliberate system.