Javier Braña
356c4773fc
feat: Phase 5.3 - PWA Offline Support with Workbox
...
Code Style & Quality / Laravel Pint (push) Canceled after 0s
Code Style & Quality / PHPStan Static Analysis (push) Canceled after 0s
Code Style & Quality / Test Suite (push) Canceled after 0s
Code Style & Quality / Browser Tests (Dusk) (push) Canceled after 0s
- Add vite-plugin-pwa + workbox-window
- Configure PWA manifest with icons (SVG)
- Configure Workbox runtime caching:
- API routes: NetworkFirst (10s timeout, 100 entries, 24h)
- Media files: CacheFirst (50 entries, 7 days)
- Pages: NetworkFirst (10s timeout, 50 entries, 24h)
- Register service worker in app.js with update notification
- Generate icons (SVG) for all sizes
Tests: 101 passing (319 assertions)
2026-09-01 14:00:14 +02:00
Javier Braña
55b1a9276a
feat: Phase 5.2 - Global Search with Laravel Scout
...
Code Style & Quality / Laravel Pint (push) Canceled after 0s
Code Style & Quality / PHPStan Static Analysis (push) Canceled after 0s
Code Style & Quality / Test Suite (push) Canceled after 0s
Code Style & Quality / Browser Tests (Dusk) (push) Canceled after 0s
- Install laravel/scout with database driver
- Add Searchable trait to Feature, Issue, Task, Inspection models
- Create GlobalSearch Livewire component with Blade view
- Configure scout.php for database driver + queued syncing
- Add SCOUT_DRIVER=database to .env.example
Tests: 101 passing (319 assertions)
2026-09-01 13:49:16 +02:00
Javier Braña
c50a1a2080
feat: Phase 5.1 - Scheduled Report Emails
...
Code Style & Quality / Laravel Pint (push) Canceled after 0s
Code Style & Quality / PHPStan Static Analysis (push) Canceled after 0s
Code Style & Quality / Test Suite (push) Canceled after 0s
Code Style & Quality / Browser Tests (Dusk) (push) Canceled after 0s
- Create SendScheduledReport job (runs daily 08:00)
- Create ScheduledReportMail Mailable with Blade template
- Add receive_reports boolean to users table (migration)
- Register job in routes/console.php
Tests: 101 passing (319 assertions)
2026-09-01 13:23:20 +02:00
Javier Braña
a9bbf8ca57
feat: Phase 4 - CI/CD, Static Analysis, Browser Tests
...
Code Style & Quality / Test Suite (push) Canceled after 0s
Code Style & Quality / Laravel Pint (push) Canceled after 0s
Code Style & Quality / PHPStan Static Analysis (push) Canceled after 0s
Code Style & Quality / Browser Tests (Dusk) (push) Canceled after 0s
- Add GitHub Actions CI workflow (.github/workflows/ci.yml)
- Laravel Pint code style check
- PHPStan static analysis (level 5)
- Test suite with parallel execution
- Dusk browser tests (disabled by default)
- Add phpstan.neon config (level 5, ignores User notifications methods)
- Add Dusk browser tests (ProjectWorkflowTest)
- Install laravel/dusk + chromedriver
Tests: 101 passing (319 assertions)
2026-08-31 17:33:34 +02:00
Javier Braña
ff1d1ed3a4
feat: Phase 3.2 - Rate limiting all API routes
...
- Add throttle:120,1 to PULL endpoints (projects, bundle, templates)
- Add throttle:60,1 to PUSH endpoint (sync)
- Add throttle:120,1 to media upload
Tests: 101 passing (319 assertions), 24/24 API tests pass
2026-08-31 12:28:28 +02:00
Javier Braña
2c7b36b050
feat: Phase 3.1 - FormRequests for Task, Issue, Inspection
...
- Create TaskStoreRequest, TaskUpdateRequest with authorize() + rules()
- Create IssueStoreRequest, IssueUpdateRequest with authorize() + rules()
- Create InspectionStoreRequest, InspectionUpdateRequest with authorize() + rules() + withValidator()
- Update TaskForm to use FormRequests via app()
- Update IssueForm (kept inline validation for complex logic)
- Add InspectionStore/Update requests for ProjectMap inspection methods
Tests: 101 passing (319 assertions)
2026-08-31 12:26:15 +02:00
Javier Braña
9222eefdf9
feat: Phase 2 - Laravel Reverb + real-time notifications
...
- Install laravel/reverb + laravel-echo + pusher-js
- Configure broadcasting to reverb in .env.example + .env
- Add Echo + Pusher client in resources/js/app.js
- Update all 14 notifications to implement ShouldBroadcast + broadcastOn()
- Update NotificationBell component to listen for real-time events
- Add Livewire.emit in notification-bell blade for JS-to-Livewire bridge
Tests: 101 passing (319 assertions)
2026-08-31 12:16:56 +02:00
Javier Braña
78d1dbf45a
feat: Phase 1 - Redis config, Dashboard cache, Report cache, N+1 fixes, observers
...
- Add predis/predis for Redis support
- Configure cache/queue defaults to redis in config + .env.example
- Create DashboardController with 60s cache for dashboard queries
- Add cache (5min) to ReportController::generate() and preview()
- Add FeatureObserver, InspectionObserver, IssueObserver for cache invalidation
- Fix N+1 in ProjectMap (eager load template, images), TaskManager (subtasks.parentTask)
- Register observers in AppServiceProvider
Tests: 101 passing (319 assertions)
2026-08-31 09:44:33 +02:00
Javier Braña
90630379fb
chore: cleanup dead code + format with Pint
...
- Remove unused FeaturesController (empty stubs, no routes)
- Remove ConvertSpatialFile CLI command (unused; service used in LayerManager)
- Remove MigrateGeojsonToFeatures CLI command (one-shot migration, not referenced)
- Remove .claude/worktrees/ (11 old agent worktrees from June)
- Apply Laravel Pint formatting across 219 files (style only, no functional changes)
Tests: 101 passing (319 assertions)
API routes: unchanged (8 routes intact)
2026-08-28 13:04:28 +02:00
Javier Braña
2dccd59385
fix(reports): use Livewire::mount in controller to avoid layout conflict; remove #[Layout] from ReportBuilder component
2026-08-24 13:22:31 +02:00
Javier Braña
e7aea3f69f
fix(reports): remove middleware() from controller constructor - auth already applied via route group
2026-08-24 13:08:56 +02:00
Javier Braña
1ac2df9454
fix(reports): ReportBuilder::generateReport return type - remove void, return redirect
2026-08-24 12:36:33 +02:00
Javier Braña
ee32544525
feat(reports): complete reporting system with deviations, progress curves, multi-format export
...
- Added planned/actual/baseline dates to Phase and Feature models
- Created ProgressSnapshot model + migration for historical tracking
- Implemented CaptureDailyProgressSnapshot job (scheduled daily at 06:30)
- Added DeviationCalculator logic (SPI, planned progress, deviation days)
- ReportGenerator service with complete data aggregation
- ReportController with builder, preview, generate (HTML/Excel)
- ReportBuilder Livewire component with date range, entity selection, format
- ProjectReportExport with 10 sheets (Summary, Phases, Features, Inspections, Issues, Tasks, Deviations, Media, Progress Curve, Parameters)
- Blade partials for all sections (header, summary, phases, features, inspections, issues, tasks, media, deviations, progress curve)
- New routes: /projects/{project}/reports/*
- Added 'generate reports' permission
- All 101 tests passing
2026-08-24 12:32:08 +02:00
Javier Braña
c58a49f22d
fix(map): selectFeature event handling - unify payload format for map click and feature table
...
- FeatureTable: dispatch { featureId } object instead of raw ID
- ProjectMap: selectFeature listener accepts both formats (direct ID or { featureId })
- project-map.blade.php: move selectFeature inside livewire:init handler so Livewire.emit is available
- Added logging for debugging
Fixes: 'Livewire.emit is not a function' on map click and 'Only arrays and Traversables can be unpacked' on table button
2026-08-24 11:12:32 +02:00
Javier Braña
534d9f8eab
Fix Livewire BindingResolutionException: replace @this calls in pushed scripts with #[On] + Livewire.emit
...
- Add #[On] attributes to 5 Livewire component methods:
- LayerManager::saveManualGeojson
- ProjectForm::setLocation
- ProjectMap::selectFeature (already had #[On])
- TaskForm::closeModal
- TaskKanban::updateTaskStatus
- Replace @this.method() in @push('scripts') with Livewire.emit() calls
- Fix DataTable event payloads from objects {id: X} to scalars X for:
- FeatureTable::map-select-feature
- InspectionTable::map-view-inspection, edit-inspection, delete-inspection
2026-08-04 13:58:56 +02:00
Javier Braña
f566d370be
fix(route): fix implicit route model binding for Project
...
- Move Route::model to register() in AppServiceProvider so it persists in route cache
- Re-register in boot() for runtime
- Fix navigation spacing for language/notification/user menu
All 101 tests pass
2026-08-04 12:18:54 +02:00
Javier Braña
16efe381c5
fix(tasks): auto-open create modal when accessing /projects/{project}/tasks/create
2026-08-04 09:53:57 +02:00
Javier Braña
1a61e219c6
style(nav): reduce spacing between language switcher, notification bell, and user menu
2026-08-04 09:30:15 +02:00
Javier Braña
0af98fb49d
fix: add tasks button to project dashboard, verify kanban/calendar routes
2026-08-04 08:30:33 +02:00
Javier Braña
ba614bddbc
feat(tasks): complete task management system with Kanban, Calendar, notifications
...
- Add Task model with subtasks, priorities, status transitions, dates, hours
- Add Comment polymorphic model for tasks/issues/projects
- Livewire components: TaskManager (list+filters), TaskForm (modal), TaskDetail, TaskKanban (drag&drop), TaskCalendar (FullCalendar)
- TaskPolicy with permissions (view/create/edit/delete/assign/manage all)
- Notifications: assigned, status change, overdue, comment added
- Daily overdue notification job scheduled
- Dashboard widget unifies IssueTask + Task
- i18n: en/es/fr/ru (393 keys each)
- Routes, navigation, offline sync support
- 101 tests passing, Pint compliant on new files
2026-08-03 13:44:10 +02:00
Javier Braña
a65d4b12f2
feat(inspections): add photos support with edit + lightbox
...
- Validación robusta fotos (10MB, jpeg/png/webp, max 10)
- Editar inspección existente: botón en historial, modal y tabla
- Eliminación individual de fotos en edición (marcar + guardar)
- Lightbox/carousel en modal ver + editar (Alpine.js)
- Columna 'Fotos' en InspectionTable con thumbnails + contador
- Permiso 'edit inspections' en seeders + checks en componente
- Test actualizado: seed roles/permisos + attach template pivot
- Fix: removed unsupported filterable() on secondaryHeaderFilter
2026-07-29 01:44:38 +02:00