From 558b1732aa397e77145afa598f784056e6df4975 Mon Sep 17 00:00:00 2001 From: javier Date: Wed, 17 Jun 2026 13:14:17 +0200 Subject: [PATCH] feat(project-map): clearer editor tabs + per-phase and per-layer visibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. Editor tabs restyled as spaced DaisyUI buttons (btn-primary when active, btn-ghost otherwise) — fixes cramped labels and missing active indicator. 2. Layer visibility now works at two levels: - Phase toggle calls togglePhase() and shows/hides ALL its layers (checked only when every layer of the phase is active) - Each layer has its own independent toggle calling toggleLayer() Map JS regrouped to build one Leaflet group per LAYER (keyed by layer id) instead of per phase, so activeLayers (layer ids) drives visibility correctly per layer. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../livewire/projects/project-map.blade.php | 128 ++++++++++-------- 1 file changed, 70 insertions(+), 58 deletions(-) diff --git a/resources/views/livewire/projects/project-map.blade.php b/resources/views/livewire/projects/project-map.blade.php index db3d9f0..4eaf364 100644 --- a/resources/views/livewire/projects/project-map.blade.php +++ b/resources/views/livewire/projects/project-map.blade.php @@ -22,23 +22,34 @@
@foreach($phases as $phase) -
+ @php + $phaseLayerIds = $phase->layers->pluck('id')->map(fn($i) => (int) $i)->all(); + $phaseAllActive = count($phaseLayerIds) > 0 && collect($phaseLayerIds)->every(fn($i) => in_array($i, $activeLayers)); + @endphp +
+ {{-- Fase: el toggle muestra/oculta TODAS sus capas --}}
id, $activeLayers)) checked @endif - class="toggle toggle-xs toggle-primary"> + wire:change="togglePhase({{ $phase->id }})" + @if($phaseAllActive) checked @endif + class="toggle toggle-xs toggle-primary" + title="{{ __('Show/hide all layers of this phase') }}"> {{ $phase->name }} {{ $phase->progress_percent }}
- {{-- Capas de esta fase --}} + {{-- Capas de esta fase: cada una con su propio toggle independiente --}} @if($phase->layers->isNotEmpty())
@foreach($phase->layers as $layer) -
- +
+ id, $activeLayers)) checked @endif + class="toggle toggle-xs toggle-primary" + title="{{ __('Show/hide layer') }}"> + {{ $layer->name }} {{ $layer->features_count ?? $layer->features->count() }} {{ __('elem.') }}
@@ -91,11 +102,11 @@
-
- - - - + + + `; - layer.bindPopup(content); - layer.on('click', function() { selectFeature(featId); }); - } - }); - layers[{{ $phase->id }}] = phaseLayer; - @if(in_array($phase->id, $activeLayers)) - phaseLayer.addTo(map); - @endif - } - })() + @foreach($phase->layers as $layer) + @php + $fc = [ + 'type' => 'FeatureCollection', + 'features' => $layer->features->map(function($f) { + return [ + 'type' => 'Feature', + 'id' => $f->id, + 'geometry' => $f->geometry, + 'properties' => array_merge($f->properties ?? [], [ + 'name' => $f->name, + 'progress' => $f->progress, + 'responsible' => $f->responsible, + 'template_id' => $f->template_id, + '_feature_id' => $f->id, + ]) + ]; + })->values()->toArray() + ]; + @endphp + (function() { + const data = @json($fc); + if (data && data.features && data.features.length > 0) { + const layerGroup = L.geoJSON(data, { + style: { color: '{{ $layer->color ?? $phase->color }}', weight: 3, opacity: 0.8, fillOpacity: 0.3 }, + onEachFeature: function(feature, lyr) { + const props = feature.properties || {}; + const featId = props._feature_id || feature.id; + const safeName = escapeHtml(props.name || '{{ __('Feature') }}'); + const safeProgress = escapeHtml(props.progress || 0); + const safeResponsible = escapeHtml(props.responsible || '-'); + let content = `${safeName}
+ {{ __('Progress') }}: ${safeProgress}%
+ {{ __('Responsible') }}: ${safeResponsible}
+ `; + lyr.bindPopup(content); + lyr.on('click', function() { selectFeature(featId); }); + } + }); + layers[{{ $layer->id }}] = layerGroup; + @if(in_array((int) $layer->id, $activeLayers)) + layerGroup.addTo(map); + @endif + } + })() + @endforeach @endforeach // Initialize combined bounds