Skip to content

[comp] Production Deploy#3335

Merged
tofikwest merged 56 commits into
releasefrom
main
Jul 3, 2026
Merged

[comp] Production Deploy#3335
tofikwest merged 56 commits into
releasefrom
main

Conversation

@github-actions

@github-actions github-actions Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

This is an automated pull request to release the candidate branch into production, which will trigger a deployment.
It was created by the [Production PR] action.


Summary by cubic

Turned People task tracking into real table columns and added per-employee 2FA status from a selected integration. Polished the Sync settings popover with provider logos and clearer labels.

  • New Features

    • Split TASKS into columns: POLICIES/TRAINING/HIPAA/DEVICE/BACKGROUND/2FA. Binary items show Done/Missing/Not provided; counts show x/y (brand green when complete). Inapplicable members show a muted dash; hide 0/0 rows; columns render only when the org tracks them.
    • Moved Status/Role/Onboarded/Offboarded into a Filters popover with presets and removable chips; works on mobile. Added a slim, always-visible horizontal scrollbar for wide tables.
    • 2FA source selection now lives in a right-aligned Sync settings popover (mobile-ready). Shows an empty state with a link to Integrations when no sources are connected. Dropdown items include provider logos; labels read “People” and “2FA status,” and unset triggers read “Not syncing”/“Not shown.” Per-user statuses are wired to CheckResultsService and the new endpoints.
  • Bug Fixes

    • Matched filter Select handlers to the design-system signature.
    • Column visibility now derives from org-level tracking (never from member data).
    • Fixed Filters trigger to avoid nested buttons; nested date pickers reset on popover close.
    • Unbounded ranges map to the exact “All time” preset so the selection stays highlighted.
    • Restored portaled Select dropdowns in toolbar popovers to fix mis-positioning and layout stretch.
    • 2FA source endpoints: return 404 when the org is missing and validate org existence before provider checks.
    • Made the 2FA source Select uncontrolled so the popover dismisses cleanly, matching the People sync Select.

Written for commit e7e276e. Summary will update on new commits.

Review in cubic

tofikwest and others added 12 commits July 1, 2026 14:53
Replace the collapsed single progress bar + wrapped gray text with a
vertical list: fractional requirements (policies, training) show a
count + mini bar; binary requirements (HIPAA, device, background) show
a Done/Missing badge. Colors use design-system Text/Badge variants
(success/warning/muted, accent/secondary). Extracted the rendering into
TaskRequirements.tsx to keep MemberRow focused.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Universal per-employee 2FA sourcing from any integration bound to the 2FA
evidence task (taskMapping === TASK_TEMPLATES.twoFactorAuth), covering
codebase + dynamic integrations via the shared registry.

- Organization.twoFactorSource column + migration
- CheckRunRepository.findLatestUserResultsByConnectionAndCheck: full
  per-user results from the latest real (non-inconclusive) run, org-scoped
- TwoFactorSourceController: GET/POST two-factor-source, available-2fa-sources
  (registry filtered by 2FA taskMapping), two-factor-statuses (per-email
  enabled/missing from the latest run; absence resolves to Not provided client-side)
- All endpoints @RequirePermission-gated (integration read/update); 22 tests

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ck results

Extract a feature-agnostic, read-only service that returns ANY integration
check's per-resource results in a stable envelope. Interpretation stays in the
feature — the service never types/interprets evidence (raw JSON). The 2FA
controller becomes consumer #1 and gets thinner (delegates all fetching).

- CheckResultsService: listSourcesBoundToTask / getLatestResultsByCheck /
  getLatestResultsForTask; exported from IntegrationPlatformModule
- Generalize repo method -> findLatestResultsByConnectionAndCheck (optional resourceType)
- TwoFactorSourceController now depends only on the service (+ its own twoFactorSource column)
- Agent docs: check-results-service skill + README + apps/api/CLAUDE.md pointer
- 29 tests across service/controller/repo

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Frontend for the universal 2FA source: a toolbar selector (clone of the
sync-source pattern) picks which connected integration bound to the 2FA
evidence task supplies per-user status; the People list joins the latest
check-run results to members by email and renders a 2FA row per person
as Done / Missing / Not provided (absence never reads as failure).

Also: service cleanups (batched connection lookup via
ConnectionRepository.findActiveBySlugsAndOrg, typed manifest+check pairs)
and hide 0/0 count rows (nothing-to-complete is not-applicable).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…bile

New responsive-ui skill: every UI change must work at mobile/tablet/
desktop/large-desktop widths by default, with repo patterns (DS Table
overflow-x-auto, toolbar hidden sm:block convention, mobile-first
Tailwind) and a done-checklist. Wired into the ui skill and CLAUDE.md so
it loads without being asked.

Apply it to the 2FA source selector: hidden sm:block, matching the other
secondary toolbar controls (the no-wrap toolbar squeezed on phones); the
per-member 2FA status stays visible at every width via table scroll.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Explicit precedence: DS rules win where the skills touch. Breakpoint
classes go on wrapper divs, never on DS components; DS layout primitives
before raw responsive divs; arbitrary pixel values stay an anti-pattern
(standard scale first, fixed control widths only when matching an
established pattern on that surface, always with a responsive strategy).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The showLoadingRow test only checked a negative condition, so removing
the Skeleton would still pass. Add a testid to the loading wrapper and
assert it both ways.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…mpai/comp into tofik/people-tasks-column-redesign
…fa-source

# Conflicts:
#	apps/app/src/app/(app)/[orgId]/people/all/components/TaskRequirements.test.tsx
…esign

feat(people): redesign TASKS column with per-requirement status rows
@vercel

vercel Bot commented Jul 2, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
app (staging) Ready Ready Preview, Comment Jul 3, 2026 7:22pm
comp-framework-editor (staging) Ready Ready Preview, Comment Jul 3, 2026 7:22pm
1 Skipped Deployment
Project Deployment Actions Updated (UTC)
portal (staging) Skipped Skipped Jul 3, 2026 7:22pm

Request Review

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No issues found across 5 files

Confidence score: 5/5

  • Automated review surfaced no issues in the provided summaries.
  • No files require special attention.

Re-trigger cubic

tofikwest and others added 8 commits July 2, 2026 12:15
- Deterministic email dedup in two-factor-statuses: a failing row always
  wins regardless of result order (compliance-conservative)
- use2faSource: isLoading covers both SWR requests; surface fetch errors
- Selector waits for both requests before rendering (no placeholder flash)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Row gap halved (gap-1 -> gap-0.5)
- Progress bar smaller: h-1 and fixed w-20 instead of stretching flex-1
- Counts get pl-1.5 to match the Badge's inner padding, so counts and
  Done/Missing badges sit on one vertical line
- Container content-sized (w-max) so the column stays compact

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The colored count (green done / amber partial / muted none) already
carries the state; an 80px bar adds a second encoding of the same fact
with barely perceptible differences. Rows are now clean label -> value
pairs, keeping counts and badges on one vertical line.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- POST two-factor-source: catch Prisma P2025 from the org update (stale/
  deleted org context) and return 404 like the controller's other org
  lookups, instead of a raw 500
- GET two-factor-statuses: a missing org row now 404s instead of being
  collapsed into the valid configured:false state

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…wo-factor-source

A deleted/stale org has no connections, so the provider check fired first
and returned 400 'not connected' instead of the endpoint's 404 contract.
Check the org row up front; the P2025 catch now only covers a deletion
racing the update. Regression test included.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(people): per-employee 2FA status from a selected integration source
…ping

- '2FA source' and 'Sync source' labels above the two selects (a bare
  'none'/'Google' select gave users no clue what it configures)
- 2FA trigger shows a muted 'None' instead of the raw item value
- Toolbar bottom-aligns (items-end) so labeled and unlabeled controls line up
- Date chips get whitespace-nowrap so 'Any time' no longer wraps

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
tofikwest and others added 5 commits July 3, 2026 13:42
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The empty state now renders the REAL structure — 'Sync people from' and
'2FA status from' as labeled placeholder slots with a dashed Connect row
deep-linking to Integrations — so users see exactly what can appear here
instead of reading about it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Search + Filters (query) group left; Data sources (view configuration)
sits alone on the right — the Linear/Stripe toolbar convention.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
style(people): Sync settings popover + toolbar layout per Linear/Stripe convention
tofikwest and others added 4 commits July 3, 2026 14:27
Selects portaled outside their parent popover broke outside-click
dismissal: closing an open select left the popover needing two more
clicks to dismiss. Render SelectContent with portal={false} inside the
Sync settings and Filters popovers so the dismiss layering stays sane.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Items now show the integration logo (matching the sync select and the
trigger); the clear option is a muted 'None'; the helper line is short.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
'Sync people from'/'2FA status from' -> 'People'/'2FA status' (the
popover is already called Sync settings — key-value rows, no redundancy).
Clear option is 'Don't show' (mirrors 'Don't auto-sync'); unset triggers
read 'Not syncing'/'Not shown' instead of the technical 'None'.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ortals

fix(people): popover dismissal + Sync settings polish
tofikwest and others added 3 commits July 3, 2026 14:59
Inline (non-portaled) select dropdowns mis-position inside the popover
and stretch the page width on mousedown. Restore the portal; the minor
extra-click-to-dismiss quirk returns and needs a proper fix at the
design-system layer instead.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ortals

improvement(people): restore portaled dropdowns for in-popover selects
tofikwest and others added 3 commits July 3, 2026 15:14
The people-sync select (uncontrolled) dismisses cleanly inside the
popover; the 2FA select (controlled via SWR-backed value) re-rendered
mid-dismissal and ate the popover's next outside click. Mirror the
working pattern: no value prop, manual 'Active' marker on the selected
item, and no focus-revalidation on the source hooks.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ortals

fix(people): 2FA select now dismisses cleanly (match the sync select pattern)
@vercel vercel Bot temporarily deployed to staging – portal July 3, 2026 19:19 Inactive
@tofikwest tofikwest merged commit 6cbf9d5 into release Jul 3, 2026
14 checks passed
@claudfuen

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.96.0 🎉

The release is available on GitHub release

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants