Commit graph

348 commits

Author SHA1 Message Date
Tracewebstudio Dev
fcf65664bf feat(admin): add Guard Events tab to AI Management page
All checks were successful
build-and-release / build (push) Successful in 1m36s
Shows blocked AI chat messages from ai_guard_violations, paginated,
filterable by guard_type (keyword / moderation_api / length / flood).
Fetches from GET /api/admin/ai/guard-events.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-15 14:20:50 +02:00
Tracewebstudio Dev
11041ba91c feat(kb): AI Draft button in KB article editor
All checks were successful
build-and-release / build (push) Successful in 1m51s
- Imports Sparkles icon from lucide-solid
- Adds [drafting, setDrafting] signal
- Adds aiDraft() function: calls POST /api/admin/kb/articles/ai-draft
  with current title + resolved category name; fills content field and
  summary field (only if summary is currently empty) from the response
- AI Draft button appears inline with the Content label, styled in the
  orange/amber palette; shows 'Generating...' while in flight
- Adds monospace font to the content textarea and a helper hint line
  reminding admins to review before saving

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-15 14:03:54 +02:00
Ashwin Kumar Sivakumar
8c03cd0eac fix(docker): don't set NODE_ENV=production before npm ci in builder stage
All checks were successful
build-and-release / build (push) Successful in 1m34s
With NODE_ENV=production set, npm ci skips devDependencies - but
npm run build (vinxi/vite under the hood) needs them, failing with
ERR_MODULE_NOT_FOUND for 'vite'. This broke every build regardless
of what changed in the app itself, including the innocuous waitlist
page added in 26667c7. Pre-existing bug, not introduced by that
commit - confirmed via git log that the NODE_ENV=production line
predates it.

Moved NODE_ENV=production to the runtime stage only, where it
actually matters (affects the running server, not the build tooling).
Added --include=dev to npm ci for defense in depth if NODE_ENV ever
gets reintroduced in the builder stage.

Verified with a local  - completes
successfully now.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 04:15:32 +05:30
Ashwin Kumar Sivakumar
2614beb62a chore: re-trigger admin-solid build (previous run died mid-checkout)
Some checks failed
build-and-release / build (push) Failing after 14s
2026-08-14 04:11:02 +05:30
Ashwin Kumar Sivakumar
26667c7ede feat: add Waitlist admin page
Some checks failed
build-and-release / build (push) Failing after 7s
Lists nxtgauge.com coming-soon signups (email + date, paginated 200/
page) via GET /api/admin/waitlist, with a CSV export button. Added to
the sidebar nav under the Pricing/Credit/AI/Coupon/Discount group.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 04:07:18 +05:30
Ashwin Kumar Sivakumar
b9c209aa67 Merge remote-tracking branch 'forgejo/high-performance' into high-performance
Some checks failed
build-and-release / build (push) Failing after 18s
2026-08-14 01:46:28 +05:30
Ashwin Kumar Sivakumar
066b077941 feat(ai-credits): add role scoping UI to AI Credit Packages admin
Matches the backend's new applicable_roles field
(nxtgauge-backend-rust apps/payments/src/ai_credits.rs): a role-toggle
chip picker (reusing the same ALL_ROLES/ROLE_LABELS already used by
the TraceCoin packages tab in this file) on both the create form and
the inline edit row, plus a Roles column in the packages table
showing 'All roles' when applicable_roles is empty or up to 3 role
badges (+N overflow) otherwise.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-14 01:46:22 +05:30
Tracewebstudio Dev
2ea364f73f fix(lint): auto-fix curly brace errors across admin routes
Some checks failed
build-and-release / build (push) Failing after 43s
All 22 ESLint curly errors resolved via eslint --fix.
Files: coupon, department, designation, employees/index,
external-dashboard-management/index, external-roles, index,
pricing, roles/index, support, users/index, test/setup.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-13 21:49:08 +02:00
Tracewebstudio Dev
6b8d4894fd feat: pending-verification count badge in sidebar
Some checks failed
build-and-release / build (push) Failing after 17s
- AdminSidebar: new badgeCounts prop (Record<string, number>); Verification
  Management nav item shows an orange pill badge when pendingVerifications > 0
  (both expanded and collapsed states)
- AdminShell: fetch /api/admin/verifications?status=PENDING on mount and
  poll every 60 s; passes count as badgeCounts to AdminSidebar — badge updates
  automatically as users submit role-registration wizards
- ESLint config: turn off solid/style-prop (whole codebase uses string styles),
  no-explicit-any (complex admin data shapes), add varsIgnorePattern/
  destructuredArrayIgnorePattern: '^_'; fix pre-existing unused
  User/GlobalSearch/ShowTabs/pageTitle symbols and return-once violation in
  _ShowTabs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 17:10:48 +02:00
Tracewebstudio Dev
164bbaf99b feat: role registration wizard + shared identity doc pre-fill
Some checks failed
build-and-release / build (push) Failing after 30s
- Add RoleWizard inline to SwitchServicesPage after successful role
  registration — same wizard flow as ProfilePage, no separate step
- Pre-fill identity documents (Aadhaar, PAN, selfie, etc.) from the
  user's active role profile so they don't re-upload on second role
- Add identity_shared flag to RuntimeOnboardingField for admin-
  configurable per-field opt-in; CONVENTION_IDENTITY_FIELD_IDS covers
  common IDs without schema changes
- Extract roleKeyToPrefix() into src/lib/role-utils.ts (shared util)
- Fix solid/reactivity: snapshot portfolioForm()/form()/docUrls()
  synchronously before the first await in handleSubmit
- Reuse badge (♻ purple) distinguishes pre-filled docs from new uploads;
  Change link clears the pre-fill and lets user re-upload
- Pending roles now show 'Under Review' status badge instead of Switch
- ArrowLeft back-button in header exits wizard without full page reload

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-08-12 14:55:25 +02:00
Ashwin Kumar Sivakumar
bd9666aabf Block saving a wizard-enabled onboarding schema with no fields
All checks were successful
build-and-release / build (push) Successful in 57s
The "Enable verification wizard flow" checkbox and step/field editing
were decoupled with no validation tying them together — an admin could
toggle the wizard on and hit Save before adding any fields to a step,
instantly publishing a wizard with nothing to fill in. Save is now
disabled (with an inline message naming the empty step) until every
non-review step has at least one field. Mirrors the same check added
server-side in nxtgauge-backend-rust's create_onboarding_config.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-29 11:46:22 +05:30
Ashwin Kumar Sivakumar
5316811b45 Add Onboarding Schema Editor, replacing the deprecated stub
All checks were successful
build-and-release / build (push) Successful in 50s
Lets an admin define each role's verification wizard steps and fields
(with drag-to-reorder), which fields lock permanently once approved,
the portfolio persistence model, and whether the wizard is enabled at
all for that role — writing to onboarding_configs.schema_json via the
(now admin-gated) config API. This is the admin surface for the new
runtime-config-driven wizard the frontend/backend now consume, so
nothing about a role's onboarding flow needs a code change to adjust.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-28 20:11:12 +05:30
Ashwin Kumar Sivakumar
cb99b90774 Fix "View" showing the nxtgauge logo instead of the submitted document
All checks were successful
build-and-release / build (push) Successful in 1m1s
The verification queue read row.payload?.documents (never populated —
the real per-document array is a separate top-level `documents` field
that was dropped during row mapping) and expected a {title, url} shape
that doesn't match what the backend actually sends ({type, value,
status}). Both mismatches meant every submission fell through to the
hardcoded placeholder-logo stub. Capture v.documents into each row,
read the real fields, and resolve the stored URL through the presign
endpoint before displaying it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-27 23:02:01 +05:30
Ashwin Kumar Sivakumar
69479291c9 Fix captcha not rendering on admin login: route through /api/gateway proxy
All checks were successful
build-and-release / build (push) Successful in 47s
/api/auth/captcha has no server route in this SolidStart app (only
/api/admin/* and /api/gateway/* are proxied to the backend), so the
request was silently falling through to the SPA's index.html (200,
text/html) instead of hitting the real endpoint — captchaChallenge
stayed empty and the canvas rendered blank. Use the existing generic
/api/gateway/* proxy instead, which already resolves auth/* paths
correctly.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-27 20:53:26 +05:30
Ashwin Kumar Sivakumar
47f36a3d69 Fix admin login: send required captcha, unblocking all admin sign-ins
All checks were successful
build-and-release / build (push) Successful in 57s
Backend commit fdd5c7a added a mandatory captcha to
/api/admin/auth/login, but this login page was never updated to
collect one — every admin login has been failing with a 422
("missing field captcha_id") since that change shipped. Add the same
challenge/canvas/verify flow the public site already uses (challenge
from /api/auth/captcha, verified server-side via shared Redis).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-27 19:30:16 +05:30
Ashwin Kumar Sivakumar
280d99da32 Stop rendering permanent Backblaze URLs in the approval viewer
Some checks failed
build-and-release / build (push) Failing after 56s
Every image/PDF/document field in a submission was rendered directly
from the stored profile_data value, which is a permanent, unsigned B2
URL. Resolve a short-lived signed URL via the new admin presign
endpoint before ever using it as an img src, iframe src, or link href.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-27 18:07:56 +05:30
Ashwin Kumar Sivakumar
d89c8bb3c1 Fix security audit findings: PayU secret leak, dead auth gate
All checks were successful
build-and-release / build (push) Successful in 1m2s
- Remove fake client-side admin-session cookie gate (the real
  server-verified /api/auth/session check already handles auth
  redirects; the cookie was JS-forgeable and added no security)
- Stop displaying full PayU merchant salt/client secret in the admin
  UI (backend now masks to last 4 chars); drop the plaintext-reveal
  toggle since there's nothing left to reveal
- Bump patchable dependency vulnerabilities via npm audit fix

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 17:32:28 +05:30
Ashwin Kumar Sivakumar
fbf343263d fix: expose verification_status as a selectable JOB_SEEKER dashboard widget
All checks were successful
build-and-release / build (push) Successful in 47s
Job seekers had no way to see/submit verification documents from their
dashboard because the widget picker never offered this option for their
role, so no admin could add it via the builder UI.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-23 04:25:53 +05:30
Ashwin Kumar Sivakumar
1de5baeb92 fix: show real company/applicant data in Verification Management table and detail view
All checks were successful
build-and-release / build (push) Successful in 44s
Applicant Name was hardcoded to 'Applicant' (backend never returns a
user_name field), the Company category tab could never match anything
since requestType was never set to 'Company Approval', and a class of
submissions with an accidentally double-wrapped payload rendered as
blank/Unknown everywhere. Derives the display name and area from the
actual payload fields (with defensive unwrapping for the double-wrapped
shape), and classifies company submissions correctly for tab filtering.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-19 22:03:59 +05:30
Ashwin Kumar Sivakumar
fadb2c0a80 fix: make Verification Management pagination actually work
All checks were successful
build-and-release / build (push) Successful in 1m3s
The page/next/prev controls were static markup with no onClick handlers,
and the "Showing X-Y of Z" label always rendered the same number for X, Y,
and Z (all displayRows().length) - pagination never did anything, all
fetched rows rendered on one page. Wires it to a real page signal with
working prev/next/page-number buttons, resets to page 1 when filters
change, and fixes the range label.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-19 19:41:39 +05:30
Ashwin Kumar Sivakumar
b208b37845 fix: show real uploaded documents/profile data on verification review, use reference numbers
All checks were successful
build-and-release / build (push) Successful in 52s
The verification review page was rendering hardcoded mock documents and
mock profile data instead of the real API response, so admins never saw
what customers actually submitted. Wires it to the real documents/payload
fields. Also replaces raw UUID displays with the new human-readable
reference_number across verification, support, orders, and users.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-19 16:35:49 +05:30
Ashwin Kumar Sivakumar
0e08cf9d6b feat(admin): extend session on activity, expire on 15 min idle
All checks were successful
build-and-release / build (push) Successful in 1m33s
Pairs with the backend's new POST /api/admin/auth/refresh (nxtgauge-backend-rust).
While the admin is active (mouse/keyboard/scroll/touch), silently exchange
the refresh-token cookie for a new access token every 3 minutes so the
15-minute access token never actually expires mid-work. Once idle for 15
minutes, the refresh loop stops on its own and the token expires naturally,
triggering the existing session-expired dialog - "logged out on inactivity,
not on a fixed timer" as intended.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-19 00:14:39 +05:30
Ashwin Kumar Sivakumar
ca2c5a4ef6 feat(admin): show a dialog when the session expires instead of failing silently
All checks were successful
build-and-release / build (push) Successful in 1m2s
Admin access tokens expire after 15 minutes with no refresh flow. Until now,
once the token expired, every subsequent action (approve, save, etc.) just
403/401'd with no visible feedback, or an error banner easy to miss inside a
modal — it looked like the button "didn't work."

Add a global window.fetch wrapper (installSessionExpiryWatcher, installed
once from AdminShell) that flips a shared signal whenever an authenticated
request comes back 401. AdminShell renders a "You have been logged out"
dialog on top of everything when that fires, with a button that clears the
stale session and sends the admin back to /login?from=<current path>.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-19 00:03:57 +05:30
Ashwin Kumar Sivakumar
5df2d6c07e fix(admin-verification): send request body on Approve action from queue list
All checks were successful
build-and-release / build (push) Successful in 1m21s
Every action branch (reject, request-documents, request-revision, notes)
set common.body to a JSON payload, but the isApprove branch never did,
leaving body: undefined. axum's Json<ActionPayload> extractor rejects a
body-less POST before approve_verification even runs, so clicking Approve
in the queue-list modal silently failed (the error banner renders at the
top of the page, easy to miss behind the open modal).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-18 23:41:22 +05:30
Ashwin Kumar Sivakumar
fe9c994b74 fix(admin-verification): attach bearer token to verification queue/detail fetches
All checks were successful
build-and-release / build (push) Successful in 1m1s
Backend's AuthUser extractor only reads the Authorization header — it never
looks at cookies. The verification queue list (index.tsx load()) and every
call in the verification detail page (via the shared adminFetch helper) sent
credentials: 'include' but no Authorization header, so they 401'd right after
a successful login even though the access token was already in sessionStorage.
Matches the pattern already used by the approve/reject actions further down
in index.tsx.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-18 22:59:04 +05:30
Ashwin Kumar Sivakumar
d1db169162 fix(admin-auth): read GATEWAY_URL from process.env instead of build-time Vite var
All checks were successful
build-and-release / build (push) Successful in 1m44s
Server-side gateway proxy (login, forgot-password, reset-password, all
/api/admin/* and /api/gateway/* calls) was reading import.meta.env.VITE_GATEWAY_URL,
which Vite only inlines at build time. The Dockerfile wrote GATEWAY_URL (no VITE_
prefix, and localhost besides) to .env at build time, so the var was never picked
up and the fallback http://localhost:9100 got baked into the server bundle
permanently — unreachable inside the pod, causing every admin auth call to 502
regardless of the correct GATEWAY_URL already set in the k8s ConfigMap.

Switch to process.env.GATEWAY_URL, read at runtime like the rest of the server
config already is.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-18 22:23:19 +05:30
Ashwin Kumar Sivakumar
ed4b65cba8 fix(ci): sort registry prune by real image build time, protect current SHA
All checks were successful
build-and-release / build (push) Successful in 1m6s
Same fix as nxtgauge-frontend-solid: registry_prune.py sorted candidate
tags by the manifest GET response's Date header (the moment of the
request, not the image's actual build time), making the "keep newest N"
sort effectively random whenever multiple tags are touched in the same
prune run - which happens on every single run, since the tag just
pushed by this same build is always one of the candidates. That let the
prune step delete the image a run had just built, before gitops even
got a chance to reference it.

Now reads the real "created" timestamp from the image's config blob and
always protects the current run's own SHA from deletion regardless of
sort order.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-17 05:37:45 +05:30
Tracewebstudio Dev
bed7035ec5 fix: TypeScript errors, test quality, and admin panel correctness
All checks were successful
build-and-release / build (push) Successful in 1m19s
- tsconfig.json: add @types/node for playwright/test configs
- lib/api.ts: handle both array and wrapped packages response from tracecoin endpoint
- lib/server/gateway.ts: use import.meta.env instead of process.env
- routes/admin/pricing.tsx: fix packages() usage after api.ts fix
- routes/admin/roles/*.tsx: fix Set<string> types and module filter types
- routes/admin/users/[id]/edit.tsx: add phone? to local User type
- routes/admin/users/details/[id].tsx: fix roleFilter param type narrowing
- components/admin/DashboardDesignPreview.tsx: fix budget→budget, responses→responseTag
- vite.config.ts: type proxy callbacks as any
- test/setup.ts: fix IntersectionObserver mock, add vitest/globals reference
- tests/e2e: fix PNG type mismatches, add as any for mock overrides
- tests/vitest: fix global.createElement mock type, vitest globals reference
- tests/tsconfig.json: test-specific tsconfig with node types

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-17 00:47:43 +02:00
Ashwin Kumar Sivakumar
87fe3c0c59 fix(admin-auth): point forgot-password at the employees endpoint, not users
All checks were successful
build-and-release / build (push) Successful in 57s
The previous fix routed through /api/gateway/auth/* (the users-table
forgot-password), which succeeds but changes the wrong account entirely —
admin.nxtgauge.com authenticates against a separate employees table.
Backend now exposes /api/admin/auth/forgot-password and
/api/admin/auth/reset-password against EmployeeRepository; route there.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 23:29:27 +05:30
Ashwin Kumar Sivakumar
eb6baf037b fix(admin-auth): route forgot-password calls through the gateway proxy
All checks were successful
build-and-release / build (push) Successful in 49s
/api/auth/forgot-password and /api/auth/reset-password aren't routes this
app serves itself — admin.nxtgauge.com only proxies specific prefixes
(/api/admin/*, /api/gateway/*, /api/me/*), so calling the bare path 404'd
at the SolidStart routing layer before ever reaching the backend. The
existing /api/gateway/[...path] proxy already rewrites /auth/* to
/api/auth/* on the real backend — route through that instead.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 23:09:28 +05:30
Ashwin Kumar Sivakumar
812fc5ef04 fix(admin-auth): point forgot-password flow at endpoints that actually exist
All checks were successful
build-and-release / build (push) Successful in 48s
The reset-password flow called /api/auth/internal/forgot-password/request-code
and /verify-code with a challengeId-based two-step contract — neither route
exists anywhere in the backend, so every reset attempt failed with "Failed to
send reset code." The real backend only exposes /api/auth/forgot-password
(sends a one-time code, always 200 to avoid account enumeration) and
/api/auth/reset-password (consumes the code + new password, no challengeId
involved). Rewrites both request/verify handlers to match that contract.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 22:56:52 +05:30
Ashwin Kumar Sivakumar
0866b7a069 fix(admin): add missing detail pages for 8 profession admin lists
All checks were successful
build-and-release / build (push) Successful in 44s
Each of these profession admin list pages (makeup artist, tutor, developer,
video editor, graphic designer, social media manager, fitness trainer,
catering services) linked "View Profile" to /admin/{role}/{id}, but only
Photographer and Company had a real [id].tsx route — every other role fell
through to the legacy catch-all module and showed a placeholder instead of
the applicant's actual profile. Converts each flat list route into a
folder (index.tsx + [id].tsx) and adds a shared ProfessionDetailPage
component, modeled on the working Photographer detail page.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-14 21:24:02 +05:30
Ashwin Kumar Sivakumar
7ae59fee20 fix: admin panel bugs found in QA audit
All checks were successful
build-and-release / build (push) Successful in 59s
- users: wire suspend/block buttons to PATCH /api/admin/users/:id/status
  (previously only mutated local state, reverted on refresh); add
  load/action error banners instead of silently emptying the table
- [...module]: stop rendering a dead localhost:9201 iframe for legacy
  modules when VITE_LEGACY_ADMIN_ORIGIN isn't configured (it never is
  in production); show a clear "not available" message instead
- dashboard: surface a banner when /api/admin/dashboard/metrics fails
  instead of silently showing "No Data" on every widget
- credit: fix stray extra closing </Show> tag that broke the whole
  file's JSX parse; restore missing API/authHeaders module helpers
  dropped in a previous refactor (AI Credits handlers referenced them
  but they were undefined); replace a dead, broken exportLedgerCsv/
  filteredLedger implementation with one matching actual call sites;
  fix activeTab type/tab keys so the Balance & Ledger and Platform
  Ledger tabs were actually reachable (they compared against 'balance'
  /'platform' but the tab buttons only ever set 'ledger')
- roles: surface errors when fetching a role's permissions for edit
  fails, instead of silently swallowing them
- runtime-roles: surface fetch/delete errors instead of silently
  swallowing them or presenting fallback sample data as if real

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-13 18:24:44 +05:30
Ashwin Kumar Sivakumar
98a41d833a fix(ci): push gitops updates via GitHub instead of direct-to-Forgejo
Some checks failed
build-and-release / build (push) Failing after 57s
GITOPS_PAT auth was failing against Forgejo. GitHub is the source of
truth for nxtgauge-gitops; push there and let sync-to-forgejo.yml
relay to Forgejo, which Flux actually watches.
2026-07-12 23:00:58 +05:30
Ashwin Kumar Sivakumar
697a4b0d92 fix(ci): use GITOPS_PAT for gitops push, not never-configured SSH secrets
Some checks failed
build-and-release / build (push) Failing after 1m34s
Same fix as nxtgauge-frontend-solid: GITEOPS_REPO/GITEOPS_SSH_KEY were
never configured as repo secrets. Switch to an HTTPS clone with
GITOPS_PAT, matching nxtgauge-backend-rust's already-working workflow.
2026-07-12 18:37:20 +05:30
Ashwin Kumar Sivakumar
7f4351550a fix(ci): tolerate whitespace in buildx metadata-file digest grep
Some checks failed
build-and-release / build (push) Failing after 1m39s
Same fix as nxtgauge-frontend-solid: buildx writes its metadata file
pretty-printed, so the compact ":"-only grep pattern never matched,
failing the build-and-push step right after a successful push and
skipping the GitOps-release step. Match backend-rust's
whitespace-tolerant pattern.
2026-07-12 18:32:57 +05:30
Ashwin Kumar Sivakumar
f94dafdf7c fix(ci): detect docker gateway instead of hardcoding 127.0.0.1
Some checks failed
build-and-release / build (push) Failing after 1m17s
Same fix as nxtgauge-backend-rust and nxtgauge-frontend-solid: every
build here has been failing with "Cannot connect to the Docker daemon
at tcp://127.0.0.1:2375" since the job container is nested inside the
runner pod's dind sidecar. Detect the real gateway from
/proc/net/route instead of hardcoding loopback.
2026-07-12 18:28:38 +05:30
Ashwin Kumar Sivakumar
ef8f4410c7 fix: dead Add Note buttons and no-op row click in admin review pages
Some checks failed
build-and-release / build (push) Failing after 1m16s
- verification/[id].tsx: "Add Note" in the Reviewer Notes panel had no
  onClick — wired to the existing POST /api/admin/verifications/:id/notes
  endpoint.
- approval/index.tsx: Decision Notes textarea was uncontrolled and its
  "Add Note" button was a no-op; there's no standalone notes endpoint
  for approval_requests, so the textarea is now bound to state and its
  value is sent as the rejection reason when the reviewer rejects
  (the only channel the backend currently supports).
- support.tsx: removed a no-op onClick={() => {}} on the case row —
  the row isn't actually clickable, only the adjacent "View" link is
  (though that link's target route doesn't exist yet — flagged
  separately, out of scope here).
2026-07-12 17:59:03 +05:30
Ashwin Kumar Sivakumar
e78b7c2642 fix: Update Dockerfile to use ci.nxtgauge.com registry
Some checks failed
build-and-release / build (push) Failing after 1m3s
2026-07-08 03:37:18 +05:30
Ashwin Kumar Sivakumar
78b6558539 fix: Storybook import path for onboarding-management
- Update import from non-existent onboarding-management to onboarding-schemas/index
2026-07-06 22:02:39 +05:30
Ashwin Kumar Sivakumar
a5bfe63f78 ci: remove GitHub Actions workflow - using Forgejo CI exclusively
Some checks failed
build-and-release / build (push) Failing after 1m11s
- Remove build-and-deploy-forgejo.yml from GitHub Actions
- Forgejo CI at ci.nxtgauge.com now handles all builds and deployments
- All images pushed to Forgejo registry (ci.nxtgauge.com/ashwin/*)
2026-07-06 04:19:48 +05:30
Ashwin Kumar Sivakumar
fa9e221fe3 fix(ci): switch from GHCR to Forgejo registry
Some checks failed
build-and-release / build (push) Failing after 1m15s
- Update workflow to push to ci.nxtgauge.com/ashwin/nxtgauge-admin-solid
- Use FORGEJO_USERNAME and FORGEJO_TOKEN secrets
- Fix gitops repo cloning to use x-access-token
2026-07-06 03:49:11 +05:30
Ashwin Kumar Sivakumar
43d181bf5a fix: JSX structure in credit.tsx
Some checks failed
build-and-release / build (push) Failing after 1m11s
- Fix nested tag structure: AI Credits tab was incorrectly nested inside Platform Ledger section
- Close Platform Ledger section before starting AI Credits tab
- Move AI Credits tab to be a sibling of Platform Ledger tab, not a child
- Wrap AI Credits content in proper section element for consistent styling

Fixes build errors in admin-solid
2026-07-06 03:04:14 +05:30
Ashwin Kumar Sivakumar
578fb2c5a1 fix: JSX structure in credit.tsx
Some checks failed
build-and-release / build (push) Failing after 1m10s
- Fix nested tag structure: AI Credits tab was incorrectly nested inside Platform Ledger section
- Close Platform Ledger section before starting AI Credits tab
- Move AI Credits tab to be a sibling of Platform Ledger tab, not a child
- Wrap AI Credits content in proper section element for consistent styling
2026-07-06 02:49:39 +05:30
Ashwin Kumar Sivakumar
059c7569c4 feat: Add AI Credits admin UI on high-performance branch (Task 2)
Some checks failed
build-and-release / build (push) Failing after 1m10s
- pricing.tsx: AI Credit Packages tab
- credit.tsx: AI Credits panel with Balance/Ledger/Adjust/Reconcile
2026-07-06 01:49:44 +05:30
Ashwin Kumar Sivakumar
2d02d5f26f ci(forgejo): update admin build pipeline
Some checks failed
build-and-release / build (push) Failing after 0s
2026-07-03 19:51:38 +05:30
Ashwin Kumar Sivakumar
b7023648a6 ci: sync GitHub pushes to Forgejo
Some checks failed
build-and-release / build (push) Failing after 0s
2026-07-03 18:58:29 +05:30
Tracewebstudio Dev
69079caa1d feat: admin invoice/credit/pricing UI overhaul with auth token injection
Some checks failed
build-and-release / build (push) Failing after 0s
- Inject Bearer token from sessionStorage into all API requests
- Add typed API helpers for invoices, credits, discounts, ledger, orders, pricing, tax
- Overhaul invoice, credit, pricing, tax admin routes with full CRUD UI
- Remove committed log files

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-02 13:51:08 +02:00
Ashwin Kumar Sivakumar
2f042bbc15 Merge branch 'high-performance' of https://github.com/Traceworks2023/nxtgauge-admin-solid into high-performance 2026-07-02 06:51:14 +05:30
Ashwin Kumar Sivakumar
4623d7c371 Update Dockerfile 2026-07-02 06:51:03 +05:30