Conversation
manager_digest shipped in #547 but nothing ever wrote it. Renaming it now and adding manager_weekly_digest is data-preserving since the column is still unused. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
previousOrgDay, currentOrgWeekStart and previousOrgWeek do their arithmetic on the org calendar date, never a resolved instant, so a DST transition inside the shifted range can't shift the day count. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
getDailyDigestRecipients/getWeeklyDigestRecipients compute recipients from EmailLog alone (no new column) — a manager already digested inside the current calendar day/week is dropped and counted as skipped, so a repeat cron fire is a no-op. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Two static routes, not one route with a mode param — each names and runs exactly the one digest its path names, so it stays a falsifiable allowlist line rather than a job runner. Both reject any request whose Authorization header isn't the CRON_SECRET bearer token before touching the database. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Appends both cron routes to CLAUDE.md's allowlist per #569's shape, and updates ENGINEERING/PERMISSIONS/WORKFLOWS for the new swallow site, the machine-authenticated route, and the two digest workflows. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The weekly email no longer tallies "new applications this week" — a manager gets it only when they have applications still short of a terminal status, with a status-count box per status (color-coded like the in-app badges) instead of a text recap. previousOrgWeek has no remaining caller and is removed along with it. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the previous-org-calendar-day window with a gap-safe one anchored to each manager's own last digest (24h fallback for a first-ever digest). A missed or delayed cron fire can no longer drop an application, and in steady daily operation the window is still always ~24h. The email now names the exact since-instant rather than a calendar day, since the window can span more than a day after a gap. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
#747 (merged to dev after this branch's last rebase) dropped the default and made Application.submittedAt nullable — a draft no longer has a fake submission timestamp. fetchNewApplications already excludes drafts by status, so the null case can't occur in practice; narrow the type back with a filter rather than loosening the daily digest's own types to Date | null everywhere downstream. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace the IntersectionObserver-based active section detection with scroll-position measurements. The old approach let an edge-only overlap of the previous section win over the section actually being read, and never let the last section highlight once the user was already at the bottom of the page. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…iew-in-sidebar-nav #769 Highlight The Section In View In The Sidebar Section Nav
MyApplicationPrimaryAction now gates draft the same way withdrawn was already gated, and both degrade to a disabled Continue/Edit & resubmit with an aria-describedby reason instead of a bare removal or note. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Move the blocked-action reason from visible text into a shared hover/focus tooltip (with an sr-only fallback for screen readers), reused by both GatedActionButton and MyApplicationPrimaryAction so the pattern can't drift between the two surfaces. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
DisabledActionTooltip took a render-prop function as children, which crashes when a server component (the applications detail page) renders it. Switched to a plain element the component clones internally; it now also owns the pointer-events wrapper so hover opens the tooltip when the inner control has pointer-events:none. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…on-on-past-deadline-drafts #748 Hide The Continue Action On Past-Deadline Drafts
Radix Tooltip never sets data-state="open" on TooltipContent (its open states are delayed-open/instant-open), so the gated enter classes never matched. Make the enter animation unconditional. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…-well-as-out #772 Animate Tooltips In As Well As Out
Relocates the dashboard "Recent activity" card into a Sheet reachable from every authenticated page (sidebar on desktop, mobile-nav on mobile), so activity isn't tied to standing on the dashboard. getActivityGroups composes the caller's own applications with a reviewer group scoped to managed/all positions, self-filtered so a reviewer's own application never appears twice. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Match the activity skeleton to the resolved two-heading layout for reviewer scopes, and fall back to a muted message instead of the global error boundary when the feed's fetch throws. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…nto-a-global-activity-panel #617 Move Recent Activity Into A Global Activity Panel
Records every position status change, mirroring ApplicationStatusEvent, so the activity panel can later show "position opened" items. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Wraps the status write in a transaction with a compare-and-swap on the prior status, so a concurrent change surfaces a clear error instead of silently overwriting, and writes a PositionStatusEvent per real move. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
getRecentPositionOpenings reads PositionStatusEvent rows scoped like the existing application feed; getActivityGroups merges them in by time and caps the combined reviewer group at 10. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
A row with an href renders as a Link wrapped in SheetClose so opening it also closes the panel; plain application rows are unaffected. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Covers scoping (manager, other manager, applicant, admin), reopen vs close, returning to draft, and merge-and-cap behavior in getActivityGroups, plus the event write itself in updatePositionStatus. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Add manual and deadline-close activity rows, and trim three over-long comments flagged for the same discipline rule. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds the deletion row for the activity panel (R3-M1, second amendment in #775): a published position deleted while open/closed shows an unlinked "was deleted" item, derived from deletedAt with no schema change. Fixes the scope gap where deleting a manager's only position would drop their reviewer group before the notification could show. Also compresses the deadline-close comment flagged as R3-L1. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Stored on User because sessions are hard-deleted on sign-out, expiry, and deactivation, so nothing derived from Session survives long enough to answer "who has gone quiet". The write moves into the session create `after` hook so a blocked (deactivated) sign-in never stamps it. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Makes the nulls-last sort rule unit-testable independently of the DataTable component; behavior is unchanged. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Sorts nulls (never-signed-in users) last in both directions; dash cells carry an sr-only "No sign-in recorded" label, and a footnote explains what the dash means since nothing is backfilled. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Deletion no longer erases a position's earlier activity history: opened, closed and deadline-close rows now survive deletion, rendered unlinked. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Remove the permanent footnote under the users table per operator request; the "—" cell and its screen-reader text still explain the missing sign-in. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…-when-position-opened #775 Show Managers Activity When Their Position Is Opened
…umn-to-the-users-page #645 Add A Last Sign-In Column To The Users Page
#549 Manager Daily Digest
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
bump version to v1.14.0
This branch was successfully deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release v1.14.0
Changes
Testing plan