Commit Graph
88 Commits
Author SHA1 Message Date
NeilClack ce42414214 Restrict proclamation editing and content to Super admins only
- Only roleId <= 1 (SUPER) can create/edit/delete proclamations
- Content field is stripped from records for non-Super users
- Content field is hidden from the form for non-Super users
- Server actions reject upsert/delete from non-Super users
2026-07-07 22:10:54 -05:00
NeilClack 4cef38a1ab Commit 2: Delete AdminForm.svelte and AdminPage.svelte 2026-07-07 21:01:02 -05:00
NeilClack 22b6adee3f Commit 1: Create individual form components per route, remove generic AdminForm dependency
- Add per-route form components: UserRoleForm, UserForm,
  ProclamationForm (with category cascade), CategoryForm,
  FreqForm, LevelForm
- Update all admin +page.svelte files to use AdminTable + AdminModal
  + their specific form component instead of AdminPage
- Update profiles page to inline fields instead of using AdminForm
- Add custom Proclamation server action with category fallback logic
  (categoryId falls back to parentCategoryId when no sub-category)
- Remove cascade/were/fieldLabels logic from generic crud.ts
- Remove outdated cascade/where tests from crud.spec.ts
- Remove fieldLabels from AdminModelConfig type
2026-07-07 21:01:02 -05:00
NeilClack 2073248576 fix: Superforms SSR import from /server path and Prisma client version mismatch
- Import superValidate from sveltekit-superforms/server instead of default
  path to avoid pulling SuperDebug.svelte into SSR
- Upgrade @prisma/client to match prisma CLI version (7.2.0 -> 7.8.0)
  so generated client's query_compiler_fast_bg files exist at runtime
- Add regression test verifying superValidate works in server context
- Add regression test verifying generated Prisma client compiler imports
  reference real files
2026-07-07 13:39:11 -05:00
NeilClack 38d1752f5b admin: Superforms + Zod validation, three-address-defaults schema, profiles toast fix
- Add Superforms + Zod 4 for all admin form validation
- Replace address isDefault with three separate boolean defaults (Mailing, Billing, Shipping)
- Update profiles page with three-checkbox address form and toast improvements
- Convert all admin page server actions to pass request directly to crud
- Export superFormErrorsToFieldErrors helper for profiles server actions
- Regenerate Prisma client for new schema fields
2026-07-07 13:36:23 -05:00
NeilClack 38347f5f24 profiles: add address management, user edit, fix form redirect
- Add type (Mailing/Billing/Shipping) and isDefault fields to Address
  schema with migration. Unique default enforced server-side.
- Rewrite profiles page with inline address creation form and
  editable user name/email within the profile modal.
- Add upsertAddress and updateUser form actions.
- Fix form redirect by adding use:enhance to AdminForm.
- Disable Update button in AdminForm until a field is changed
  (prevents accidental submissions).
2026-07-07 13:20:35 -05:00
NeilClack faacbab1de admin: remove NavBar Admin Panel link, make users list-only
- Remove redundant Admin Panel link from top navigation bar. The
  sidebar already has the full admin model tree and the Dashboard
  shows a Proclamations card for Staff+ users.
- Add listOnly: true to users admin config. Users are created via
  registration, not the admin panel. RUD operations still work.
2026-07-07 13:07:34 -05:00
NeilClack 27aae18b3a refactor: inline single-use components, remove dead code
- Inline TopBar into root layout (+layout.svelte) — only used there
- Inline Center into home page (+page.svelte) — only used there
- Remove ComboBox.svelte — dead code, no imports
- Remove TipTap.svelte — dead code, no imports
- Remove empty container/ui/admin/tiptap directories
- Keep Window.svelte in components/containers/ — used by 4 pages
2026-07-07 10:40:59 -05:00
NeilClack b87e2b0936 fix: replace CSS variable inversion with standard Tailwind dark: classes
The :root.dark CSS variable inversion caused contrast problems -
text-gray-900 and bg-gray-950 both became light in dark mode, making
text invisible on backgrounds.

Fix:
- Remove :root.dark { --color-gray-*: ... } block from layout.css
- Change :root.dark selector to .dark for form element styles
- Add standard Tailwind dark: classes throughout every .svelte page
  - dark:bg-gray-950 (page backgrounds)
  - dark:bg-gray-900 (card/surface backgrounds)
  - dark:bg-gray-800 (table headers, elevated surfaces, active nav links)
  - dark:bg-gray-700 (primary buttons)
  - dark:text-gray-100 (primary text)
  - dark:text-gray-300 (secondary text, labels)
  - dark:text-gray-400 (muted text, inactive nav links, links)
  - dark:border-gray-700 (borders)
  - dark:border-gray-600 (input borders)
  - dark:hover:bg-gray-800 (sidebar hover)
  - dark:hover:bg-gray-600 (button hover)
  - dark:prose-invert (rich text content)
- TopBar: full dark mode support (bg, links, toggle button)
- Sidebar: all nav links, active states, admin submenu get dark mode
- Auth pages (login, register, forgot, reset): full dark mode
- Protected pages (dashboard, account, setup, license-keys,
  proclamations, categories): full dark mode
- Home page, error page, admin page: dark:text-gray-100
2026-07-07 10:27:08 -05:00
NeilClack d97ed88031 feat: full dark mode with :root.dark and dark: classes
layout.css
- Change .dark → :root.dark so variable overrides match Tailwind's
  :root, :host specificity and actually take effect
- Add global dark mode styles for input/select/textarea elements

All .svelte files:
- bg-white → bg-white dark:bg-gray-100 (cards, tables, containers)
- text-white → text-white dark:text-gray-950 (button text)
- Add dark:bg-gray-950 to main page containers (dashboard, account,
  license-keys, proclamations, proclamations/[id])
- Add dark:border-gray-300 to bordered elements (cards, tables, forms)
- Add dark:bg-gray-200 to secondary backgrounds (table headers,
  address form, price badges)
- Add dark:hover:bg-gray-300 / dark:hover:bg-gray-700 to hover states
  (sidebar nav links, clear button, admin categories table)
2026-07-07 10:00:00 -05:00
NeilClack 03ecfbd635 feat: add dark/light mode toggle
- Add blocking inline script in app.html that reads localStorage
  'theme' and applies .dark class before render (no flash)
- Invert gray scale in .dark via CSS custom properties so all
  grayscale colors reverse automatically (light becomes dark)
- Add @custom-variant dark to enable dark: utility classes
- Add border-button toggle ("Dark"/"Light") in TopBar far right
- Persist preference in localStorage
2026-07-07 09:54:32 -05:00
NeilClack 5a13f2516c style: strip to grayscale wireframe
- Remap all non-gray colors (blue, green, red, purple, slate) to gray
  equivalents via Tailwind v4 @theme overrides in layout.css
- Zero out all border-radius values (square everything)
- Zero out all shadow values (no depth)
- Disable all transitions and animations globally
- Change theme-color meta tag from purple (#7B2D8E) to gray (#6b7280)
- Clean up undefined 'underlined' class and typo bg-grey-200
2026-07-07 09:50:57 -05:00
NeilClack 24f3a9f465 Add AI skills 2026-07-07 09:41:07 -05:00
NeilClack 6ff8e878a4 test: add unit tests for all auth backend logic
- Register: edge cases for non-Error throws, error message assertions,
  and verify signUpEmail was called with correct payload
- Forgot-password: empty/missing email, Error/non-Error throws
- Reset-password: load (missing/expired/valid token) and action (short
  password, mismatch, throw, success redirect)
- Account setup: load (unauthorized, returns user), action (redirect,
  falsy create, throws, isRedirect passthrough)
- Email-verification: correct URL construction, sendMail delegation,
  throw propagation
- Hooks: sets/omits locals, passes building/auth to svelteKitHandler
- Fix Svelte 5  warning on setup page by using  with
  one-time guard instead of top-level prop read
2026-07-07 09:22:56 -05:00
NeilClack 1e391c9252 redirect setup page to /dashboard instead of /account 2026-07-07 09:18:45 -05:00
NeilClack d160186925 feat: pre-fill first/last name on setup page from user's registered name 2026-07-07 09:16:54 -05:00
NeilClack 5f1edc3174 fix: prevent redirect loop on /account/setup for users without profile
- Skip profile redirect when already on /account/setup so users
  who just signed up/logged in land on the page without looping
- Add test for the skip-redirect case
2026-07-07 09:14:14 -05:00
NeilClack 209fd8456d auth: show email verified banner on login page after verification
- Append ?verified=true to callbackURL in verification link
- Login page reads query param and shows green success banner
  when user lands after email verification
2026-07-07 09:10:11 -05:00
NeilClack fc2790f6fa fix: handle duplicate email sign-up and null user in protected layout
- Register action now returns success instead of redirecting to /account/setup
  so users without a session (duplicate email with requireEmailVerification)
  see a 'check your email' message instead of crashing
- Protected layout guards against null/undefined locals.user before querying
  Prisma (was passing id: undefined)
- Updated register page to show success banner with verification instructions
- Updated test to match new action response
2026-07-07 09:05:29 -05:00
NeilClack 667ae4e05e auth: build verification link from BASE_URL env var
- Build the verification URL as /api/auth/verify-email?token=xxx&callbackURL=/login
- Pass token from Better Auth callback instead of its built-in url
- Add callbackURL=/login so user lands on login after verifying
2026-07-07 08:59:25 -05:00
NeilClack ba83c48b9e auth: extract reusable sendVerificationEmail utility, enable sendOnSignUp
- Create src/lib/server/email-verification.ts with exported utility function
- Use it in auth.ts sendVerificationEmail callback
- Enable sendOnSignUp so verification email is sent on registration
2026-07-07 08:54:47 -05:00
NeilClack a72b65be95 audit: harden better-auth config, fix types, cleanup
- Fix email verification link using Better Auth's url parameter (was hardcoded to google.com)
- Make App.Locals session/user types nullable to match reality
- Add explicit rate limiting config (60s window, 100 max)
- Add trusted origins for localhost:5173 and production domain
- Add Forgot Password? and Register links to login page
- Remove unused dead code from auth-client.ts
- Remove outdated known-bug note from AGENTS.md (register redirect is fixed)
2026-07-07 08:51:24 -05:00
NeilClack 4d4b2a1497 fix auth: register redirect, password reset flow, GHL contact ID, session handling
- Fix register redirect bug where successful signup returned 400 instead
  of redirecting to /account/setup (use isRedirect() to re-throw redirects)
- Add error display to register page and fix Svelte 5 syntax (on:click)
- Add await to Google sign-in on login page and register page
- Fix logout to await signOut and redirect to /
- Implement full password reset flow:
  - Add sendResetPassword callback to auth.ts config
  - Create forgot-password page with email submission
  - Create reset-password page with one-time token validation
  - Guard reset page: redirect to / if no valid token in URL
- Add ghlContactId field to Profile model for future Go High Level integration
- Add Prisma migration for ghl_contact_id column
- Update register test to expect redirect instead of broken 400
2026-07-07 08:30:27 -05:00
NeilClack f566866a23 remove cert file 2026-07-06 21:51:59 -05:00
NeilClack 92c5ef91c8 Update environment variables 2026-07-06 21:04:11 -05:00
NeilClack a42c32f014 Add email via Resend 2026-07-06 21:01:41 -05:00
NeilClack 96eafafbf6 Rename certificate to be more clear 2026-07-03 07:29:43 -05:00
NeilClack c9a6c791e9 run npm audit 2026-07-03 07:28:53 -05:00
NeilClack cec1b161a2 remove unused workflow 2026-07-03 07:28:46 -05:00
NeilClack c3454d1152 Add frequencies api route 2026-05-30 14:02:46 -05:00
NeilClack 218a3a3cb0 add categories admin page 2026-05-04 09:40:34 -05:00
NeilClack 1615f07974 Mock payment API 2026-05-03 21:01:08 -05:00
NeilClack 3d1d713308 Restructure route organization 2026-05-03 20:59:43 -05:00
NeilClack e563a66dc7 Add API routes 2026-03-25 17:26:09 -05:00
NeilClack 7d211ba6d8 Fix null price value 2026-03-18 12:10:16 -05:00
Neil Clack 3d2d848df6 Merge pull request 'Release 1.0.1' (#5) from dev into main
Reviewed-on: https://git.rhemawavetech.com/NeilClack/Portal.RhemaWaveTech.com/pulls/5
2026-03-18 16:47:29 +00:00
NeilClack 61fe470451 Add default price for all price fields 2026-03-18 11:31:06 -05:00
NeilClack b30281c19c Rearrange New Proclamation Form 2026-03-18 11:27:57 -05:00
NeilClack b39b7008de Move TipTap to Bottom of AdminForm 2026-03-18 11:15:08 -05:00
NeilClack 56c688f674 Add proclamations api endpoint 2026-03-18 01:09:21 -05:00
NeilClack 791114d2aa Remove unique index on Proclamation content 2026-03-17 16:55:02 -05:00
NeilClack 4f7622ab42 Update proclamation category naming constraints. 2026-03-16 13:39:53 -05:00
NeilClack 52c740b986 Customize Proclamations Admin page 2026-03-16 13:23:25 -05:00
NeilClack 0fd901b01f Ready for NixOS builds 2026-03-09 21:51:56 -05:00
NeilClack cc51f40591 Build user pages 2026-02-25 13:19:26 -06:00
NeilClack 12190d01dc Remove unused links in sidebar 2026-02-24 12:15:52 -06:00
NeilClack f562e67d89 Add favicon 2026-02-24 12:15:40 -06:00
NeilClack a579186134 Add logo to static assets 2026-02-24 12:08:01 -06:00
NeilClack 9fed7acff5 Force initialization to be lazy, preventing docker build errors 2026-02-24 10:34:44 -06:00
NeilClackandClaude Opus 4.6 10fd06887f Add comprehensive tests for profile-redirect and auth features
19 new tests across 5 test files covering the protected layout redirect,
account page load, registration action (documenting the redirect bug),
and login/register component rendering. Includes shared test utilities.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-24 08:58:01 -06:00