feat: Phase 6.1 - Split ProjectMap into traits (part 1)
- Create MapLayers trait (layer/phase visibility, filters) - Create MapInspections trait (inspection CRUD, viewer, editor) - Create MapIssues trait (issue count listeners) - Create MapFeatures trait (feature selection, progress, images) Tests: 101 passing (319 assertions)
This commit is contained in:
@@ -0,0 +1,114 @@
|
||||
<?php
|
||||
|
||||
namespace App\Livewire\Projects\Traits;
|
||||
|
||||
use App\Models\Phase;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Livewire\Attributes\On;
|
||||
|
||||
trait MapLayers
|
||||
{
|
||||
public $phases;
|
||||
|
||||
public $activeLayers = []; // Now stores Layer IDs (not Phase IDs)
|
||||
|
||||
public $showLayerModal = false;
|
||||
|
||||
// ─── Layer / Phase visibility ────────────────────────────────────────────────
|
||||
|
||||
public function toggleLayer($layerId)
|
||||
{
|
||||
$layerId = (int) $layerId;
|
||||
if (in_array($layerId, $this->activeLayers)) {
|
||||
$this->activeLayers = array_values(array_diff($this->activeLayers, [$layerId]));
|
||||
} else {
|
||||
$this->activeLayers[] = $layerId;
|
||||
}
|
||||
$this->dispatch('layersUpdated', $this->activeLayers);
|
||||
}
|
||||
|
||||
public function togglePhase($phaseId)
|
||||
{
|
||||
$phase = $this->phases->find($phaseId);
|
||||
if (! $phase) {
|
||||
return;
|
||||
}
|
||||
$layerIds = $phase->layers->pluck('id')->map(fn ($id) => (int) $id)->toArray();
|
||||
$allActive = ! empty($layerIds) && collect($layerIds)->every(fn ($id) => in_array($id, $this->activeLayers));
|
||||
if ($allActive) {
|
||||
$this->activeLayers = array_values(array_diff($this->activeLayers, $layerIds));
|
||||
} else {
|
||||
$this->activeLayers = array_values(array_unique(array_merge($this->activeLayers, $layerIds)));
|
||||
}
|
||||
$this->dispatch('layersUpdated', $this->activeLayers);
|
||||
}
|
||||
|
||||
public function openLayerModal()
|
||||
{
|
||||
$this->showLayerModal = true;
|
||||
}
|
||||
|
||||
public function closeLayerModal()
|
||||
{
|
||||
$this->showLayerModal = false;
|
||||
}
|
||||
|
||||
// ─── Filters ────────────────────────────────────────────────────────────────
|
||||
|
||||
public $filterStatus = '';
|
||||
|
||||
public $filterResponsible = '';
|
||||
|
||||
public $filterProgressMin = 0;
|
||||
|
||||
public $filterProgressMax = 100;
|
||||
|
||||
public $showFilters = false;
|
||||
|
||||
public function updatedFilterStatus()
|
||||
{
|
||||
$this->applyFilters();
|
||||
}
|
||||
|
||||
public function updatedFilterResponsible()
|
||||
{
|
||||
$this->applyFilters();
|
||||
}
|
||||
|
||||
public function updatedFilterProgressMin()
|
||||
{
|
||||
$this->applyFilters();
|
||||
}
|
||||
|
||||
public function updatedFilterProgressMax()
|
||||
{
|
||||
$this->applyFilters();
|
||||
}
|
||||
|
||||
public function applyFilters()
|
||||
{
|
||||
$filtered = $this->allFeatures->filter(function ($f) {
|
||||
if ($this->filterStatus && $f->status !== $this->filterStatus) {
|
||||
return false;
|
||||
}
|
||||
if ($this->filterResponsible && ! str_contains(strtolower($f->responsible ?? ''), strtolower($this->filterResponsible))) {
|
||||
return false;
|
||||
}
|
||||
if ($f->progress < $this->filterProgressMin || $f->progress > $this->filterProgressMax) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
});
|
||||
$this->dispatch('filtersChanged', $filtered->pluck('id')->values()->toArray());
|
||||
}
|
||||
|
||||
public function clearFilters()
|
||||
{
|
||||
$this->filterStatus = '';
|
||||
$this->filterResponsible = '';
|
||||
$this->filterProgressMin = 0;
|
||||
$this->filterProgressMax = 100;
|
||||
$this->dispatch('filtersChanged', $this->allFeatures->pluck('id')->values()->toArray());
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user