- 30 Jun, 2026 2 commits
-
-
Mahmoud Aglan authored
Fix PermissionSeeder: use correct column names (name not slug, permission_role not role_permissions) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Fix sidebar positioning (end-0 → start-0) so it appears on the RIGHT in RTL - Fix main content margin (me-64 → ms-64) to offset sidebar correctly - Fix TrainingProgram queries using non-existent is_active column → status - Fix User queries using is_active → status - Fix invoice type 'invoice' → 'standard' to match CHECK constraint - Fix CollectPaymentWizard using balance_due → due_amount + billable morphs - Fix notification template Blade parse error (unclosed parenthesis) - Align 10+ sidebar permission checks with actual route middleware permissions - Add missing permissions to seeder (pos.sell, inventory.list, reports.view, etc.) - Add comprehensive global error handler with full stack trace, SQL log, request data - Add Arabic error pages (500, 403, 404) with detailed debugging info Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 29 Jun, 2026 13 commits
-
-
Mahmoud Aglan authored
Audited all varchar-limited columns vs code that generates values for them: - BranchForm: validation was max:20 but column is varchar(10) — fixed - ActivityService: Str::slug output now capped at 90 chars (column is 100) - TrainingProgramService: same slug truncation fix - SetupWizard: slug generation for activities/programs also truncated - Logout: removed navigate:true (app→guest layout cross breaks) Affected columns and their limits: branches.code = varchar(10) ✓ fixed training_groups.code = varchar(10) ✓ already validated activities.slug = varchar(100) ✓ now truncated training_programs.slug = varchar(100) ✓ now truncated Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Str::slug on Arabic names can produce codes longer than 10 chars. Added Str::limit(..., 10, '') to truncate. Also removed navigate:true from redirects to avoid Livewire SPA issues between layouts. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Replaced x-data/x-show/x-transition with @if($currentStep === N)/@endif. Livewire re-renders the component on each step change, so only the active step's HTML is sent to the browser. No JS needed, no entangle, no Alpine timing issues. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. app.js was importing and starting Alpine manually, but Livewire 3/4 already bundles Alpine. Two instances meant $wire magic was unavailable. Now app.js just registers the focus plugin via Livewire's alpine:init hook. 2. Wizard x-data used @entangle which compiled to the old window.Livewire.find(id).entangle() syntax. Replaced with $wire getters which is the canonical Livewire 3+ approach. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Livewire components use $this->authorize() which goes through Laravel's Gate system. Without a Gate callback, super_admin gets 403 because no policies exist. Gate::before delegates all ability checks to our PermissionService (which returns true for is_super_admin). Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Sidebar: route names in navigation array didn't match actual registered routes (e.g. 'participants.index' vs 'participants.list'). Remapped all entries to match the real route names from route:list. Login: replaced `redirect(navigate: true)` with `redirectIntended()` — Livewire SPA navigation between different layouts (guest→app) fails silently, requiring a manual page refresh. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
The @php block starting at line 1 was never closed before another @php was opened at line 99, causing "unexpected variable $permissionService". Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Remove double <aside> wrapper (app.blade.php was wrapping sidebar in its own aside, conflicting with sidebar's own fixed positioning) 2. Replace auth()->user()->can() with PermissionService->can() which properly handles is_super_admin bypass Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
-
Mahmoud Aglan authored
Laravel 13's Symfony dependencies require PHP >= 8.4.1. The container was crash-looping because the entrypoint hit Composer's platform check against the 8.3 runtime. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Handles transient GitHub CDN 400 errors during Docker build. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- All 14 domain modules with models, services, events, listeners - Auto-enrollment with auto-group creation when capacity full - SuperAdmin setup wizard (8-step first-login onboarding) - Receptionist desk wizards (registration, enrollment, payment, POS) - Complete permission seeder (138 permissions, 10 roles) - Full sidebar navigation with permission gates - Docker + supervisor (PHP-FPM, nginx, queue worker, scheduler) - Pre-deploy checklist and FK verification scripts - All 35 events registered with ShouldDispatchAfterCommit - All listeners queued with ShouldQueue - RTL Arabic-first UI with logical Tailwind properties Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
-