Docs/On-site tools

Search

The search bar at the top of the dashboard is one query, many registers. Type a project name, a defect description, a contractor, a document, or a person — all five are searched in a single call, and the results come back grouped by type.

What's indexed today

Search currently covers five entity types:

  • Projects — by name.
  • Defects — by description.
  • Contractors — by company name (excludes soft-deleted contractors).
  • Documents — by title or current-revision filename (active documents only).
  • Users — by first name, last name, or email.

Each group returns up to five results per query, so the UI stays compact even on broad queries. RFIs and work orders aren't indexed in search — to filter them, use the inbox views inside the RFIs and Work orders modules.

How matching works

Matches are case-insensitive substring (SQL ILIKE). A query for "smith" will match "Smith Construction", "ELLE SMITHSON", and bob.smith@example.com. The minimum query length is 2 characters — shorter queries return no results to avoid flooding the UI.

Tenant and project scope

Two layers of scope are always applied:

  • Tenant scope — all queries run inside your current organisation's row-level-security boundary. You never see records from another tenant, full stop.
  • Project-membership scope — for documents and users, results are filtered to projects you're a member of. You won't see a document from a project you don't have access to, or a user who's only on projects you can't see.

Projects, defects, and contractors are tenant-scoped but not further filtered by project membership — they're considered organisation-wide context.

"Invite by email"

If your search query looks like an email address, no user matches, and your role has the user:invite permission, search adds an "Invite [email]" affordance at the end of the user results. Click it to open the invite flow pre-filled with that address.

The check is gated three ways: looks-like-email, no existing matches, and you have permission to invite. It won't appear if any of those fails.

Result grouping

Results return as one object with five named arrays (one per entity type). The UI groups them visually with a small header per type and a result count. Empty groups don't render — so a query that only matches users shows just users, with no empty Projects or Defects sections cluttering the dropdown.

What to read next

  • Roles & dashboards — the role gates that determine what surfaces a user can search across.
  • Projects — project membership is what scopes document and user results.
  • Contractors — the contractor master list that search hits.