1. 14 May, 2026 7 commits
  2. 13 May, 2026 14 commits
  3. 12 May, 2026 8 commits
    • Mahmoud Aglan's avatar
      hgdghkd · 91ab2d74
      Mahmoud Aglan authored
      91ab2d74
    • Mahmoud Aglan's avatar
      Fix TypeError: Router passes route params as strings, not int · f458cd55
      Mahmoud Aglan authored
      Cast string params to int at the start of each controller method.
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      f458cd55
    • Mahmoud Aglan's avatar
    • Mahmoud Aglan's avatar
      vhmh · 51a900da
      Mahmoud Aglan authored
      51a900da
    • Mahmoud Aglan's avatar
      fsgdrndfh · 526babd9
      Mahmoud Aglan authored
      526babd9
    • Mahmoud Aglan's avatar
      Fix migration and seed failures: correct column references · af806c60
      Mahmoud Aglan authored
      - Phase_45_004: activity_pricing has no 'fee_type' column, use
        'nonmember_rate_pm' as AFTER target instead
      - Seed Phase_52_001: system_config uses 'group_name' not 'category',
        and 'description_ar' not 'description', and needs 'config_type'
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      af806c60
    • Mahmoud Aglan's avatar
      Pool management complete overhaul: interactive 2D grid, schedules, dashboard · 5c9ce3c8
      Mahmoud Aglan authored
      Grid rewrite:
      - Fully interactive lanes×timeslots grid with click/drag cell selection
      - Click individual cells, drag-select rectangles, row headers (full lane),
        column headers (full time slot)
      - Inline booking panel slides up from bottom when cells are selected —
        no separate page needed, book directly from the grid
      - Recurring schedules shown as purple cells on the grid
      - Real-time refresh every 30s via AJAX
      - Visual pool dimensions display with lane numbers
      
      New: Weekly Schedules (pool_schedules):
      - Create recurring weekly templates (coach, academy, age group, gender, lanes)
      - Effective date range, color-coded, max swimmers per schedule
      - Auto-displayed on the grid for the matching day of week
      - Manage page with create form + list of all schedules with delete
      
      New: Pool Dashboard (/pool/{id}/dashboard):
      - KPI cards: today/week/month bookings, swimmers, revenue, utilization %
      - Heatmap: bookings per hour per day of week (last 30 days) with color intensity
      - Booking type breakdown with progress bars
      - Lane utilization bars (hours used vs available)
      - Peak hours chart with AI recommendations for increasing occupancy
      - Low-utilization detection + suggestions
      
      Updated pool index:
      - Cards with mini pool visual, 3 action buttons (grid, dashboard, schedules)
      - Better visual hierarchy and information density
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      5c9ce3c8
    • Mahmoud Aglan's avatar
      Phase 52: Medical approval workflow, mirror grid, facility dashboard, pricing integration · d11abbce
      Mahmoud Aglan authored
      - Medical records: upload with certificate type (ممارس/أكاديمي/دولي), auto-validity
        calculation, Board of Trustees approval workflow (pending → approved/rejected)
      - New /medical-approvals page for مجلس الأمناء with approve/reject actions
      - Mirror (المراية): interactive grid system for facility scheduling - create grids,
        assign coaches/academies to boxes, manage trainees (max 5 per box)
      - Facility dashboard: per-facility stats with day/week/month/custom date filtering
      - FacilityPricingService: reads club pricing rules from system_config, integrates
        with reservation creation as rate fallback
      - Pricing seed: official 2025 club ruleset for non-educational activities stored
        in system_config (member/non-member rates, entry tickets, general fees)
      - Updated sidebar menu with medical approvals link
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      d11abbce
  4. 11 May, 2026 3 commits
    • Mahmoud Aglan's avatar
      sgjdfh · d0ef9ed6
      Mahmoud Aglan authored
      d0ef9ed6
    • Mahmoud Aglan's avatar
      sdgjdhfk · d01e77d7
      Mahmoud Aglan authored
      d01e77d7
    • Mahmoud Aglan's avatar
      Sports module overhaul: fix bugs, NID parsing, photo upload, cascading forms, auto-codes · 85a4f4fb
      Mahmoud Aglan authored
      - Fix route URL mismatches in player show.php (card/activate, card/suspend, card/revoke, enroll/drop)
      - Fix Sports module permissions (was using temp.view/temp.add, now sports.view/sports.add/sports.convert)
      - Add CSRF middleware to Sports POST route
      - Fix AcademyEnrollment::getForPlayer() to JOIN academy/level names
      - Add NID auto-parsing API and JS to player create/edit (deduces DOB, age, gender, governorate)
      - Replace raw ID inputs in enrollment form with cascading dropdowns (academy→level→schedule)
      - Add profile photo upload to player create/edit/show with live preview
      - Add full player history timeline (enrollments, payments, medical, attendance)
      - Add sport→facility cascade filter to reservation create form
      - Make all code fields optional with auto-generation (Disciplines, Academies, Facilities, Levels)
      - Overhaul Sports create form with discipline dropdown and competitive level select
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      85a4f4fb
  5. 10 May, 2026 5 commits
  6. 05 May, 2026 3 commits
    • Mahmoud Aglan's avatar
      Fix ghost lists: remove JS IntersectionObserver that hides all cards · 4cc10d4f
      Mahmoud Aglan authored
      Root cause found: app.js sets opacity:0 + transform:translateY(16px) on
      EVERY .card element at DOMContentLoaded, then relies on an
      IntersectionObserver to reveal them. When cards are already in viewport
      or content is tall, the observer fails to fire and cards stay invisible.
      
      Zooming triggered a layout recalculation that forced the observer to
      re-evaluate, making content reappear — explaining the user's symptom.
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      4cc10d4f
    • Mahmoud Aglan's avatar
      Fix boot errors: migration column-exists and seed missing-table · 88b6e082
      Mahmoud Aglan authored
      Phase_24 migration: converted to closure that checks information_schema
      before adding each column (column already exists on deployed DB).
      
      Phase_39 seed: check if permissions table exists before inserting
      (table was never created — skip gracefully).
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      88b6e082
    • Mahmoud Aglan's avatar
      Fix rendering bug: remove all GPU layer promotions from list containers · 5d11c9c2
      Mahmoud Aglan authored
      The list disappearance was caused by multiple CSS properties creating
      GPU compositing layers that Chrome fails to paint correctly for tall
      content:
      
      1. backdrop-filter on .top-header (sticky + blur = broken paint bounds)
      2. animation on .page-content (creates layer on entire page)
      3. transition:all on every table row (hundreds of compositing hints)
      4. tableRowIn animation with transform (layer per animated row)
      5. transition + hover on .card (unnecessary for a container)
      
      Removed all these GPU-triggering properties. The visual appearance is
      preserved (opacity 0.97 white background instead of blur, hover effects
      still work via :hover without transition).
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      5d11c9c2