1. 01 Sep, 2026 1 commit
    • Mahmoud Aglan's avatar
      fix(live): make the manager show the tournaments EL3AB actually runs · 4a2cb04f
      Mahmoud Aglan authored
      The manager could only ever see the external Swiss service. Every tournament
      the player app's own engine ran was invisible here: standings came back empty,
      pairings were read from a column that does not exist (swiss_api_round_id,
      against a swiss_round_id column), and three of the fallback tables the service
      queried have never existed in this schema.
      
      The public live page was also fatal. The Swiss service wraps its rows in
      {"data": [...]}; the standings view iterated the wrapper, so "data" + 1
      crashed PHP 8 and printed a stack trace with server paths to anyone holding the
      link. Two more views did the same thing to the native pairing shape, which puts
      an object where the Swiss shape puts a name.
      
      - NativeTournamentService reads the engine's rounds and computes standings,
        pairings and tiebreaks from them; LiveDataService is native-first throughout.
      - display_errors is off in the image, so a fatal is logged, never rendered.
      - Start no longer flips a tournament to in_progress and leaves it unpaired, and
        Generate Round no longer answers "no link to the Swiss system" for every
        tournament EL3AB runs. Both ask the player app's engine, authenticating with
        the service key both apps already hold.
      
      Two controls on the live page were scenery. The player-compare selects were
      filled from a class the players view no longer emits, and choosing two names ran
      a function whose whole body hid the result; the player card modal needed a
      data-player payload nothing rendered. Both now work off data already on the page.
      
      Visually the page was rebuilt around what a spectator opens it for: the boards
      and the leaderboard first (the share box and compare tool used to be pulled
      above them on a phone by order:-1), a podium, avatars and form dots, board cards
      that show at a glance which games are still running, a readable rounds timeline,
      a knockout bracket with connectors, and a QR that leads the share card instead of
      hiding behind a disclosure. Sections no longer render at opacity 0 when script
      does not run.
      
      tools/verify-cycle.mjs runs the whole cycle across both apps and checks the
      manager reports what the players did; it passes.
      Co-Authored-By: 's avatarClaude Opus 5 (1M context) <noreply@anthropic.com>
      4a2cb04f
  2. 03 Jul, 2026 2 commits
  3. 22 Jun, 2026 1 commit
  4. 21 Jun, 2026 6 commits
  5. 06 Jun, 2026 3 commits
  6. 05 Jun, 2026 1 commit
  7. 31 May, 2026 1 commit
  8. 30 May, 2026 15 commits
  9. 26 May, 2026 2 commits
    • Mahmoud Aglan's avatar
      fix: replace Auth::csrfField() with Auth::csrfToken() + fix org-leaderboards view mismatch · 0dc3c835
      Mahmoud Aglan authored
      Auth::csrfField() doesn't exist — replaced all 24 occurrences across org modules
      with the correct <input type="hidden" name="_csrf" value="<?= Auth::csrfToken() ?>">.
      Also fixed org-leaderboards index.php which was actually the org-board view (using
      $org variable that wasn't passed by the index action), renamed it to org-board.php
      and created a proper index.php for global rankings. Fixed org_members column name
      (user_id → player_id) in org-applications controller.
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      0dc3c835
    • Mahmoud Aglan's avatar
      feat: Live Tournaments Update — public tournament pages with 40 features · e79d4439
      Mahmoud Aglan authored
      Full public-facing live tournament system:
      - Public pages at /live/{slug} with no auth required
      - 5 visual themes (default, neon, minimal, royal, arena)
      - Live standings, pairings, bracket with auto-refresh polling
      - Countdown timer, player roster, results feed, timeline
      - Prize display, announcements feed, photo gallery
      - QR code sharing, social share, embeddable widget
      - SEO meta tags (OG, Twitter Cards, JSON-LD)
      - Tournament ad slots with impression/click tracking
      - Analytics tracking (views, sections, referrers)
      - Admin config panel: visibility toggles, custom CSS, slug management
      - Mobile responsive with dark/light mode support
      - Print-optimized view
      
      New DB tables: tournament_announcements, tournament_ad_slots,
      tournament_page_views, tournament_media
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      e79d4439
  10. 25 May, 2026 8 commits
    • Mahmoud Aglan's avatar
      fix: update theme to El3ab brand identity + add reset button · 853341b5
      Mahmoud Aglan authored
      - Update variables.css surfaces to match brand navy (#152132)
      - Add sidebar-bg and input-bg CSS variables with fallbacks
      - Add "Reset to Brand Identity" button in branding settings
      - Add resetColors controller action that reverts all colors to
        their default_value from platform_theme
      - Reset live DB colors to brand defaults
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      853341b5
    • Mahmoud Aglan's avatar
      feat: organizational steroids update — 18 new modules + bugfixes · c08ba733
      Mahmoud Aglan authored
      - Add 18 org ecosystem modules: frames, invites, applications, chat,
        treasury, challenges, achievements, transfers, recruitment, events,
        content, leaderboards, partnerships, loyalty, rosters, training,
        media, spotlights (controllers + views + CSS assets)
      - Add core services: SupabaseStorage, OrgPermissions, ThemeService
      - Add migration 003 (23 new tables, RLS policies, indexes)
      - Fix games edit not saving (wrong column names: icon→icon_url,
        matchmaking_config→config)
      - Fix branding colors not reflecting (added ThemeService to inject
        DB theme colors as CSS variable overrides at render time)
      - Update permissions.php with new module access for admin/org roles
      - Update sidebar with org ecosystem navigation section
      - Add 120+ new routes for all org modules
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      c08ba733
    • Mahmoud Aglan's avatar
      tournament update · 8b678c5b
      Mahmoud Aglan authored
      8b678c5b
    • Mahmoud Aglan's avatar
      fix: chess bots not showing - extract bots array from API response · e87eca4e
      Mahmoud Aglan authored
      API returns {bots: [...], count: N} not a flat array.
      Also fixed pool stats mapping (pool_alive/pool_idle) and portrait URLs
      to use full Stockfish API base URL.
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      e87eca4e
    • Mahmoud Aglan's avatar
    • Mahmoud Aglan's avatar
      fix: align remaining modules to actual Supabase column schemas · 0402e2b4
      Mahmoud Aglan authored
      - ads: remove non-existent columns (advertiser, placement, cpm, title, body, click_url, image_url), use actual schema (campaign_type, target_slots, target_games, budget_daily)
      - moderation: resolution→action_taken, resolved_by→reviewed_by (UUID), resolved_at→reviewed_at
      - tournaments: el3ab_tournament_players→tournament_registrations, swiss_tournament_id→swiss_api_tournament_id
      - players: remove email from insert (not in profiles), banned_at removed, use ban_expires_at
      - notifications: remove is_broadcast (not in schema), detect broadcast by null user_id
      - settings: is_editable→is_secret, handle JSONB value column
      - auth: last_login→last_login_at
      - Created el3ab_tournament_rounds table on server
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      0402e2b4
    • Mahmoud Aglan's avatar
      fix: align all code to actual Supabase DB schema · 367e98e5
      Mahmoud Aglan authored
      Table renames: transactions→economy_transactions, organizations→el3ab_organizations
      Column fixes: user_id→player_id, last_active_at→last_seen_at, reported_id→reported_player_id,
      organizer_id→created_by, actor→actor_id, entity_type→resource_type, entity_id→resource_id
      Schema match: economy_transactions uses type credit/debit + reason + source_id,
      audit_log uses actor_id/resource_type/resource_id/details,
      org_members uses player_id, ad_campaigns uses spent_total.
      Created admin_users, approval_requests, workflow_rules tables on server.
      Co-Authored-By: 's avatarClaude Opus 4.6 <noreply@anthropic.com>
      367e98e5
    • Mahmoud Aglan's avatar
      k · 080ac7e2
      Mahmoud Aglan authored
      080ac7e2