@php
// Stato di visibilità delle sezioni passato dal componente Livewire
$visibilityState = $visibilityState ?? [];
$sectionVisibility = [
'intestazione' => $visibilityState['showIntestazione'] ?? true,
'DatiCliente' => $visibilityState['showDatiCliente'] ?? true,
'StudioPeso' => $visibilityState['showStudioPeso'] ?? true,
'plicometria' => $visibilityState['showPlicometria'] ?? true,
'circonferenze' => $visibilityState['showCirconferenze'] ?? true,
'AnalisiBIA' => $visibilityState['showAnalisiBIA'] ?? true,
'bodyComp' => $visibilityState['showBodyComposition'] ?? true,
'LymphaDex' => $visibilityState['showLymphaDex'] ?? true,
'andamenti' => $visibilityState['showAndamenti'] ?? true,
'tabelle' => $visibilityState['showTabelle'] ?? true,
'note' => $visibilityState['showNote'] ?? true,
];
// Applichiamo lo stesso filtro di visibilità usato nell'anteprima
if (is_array($components)) {
$components = array_values(array_filter($components, function ($component) use ($sectionVisibility) {
if (!is_array($component) || !isset($component['type'])) {
return false;
}
$type = $component['type'];
if (isset($sectionVisibility[$type])) {
return $sectionVisibility[$type];
}
return true;
}));
}
// Prepariamo una lista di componenti da utilizzare
$processedComponents = [];
// Identifichiamo i componenti AnalisiBIA e BodyComp che devono stare insieme
$biaPairs = [];
// Flag per identificare se stiamo iniziando con AnalisiBIA
$startWithAnalisiBIA = false;
// Controllo di sicurezza: verifica che components sia un array valido
if (is_array($components) && !empty($components)) {
for ($i = 0; $i < count($components); $i++) {
// Controllo di sicurezza per ogni componente
if (!isset($components[$i]) || !is_array($components[$i])) {
continue;
}
$component = $components[$i];
// Controllo che il componente abbia il tipo necessario
if (!isset($component['type'])) {
continue;
}
if ($component['type'] === 'AnalisiBIA') {
// Cerchiamo il prossimo bodyComp
for ($j = 0; $j < count($components); $j++) {
if ($i != $j && isset($components[$j]) && is_array($components[$j]) &&
isset($components[$j]['type']) && $components[$j]['type'] === 'bodyComp') {
// Trovato un bodyComp, lo associamo a questo AnalisiBIA
$biaPairs[$i] = $j;
break;
}
}
}
}
}
// Valutiamo se la prima AnalisiBIA deve davvero iniziare da una nuova pagina.
// Se prima ci sono solo intestazione o pochi blocchi leggeri, la lasciamo risalire.
$tipiPrimaDiAnalisiBia = [];
$deveForzareSaltoPrimaDiAnalisiBia = false;
if (is_array($components) && !empty($components)) {
foreach ($components as $component) {
if (!is_array($component) || !isset($component['type'])) {
continue;
}
if ($component['type'] === 'AnalisiBIA') {
break;
}
if (!isset($component['content']) || empty($component['content'])) {
continue;
}
$tipiPrimaDiAnalisiBia[] = $component['type'];
}
$haStudioPesoPrimaDiAnalisiBia = in_array('StudioPeso', $tipiPrimaDiAnalisiBia, true);
$haDatiClientePrimaDiAnalisiBia = in_array('DatiCliente', $tipiPrimaDiAnalisiBia, true);
$haPlicometriaPrimaDiAnalisiBia = in_array('plicometria', $tipiPrimaDiAnalisiBia, true);
$haCirconferenzePrimaDiAnalisiBia = in_array('circonferenze', $tipiPrimaDiAnalisiBia, true);
$deveForzareSaltoPrimaDiAnalisiBia =
$haStudioPesoPrimaDiAnalisiBia ||
$haDatiClientePrimaDiAnalisiBia ||
($haPlicometriaPrimaDiAnalisiBia && $haCirconferenzePrimaDiAnalisiBia);
}
// Ora prepariamo i gruppi di componenti
$groupedComponents = [];
$currentGroup = [];
$currentRowWidth = 0;
$foundFirstAnalisiBIA = false;
// Controllo di sicurezza: verifica che components sia un array valido
if (is_array($components) && !empty($components)) {
for ($i = 0; $i < count($components); $i++) {
// Se questo indice è stato già processato, lo saltiamo
if (in_array($i, $processedComponents)) {
continue;
}
// Controllo di sicurezza per ogni componente
if (!isset($components[$i]) || !is_array($components[$i])) {
continue;
}
$component = $components[$i];
// Controllo che il componente abbia le proprietà necessarie
if (!isset($component['type']) || !isset($component['colSize'])) {
continue;
}
$componentWidth = $component['colSize'];
// Verifichiamo se il componente ha contenuto valido
$hasValidContent = false;
if (isset($component['content']) && !empty($component['content'])) {
$hasValidContent = true;
}
// Se incontriamo un AnalisiBIA e non è il primo componente,
// chiudiamo il gruppo corrente anche se non è pieno per forzare un cambio pagina
if ($component['type'] === 'AnalisiBIA' && !empty($groupedComponents) && !$foundFirstAnalisiBIA && $hasValidContent) {
if (!empty($currentGroup)) {
$groupedComponents[] = $currentGroup;
$currentGroup = [];
$currentRowWidth = 0;
}
$foundFirstAnalisiBIA = true;
}
// Caso speciale: se è un AnalisiBIA con un bodyComp associato
if ($component['type'] === 'AnalisiBIA' && isset($biaPairs[$i])) {
$bodyCompIndex = $biaPairs[$i];
$bodyComp = $components[$bodyCompIndex];
// Verifichiamo se entrambi i componenti hanno contenuto
$biaHasContent = isset($component['content']) && !empty($component['content']);
$bodyCompHasContent = isset($bodyComp['content']) && !empty($bodyComp['content']);
// Solo se almeno uno dei due ha contenuto, li aggiungiamo
if ($biaHasContent || $bodyCompHasContent) {
$totalWidth = $componentWidth + $bodyComp['colSize'];
// Se i due componenti non possono stare davvero nella stessa riga,
// evitiamo di trattarli come un blocco unico: altrimenti Chrome
// prova a spostare l'intero gruppo alla pagina successiva.
if ($totalWidth > 12) {
if ($biaHasContent) {
if ($currentRowWidth + $componentWidth > 12 && !empty($currentGroup)) {
$groupedComponents[] = $currentGroup;
$currentGroup = [];
$currentRowWidth = 0;
}
$currentGroup[] = $component;
$currentRowWidth += $componentWidth;
$processedComponents[] = $i;
if ($currentRowWidth >= 12) {
$groupedComponents[] = $currentGroup;
$currentGroup = [];
$currentRowWidth = 0;
}
} else {
$processedComponents[] = $i;
}
if ($bodyCompHasContent) {
if ($currentRowWidth + $bodyComp['colSize'] > 12 && !empty($currentGroup)) {
$groupedComponents[] = $currentGroup;
$currentGroup = [];
$currentRowWidth = 0;
}
$currentGroup[] = $bodyComp;
$currentRowWidth += $bodyComp['colSize'];
$processedComponents[] = $bodyCompIndex;
if ($currentRowWidth >= 12) {
$groupedComponents[] = $currentGroup;
$currentGroup = [];
$currentRowWidth = 0;
}
} else {
$processedComponents[] = $bodyCompIndex;
}
continue;
}
// Se l'aggiunta di entrambi supera la larghezza, creiamo un nuovo gruppo
if ($currentRowWidth + $totalWidth > 12) {
if (!empty($currentGroup)) {
$groupedComponents[] = $currentGroup;
$currentGroup = [];
}
$currentRowWidth = 0;
}
// Aggiungiamo AnalisiBIA solo se ha contenuto
if ($biaHasContent) {
$currentGroup[] = $component;
$currentRowWidth += $componentWidth;
}
$processedComponents[] = $i;
// Aggiungiamo bodyComp solo se ha contenuto
if ($bodyCompHasContent) {
$currentGroup[] = $bodyComp;
$currentRowWidth += $bodyComp['colSize'];
}
$processedComponents[] = $bodyCompIndex;
// Se abbiamo superato la larghezza massima, chiudiamo il gruppo
if ($currentRowWidth >= 12) {
$groupedComponents[] = $currentGroup;
$currentGroup = [];
$currentRowWidth = 0;
}
} else {
// Se nessuno dei due ha contenuto, li marchiamo come processati ma non li aggiungiamo
$processedComponents[] = $i;
$processedComponents[] = $bodyCompIndex;
}
}
// Caso normale
else {
// Solo se il componente ha contenuto valido, lo aggiungiamo
if ($hasValidContent) {
// Se l'aggiunta supera la larghezza, creiamo un nuovo gruppo
if ($currentRowWidth + $componentWidth > 12) {
if (!empty($currentGroup)) {
$groupedComponents[] = $currentGroup;
$currentGroup = [];
}
$currentRowWidth = 0;
}
// Aggiungiamo il componente al gruppo corrente
$currentGroup[] = $component;
$currentRowWidth += $componentWidth;
// Se abbiamo superato la larghezza massima, chiudiamo il gruppo
if ($currentRowWidth >= 12) {
$groupedComponents[] = $currentGroup;
$currentGroup = [];
$currentRowWidth = 0;
}
}
$processedComponents[] = $i;
}
}
}
// Aggiungiamo l'ultimo gruppo solo se non è vuoto e ha componenti validi
if (!empty($currentGroup)) {
$hasValidComponents = false;
foreach ($currentGroup as $component) {
if (isset($component['content']) && !empty($component['content'])) {
$hasValidComponents = true;
break;
}
}
if ($hasValidComponents) {
$groupedComponents[] = $currentGroup;
}
}
// Rimuovi gruppi vuoti dalla fine
while (!empty($groupedComponents) && empty(end($groupedComponents))) {
array_pop($groupedComponents);
}
@endphp
@foreach ($groupedComponents as $groupIndex => $group)
@php
// Verifichiamo se il gruppo ha componenti con contenuto valido
$hasValidComponents = false;
foreach ($group as $component) {
if (isset($component['content']) && !empty($component['content'])) {
$hasValidComponents = true;
break;
}
}
// Se il gruppo non ha componenti validi, lo saltiamo
if (!$hasValidComponents) {
continue;
}
// Determina se questo gruppo contiene un AnalisiBIA
$containsAnalisiBIA = false;
foreach ($group as $component) {
if ($component['type'] === 'AnalisiBIA') {
$containsAnalisiBIA = true;
break;
}
}
// Determina se dobbiamo aggiungere la classe per forzare page break
$rowClass = 'no-break-container';
if ($containsAnalisiBIA && $groupIndex > 0 && $deveForzareSaltoPrimaDiAnalisiBia) {
$rowClass .= ' force-page-break-before';
}
// Aggiungiamo classe specifica per Chrome se contiene AnalisiBIA
if ($containsAnalisiBIA) {
$rowClass .= ' chrome-analisi-bia-group';
}
// Aggiungiamo classe specifica se il gruppo contiene bodyComp
$containsBodyComp = false;
foreach ($group as $component) {
if ($component['type'] === 'bodyComp') {
$containsBodyComp = true;
break;
}
}
if ($containsBodyComp) {
$rowClass .= ' body-comp-group';
}
// Aggiungiamo classe specifica se il gruppo contiene andamenti
$containsAndamenti = false;
foreach ($group as $component) {
if ($component['type'] === 'andamenti') {
$containsAndamenti = true;
break;
}
}
if ($containsAndamenti) {
$rowClass .= ' andamenti-group';
}
// Determina se questo gruppo contiene plicometria
$containsPlicometria = false;
foreach ($group as $component) {
if ($component['type'] === 'plicometria') {
$containsPlicometria = true;
break;
}
}
// La plicometria deve restare compatta, ma non deve piu creare da sola una pagina vuota.
if ($containsPlicometria && $groupIndex > 0) {
$rowClass .= ' plicometria-group';
} elseif ($containsPlicometria) {
$rowClass .= ' plicometria-group';
}
@endphp
@foreach ($group as $component)
@php
// Verifichiamo se il componente ha contenuto valido
$hasValidContent = isset($component['content']) && !empty($component['content']);
// Se il componente non ha contenuto valido, lo saltiamo
if (!$hasValidContent) {
continue;
}
// Determina classi aggiuntive in base al tipo di componente
$additionalClass = '';
if ($component['type'] === 'AnalisiBIA') {
$additionalClass = 'analisi-bia-component';
} elseif ($component['type'] === 'bodyComp') {
$additionalClass = 'body-comp-component';
}
@endphp
@switch($component['type'])
@case('intestazione')
@livewire('report-generator.components.Intestazione',['visita' => $component['content']])
@break
@case('StudioPeso')
@livewire('report-generator.components.StudioPeso',['misurazione' => $component['content'],'visita' => $visita])
@break
@case('plicometria')
@livewire('report-generator.components.Plicometria',['misurazione' => $component['content']])
@break
@case('circonferenze')
@livewire('report-generator.components.Circonferenze',['misurazione' => $component['content']])
@break
@case('AnalisiBIA')
@livewire('report-generator.components.AnalisiBia',['misurazione' => $component['content']])
@break
@case('bodyComp')
@livewire('report-generator.components.BodyComposition',['misurazione' => $component['content']])
@break
@case('LymphaDex')
@livewire('report-generator.components.LymphaDex',['misurazione' => $component['content']])
@break
@case('andamenti')
@livewire('report-generator.components.Andamenti',['cliente' => $component['content'],'visita' => $visita])
@break
@case('tabelle')
@livewire('report-generator.components.Tabelle',['cliente' => $component['content'],'tabella' => "AnalisiBIA",'data_da' => $data_da,'data_a' => $data_a])
@break
@case('note')
@livewire('report-generator.components.Note',['visita' => $component['content']])
@break
@endswitch
@endforeach
@endforeach