Skip to main content

Recent Changes

Track the latest updates and changes made to Siteview across all tools and resources. Showing page 1 of 7.

Version 5.0.1 (April 20, 2026)

Stripe Sandbox Testing Complete + Admin User Management Overhaul

  • Stripe End-to-End Testing - Full sandbox flow verified: donate ($1–$50), Pro monthly membership, webhook processing, and user_memberships + membership_tier sync all confirmed working.
  • Stripe Bug Fixes - Installed php8.3-curl and php8.3-mbstring. Corrected APP_URL to http://sitescarlet.local. Fixed StripeService return type from ?string to ?array (returns ['url', 'id']) and updated all callers. Fixed Stripe API 2026-03-25 breaking change where current_period_end must now be calculated from the subscription item interval.
  • Donate Page - One-time donations only; monthly checkbox removed. Membership upgrade CTA added for members who want recurring support.
  • Roles Cleanup (migration 097) - Dropped member and user roles β€” auth now handled by users.membership_tier. Fixed editor role permissions. Added coach role with manage_content and view_audit_logs. Final roles: super_admin, admin, editor, coach.
  • Admin User Detail Page (migration 098) - New ?action=view&id=X view showing Account Info, Roles, Active Membership, Suspension History, Login History, Page Views, and Donations per user.
  • Destructive Action Modals - Suspend, unsuspend, ban, unban, and delete actions all require a modal with a mandatory reason field. Reasons stored in user_suspensions.reason, user_suspensions.unsuspend_reason (migration 099), users.banned_at/banned_by_user_id/status_reason, and users.status_reason.
  • Suspension History Cards - Each suspension displayed as a numbered incident card showing suspended-by, duration, reason, and (if lifted) lifted-by, date, and reason.
  • Auto-Lift Expired Suspensions - bootstrap.php checks for expired suspensions once per minute (throttled via settings table), automatically lifting them and recording unsuspend_reason = 'Time Served'.
  • Admin Membership Tiers Page - New /admin/membership-tiers page showing all tiers with pricing, Stripe price IDs, perks, and Activate/Deactivate toggle per tier.

Version 5.0.0 (April 14, 2026)

Memberships & Stripe Integration

  • Stripe Checkout Integration - stripe/stripe-php ^20.0 installed via Composer. Stripe Checkout (redirect mode) implemented for memberships and donations. Three sandbox products created: Basic, Pro, Elite β€” each with monthly, semi-annual (10% off), and annual (20% off) pricing.
  • Membership Tiers (migration 095) - membership_tiers table rebuilt with slug, name, tagline, color, pricing columns, Stripe price ID columns, perks (JSON), is_active, and sort_order. user_memberships table added tracking tier, interval, status, Stripe customer/subscription/price IDs, and billing period. All paid tiers seeded as is_active = 0.
  • MembershipService - Tier lookup, active membership check, syncUserTier(), hasPerk(), isAdFree(), getCoachingDiscount(), and getAdminMembershipList().
  • StripeService - createMembershipCheckoutSession(), createDonationCheckoutSession(), retrieveCheckoutSession(), constructWebhookEvent(), cancelStripeSubscription(), setSubscriptionCancelAtPeriodEnd().
  • Pricing Page - New /pricing route with a tier comparison grid, 3-interval toggle (monthly / semi-annual / annual), and a donation section.
  • Stripe Webhook Handler - /stripe/webhook handles checkout.session.completed, customer.subscription.updated/deleted, and invoice.payment_failed events.
  • Membership Billing Page - /membership/billing lets members view their active subscription, cancel (at period end), and resume a pending cancellation.
  • Admin Memberships Page - /admin/memberships shows per-tier subscriber counts, MRR estimate, and Stripe subscription links.
  • Pricing Link - Added to the primary top navigation.

Version 4.9.1 (April 13, 2026)

Coaching Phase 2: Interest Waitlist + Email Notifications + My Sessions Tab

  • Coaching Email Templates (migration 093) - Eight coaching email templates added: booking confirmed, waitlisted, session confirmed by admin, cancelled, promoted from waitlist, admin alerts for new bookings and waitlist joins, and interest waitlist notification.
  • Interest Waitlist (migration 094) - coaching_interest_waitlist table records name, email, and track_id for users interested in a track before sessions are scheduled. track_id column added to coaching_events.
  • Track Waitlist Join - /tracks/{slug} shows a "Join the Waitlist" button for logged-in users. State persists on return visits. Login-gated via AJAX POST.
  • Email Notifications - CoachingSessionService fires appropriate emails on book, waitlist, admin-confirm, cancel, and promote-from-waitlist events.
  • Notify Interest Waitlist - Admin can send coaching.interest_notify emails to all un-notified interest waitlist entries for a track, linking available session dates. Marks notified_at on send.
  • Admin Tracks - Waitlist column added to track list (orange count, links to waitlist view). Waitlist management view shows Name / Email / Joined / Notified / Remove. "Notify Waitlist" email button added.
  • Admin Coaching Sessions - Coaching Track dropdown on create/edit form links a session to a track's interest waitlist. "Notify Track Waitlist" button appears on the Bookings view.
  • Track Analytics β€” Waitlist Conversion Funnel - Table showing Joined / Notified / Never Notified / No Response / Booked / Confirmed / Avg Days to Book / Conversion Rate per track.
  • Profile My Sessions Tab - Shows Upcoming Bookings (Confirmed βœ… / Pending ⏳ badges, Join Meeting button), Waitlist Entries (amber), and Past Sessions (dimmed).

Version 4.9.0 (April 12, 2026)

Coaching Session Scheduling System (Phase 1)

  • Live Session Scheduling β€” 3 New Tables (migration 092) - coaching_events stores scheduleable sessions (title, type: group/1-on-1, datetime, duration, capacity, price, meeting link, status). coaching_bookings tracks per-user bookings with pending/confirmed/cancelled states. coaching_waitlist tracks waitlist entries with auto-promote on cancellation.
  • CoachingSessionService - Full service class covering event CRUD, booking flow (capacity check β†’ book or auto-waitlist), cancellation with automatic waitlist promotion, and admin helpers (confirm/cancel bookings, remove waitlist entries).
  • Public Booking Flow - /coaching/book/{id} shows event details and context-aware action: Book My Spot (free or priced), Join Waitlist when full, You're Booked confirmation with meeting link for confirmed attendees, cancel option. Login-gated with redirect_after_login.
  • /coaching Page β€” Live Events - Live Sessions section now queries the DB and renders real upcoming event cards with date, time, duration, capacity, price, and Book Now / Join Waitlist / You're Booked / On Waitlist state badges. Falls back to Coming Soon placeholders when no events are scheduled.
  • Admin Live Sessions - /admin/coaching/sessions provides full event management: list view with booking/waitlist counts and full/capacity indicators, create/edit form (all fields including datetime picker and meeting link), and a Bookings view showing all attendees with confirm/cancel actions plus the full waitlist with remove option.
  • Admin Nav - Live Sessions link added to Content & Tools section. Pending Approvals moved from Work Queue to Users & Access.
  • Admin Nav Reorganisation - Site Analytics moved to Analytics & Logs. Email Delivery Logs moved from Communications to Analytics & Logs. Raw Content moved from Content & Tools to System & Config. Project Phases and Items collapsed as sub-links under Roadmap.
  • Recycle Bin - Pages, Email Templates, and Roles (all soft-deletable) are now tracked, with correct labels, restore, and permanent-delete support.
  • Bug Fix β€” admin_user_approvals - $user_email_logs was not passed to the view, causing a fatal TypeError on the user detail panel.

Version 4.8.1 (April 12, 2026)

Coaching Login Gate + Teaser Page

  • Coaching Teaser Page - Logged-out visitors to /coaching now see a dedicated marketing/teaser page instead of the full coaching interface. The page includes a hero section with CTAs (Join Free / Log In), four feature pillars (Tracks, Group Sessions, 1-on-1, Ask an Expert), a live preview of available coaching tracks with a Members Only badge, and a sign-up call-to-action box at the bottom.
  • Coaching Gated to Members - /coaching, /tracks, and /tracks/{slug} all require a logged-in session. Logged-out users are shown the teaser or redirected to it.
  • Tracks Redirect - Direct visits to /tracks or any individual track page while logged out redirect to /coaching so the teaser page handles the conversion flow.

Version 4.8.0 (April 12, 2026)

Coaching Tracks System (migration 091)

  • Coaching Tracks β€” 4 New DB Tables (migration 091) - coaching_tracks, coaching_track_steps, coaching_track_completions, coaching_track_cta_clicks power the full track system.
  • Public Tracks UI - /tracks lists all published coaching tracks. /tracks/{slug} shows the full step-by-step track with numbered step cards, action prompt boxes, linked calculators, AJAX Mark as Complete toggle, and a progress bar.
  • Waitlist CTA - Each track page ends with a waitlist join button that records the click in coaching_track_cta_clicks and shows a confirmation message.
  • Admin Tracks - /admin/tracks provides full CRUD for tracks and steps, plus an Analytics tab showing views, unique visitors, users started/finished, step completions, CTA clicks, and conversion rate per track. Step Funnel view shows per-step drop-off.
  • Seed Script - scripts/seed_coaching_tracks.php seeds the "Negotiate Your Next Raise" track with 5 steps linked to the percentage-change, compound-interest, and roi-calculator tools.
  • /coaching Page Rebuilt - Two-column layout: left shows live coaching tracks grid + Live Sessions teaser cards (group and 1-on-1, both Coming Soon); right shows Ask an Expert panel.
  • Admin Nav - Coaching Tracks link added to the Content and Tools section of the admin left nav.
  • Homepage Strip - Coaching Tracks section added to the homepage between Math Topics and Career Paths.

Version 4.7.2 (April 12, 2026)

Stats Tab Achievements Rebuild + Badge Progress UI

  • Stats Tab β€” Achievements Section Rebuilt - Replaced the full badge grid with three focused components: (1) overall progress bar showing earned vs. total badges, (2) Recently Earned β€” last 5 badges as emoji circles with name below, (3) Almost There β€” top 3 locked badges closest to completion, each with an amber progress bar and X/max label.
  • Achievements Tab β€” Progress on Locked Badges - Every locked badge now shows a 3px amber progress bar beneath the badge name plus an X/max fraction, giving users a clear sense of how close they are to each badge.
  • UserStatsService::getBadgeProgress() - New method computing 16 raw counts (lessons, quizzes, calculators, streaks, quiz scores, career tracks, etc.) used to power per-badge progress across both tabs.
  • Bug Fix β€” Almost There Filter - Badges where the current count already meets or exceeds the threshold are excluded from the "Almost There" list even before the DB write catches up.
  • Bug Fix β€” checkAchievements() Call Order - Badge awards now write to the DB before badge data is loaded, so newly earned badges appear immediately without a page refresh.
  • Bug Fix β€” user_badges Unique Key (migration 090) - The user_badges table had a UNIQUE constraint on user_id alone, limiting each user to one badge. Migration 090 corrects this to a composite key on (user_id, badge_slug). The migration runner now allows error 1091 (duplicate key name) so the old index drop is safe to re-run.
  • Bug Fix β€” .ach-pill Styles on Stats Tab - The .ach-pill CSS class was only loaded on the Achievements tab; Recently Earned badges now render correctly on the Stats tab.

Version 4.7.1 (April 12, 2026)

Badge System Expansion β€” 25 New Badges + Achievements Tab Overhaul

  • 25 New Badges - Six new badge categories expanded: streak (comeback-kid, early-bird, night-owl, weekend-warrior), learning (lessons-25, lessons-50, lessons-100, all-topics-starter, well-rounded, reader), quiz (quiz-80, quiz-persistence, quiz-sharpshooter, quiz-mastery, quiz-consistent, lucky-guess, overachiever), tools (explorer-tools, power-user, curator), career (future-developer, finance-ready, data-mindset, engineer-path), special (top-contributor, badge-collector). Total ~47 badge definitions.
  • is_hidden Flag - Secret badges (lucky-guess, overachiever, comeback-kid, early-bird, night-owl) are stored with is_hidden=1 and displayed as πŸ”’ Secret on the Achievements tab.
  • career ENUM Column - badge_definitions gains a career ENUM column for career-track badge criteria.
  • checkAndAwardBadges() Fully Expanded - All new badge conditions implemented: completionist topic queries, quiz retry/improvement detection, total tool usage, visit-pattern checks (weekend days, time-of-day, gap detection), and multi-topic career track joins. badge-collector checked post-write.
  • Achievements Tab Redesign - Hero progress bar + "Next lesson badge: X to go" hint. Per-category headers with earned count. Badge display: 52px emoji circle + name below (no cards). Unearned hidden badges shown as πŸ”’ Secret.
  • 30-Day Activity Chart Fix - Missing ECharts load corrected ($needs_echarts now set for the stats tab); switched from a calendar heatmap to a readable bar chart.

Version 4.7.0 (April 12, 2026)

Personal Learning Dashboard + Full Badge System (migrations 087–088)

  • Stats Tab Rebuilt - /profile?tab=stats is now a full personal learning dashboard with 8 sections: Activity Snapshot (4 stat cards + weekly trend deltas + 30-day bar chart), Your Next Move (up to 4 actionable CTAs), Overall Progress (hero % card), Active Topics (progress bars for started topics), Your Skills (quiz scores as skill levels with radar chart), Favorite Tools (list + category insight), Learning Insights (tiles for most active day, favourite topic, avg session, etc.), and Achievements (visible badges with progress).
  • New UserStatsService Methods - getWeeklyTrend(), getLearningInsights(), getFocusTopic(), checkAndAwardBadges(), getUserBadges(), getAllBadgeDefinitions(), getNextMoves(), getActivityHeatmap().
  • Skills Radar Chart - ECharts radar chart showing quiz performance across topics; renders when β‰₯3 topics have quiz data.
  • Skill Level Badges - Quiz scores displayed as πŸ”΅ Expert / 🟒 Strong / 🟑 Improving / πŸ”΄ Needs Work tiers.
  • Migration 087 - Creates badge_definitions table with initial badge set.
  • Migration 088 - Creates user_badges table (user_id, badge_slug, earned_at).
  • BadgeService - checkAchievements($userId) calls UserStatsService::checkAndAwardBadges() plus profile/feedback checks; called on every profile page load.

Version 4.6.0 (April 11, 2026)

Konva.js Interactive Diagrams β€” 3 Lesson Types

  • Interactive Diagram Panel - Added a "Interactive Diagram" panel (green left border) between lesson content and the calculator CTA on 5 targeted lessons across Geometry and Algebra topics.
  • Pythagorean Triangle Diagram - Lesson: Pythagorean Theorem. Two draggable handles control leg a (vertical, red) and leg b (horizontal, blue). Hypotenuse c recalculates live. Right-angle box marker shown at the corner. Live equation display: aΒ² + bΒ² = cΒ².
  • Unit Circle Explorer Diagram - Lessons: Understanding Angles: Degrees & Radians Β· The Unit Circle. Draggable point constrained to the circumference. Radius arm, dashed sin (red) and cos (blue) projection lines, and a filled angle wedge all update in real time. Info panel shows ΞΈ in degrees and radians plus sin ΞΈ, cos ΞΈ, and tan ΞΈ to 4 decimal places.
  • Slope Explorer Diagram - Lessons: Slope and Linear Relationships Β· Graphing on the Coordinate Plane. Two draggable points snap to grid intersections. An extended line is drawn through both points. Rise (red dashed) and run (green dashed) indicators show the right-triangle components with live labels. Slope formula shown as rise Γ· run, simplified fraction, and decimal.
  • Zero Overhead on Other Pages - Konva.js is loaded from CDN only on lesson pages that have a mapped diagram. All other pages are unaffected.
  • Extensible Architecture - Adding a new diagram requires one entry in $_konva_map in lesson.php and one init*() function in /assets/js/konva-diagrams.js.