Commit graph

138 commits

Author SHA1 Message Date
Tracewebstudio Dev
77febdaeb4 feat(credits): add coupon code input to AI credit checkout
All checks were successful
build-and-release / build (push) Successful in 1m41s
Adds an optional coupon code field (uppercase, with Apply button and
confirmation tick) to the checkout modal, visible only for AI credit
package purchases. The code is passed as coupon_code to POST
/api/ai-credits/order; the backend applies the discount and the
discounted amount flows through to PayU.

CheckoutState gains couponCode + couponApplied fields. All open/close
reset paths clear them. Retry from error preserves the entered code.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-14 11:19:07 +02:00
Ashwin Kumar Sivakumar
74f321099f fix(coming-soon): bump near-invisible text opacity
All checks were successful
build-and-release / build (push) Successful in 1m45s
.cs-form-note ('No spam...') and .cs-footer-copy ('© 2026...') were
at 20-22% white opacity against the navy background - reported as
not visible. Bumped to 50-55%, still visually secondary/muted but
actually legible now.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 05:02:52 +05:30
Ashwin Kumar Sivakumar
97f1b61979 fix: hide the global AI chat widget on /coming-soon
All checks were successful
build-and-release / build (push) Successful in 2m21s
AiChatWidget renders unconditionally in the root layout for every
route - looked out of place on the pre-launch marketing page (a
floating chat bubble implying app functionality that doesn't exist
yet). Hidden via a small route-exclusion set keyed off useLocation(),
rather than threading a prop through every route.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 04:48:24 +05:30
Ashwin Kumar Sivakumar
f51a94b777 feat: coming-soon page as a real SolidJS route, host-redirected from nxtgauge.com
All checks were successful
build-and-release / build (push) Successful in 2m18s
Replaces the standalone static-nginx coming-soon deployment
(nxtgauge-gitops/coming-soon/ + apps/nxtgauge-coming-soon/) with a
proper route in this app - same content/design, ported to SolidJS
(signals for the form state instead of vanilla DOM manipulation),
CSS classes prefixed cs- to avoid colliding with the rest of the
app's global styles.

src/middleware.ts (already intercepts every request for the /api/*
proxy workaround) now also redirects '/' to '/coming-soon' when the
request Host is nxtgauge.com or www.nxtgauge.com - test111.nxtgauge.com
still shows the real app. Same deployment, same ingress backend, no
separate infra to build+deploy+eventually tear down when launching -
flipping the switch at launch time is just deleting that redirect
block and the route.

Reuses existing public/nxtgauge-logo.png and public/traceworks-logo-white.svg
(confirmed byte-identical to the old coming-soon/assets/ copies) rather
than duplicating assets.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 04:43:24 +05:30
Tracewebstudio Dev
f35e76802e fix(explore): resolve TSX JSX component return type error
All checks were successful
build-and-release / build (push) Successful in 1m48s
card.Icon typed as (props) => JSX.Element instead of unknown to
satisfy SolidJS JSX component constraint.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-13 21:48:42 +02:00
Tracewebstudio Dev
84fbfc1d73 fix: always show Verification in sidebar when user has a pending submission
All checks were successful
build-and-release / build (push) Successful in 1m48s
mergeSidebar already restricts the sidebar to 'Verification', 'Settings',
'Help Center' (and conditionally 'My Profile') when a verification is pending.
But if the admin's runtime config for this role omits 'Verification', the item
was silently absent even after registration — leaving users with no way to
track their submission.

Fix: after filtering to the restricted set, inject 'Verification' when it is
missing and the user has a pending status. This is a safety guarantee:
admin config governs approved-role layouts; pending-verification state always
wins on the Verification item regardless.

Also:
- .eslintrc.cjs: add varsIgnorePattern/destructuredArrayIgnorePattern '^_',
  turn off no-explicit-any (complex runtime config shapes), matching admin config
- Prefix unused resolveRuntimeSidebarKeys helper with _ to silence lint

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 17:46:03 +02:00
Tracewebstudio Dev
7b28301793 feat: add inline role-registration wizard to ExploreServicesPage
All checks were successful
build-and-release / build (push) Successful in 1m48s
- After registerRole() succeeds, fetch existing profile for identity doc
  pre-fill and immediately launch RoleWizard inline (same pattern as
  SwitchServicesPage)
- Wizard header shows role name + back arrow; main card grid hides
- On wizard submission: show approval-pending message and reload roles
- Card status now uses /api/me/roles (returns status field) so Pending
  roles show 'Under Review' badge instead of 'Switch' button
- Main roles (Company, Job Seeker, Customer) also go through the wizard
- StatusBadge component uses reactive accessor thunks (fixes
  solid/reactivity warning)
- Remove unused BTN_PRIMARY import

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 17:10:36 +02:00
Tracewebstudio Dev
09a5c36310 refactor: remove convention-based identity field fallback
All checks were successful
build-and-release / build (push) Successful in 2m23s
Pre-fill is now purely schema-driven: only fields explicitly marked
identity_shared: true by an admin in the Onboarding Schema Editor are
pre-filled when registering a second role.  No implicit convention set.

SwitchServicesPage now passes the full existing profile to RoleWizard;
RoleWizard filters to identity_shared fields using the new role's schema.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 16:29:41 +02:00
Tracewebstudio Dev
1df875ed36 feat: role registration wizard + shared identity doc pre-fill
All checks were successful
build-and-release / build (push) Successful in 1m44s
- Show RoleWizard inline in SwitchServicesPage immediately after
  role registration — no separate navigate-to-profile step
- Pre-fill shared identity docs (Aadhaar, PAN, selfie, address proof)
  from the user's active role profile so they don't re-upload on a
  second role registration
- Add identity_shared: boolean to RuntimeOnboardingField type so admins
  can mark fields in the Onboarding Schema Editor; CONVENTION_IDENTITY_
  FIELD_IDS covers common IDs automatically as a fallback
- Extract roleKeyToPrefix() into src/lib/role-utils.ts shared utility
- FileControl sub-component keeps reactivity clean (no any casts)
- Fix solid/reactivity: snapshot form()/docUrls()/portfolioForm()
  synchronously before the first await in handleSubmit/savePortfolio
- Reuse badge (♻ indigo) distinguishes pre-filled docs from new uploads;
  Change link clears pre-fill so user can re-upload
- Pending roles now show 'Under Review' badge; wizard exits via ArrowLeft

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 14:56:03 +02:00
Tracewebstudio Dev
40e79f2d01 fix: ESLint, SolidJS reactivity bugs, role workflow bug fixes
All checks were successful
build-and-release / build (push) Successful in 2m16s
ESLint:
- Downgrade eslint v10 → v8.57.1 (compatible with @typescript-eslint v7 + eslint-plugin-solid)
- Fix .eslintrc.cjs: remove invalid require() calls, update to valid rule set
- Add npm run lint script

SolidJS solid/prefer-for (18 fixes across 3 files):
- OpportunityGraph.tsx: EDGES.map() → <For> with reactive visible/drawing signals
- PortfolioPage.tsx: services.map() and experience.map() → <For>
- DashboardDesignPreview.tsx: 15 .map() calls → <For> (stats, packages, timeline,
  testimonials, quick actions, step tabs, pills, form fields, status lists, buttons,
  counters, filter tabs)

Role workflow bug fixes (from full role audit):
- cover_letter → cover_note in job applications (field name canonical fix)
- applicant_user_id field name fix in shortlisted candidates
- CompanyApplicationsPage: GET → POST for contact unlock endpoint
- CreditsPage: /payments/history → /payments/invoices; response key data.data
- CreditsPage: holds response key data.data (not data.holds)
- ProfessionalResponsesPage: requirement_id → lead_id, decision_at → resolved_at
- PortfolioPage: data.items → data.data; fix vacuous-truth in form completion check;
  saveProfessionalForm: check res.ok before showing success
- CustomerBrowseProfessionalsPage: professional_role_code → profession_key
- MyDashboardPage: professional prefix split('_')[0] not replace('_','')

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 13:38:38 +02:00
Ashwin Kumar Sivakumar
9f1448ee1e fix: surface real create-job failure reason instead of generic error
All checks were successful
build-and-release / build (push) Successful in 1m35s
Backend now returns JSON error bodies with a code field for every
create_job failure branch. Special-case QUOTA_EXHAUSTED with an
actionable message since there's no self-serve job-slot purchase flow
yet (support has to grant slots manually).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-03 17:04:43 +05:30
Ashwin Kumar Sivakumar
65bdefadc7 Fix job seeker submission failing: wrong API prefix and missing auth header
All checks were successful
build-and-release / build (push) Successful in 1m46s
job-seeker-custom-data.ts hit /api/gateway/jobseeker/profile/me — a prefix
that never existed in production (see the comment in lib/api.ts, which
every other authenticated call already follows); it 404s against the real
ingress, which routes /api/* straight to the gateway. Its local apiFetch
also never sent an Authorization header, which AuthUser requires (no
cookie fallback), so even the corrected path would 401.

This is why RoleWizard's submit flow broke for JOB_SEEKER specifically:
handleSubmit() calls savePortfolio() first, which calls
updateJobSeekerCustomData() (JOB_SEEKER's portfolioModel is "custom_data"),
which threw on the failed fetch and aborted the whole submission before
the actual profile PATCH or submit-for-verification call ever ran.
Confirmed against production: verifications has 5 rows for COMPANY, 1 for
PHOTOGRAPHER, 0 for JOB_SEEKER ever, despite a job seeker having fully
filled out the wizard (including an uploaded document) days ago.

Same file backs readJobSeekerProfile/updateJobSeekerCustomData used by
PortfolioPage, JobSeekerJobsPage, and JobSeekerSavedJobsPage too — all
four were broken the same way.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-30 21:53:06 +05:30
Tracewebstudio Dev
9358ab541f fix: verification page transitions cleanly to Pending Review after wizard submit
All checks were successful
build-and-release / build (push) Successful in 1m37s
- VerificationStatusPage: showInlineEditors now hides for PENDING and
  UNDER_REVIEW (only shows when user action is needed: NOT_SUBMITTED,
  DOCUMENTS_REQUESTED, REVISION_REQUESTED, REJECTED). Previously the
  old ProfilePage form with validation errors appeared after submission.

- VerificationStatusPage: wrap onVerificationStatusChange passed to
  ProfilePage so the local status signal also updates when the wizard
  calls onSubmitted. Previously the status card kept showing NOT_SUBMITTED
  until a page reload.

- VerificationStatusPage progress tracker: inline signal reads directly
  in JSX instead of capturing them in local variables. In Solid.js, local
  const done = signal() inside a For callback is computed once and goes
  stale — the step circles stayed grey even after status changed to PENDING.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-30 15:36:29 +02:00
Tracewebstudio Dev
00489b7414 Show runtime verification fields inline
All checks were successful
build-and-release / build (push) Successful in 1m48s
2026-07-29 18:21:26 +02:00
Tracewebstudio Dev
ddc6a95771 fix: persist verification docs and unlock dashboard
All checks were successful
build-and-release / build (push) Successful in 1m45s
2026-07-29 15:14:37 +02:00
Ashwin Kumar Sivakumar
012a6a6072 Fix Profile Completion widget stuck at wrong % and empty-field wizard steps
All checks were successful
build-and-release / build (push) Successful in 1m42s
ProfileCompletionWidget hardcoded a per-role field list (industry,
description, full_name, bio, ...) that never matched what the onboarding
wizard actually collects or where it's stored — for COMPANY only 2 of 5
checked fields existed at all, producing a stuck 40% regardless of real
completeness. Now derives required field ids from the same
fetchOnboardingSchemaForRole the wizard itself uses, and checks them
against the same /api/profile endpoint the wizard writes to, so it can't
drift again.

RoleWizard now shows "no fields configured yet" instead of rendering a
blank step card when a step has zero fields — visible failure instead of
silent, in case a stale/cached schema ever produces one.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-29 11:46:15 +05:30
Ashwin Kumar Sivakumar
f4b9885974 Add schema-driven verification wizard, replacing per-role hardcoding
All checks were successful
build-and-release / build (push) Successful in 1m42s
Generalizes the COMPANY-only 3-step wizard into RoleWizard, a component
driven entirely by the role's active onboarding_configs schema (fetched
via fetchOnboardingSchemaForRole) rather than hardcoded field/step
lists. Which roles get the wizard, and when, is now a runtime toggle
(enableWizardFlow) set through the new admin schema editor:

- ProfilePage shows the wizard while unverified/sent-back-for-fixes,
  falls back to the existing free-form tabs once approved, and greys
  out (both client- and server-side) any field the schema marks
  lockAfterApproval once approved — previously isLocked() only covered
  the in-review window and unlocked everything again at APPROVED.
- dashboard.tsx hides My Profile/My Portfolio from the sidebar
  pre-approval only for roles that have the wizard enabled (roles not
  yet rolled out keep direct access, so they aren't left with no way to
  complete their profile), and shows a checkmark on the Verification
  nav item once approved.

Rolling out to more roles is now purely an admin-panel config change —
no further code needed, since RoleWizard has no role-specific branches.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-28 20:10:41 +05:30
Ashwin Kumar Sivakumar
5fad33634a Show specifically what's missing before submit-for-verification
All checks were successful
build-and-release / build (push) Successful in 1m44s
The disabled-button hint just said "Complete all required fields to
submit" with no indication of which section was incomplete. For job
seekers, portfolio completion (headline, summary, education, work
experience, skills — filled in via My Portfolio, a separate page from
this one) is required alongside Basic Info and Documents, so seeing
both visible tabs fully checked while submit stays disabled looked
like a bug. Now names the actual missing items.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-27 23:02:11 +05:30
Ashwin Kumar Sivakumar
cab192d946 Fix job seeker document submission: hide raw storage URL, fix error masking
All checks were successful
build-and-release / build (push) Successful in 1m48s
Two issues in the job seeker (and shared profile) dashboard:
- The uploaded document's full Backblaze URL was rendered as visible text
  and linked directly; view-document now resolves a short-lived signed
  URL on demand instead of exposing the permanent storage link.
- "Submit for Verification" always showed a generic "Network error"
  message on any failure because request() throws on non-2xx responses,
  making the destructured status/data unreachable in the catch-free path
  (e.g. a 409 "verification already in progress" looked identical to a
  network failure). Now surfaces the real backend error message.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-27 18:07:37 +05:30
Ashwin Kumar Sivakumar
83b5072011 Fix forgot-password flow: UI never let users enter the emailed code
All checks were successful
build-and-release / build (push) Successful in 2m14s
The backend emails a plain 6-digit reset code (crates/email/templates/
password-reset.html just renders {{reset_code}}, no link) and expects
POST /api/auth/reset-password with {code, new_password}. This page was
built for a different, unused link-based flow instead: it only read a
`token` from the URL query string and posted it as `token`, a field
name the backend's ResetPasswordPayload doesn't even have. Users had
no way to type the code in at all, so submitting a request just left
them stuck back on the request screen.

Now: requesting a reset code moves straight to a "set new password"
step with a 6-digit code input, and the code is submitted under the
correct `code` field name.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 22:25:31 +05:30
Ashwin Kumar Sivakumar
7a0799f1d1 Fix security audit finding: replace fake client-side captcha
All checks were successful
build-and-release / build (push) Successful in 2m5s
The captcha on login and all four signup forms was generated and
checked entirely in the browser (answer readable via window global),
so it provided no real bot/brute-force protection. Wire up the new
server-side captcha endpoint instead: fetch a challenge on mount,
submit captcha_id + captcha_answer with login/register, and refresh
the challenge on CAPTCHA_FAILED.

Also bump patchable dependency vulnerabilities via npm audit fix
(all criticals resolved; remainder needs an upstream SolidStart/vinxi
bump not yet available).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 17:32:43 +05:30
Ashwin Kumar Sivakumar
070c4bdab1 fix: job seekers unable to submit verification documents
All checks were successful
build-and-release / build (push) Successful in 1m51s
The dashboard's Submit for Verification widget checked profile_data for
a documents/documents_data field that GET /api/jobseeker/profile/me never
returns, so the Submit button stayed permanently disabled. Even bypassing
that, it POSTed {document_urls: []}, a field the backend doesn't
recognize, instead of the profile_data shape submit-for-verification
actually expects.

Now fetches the job seeker's real uploaded documents via
GET /api/jobseeker/profile/documents, checks the correct document_type
field, and submits profile_data merged with the uploaded document URLs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 04:26:13 +05:30
Ashwin Kumar Sivakumar
18a9161e4f chore: remove orphaned legacy dashboard routes; fix NotificationBell's broken API calls
All checks were successful
build-and-release / build (push) Successful in 1m28s
An entire route/component cluster was built on a legacy sibling of
DashboardShell (DashboardLayout.tsx) and called APIs via the bare
api.get/post/patch/delete helper, which never prefixes /api/ — so
every call 404s against the real ingress (which only routes /api/*
to the backend). Confirmed orphaned: nothing in the live dashboard
shell (DashboardShell.tsx / dashboard.tsx) links to any of it; the
only cross-references are within the cluster itself. Some of it also
targeted the apps/leads backend service removed in the companion
backend commit.

Removed:
- src/routes/dashboard/wallet/ (buy.tsx, payu-return.tsx, invoices/*)
- src/routes/dashboard/requests.tsx
- src/routes/dashboard/leads/accepted/*
- src/routes/dashboard/marketplace/*
- src/components/dashboard/AcceptedLeadsView.tsx
- src/components/DashboardLayout.tsx (only consumer was the above)
- the unused `api` object in src/lib/api.ts (the unprefixed-path
  footgun itself — `request()`, which it wrapped, stays; it's used
  correctly elsewhere with explicit /api/ paths)

Fixed rather than deleted: src/components/NotificationBell.tsx uses
the same broken convention but IS live (rendered on every dashboard
page via DashboardShell). Switched it to apiFetch with correct
/api/me/notifications/* paths, matching the routes that actually exist
in apps/users/src/handlers/notifications.rs.

`tsc --noEmit` shows no errors under src/ after these changes (pre-
existing node_modules/type-declaration noise unrelated to this change
remains, as it did before).
2026-07-21 04:25:36 +05:30
Ashwin Kumar Sivakumar
142e185fc6 feat: render human-readable reference numbers and show submitted documents
All checks were successful
build-and-release / build (push) Successful in 1m41s
Replaces raw/truncated UUID labels with the backend's new reference_number
field across verification, application, and lead request views. Verification
status page now renders actual uploaded documents (previously invisible
after submission since the API never returned them).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-19 16:35:30 +05:30
Tracewebstudio Dev
49b979eb16 fix: eliminate API prefix double-encoding across all dashboard components
All checks were successful
build-and-release / build (push) Successful in 1m40s
All dashboard pages and widgets had one of three bugs:
- const API = "/api" combined with paths already starting /api → double prefix
- const API = '/api/gateway' → nonexistent gateway path prefix
- cleanPath stripping /api off paths when API was set to ""

Fix: set const API = "" uniformly and remove cleanPath rewrite in all 30+
affected files (CompanyJobsPage, CompanyApplicationsPage, CreditsPage,
JobSeekerJobsPage, CustomerRequirementsPage, all widgets, etc.).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-18 11:40:20 +02:00
Ashwin Kumar Sivakumar
6318b445d7 fix(ai-chat): fix gateway routing so chat send and KB lookups actually work
All checks were successful
build-and-release / build (push) Successful in 1m48s
AiChatWidget.tsx's local API constant was still "/api/gateway", a path
that only exists via the dev-only vite proxy and has no equivalent in
production (the gateway's resolve_upstream() has no "/api/gateway"
prefix). The usage-summary fetch had been patched to add auth headers
but this constant was left broken, and the two chat-send calls
(/chat/ask, /chat/message - the widget's core send-message path) were
untouched and doubly broken (wrong prefix plus a duplicated "/api").
Every send would 404 in production. Changed API to "/api" and dropped
the duplicated segment from both chat-send calls.

Also corrected a comment in CompanyJobsPage.tsx that incorrectly
described its own local API constant as "/api/gateway" (it's "/api");
no behavior change there, that fetch was already correct.

help-center.ts's uncommitted change (adding an "/api/gateway" prefix to
already-correct direct "/api/kb" calls) was reverted separately since it
introduced the same class of bug rather than fixing anything - it now
matches HEAD with no diff.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-17 05:48:15 +05:30
Tracewebstudio Dev
4efe848f3a fix: local dev proxy, TypeScript errors, and test quality
All checks were successful
build-and-release / build (push) Successful in 2m15s
- middleware.ts: default GATEWAY_URL to localhost:9100 (was K8s hostname);
  proxy all /api/* to gateway instead of falling through to SolidStart renderer
- signup/index.tsx: fix kebab-case style property (align-items)
- dashboard/CreditsPage.tsx: fix IIFE closing in Show children
- AskAsh/index.ts: use ~ alias to fix bundler module resolution
- vite.config.ts: add string type to rewrite callback
- global.d.ts: add Window.__captchaCode and __testMode declarations
- help-center/article/[slug].tsx: add missing ContentBlock import
- test/setup.ts: add vitest/globals reference, fix IntersectionObserver mock
- tests/e2e: fix implicit any, string|null/undefined type errors in e2e specs
- tests/tsconfig.json: add tests-specific tsconfig with node types

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 00:47:32 +02:00
Ashwin Kumar Sivakumar
0b38bc6ca5 fix(api): stop routing through a nonexistent /api/gateway rewrite layer
All checks were successful
build-and-release / build (push) Successful in 1m27s
The K8s ingress for this domain routes any /api/* path directly to the
Rust gateway service — there is no rewrite/proxy layer in production that
collapses /api/gateway/* down to /api/*. That rewrite only exists as a
dev-only vite proxy, so lib/api.ts's request()/apiFetch() (used by Save
Changes, Submit for Verification, document upload, wallet, jobs,
marketplace, portfolio, and more) were 404ing on every call in production
with "Route not found in gateway". ProfilePage.tsx and
VerificationStatusPage.tsx each had their own local apiFetch with the same
assumption, doubly broken (paths already included /api/, prefixed again).
All three now hit the already-fully-qualified /api/... path directly,
matching how the working signup/login calls have always done it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-15 01:17:44 +05:30
Ashwin Kumar Sivakumar
3ec5e60d15 fix(signup): remove duplicate role_key field from professional registration
All checks were successful
build-and-release / build (push) Successful in 1m29s
The register() request body sent both profession and role_key with the
same value. The backend's registration DTO aliases role_key onto the same
field as profession, so serde_json rejected the payload outright with a
"duplicate field" deserialization error — professional signup was
returning 422 for every role in production.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 22:14:10 +05:30
Ashwin Kumar Sivakumar
5290e7c70f fix(profile): persist uploaded document URLs and fill in missing doc config
All checks were successful
build-and-release / build (push) Successful in 1m47s
Uploaded document URLs lived only in a client-side signal and were never
included in the Save or Submit-for-Verification payloads (the latter sent
a document_urls field the backend silently ignored), so every submitted
verification case ended up with no attached documents for every role
except COMPANY. Now merges doc URLs into profile_data on save/submit and
repopulates them from the saved profile on reload.

Also adds the missing DOC_FIELDS entries for Developer, Video Editor,
Graphic Designer, Social Media Manager, and UGC Content Creator, and makes
the verification-status Documents tab role-aware instead of showing 3
hardcoded generic labels.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 21:23:45 +05:30
Ashwin Kumar Sivakumar
474fa637c3 fix: dead sidebar/wallet/leads/marketplace navigation links
Some checks failed
build-and-release / build (push) Failing after 1m11s
- DashboardLayout sidebar: Leads/Credits/Settings/Logout pointed to
  routes with no matching file (404). Leads now routes to the real
  accepted-leads page; Credits/Settings/Logout reuse the working
  /dashboard?nav= deep-link into the main dashboard's tab switcher
  (fixes Logout leaving users authenticated on a 404).
- wallet/buy.tsx, wallet/payu-return.tsx: post-purchase, cancel, and
  payment-verification redirects targeted non-existent /dashboard/wallet;
  now redirect to the existing credits/wallet tab.
- leads/accepted.tsx already contained a detail view gated on
  useParams().id, but was only registered as a flat route with no :id
  segment, so the detail view was dead code. Split into
  leads/accepted/index.tsx + leads/accepted/[id].tsx backed by a shared
  AcceptedLeadsView component.
- Added marketplace/[id].tsx: "View Requirement" buttons navigated to
  a route that never existed.
2026-07-12 17:58:37 +05:30
Ashwin Kumar Sivakumar
3d6a81d4ff feat(profile): add 3-step wizard for COMPANY role with single submit button
Some checks failed
build-and-release / build (push) Failing after 1m15s
2026-07-11 01:44:27 +05:30
Ashwin Kumar Sivakumar
ec4bb48358 feat(api): add submitCompanyProfileWithDocuments helper for wizard
Some checks failed
build-and-release / build (push) Failing after 1m7s
2026-07-11 01:34:37 +05:30
Benimaru
158c947944 fix(profile): use request() helper, check status correctly for save + submit
Some checks failed
build-and-release / build (push) Failing after 1m16s
2026-07-10 14:15:00 +05:30
Ashwin Kumar Sivakumar
d0fb78d21d fix: Update buttons from orange to navy blue for accessibility WCAG AA compliance
Some checks failed
build-and-release / build (push) Failing after 1m19s
- Changed all buttons with orange background (#fd6116) and white text
  to navy blue background (#050026) with white text
- Maintains 12.5:1 contrast ratio (exceeds WCAG AA 4.5:1 requirement)
- Keeps brand orange (#fd6116) for decorative elements and accents
- Preserves all hover states and transitions

Fixes accessibility violations for chip buttons, nav buttons, auth buttons,
submit buttons, and primary action buttons.
2026-07-07 05:07:28 +05:30
Ashwin Kumar Sivakumar
bb252318ab feat: Implement light theme for NXTGAUGE
- Change background from dark #07051a to light #F4F2EC
- Update dashboard background to white #ffffff
- Update text color to #0F1729 (dark navy)
- Add light theme CSS variables
- Keep brand orange #fd6116
2026-07-06 22:39:48 +05:30
Ashwin Kumar Sivakumar
d0143c229b fix: Restore brand color #fd6116, use brand navy text for accessibility
- Keep original brand orange #fd6116 for buttons
- Use brand navy #050026 as text color on orange background
- Ensures WCAG AA compliance (6.67:1 contrast ratio)
- Maintains brand consistency
2026-07-06 22:32:24 +05:30
Ashwin Kumar Sivakumar
2cb4d52fb3 fix: Storybook, Playwright runtime, accessibility color contrast, test routes
- Fix Storybook path alias resolution for ~ imports
- Fix Playwright runtime error by using production build
- Fix accessibility color contrast issues (WCAG AA compliant)
- Fix test route from /jobs to /professionals
- Update chip-btn.active and .btn.primary colors to #a33500
2026-07-06 22:02:39 +05:30
Ashwin Kumar Sivakumar
f55a2dad77 feat: AI Credits Admin Panel
Some checks failed
build-and-release / build (push) Failing after 1m6s
- Add AiCreditsAdmin component for managing AI credits
- View user balance with detailed credit breakdown
- Transaction history (ledger) viewer with pagination
- Manual credit adjustment (ADD/DEDUCT) with audit reasons
- Reconcile tab for generating reports
- Integrate with backend /admin/ai-credits endpoints
2026-07-06 01:58:29 +05:30
Ashwin Kumar Sivakumar
da7898e083 fix(dashboard): change all API endpoints from /api/gateway to /api
Some checks failed
build-and-release / build (push) Failing after 1m17s
2026-07-05 18:29:07 +05:30
Ashwin Kumar Sivakumar
09e26d2935 fix(profile): change API path from /api/gateway to /api
Some checks failed
build-and-release / build (push) Failing after 1m11s
2026-07-05 18:00:39 +05:30
Ashwin Kumar Sivakumar
38c7b4022d fix(signup): auto-login after OTP verification
Some checks failed
build-and-release / build (push) Failing after 1m17s
2026-07-05 17:04:10 +05:30
Ashwin Kumar Sivakumar
3ee5e908cf fix(signup): add role_key to registration requests
Some checks failed
build-and-release / build (push) Failing after 1m12s
2026-07-05 16:51:30 +05:30
Ashwin Kumar Sivakumar
d7810ace96 fix(auth): change all /api/gateway/auth endpoints to /api/auth for forgot-password, login, and dashboard
Some checks failed
build-and-release / build (push) Failing after 1m6s
2026-07-05 16:25:32 +05:30
Ashwin Kumar Sivakumar
1bf3191c49 fix(signup): change all auth API endpoints from /api/gateway to /api
Some checks failed
build-and-release / build (push) Failing after 1m17s
2026-07-05 16:21:17 +05:30
Ashwin Kumar Sivakumar
07aa835da5 fix(signup): change API endpoint from /api/gateway/auth/register to /api/auth/register
Some checks failed
build-and-release / build (push) Failing after 1m16s
2026-07-05 14:56:11 +05:30
Ashwin Kumar Sivakumar
0cf975f227 fix(signup): fix /signup routing so job-seeker and role-specific URLs work
Some checks failed
build-and-release / build (push) Failing after 1m17s
Three related bugs made signup pages appear blank/'Not found':

1. /signup/index.tsx redirected to /signup/job-seeker (hyphen) but the
   actual file was signup/jobseeker.tsx (no hyphen). Result: every
   /signup visit (no intent) 404'd.

2. signup/company.tsx had the same broken link in the 'Register as
   Job Seeker instead' link.

3. Landing page CTAs link to /signup?intent=professional&role=DEVELOPER
   which the index correctly redirects to /signup/professional - but
   /signup/developer, /signup/photographer etc. were 404 because there
   were no route files for them. Added signup/[role].tsx catch-all
   that maps all professional role slugs (developer, photographer,
   tutor, makeup-artist, video-editor, graphic-designer,
   social-media-manager, fitness-trainer, catering-services,
   ugc-content-creator) to /signup/professional?role=<ROLE>.

Verified via Playwright: all role-specific signup paths now load the
full signup form instead of 'Not found'.
2026-07-04 22:08:03 +05:30
Ashwin Kumar Sivakumar
6e92ed43b6 fix(signup): create proper index.tsx for signup folder, rename job-seeker to jobseeker
- Fix routing structure with index.tsx
- Remove conflicting signup.tsx at root level
- Rename job-seeker.tsx to jobseeker.tsx for cleaner URLs
2026-07-03 17:59:34 +05:30
Ashwin Kumar Sivakumar
cbe49ff5ad fix: update CTAs and fix company signup validation
- Update homepage CTAs to point to new signup URLs
- Fix company signup to not validate lastName
- Add customer signup page
- Fix professionals page CTA
2026-07-03 17:55:45 +05:30
Ashwin Kumar Sivakumar
bdf51ba3da feat(signup): create separate signup pages for each role
- /signup/company - dedicated company registration page
- /signup/job-seeker - dedicated job seeker registration page
- /signup/professional - dedicated professional registration page
- /signup - redirects to appropriate role-specific page
- Removed tabs, each role has its own clean registration flow

Fixes role assignment issues by having dedicated pages per role type.
2026-07-03 17:51:16 +05:30