Commit Graph
93 Commits
Author SHA1 Message Date
NeilClack 6266be0edf admin: category drag-and-drop reorder + modal-based license key management
- Add sortOrder column to ProclamationCategory with migration
- Implement drag-and-drop reorder in AdminTable with persist-to-DB
- Refactor AdminTable to use $derived + dragOverride (no $effect sync)
- Replace window.location.reload with invalidateAll for reorder

- Convert license key create to modal with subscription level dropdown
- Add LicenseKeyForm.svelte following the CategoryForm pattern
- Add replace action (delete + generate new key with same level)
- Remove deactivateOld checkbox; each key has its own level
- Use use:enhance with update() to refresh list after create/replace
2026-07-08 12:59:55 -05:00
NeilClack 93d941569e proclamation-categories: sub-category management inline in parent form
- Registry: Remove 'parent.name' from listFields (all shown records
  are top-level with no parent), remove 'parent: true' from include
  since unused
- +page.server.ts: Custom load filters to parentId=null (top-level
  only); custom upsert syncs children (create/update/delete) and
  handles P2002 duplicate-name errors; custom delete cascades to
  children first to avoid FK constraint violations
- CategoryForm.svelte: Replace parentId select dropdown with dynamic
  list of sub-category inputs. Each row has a name field and Remove
  button. Pre-populates from record.children when editing existing
  categories. Add Sub-category button appends new rows
- +page.svelte: Remove unused relationOptionsData prop from
  CategoryForm; rename submit button label from 'Update' to 'Save'
- prisma: Add ProclamationCategorySubscriptionLevel join table
  migration and regenerate client
- General: Update TipTap mock, Toast, license-keys page, proclamations
  server/route tests, README, AGENTS.md, and other admin forms
2026-07-08 10:31:28 -05:00
NeilClack 37bed4f64c Update AGENTS.md with detailed Svelte 5 gotchas, testing patterns, and admin form architecture
Covers select binding workaround, / sync pattern,
Playwright locator API, test patterns, dirty-state submit, and
Super-only proclamation restrictions.
2026-07-07 22:29:13 -05:00
NeilClack f7d255b744 Add unit/component tests for proclamation admin forms
Server tests cover load content stripping per role and upsert/delete
role enforcement. Client tests verify field rendering, pre-fill on
edit, content visibility per role, and submit button dirty-state.

Switched selects from bind:value/value to selected attribute pattern
to work around Svelte 5 select value reactivity in test env.
2026-07-07 22:27:19 -05:00
NeilClack 9ddad9d834 Fix proclamation form fields not auto-filling on edit
Switch from  initialized from prop to -synced
values so form fields always populate when the record changes.
Key the TipTap editor on record.id to force re-render.
2026-07-07 22:14:23 -05:00
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
NeilClack b8d1ba11e7 Update all routes to redirect users to create a profile if one does not exist 2026-02-24 08:17:37 -06:00
NeilClack 3c201f9b66 Add sub-categories to affirmation categories
Add self-referential parent/child relation on AffirmationCategory for
   one-level hierarchy. Update AffirmationForm with two-level category and
   sub-category dropdowns, server actions with find-or-create hierarchy
   logic, AffirmationList with Parent
2026-02-23 10:53:15 -06:00
NeilClack a230a1e36d Build Admin pages 2026-02-23 10:21:42 -06:00
NeilClack bec8f57a93 Fix affirmation list and add frequencies page 2026-02-23 08:47:58 -06:00
NeilClack e390896f44 Add margin below page title 2026-02-23 07:33:55 -06:00
NeilClack 30b02f6343 Update CLAUDE context 2026-02-21 22:28:01 -06:00
NeilClack 1c0c915cd9 Add debug log 2026-02-21 22:17:36 -06:00
NeilClack 94ae2fa5b5 Update Radiant to Rhema 2026-02-21 22:03:32 -06:00
NeilClack 81478ae695 Guard against missing ca certificate during builds 2026-02-20 10:48:50 -06:00
NeilClack 3ea3ccb2ad periodic commit 2026-02-20 10:25:55 -06:00
NeilClack 664b6daa7f Implement License Key API 2026-02-19 13:00:08 -06:00
NeilClack aa51b4a452 Remove workflows, for now 2026-02-19 11:25:44 -06:00
NeilClack 52b6e56c90 Change ssl rejectunauthorized to true 2026-02-19 11:17:32 -06:00
NeilClack 18943e1e13 Remove unused console.log statements 2026-02-19 10:55:31 -06:00
NeilClack 9687d3fe79 Switch to using a pg pool for database connections 2026-02-19 10:55:05 -06:00
NeilClack aa28ab6f22 Add .env.example 2026-02-19 10:14:51 -06:00
NeilClack c34e10159d Add user profiles and account setup page 2026-02-03 10:11:00 -06:00
NeilClack 2df81d20e3 Create the account setup page
This page is not behind (protected) because it must not use the (protected)/layout.
This means that this page also needs to handle it's own authentication, because it should not be open to the public either.
2026-02-02 22:40:11 -06:00
NeilClack 9d75cb07e4 Add the profile to the database. 2026-02-02 22:05:57 -06:00
NeilClack e50b08a0df Add prisma commands to package.json script
Instructions for running these commands are in the README file
2026-01-30 23:45:33 -06:00
NeilClack 6e50941030 Update the action workflow to utilize secrets
Instead of managing a .env file on the server, I have begun the migration to Github secrets.
This is a tes tto see if I can pass in the Google OAuth client secret.
If so, then I can migrate the rest of the environment variables and manage them in one easy place..

I should still keep a record of these somewhere, encrypted, hidden, and safe.
2026-01-30 23:33:36 -06:00
NeilClack 36ee56f96a Auto restart container on shutdown 2026-01-26 11:31:33 -06:00
NeilClack 8e5f39b205 Run container in host network 2026-01-20 18:29:29 -06:00
NeilClack 624f42500f Enfore port and host for possible bug fix 2026-01-20 18:23:22 -06:00
NeilClack 480f5159c3 Add replace to podman command 2026-01-20 18:13:22 -06:00
NeilClack 9acd3b66e3 Add placeholder values for build 2026-01-20 17:10:28 -06:00
NeilClack e95397e173 Add deployment action 2026-01-20 17:07:28 -06:00
NeilClack db9cace1de Add placeholder text to price 2026-01-20 16:52:00 -06:00
NeilClack da205344fe Fix text box to be "full sized" 2026-01-20 16:51:44 -06:00
NeilClack f1d3a62c21 Simplify Docker deployment 2026-01-20 14:35:08 -06:00
NeilClack 1f5ab4abb6 Revert 2026-01-20 12:37:23 -06:00
NeilClack b5f2b15f09 try adapter-pg 2026-01-20 12:27:31 -06:00
NeilClack 5ef46d9478 Changed connection string parsing 2026-01-20 12:04:50 -06:00
NeilClack efb8eab38b Change adapter to node 2026-01-20 08:40:05 -06:00
NeilClack 30e7f8e00a CRUD - Affirmations 2026-01-19 14:59:51 -06:00
NeilClack 0991d1916b Fix styling & alignment issues 2026-01-14 11:20:26 -06:00
NeilClack ef181d42c6 Added Google to Registration page 2026-01-13 18:09:21 -06:00
NeilClack ef855ae9a9 Init Project
This is a pretty far-developed starting point. Authentication has been intialized with Better-Auth, a database has been setup with Prisma, and Google + email logins have been enabled, as well as Google + Email registration.
2026-01-13 16:21:12 -06:00