Skip to main content

Screen: Projects (accounts)

web/accounts.html — nav label "Projects" (it was "Clients" until 14 Oct 2026, feedback #79). It is the By client view of Projects; a By client | All projects switch at the top of the rail moves to the All projects table. It is the home for client and project context and relationships — replacing what used to be a scattered set of dashboards.

Since 17 Oct 2026 this page edits projects only. New client and Edit client (name, type, HubSpot) moved to the admin-only Clients page; an admin sees Edit client in Clients → on a client header, and older ?edit_account=<id> links forward there. Add project can still create a client together with its first project.

Client list​

The list shows clients with a current project, then a Needs review group for new clients with no projects yet or projects flagged for review, then Show past clients (N) for the rest. A client with a single project opens straight on that project.

Client page​

A client page has a header — HubSpot link, Edit, Add project — then one row per current project. Other projects stay collapsed.

Project detail​

Opening a project leads with meetings, important emails, notes, decisions and next steps. Kickoff discovery, client intelligence and scope evidence sit in a collapsed Background section — one page, not a dashboard per concern.

Files​

A Files card beside Next steps lists the project's active Library documents, newest first, so nobody has to go to the Library to find them (Lindsey, 19 Oct 2026; the customer portal has its own Files card). Each row shows the title, the file type, the date it was added and how it arrived (Uploaded, Client upload, Email attachment, Drive, Built by SABLE). Badges:

  • On client portal — the client sees it: a published portal publication, or (with no publication) the release flags a "Show on client portal" upload or a client upload sets.
  • Internal — marked internal, so never on the portal.
  • Restricted — contracts and SOWs. Only admins and leads see these rows at all.

Ten show, then Show all N expands in place. Selecting a row opens it the way the Library does (/api/doc: a short-lived link; Office files in Microsoft's viewer unless restricted). A file still being prepared for search says so quietly. The empty state reads "No files yet. Upload files or email them to SABLE." Leads and admins get Open project Library → under the list; others get Browse Library →.

The card reads the Library's own browse route (GET /api/library-browse?project_id=…&as=<scope>), so the Library's access rules apply unchanged: project scope and View as are decided by the server, and restricted documents are only returned to an admin or lead (or a lead viewing as one). The route returns internal_only and on_portal for these badges; on_portal follows list_portal_resources (a document shared only through a deliverable is not counted) and is left unknown if the publication read fails. One browse page holds 100 files; past that the card says "Showing the newest 100 of N" and the Library has the rest.

The client owner (account owner) is not shown anywhere in the app since 16 Oct 2026, and not in the customer portal since 17 Oct. Lindsey asked for this; the database field clients.owner_person_id is kept, and a client edit leaves it unchanged. The portal's team contacts are the project managers (and project team, when chosen); team activity is shown under the first project manager.

Fixing and adding from the project page​

These are on the project page because that is where a misfiled meeting is noticed (feedback #90, 15 Oct 2026).

  • Move… on a meeting or email row puts it on the right project. Leads and admins can use it. The picker lists the same client's other projects first. It uses Inbound's reassignment (POST /api/inbound-emails, action: "assign"), so the item's extracted tasks, promises, decisions and search index move with it, and the move is audited. If anything was extracted, it asks before moving. There is no Dismiss on this control. Filing unfiled items and dismissing stay in Inbound, which is admin only.
  • Upload files adds documents straight to this project. It is the same path as Library's upload (upload session, storage, then the indexing agent), with the same 25-file and 15MB limits and file types. Library keeps its own upload.

Creating and correcting records​

Admins and leads can add a project to an existing client or create a new client and its first project directly here. Admins can edit a project's project manager, team, participants, dates, hours, domains, systems, project code, Google Drive folder, and connector ids from either the client or project view.

Governed client identity​

Client names are temporarily protected because they join imported records across systems — a silent rename here would break that join elsewhere. The page explains this boundary next to the client name and routes a rename request through Report feedback instead of presenting the name as freely editable.

Meeting Brief​

Meeting rows open the same summary-first Meeting Brief used on the Library screen — tasks and decisions lead; vendor notes and the transcript stay collapsed as supporting evidence, not the first thing you read.

Contextual tools, not another dashboard​

Project actions link out to Scope, Kickoff, Outcome, Drafts, or the Client Portal for their specific workflows — these focused screens intentionally don't create a second client dashboard alongside this one.

Visibility​

Governance detail stays permission-scoped. Missing evidence lowers confidence rather than inventing a stronger or weaker status than the data supports.

Where the code lives​

  • web/accounts.html, accounts-surface.js
  • web/project-page-tools.js (Move…, Upload files, the Files card), web/api/library-browse.js
  • web/api/account-directory.js, _account_directory.js, account-health.js, _account_health.js
  • web/api/_client_mutation.js, _account_creation.js