Commit Graph

325 Commits (cc9d7c08d16a2015603d679a69f2ef2a49fce812)

Author SHA1 Message Date
Talha Ahmed cc9d7c08d1 Brand-styled XLSX exports across Inbox, Candidates and Talent Pool
New shared lib/exportXlsx.js: every Export button now downloads a
dashboard-flavoured .xlsx - deep-green title band with lime text, mint
meta row (view, row count, date), ink-teal header row, zebra data rows,
frozen header and autofilter. exceljs is imported dynamically so its
~1MB chunk only downloads when an export is clicked.

- Inbox: exports the loaded view (DB-filtered; no extra request)
- Candidates: the Export button was a stub that only fired a toast -
  it now really exports the filtered account list
- Talent Pool: upgraded from plain CSV to the same styled workbook

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 20:40:43 +05:00
Talha Ahmed 56a05f840f Inbox: Export CSV button; graceful partial failure on the All channel
Export downloads the current view - channel, tab and search respected,
fetched unpaged - as UTF-8 CSV (BOM for Excel) with both sources'
columns: name, contact, position, channel, source, received, status,
city, notice period, ATS score, assigned job.

All channel resilience: when exactly one source fails, the healthy
list stays with a one-line notice naming the gap; the full error state
now renders only when there are no rows at all (cached rows beat a
scary banner over a working list).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 20:20:36 +05:00
Talha Ahmed 2abc28fc14 Inbox: single page scroll on phones, detail takes over from the list
The stacked split nested two scroll wells (list and detail each carried
max-height + overflow-y auto) inside the page scroll - scrollbars within
scrollbars on small screens. At <=900px both panes now flow naturally in
the one page scroll, and selecting an application swaps the list out for
the detail pane with a Back to list button (standard master-detail
collapse); selection also scrolls to the top so the detail header is in
view. Desktop keeps the two-pane split unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 20:12:18 +05:00
Talha Ahmed fbfcbb4eb8 Inbox: redesign the form applicant detail pane
Standard card language instead of the email-head strips: Contact &
application, Profile and Matching roles are now proper cards with
card-heads. The roles panel collapses three overlapping controls into
one flow - a single Browse roles action, with Assign appearing only
once a selection exists (a permanently disabled primary button read as
broken UI). Sheet provenance moves off the floating header corner into
the Imported from ... row N caption, and the action bar gains a
divider (email pane too, for consistency).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 19:40:03 +05:00
Talha Ahmed ef8d77ccfe Inbox: tidy the queue pagination
The stacked pager read as three loose rows with 'of N' printed twice.
Queue-scoped: drop the duplicate page-size total (the Showing line
already carries it), wrap page-controls with even gaps, and slim the
page buttons so all nine nav controls (4 chevrons + up to 5 numbers)
fit the ~350px split column on one row.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 19:20:49 +05:00
Talha Ahmed 2e66c91d63 Inbox: drop the Google Sheets status chip too
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 19:13:42 +05:00
Talha Ahmed 59afcadec9 Inbox: drop the Microsoft Graph API status chip from the header
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 17:57:27 +05:00
Talha Ahmed 2bfdbdee93 Inbox: All channel first and default
The combined stream leads the channel pills (All / Email / Sheet Forms)
and is the channel the inbox opens on.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 17:52:03 +05:00
Talha Ahmed ec8a4af52d Inbox: All channel - Email and Sheet Forms merged in one queue
Third channel pill beside Email / Sheet Forms. Both sources are fetched
unpaged (their endpoints read a missing top/limit as no LIMIT), merged
newest-first, and paged client-side - per-source skip/top cannot compose
into a correct global page. Rows carry kind (email/form) so the detail
pane, mark-read (email rows only get checkboxes; sheet rows have no
mailbox read state) and the kind-aware state/duplicate mutations all
pick the right endpoint per row. Tabs collapse to the shared set (no
Unread), counts and totals sum both sources, and the sheet filter spans
every sheet tab on this channel.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 17:36:52 +05:00
Talha Ahmed d1fa58ecc3 Inbox: surface the All toggle at the top of the queue
The unpaged switch lived only in the bottom Per-page dropdown and went
unnoticed. The bulk bar now carries a Show all (N) / Show paged button
(hidden while rows are ticked, since the bar swaps to selection
actions); it drives the same pageSize state, so the dropdown stays in
sync. The bar wraps now - four controls no longer fit one line in the
34%-wide split column at laptop widths.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 17:24:23 +05:00
Talha Ahmed 73ec556f8c Merge origin/main into Talha (history logs, page-size dropdown)
Integrates the Per-page dropdown (10/50/100) with the inbox All option:
All is now a fourth dropdown entry (opt-in via allowAll) instead of a
separate button. Restores what the stale-branch merges on main clobbered
from PR #46: mobile.test.mjs, the test:mobile script and the
puppeteer-core devDependency.
2026-09-02 16:28:25 +05:00
Talha Ahmed 3f06fbeff1 Inbox: All page-size option to show every application unpaged
PageSizeField gains an opt-in All toggle beside the numeric input
(sentinel value all; the input disables while active). Only the
Recruitment Inbox opts in: with All active the fetch omits top/limit,
which /inbox/all-applications and /sheet/form-data/fetch already read
as unpaged (Query(None) -> no LIMIT), so the whole tab renders as one
page for both the Email and Sheet Forms channels. Every other table
keeps its existing paged-only control.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 16:25:05 +05:00
ahmed.mujtaba e5d1a20dc6 Merge pull request 'added range' (#49) from create_new_Range into main
Deploy to S3 / deploy (push) Successful in 35s Details
Reviewed-on: #49
2026-09-02 11:03:35 +00:00
ahmed.mujtaba 63d5232cac added range 2026-09-02 15:58:35 +05:00
ahmed.mujtaba 7068f75008 Merge pull request 'NEW_MEREGE' (#48) from NEW_MEREGE into main
Deploy to S3 / deploy (push) Successful in 41s Details
Reviewed-on: #48
2026-09-02 10:40:42 +00:00
ahmed.mujtaba f4c1899d5b Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into add_history_logs 2026-09-02 15:35:35 +05:00
ahmed.mujtaba c7d630875c add history 2026-09-02 15:33:20 +05:00
talha.ahmed 182ee134ec Merge pull request 'Mobile responsiveness across the portal + viewport regression test' (#46) from Talha into main
Deploy to S3 / deploy (push) Successful in 40s Details
2026-09-02 10:33:02 +00:00
Talha Ahmed ea43b02b99 Post-merge: Progress screen mobile fixes, register Progress in smoke harness
- .progress-stage-grid gets the same min-width:0 blowout guard as .grid,
  and stacks to one column under 400px (two columns left ~56px for a
  stage label at 320)
- mobile.test.mjs: add the new progress/requisitions routes (27 total)
- __smoke__/entry.jsx: main added the /progress route but never
  registered the Progress screen in the harness map, so the smoke test
  rendered h(undefined) and /progress failed on main itself

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 15:32:23 +05:00
Talha Ahmed 75972d29b2 Merge origin/main into Talha (requisitions, progress screens, ATS order-by) 2026-09-02 15:19:04 +05:00
Talha Ahmed 14c78970bd Mobile responsiveness: fix grid blowouts, calendar clipping, wrapping controls; add viewport test
Audited all 25 routes at 320/375/390/430/768 with browser automation.
Root cause of most overflows: grid items default min-width:auto, so one
wide intrinsic child (a select option, the 620px RBAC matrix) pushed
whole cards past the viewport.

- .grid > * / .rbac-layout > * min-width:0 (CV Import, Interviews,
  Tasks, Access Control card blowouts)
- calendar: minmax(0,1fr) columns — SAT was clipped off-screen at 320
- .seg wraps (Tasks filters), .card-head wraps <=900
- sticky mobile table column: first column (identity), was nth-child(2)
- tooltips display:none until hover + .content overflow-x clip (killed
  a 7px sideways wiggle from invisible tooltip boxes)
- Ask Analytics form: design-system input styling, stacks on phones
- bar/grouped-bar charts thin x labels by slot width (overlap on phones)
- Candidates sort label+select wrap as one unit
- new: mobile.test.mjs + npm run test:mobile (puppeteer-core devDep,
  drives installed Chrome) — fails on sideways scroll or runtime errors

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 15:18:47 +05:00
ahmed.mujtaba 6db8e7aff3 Merge pull request 'Add_ATS_Order_by' (#45) from Add_ATS_Order_by into main
Deploy to S3 / deploy (push) Successful in 32s Details
Reviewed-on: #45
2026-09-02 08:49:25 +00:00
ahmed.mujtaba 3ab1dc9117 progress 2026-09-02 13:47:56 +05:00
ahmed.mujtaba b0d280ec86 Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into Add_ATS_Order_by 2026-09-02 13:45:29 +05:00
ahmed.mujtaba 8c5549a201 Add Progress bar 2026-09-02 13:33:11 +05:00
talha.ahmed a68cc43455 Merge pull request 'Dashboard redesign: org-wide activity summary with applications-per-job' (#44) from Talha into main
Deploy to S3 / deploy (push) Successful in 31s Details
2026-09-01 17:24:19 +00:00
Talha Ahmed f9fd88c5aa Dashboard redesign: org-wide activity summary with applications-per-job
Backend: new GET /analytics/applications-per-job/fetch (analytics.view) counting
inbox + manual-upload applications per job on the same basis as the funnel, with
zero-application open reqs included. Per-job group-bys added to Inbox_Messages,
Manual_UPLOAD_CANDIDATE; JobPosts.list_open_reqs for the zero-fill.

Frontend: Dashboard rewritten as a filterable summary (Week/Month/Quarter/Year +
department) - My Tasks, Today's Schedule and Quick Actions removed; 8 KPI tiles
(Hires and Offers Sent now shown); Applications per Job hero row-list; pipeline
card refed from /analytics/funnel so it obeys filters; Offer Book, Needs
Attention and Recent Activity cards added. ChartCard and time ranges extracted
to shared modules used by both Dashboard and Analytics.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-01 22:23:38 +05:00
ahmed.mujtaba 2998ba94a7 . 2026-09-01 19:59:55 +05:00
Talha Ahmed 88b6c96a11 Talent Pool: Export button beside All Departments filter (client-side CSV of filtered grid)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-01 19:31:22 +05:00
ahmed.mujtaba 9b5c2c8053 . 2026-09-01 18:25:53 +05:00
ahmed.mujtaba cf40e43423 Merge pull request '.' (#43) from Talha_merge into main
Deploy to S3 / deploy (push) Successful in 33s Details
Reviewed-on: #43
2026-08-31 15:30:54 +00:00
ahmed.mujtaba c41bfda959 Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into Talha_merge 2026-08-31 20:28:36 +05:00
ahmed.mujtaba 25a4eb8ec5 . 2026-08-31 18:30:56 +05:00
ahmed.mujtaba 453dc5c529 Merge pull request '.' (#42) from Talha_merge into main
Deploy to S3 / deploy (push) Successful in 32s Details
Reviewed-on: #42
2026-08-31 13:22:25 +00:00
ahmed.mujtaba 48813b4a32 . 2026-08-31 18:21:45 +05:00
Talha Ahmed 5a28b35dd9 Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into Talha
Deploy to S3 / deploy (push) Successful in 35s Details
2026-08-31 17:51:37 +05:00
ahmed.mujtaba f8a67e7649 Merge pull request 'Add_Flush' (#41) from Add_Flush into main
Deploy to S3 / deploy (push) Successful in 33s Details
Reviewed-on: #41
2026-08-31 12:37:25 +00:00
ahmed.mujtaba 823d02c34b Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into Add_Flush 2026-08-31 17:35:43 +05:00
ahmed.mujtaba 42e590e71d . 2026-08-31 17:35:34 +05:00
Talha Ahmed 7e76fb7874 Find Talent: Apify spend tracking + responsive fixes
- talent_runs.cost_usd records each run's actual charge (usageTotalUsd),
  accumulated across the broadened re-run ladder (migration 018).
- GET /talent/account: live balance and cycle spend from Apify
  /users/me/limits (nulls when Apify is unreachable) plus the observed
  $/profile over recorded runs.
- Header shows Balance / Spent / $-per-profile chips that refresh with
  every search; the run status line shows the last search's cost and the
  confirm dialog estimates from the live average.
- Responsive: toolbar controls stack edge-to-edge and candidate card
  footers wrap instead of clipping their buttons on phones.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 17:29:10 +05:00
ahmed.mujtaba 0f6de132f8 make sync visible 2026-08-31 17:03:21 +05:00
ahmed.mujtaba d5c3b87e5e Merge pull request 'Add_Flush' (#40) from Add_Flush into main
Deploy to S3 / deploy (push) Successful in 35s Details
Reviewed-on: #40
2026-08-31 11:23:37 +00:00
ahmed.mujtaba d0737e03ad Merge branch 'main' of https://git.utopiadeals.com/utopia-ai/HR-ATS-Portal into Add_Flush 2026-08-31 16:23:05 +05:00
ahmed.mujtaba 0038157eb0 Update job post insertion method to commit and refresh after adding a new job post 2026-08-31 16:21:19 +05:00
ahmed.mujtaba 1164a1cb2d add flush 2026-08-31 16:11:04 +05:00
ahmed.mujtaba 615d127775 Merge pull request 'Correct_Recieved_time' (#39) from Correct_Recieved_time into main
Deploy to S3 / deploy (push) Successful in 38s Details
Reviewed-on: #39
2026-08-31 10:52:53 +00:00
ahmed.mujtaba 8380be0d8a recieved time implemented 2026-08-31 15:51:52 +05:00
Talha Ahmed e7907a194e Inbox: responsive fixes for the split layout
- List column yields (34%, floor 280px) instead of holding 420px, so the
  detail pane stays readable in the 980-1200px band.
- Detail pane is a size container: its two-column info grid collapses on
  the pane own width, and long names/emails wrap instead of clipping.
- Tab strip wraps on narrow screens instead of running off-canvas.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 15:22:18 +05:00
Talha Ahmed 629554e6f6 Inbox: do not print raw To-addresses in the source chip
When no job board matches, the chip now says Email instead of the
full address; the address stays in the hover title and the opened
message. Board/referral chips are unchanged.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 14:39:48 +05:00
Talha Ahmed 4b93246d43 Find Talent: shortlist sourced profiles for outreach
Manual outreach funnel on talent_profiles (sourced -> shortlisted ->
contacted, one-step undo) tracked per profile with who/when stamps.
New PATCH /talent/profiles/outreach behind talent.edit; Find Talent
screen gains All/Shortlisted/Contacted tabs, a star to shortlist and
a check to record that the recruiter messaged the person on LinkedIn
(the app itself sends nothing). Re-runs never reset outreach state.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-31 14:34:23 +05:00