- 26 Jul, 2026 6 commits
-
-
Mahmoud Aglan authored
Same ->value fix as registration list — enum object cannot be used directly as array offset. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Remove 2-column grid (caused fields cramming side-by-side) - All fields stack full-width for clean readability - Radio/checkbox options in bordered card-style containers - Proper focus states using site accent color - Shadow and rounded inputs for depth - Better section dividers with centered lines - Submit button with icon, shadow, and loading spinner - Error states with icon indicators - Terms field highlighted with amber background Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
$reg->status is a backed enum — use ->value to get the string for array indexing and string comparisons. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Add explicit bg-white text-gray-900 to all form inputs so text is visible regardless of inherited site CSS variables. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Remove fixed h-40 + object-cover from event list cards and gallery previews in the create wizard. Images now display at natural aspect ratio with object-contain so sponsor logos at edges are fully visible. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Replace object-cover (crops to fill) with object-contain (fits entire image) across all event and news views. Remove fixed aspect-ratio constraints so sponsor logos at image edges are fully visible. Event show cover now bleeds full-width past the container. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 25 Jul, 2026 14 commits
-
-
Mahmoud Aglan authored
- 6 hero variants: fullscreen, split_right, split_left, centered_minimal, video_bg, slideshow - 5 navbar styles: solid, transparent, floating, centered, minimal (with CTA, logo position, social toggle) - 4 footer styles: dark, light, accent, transparent (with configurable blocks & columns) - Multi-column layout selector (grid_2/3/4, list, carousel) for activities, programs, trainers, news, branches - Visual variant picker in section editor with radio cards and mini previews - Footer block builder with add/remove/reorder (about, links, contact, social, hours) - Phase B migration adds navbar_cta_text, footer_blocks, footer_style, etc. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- CSS: all hardcoded colors replaced with CSS variables - CSS: data-animation system (fade-up/down/left/right, zoom, flip, bounce) - CSS: card style overrides via data-card, navbar variants via classes - CSS: reduced-motion support, RTL logical properties throughout - JS: IntersectionObserver for data-animation sections - JS: gallery lightbox, FAQ accordion, floating navbar scroll - Theme editor: mini-mockup template previews, better color preview strip - Theme editor: visual density indicators, shape/card mini previews - Theme editor: spinner on save, auto-dismiss success toast - Section manager: RTL-safe toggle switch, icon on visual controls header - Section manager: better save button with icon + spinner - Section manager: auto-dismiss success toast with Alpine transition Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Add 8 template presets with one-click color scheme application - Expand color palette from 4 to 8 (add background, surface, border, muted) - Add auto-palette generation from accent color (dark/light detection) - Add typography controls: font size scale, heading weight, line height, letter spacing - Add density control (compact/comfortable/spacious) affecting section padding and card gaps - Add border radius presets (sharp/subtle/rounded/pill) - Add card styles (flat/raised/bordered/glass) - Add section dividers (none/line/wave/angle/curve) rendered as SVG between sections - Add image shape control (square/rounded/circle/blob) - Add animation toggle and speed control - Add per-section: background type (solid/gradient/image/video), custom animation, padding override, mobile visibility toggle - All new columns have defaults — existing sites render unchanged until admin modifies settings - CSS variables drive all theming; public layout emits full token set Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Add openRegistration() and closeRegistration() methods to EventShow Livewire component - Add registration control panel in event admin sidebar with status indicator and toggle buttons - Fix slug generation to produce ASCII-safe slugs (prevents WhatsApp/messaging apps from truncating URLs containing Arabic/Hindi numerals) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Events that have started (in_progress) should still accept registrations until registration_closes_at. Previously only 'published' status allowed registration. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Low stock: use min_stock_level (not reorder_point), eager-load inventoryLevels 2. Inventory movements: reference is a morphTo — show class_basename#id instead of raw object 3. Product sales: pos_transaction_items has item_type/item_id (not product_id) 4. POS transactions: relationship is processedBy (not user), field is receipt_number 5. Collect payment wizard: only search participants with outstanding invoices Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Session completion: column is 'session_date' not 'date' 2. Trainer workload: TrainingGroup has no assignments() — use TrainingSession.trainer_id via employee→user link, count groups via head_trainer_id 3. Wallet balances: Wallet uses polymorphic owner() not participant() — use owner with owner_type filter Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Enrollments by program: replace PostgreSQL-incompatible HAVING on alias with get()->filter() 2. New report "المتغيبون حسب المدرب": shows absent participants grouped by trainer, with min-absences filter (1/2/3/5 sessions), excludes suspended participants 3. Also fixes existing absentee report to exclude suspended via the new report variant Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Daily revenue: group by date only (removed method split per manager request) 2. Cash sessions: fix column names (cash_in→total_cash_in, cash_out→total_cash_out) and null-safe arithmetic to prevent string/int type error 3. Revenue by activity: fix column name (line_total→total_amount) and replace broken whereHasMorph with proper join for branch filter 4. Money formatting: cast to int before division to prevent type error on empty values Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Status/gender/method columns now display Arabic labels instead of raw English values 2. Enrollment search (receptionist wizard) includes 'registered' participants, not just 'active' 3. New report: participants without medical clearance (بدون شهادة طبية) 4. Expired memberships report no longer crashes when date field is cleared (empty string fallback) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Add print_count and last_printed_at to invoices and payments tables - InvoicePrintController increments count on every print view - ReceiptController increments count on every payment receipt print - Print count badge shown next to print button on invoice show page - Print receipt button component accepts optional printCount prop - Rename dashboard revenue widget label from الإيرادات to التحصيلات Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 24 Jul, 2026 5 commits
-
-
Mahmoud Aglan authored
The guardians_relationship_type_check constraint allows: father, mother, grandfather, grandmother, uncle, aunt, sibling, legal_guardian, other. The ParticipantForm was inserting 'guardian' which isn't a valid value. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Remove draft-only restriction on delete button in EventShow - EventService::delete() no longer blocks deletion based on status - Migration sets website_settings.is_published default to true and updates existing rows - Fixes 404 on public event pages caused by unpublished website settings Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- Add radio, national_id, location, section_divider, terms field types to FormFieldType enum - Add field uniqueness constraint (blocks duplicate registrations per unique field) - Add Google Maps locations support (JSONB column + map embed on public page) - Add conditional field visibility (show field only when another field equals a value) - Add min/max length, min/max value, regex pattern validation per field - Add allow_other option for select/radio/multi_select fields - Add field description/help text, placeholder, default value - Add duplicate field action in form builder - Add section dividers for visual grouping - Add terms acceptance field type with URL link - Sanitize form fields before save (auto-fill values, strip invalid options) - Public registration form uses Alpine.js for conditional visibility - Character counters shown when max_length is set Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- PublicEventController: pass $sections to views (navbar/footer crash without it) - Navbar: replace href="#" with href="#section-hero" (forbidden pattern) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Complete events module with admin CRUD, public registration, and management: - Migrations: events, event_registrations, media collections, permissions - Domain: Event/Enums (5), Models (2), Services (EventService, EventRegistrationService) - Admin: EventList, CreateEventWizard (4-step with form builder), EventShow, EventRegistrationList - Public: event listing + detail pages under /site/{slug}/events with Livewire registration form - Form builder: button-based add/remove/reorder fields stored as JSONB - Registration: dynamic validation from form_fields, person matching, registration numbers - Admin registrations: dynamic columns, bulk confirm/cancel, CSV export - Livewire scripts added to website layout for public forms Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 22 Jul, 2026 11 commits
-
-
Mahmoud Aglan authored
Salaried trainers now get asked for their monthly amount, which is stored on the employee record (salary_amount + salary_frequency='monthly'). Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- ParticipantForm: add missing created_by when creating new guardian person - Fix 7 route references using .index instead of .list (trainers, employees, enrollments, groups) and other mismatches (inventory.levels.index, parent.excuse-form, pricing.rules.index) Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Users with 'refunds.initiate' permission see a "استرداد" button next to each confirmed inbound payment. Confirms before executing. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
This was the root cause of repeated migration FK failures in production. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
- New tables: facility_rent_payments, expenses with double-entry transactions - ExpenseService handles both rent and misc expenses with account resolution - Livewire CRUD: FacilityRentForm/List, ExpenseForm/List - Dashboard quick action buttons for recording expenses - Facility show page: new "Rent" tab with payment history - Sidebar nav links under Financial section - Reports: expense_summary and facility_rent_summary added to ReportsHub - New permission: expenses.create/list/view + seeded account 5050 Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Livewire's validate([]) falls back to looking for a $rules property on the component. Steps 6 and 7 intentionally have no validation rules, so only call validate() when the rules array is non-empty. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
1. Participant edit: guardian section now allows creating a new guardian (name + phone) OR selecting existing + editing phone. Checkbox toggles between modes. 2. Receptionist wizard: guardian name auto-fill now takes ALL names after the first (was only taking 2). "محمود أحمد عبد الفتاح علي" → guardian gets "أحمد عبد الفتاح علي" instead of just "أحمد عبد الفتاح". 3. Receptionist wizard step 5: added enrollment_start_date field so the user can specify when the player actually started (for accurate proration). Defaults to today if left empty. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Reports: 30 business reports in 6 categories (financial, participants, attendance, enrollments, operations, inventory) with CSV export. New ReportsHub grid page and generic ReportViewer with date/branch filters. Fixes: refund now creates double-entry transaction + deducts from cash session, branch switcher properly persists "all branches" selection, trainer wizard compensation step reactive, gender display on edit, participant edit supports national_id and guardian phone, participant list shows membership column + searches by national_id/membership_id. Co-Authored-By:Claude Opus 4.6 <noreply@anthropic.com>
-
- 20 Jul, 2026 3 commits
-
-
Mahmoud Aglan authored
The grid was blank because lanes and zones segments have null row_index/col_index. The old code assumed all layouts were grid-type and collapsed to 0×0. - Grid layouts: keep the spreadsheet-style row/col selector view - Lanes layouts: render as horizontal strips (label + cell side by side) - Zones/custom layouts: responsive card grid (no row/col concept) Layout type is now read from Facility::activeLayout (new HasOne relationship) with a null-safe fallback to row_index detection. Segment cell HTML extracted to _segment-cell.blade.php partial to avoid triplication. Co-Authored-By:Claude Opus 4.8 <noreply@anthropic.com>
-
Mahmoud Aglan authored
/facilities/space-assignment and /facilities/schedule-builder were registered after /facilities/{facility}, so Laravel matched the wildcard first and tried to resolve the literal slugs as UUIDs, crashing with invalid uuid syntax. Static routes are now declared before the wildcard. Co-Authored-By:Claude Opus 4.8 <noreply@anthropic.com>
-
Mahmoud Aglan authored
Adds محصّل vs إجمالي الإيرادات with a progress bar and remaining balance. Collection is computed as a pro-rata share of invoice.paid_amount based on the product line's fraction of the invoice total — so mixed invoices (product + program) correctly attribute only the product's share of each payment. Price overrides are excluded from the product's line because they always land on the program item, leaving the product total_amount intact. Co-Authored-By:Claude Opus 4.8 <noreply@anthropic.com>
-
- 19 Jul, 2026 1 commit
-
-
Mahmoud Aglan authored
Products with track_inventory=false never create InventoryMovements on sale, so the old movement-based queries always returned 0. Revenue and units sold now come from InvoiceItem (the authoritative source for what was actually invoiced). Stock-in (إجمالي الوارد) still uses InventoryMovement since that genuinely is a stock-receipt concept. Added إجمالي الإيرادات KPI card. Co-Authored-By:Claude Opus 4.8 <noreply@anthropic.com>
-