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_tiersync all confirmed working. - Stripe Bug Fixes - Installed
php8.3-curlandphp8.3-mbstring. CorrectedAPP_URLtohttp://sitescarlet.local. FixedStripeServicereturn type from?stringto?array(returns['url', 'id']) and updated all callers. Fixed Stripe API 2026-03-25 breaking change wherecurrent_period_endmust 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
memberanduserroles β auth now handled byusers.membership_tier. Fixededitorrole permissions. Addedcoachrole withmanage_contentandview_audit_logs. Final roles: super_admin, admin, editor, coach. - Admin User Detail Page (migration 098) - New
?action=view&id=Xview 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, andusers.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.phpchecks for expired suspensions once per minute (throttled viasettingstable), automatically lifting them and recordingunsuspend_reason = 'Time Served'. - Admin Membership Tiers Page - New
/admin/membership-tierspage 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_tierstable rebuilt with slug, name, tagline, color, pricing columns, Stripe price ID columns, perks (JSON),is_active, andsort_order.user_membershipstable added tracking tier, interval, status, Stripe customer/subscription/price IDs, and billing period. All paid tiers seeded asis_active = 0. - MembershipService - Tier lookup, active membership check,
syncUserTier(),hasPerk(),isAdFree(),getCoachingDiscount(), andgetAdminMembershipList(). - StripeService -
createMembershipCheckoutSession(),createDonationCheckoutSession(),retrieveCheckoutSession(),constructWebhookEvent(),cancelStripeSubscription(),setSubscriptionCancelAtPeriodEnd(). - Pricing Page - New
/pricingroute with a tier comparison grid, 3-interval toggle (monthly / semi-annual / annual), and a donation section. - Stripe Webhook Handler -
/stripe/webhookhandlescheckout.session.completed,customer.subscription.updated/deleted, andinvoice.payment_failedevents. - Membership Billing Page -
/membership/billinglets members view their active subscription, cancel (at period end), and resume a pending cancellation. - Admin Memberships Page -
/admin/membershipsshows 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_waitlisttable records name, email, andtrack_idfor users interested in a track before sessions are scheduled.track_idcolumn added tocoaching_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 -
CoachingSessionServicefires appropriate emails on book, waitlist, admin-confirm, cancel, and promote-from-waitlist events. - Notify Interest Waitlist - Admin can send
coaching.interest_notifyemails to all un-notified interest waitlist entries for a track, linking available session dates. Marksnotified_aton 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_eventsstores scheduleable sessions (title, type: group/1-on-1, datetime, duration, capacity, price, meeting link, status).coaching_bookingstracks per-user bookings with pending/confirmed/cancelled states.coaching_waitlisttracks 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 withredirect_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/sessionsprovides 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_logswas 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
/coachingnow 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
/tracksor any individual track page while logged out redirect to/coachingso 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_clickspower the full track system. - Public Tracks UI -
/trackslists 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_clicksand shows a confirmation message. - Admin Tracks -
/admin/tracksprovides 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.phpseeds 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_badgestable had a UNIQUE constraint onuser_idalone, 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-pillCSS 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=1and displayed as π Secret on the Achievements tab. - career ENUM Column -
badge_definitionsgains acareerENUM 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-collectorchecked 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_echartsnow 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=statsis 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_definitionstable with initial badge set. - Migration 088 - Creates
user_badgestable (user_id, badge_slug, earned_at). - BadgeService -
checkAchievements($userId)callsUserStatsService::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_mapinlesson.phpand oneinit*()function in/assets/js/konva-diagrams.js.