netgescon-day0/resources/views/filament/pages/strumenti/partials/generic-label-builder.blade.php

488 lines
40 KiB
PHP

<x-filament::section>
<x-slot name="heading">Etichette generiche per contenitori</x-slot>
<x-slot name="description">Area dedicata al template etichetta: prima configuri e vedi subito l'anteprima, poi scegli come stampare le etichette create.</x-slot>
@php
$preview = $this->genericLabelPreview;
$qrPosition = $preview['qr_position'] ?? 'right-center';
$qrScaleMap = ['sm' => 'h-14 w-14', 'md' => 'h-20 w-20', 'lg' => 'h-24 w-24'];
$qrClass = $qrScaleMap[$preview['qr_scale'] ?? 'md'] ?? $qrScaleMap['md'];
$templateName = $preview['template_name'] ?? 'classic-right';
$isArchive99014 = $templateName === 'archive-99014' && ($preview['format'] ?? '11354') === '99014';
$isBottomQr = str_starts_with($qrPosition, 'bottom');
$format = $preview['format'] ?? '11354';
$isWideFormat = $format === '99014';
$accentClass = match(data_get($preview, 'template.accent')) {
'emerald' => 'from-emerald-600 to-emerald-500',
'amber' => 'from-amber-500 to-amber-400',
'sky' => 'from-sky-600 to-sky-500',
default => 'from-slate-700 to-slate-600',
};
$fontSizeMap = ['xs' => 10, 'sm' => 12, 'md' => 14, 'lg' => 18, 'xl' => 24];
$fontSizes = is_array($preview['font_sizes'] ?? null) ? $preview['font_sizes'] : [];
$mnemonicFontPx = $fontSizeMap[$fontSizes['mnemonic'] ?? 'xl'] ?? 24;
$titleFontPx = $fontSizeMap[$fontSizes['title'] ?? 'xl'] ?? 24;
$subtitleFontPx = $fontSizeMap[$fontSizes['subtitle'] ?? 'md'] ?? 14;
$linesFontPx = $fontSizeMap[$fontSizes['lines'] ?? 'md'] ?? 14;
$noteFontPx = $fontSizeMap[$fontSizes['note'] ?? 'sm'] ?? 12;
@endphp
<div class="space-y-4">
<div class="grid items-start gap-4 lg:grid-cols-[minmax(0,1.2fr)_minmax(360px,0.8fr)] 2xl:grid-cols-[minmax(0,1.25fr)_minmax(420px,0.75fr)]">
<div class="space-y-4 rounded-xl border bg-white p-4">
<div class="flex items-center justify-between gap-3">
<div>
<div class="text-sm font-semibold text-slate-900">Parametri etichetta</div>
<div class="mt-1 text-xs text-slate-500">A sinistra imposti contenitore, layout, binding campi e formato di stampa. A destra vedi sempre come viene.</div>
</div>
<div class="rounded-full bg-slate-100 px-3 py-1 text-xs font-semibold text-slate-700">Layout split</div>
</div>
<div class="mt-4 rounded-xl border border-sky-100 bg-sky-50 px-4 py-3 text-sm text-sky-900">
Le etichette create qui restano memorizzate nell'archivio documentale e possono diventare preset riusabili per altre sezioni del programma.
</div>
<div class="mt-4 rounded-xl border border-amber-200 bg-amber-50 p-4">
<div class="flex flex-col gap-3 lg:flex-row lg:items-end">
<div class="min-w-0 flex-1">
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Salva configurazione come template</label>
<input type="text" wire:model.live.debounce.200ms="genericLabelTemplateLabel" class="w-full rounded-lg border-slate-200 text-sm shadow-sm" placeholder="Es. Scatola bilanci annuali" />
<div class="mt-1 text-xs text-slate-500">Salvi layout, formato etichetta, binding dei campi e posizione QR per riusarli più avanti.</div>
</div>
<button type="button" wire:click="saveCurrentGenericLabelAsTemplate" class="inline-flex items-center justify-center rounded-lg border border-amber-300 bg-white px-4 py-2 text-sm font-medium text-amber-800 shadow-sm hover:bg-amber-100">Memorizza template</button>
</div>
</div>
<div class="mt-4 grid gap-3 md:grid-cols-2">
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Preset rapido</label>
<div class="flex gap-2">
<select wire:model.live="genericLabelForm.preset_key" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
<option value="">Seleziona preset</option>
@foreach($this->genericLabelPresetOptions as $presetKey => $presetLabel)
<option value="{{ $presetKey }}">{{ $presetLabel }}</option>
@endforeach
</select>
<button type="button" wire:click="applySelectedGenericLabelPreset" class="inline-flex shrink-0 items-center rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-medium text-slate-700 hover:bg-slate-50">Applica</button>
</div>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Template layout</label>
<select wire:model.live="genericLabelForm.template_name" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($this->genericLabelTemplateOptions as $templateKey => $templateLabel)
<option value="{{ $templateKey }}">{{ $templateLabel }}</option>
@endforeach
</select>
</div>
<div class="grid gap-3 md:grid-cols-[minmax(0,1fr)_180px]">
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Codice mnemonico</label>
<input type="text" wire:model.live.debounce.150ms="genericLabelForm.mnemonic_code" class="w-full rounded-lg border-slate-200 text-sm shadow-sm" placeholder="Es. GER00079" />
<div class="mt-1 text-[11px] text-slate-500">Suggerito: {{ $this->mnemonicCodeHint ?? 'GER00079' }}</div>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Grandezza codice</label>
<select wire:model.live="genericLabelForm.mnemonic_font_size" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($this->genericLabelFontSizeOptions as $sizeKey => $sizeLabel)
<option value="{{ $sizeKey }}">{{ $sizeLabel }}</option>
@endforeach
</select>
</div>
</div>
<div class="md:col-span-2 grid gap-3 md:grid-cols-[minmax(0,1fr)_180px]">
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Titolo etichetta</label>
<input type="text" wire:model.live.debounce.150ms="genericLabelForm.titolo" class="w-full rounded-lg border-slate-200 text-sm shadow-sm" placeholder="Es. SCATOLA CONTRATTI ASCENSORI" />
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Grandezza titolo</label>
<select wire:model.live="genericLabelForm.title_font_size" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($this->genericLabelFontSizeOptions as $sizeKey => $sizeLabel)
<option value="{{ $sizeKey }}">{{ $sizeLabel }}</option>
@endforeach
</select>
</div>
</div>
<div class="md:col-span-2 grid gap-3 md:grid-cols-[minmax(0,1fr)_180px]">
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Seconda riga</label>
<input type="text" wire:model.live.debounce.150ms="genericLabelForm.linea_secondaria" class="w-full rounded-lg border-slate-200 text-sm shadow-sm" placeholder="Es. Stabile Roma 12 · 2024/2026" />
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Grandezza seconda riga</label>
<select wire:model.live="genericLabelForm.subtitle_font_size" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($this->genericLabelFontSizeOptions as $sizeKey => $sizeLabel)
<option value="{{ $sizeKey }}">{{ $sizeLabel }}</option>
@endforeach
</select>
</div>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Tipologia</label>
<select wire:model.live="genericLabelForm.tipo_item" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($this->physicalArchiveTypeOptions as $typeKey => $typeLabel)
@if($typeKey !== 'documento')
<option value="{{ $typeKey }}">{{ $typeLabel }}</option>
@endif
@endforeach
</select>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Modello etichetta</label>
<select wire:model.live="genericLabelForm.modello_etichetta" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($this->getModelliEtichettaOptions() as $labelKey => $labelText)
<option value="{{ $labelKey }}">{{ $labelText }}</option>
@endforeach
</select>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Dentro contenitore</label>
<select wire:model.live="genericLabelForm.parent_id" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
<option value="">Radice archivio</option>
@foreach($this->physicalArchiveParentOptions as $parentId => $parentLabel)
<option value="{{ $parentId }}">{{ $parentLabel }}</option>
@endforeach
</select>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Supporto</label>
<input type="text" wire:model.live.debounce.150ms="genericLabelForm.supporto_fisico" class="w-full rounded-lg border-slate-200 text-sm shadow-sm" placeholder="Es. Scatola o raccoglitore" />
</div>
<div class="md:col-span-2 rounded-xl border border-slate-200 bg-slate-50 p-4">
<div class="flex flex-col gap-3 lg:flex-row lg:items-end lg:justify-between">
<div>
<div class="text-sm font-semibold text-slate-900">Quattro righe configurabili</div>
<div class="mt-1 text-xs text-slate-500">Per ogni riga scegli se leggere un campo, scrivere testo libero, lasciare la riga bianca o disattivarla.</div>
</div>
<div class="w-full lg:max-w-[180px]">
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Grandezza righe</label>
<select wire:model.live="genericLabelForm.lines_font_size" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($this->genericLabelFontSizeOptions as $sizeKey => $sizeLabel)
<option value="{{ $sizeKey }}">{{ $sizeLabel }}</option>
@endforeach
</select>
</div>
</div>
<div class="mt-4 grid gap-3">
@for($index = 1; $index <= 4; $index++)
@php
$modeKey = 'line_' . $index . '_mode';
$sourceKey = 'line_' . $index . '_source';
$textKey = 'line_' . $index . '_text';
$currentMode = data_get($this->genericLabelForm, $modeKey, 'none');
@endphp
<div class="grid gap-3 rounded-lg border border-slate-200 bg-white p-3 xl:grid-cols-[160px_minmax(0,1fr)_minmax(0,1fr)]">
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Riga {{ $index }}</label>
<select wire:model.live="genericLabelForm.{{ $modeKey }}" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($this->genericLabelLineModeOptions as $modeValue => $modeLabel)
<option value="{{ $modeValue }}">{{ $modeLabel }}</option>
@endforeach
</select>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Campo archivio</label>
<select wire:model.live="genericLabelForm.{{ $sourceKey }}" class="w-full rounded-lg border-slate-200 text-sm shadow-sm" {{ $currentMode !== 'source' ? 'disabled' : '' }}>
@foreach($this->genericLabelStableFieldOptions as $fieldKey => $fieldLabel)
<option value="{{ $fieldKey }}">{{ $fieldLabel }}</option>
@endforeach
</select>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Testo libero</label>
<input type="text" wire:model.live.debounce.150ms="genericLabelForm.{{ $textKey }}" class="w-full rounded-lg border-slate-200 text-sm shadow-sm" placeholder="Scrivi il testo della riga" {{ $currentMode !== 'text' ? 'disabled' : '' }} />
</div>
</div>
@endfor
</div>
</div>
<div class="md:col-span-2">
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Prodotto Amazon</label>
<input type="text" wire:model.live.debounce.200ms="genericLabelForm.amazon_url" class="w-full rounded-lg border-slate-200 text-sm shadow-sm" placeholder="URL completo o ASIN Amazon" />
@if(data_get($preview, 'amazon_url') !== '')
<div class="mt-2">
<a href="{{ data_get($preview, 'amazon_url') }}" target="_blank" rel="noopener noreferrer" class="inline-flex items-center rounded-lg border border-amber-300 bg-amber-50 px-3 py-2 text-xs font-medium text-amber-900 shadow-sm hover:bg-amber-100">Apri prodotto Amazon</a>
</div>
@endif
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Campo titolo</label>
<select wire:model.live="genericLabelForm.title_source" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($this->genericLabelTemplateFieldOptions as $fieldKey => $fieldLabel)
<option value="{{ $fieldKey }}">{{ $fieldLabel }}</option>
@endforeach
</select>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Campo sottotitolo</label>
<select wire:model.live="genericLabelForm.subtitle_source" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($this->genericLabelTemplateFieldOptions as $fieldKey => $fieldLabel)
<option value="{{ $fieldKey }}">{{ $fieldLabel }}</option>
@endforeach
</select>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Campo meta</label>
<select wire:model.live="genericLabelForm.meta_source" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($this->genericLabelTemplateFieldOptions as $fieldKey => $fieldLabel)
<option value="{{ $fieldKey }}">{{ $fieldLabel }}</option>
@endforeach
</select>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Campo nota preview</label>
<select wire:model.live="genericLabelForm.note_source" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($this->genericLabelTemplateFieldOptions as $fieldKey => $fieldLabel)
<option value="{{ $fieldKey }}">{{ $fieldLabel }}</option>
@endforeach
</select>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Posizione QR</label>
<select wire:model.live="genericLabelForm.qr_position" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
<option value="right-center">Destra centrale</option>
<option value="right-top">Destra alta</option>
<option value="bottom-right">Basso destra</option>
<option value="bottom-center">Basso centro</option>
</select>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Dimensione QR</label>
<select wire:model.live="genericLabelForm.qr_scale" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
<option value="sm">Compatto</option>
<option value="md">Medio</option>
<option value="lg">Grande</option>
</select>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Magazzino</label>
<input type="text" wire:model.live.debounce.150ms="genericLabelForm.magazzino" class="w-full rounded-lg border-slate-200 text-sm shadow-sm" placeholder="Es. Deposito EUR" />
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Scaffale</label>
<input type="text" wire:model.live.debounce.150ms="genericLabelForm.scaffale" class="w-full rounded-lg border-slate-200 text-sm shadow-sm" placeholder="Es. B2" />
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Ripiano</label>
<input type="text" wire:model.live.debounce.150ms="genericLabelForm.ripiano" class="w-full rounded-lg border-slate-200 text-sm shadow-sm" placeholder="Es. 4" />
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Dettaglio ubicazione</label>
<input type="text" wire:model.live.debounce.150ms="genericLabelForm.ubicazione_dettaglio" class="w-full rounded-lg border-slate-200 text-sm shadow-sm" placeholder="Es. corridoio destro" />
</div>
<div class="md:col-span-2 grid gap-3 md:grid-cols-[minmax(0,1fr)_180px]">
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Nota breve</label>
<textarea wire:model.live.debounce.200ms="genericLabelForm.note" rows="3" class="w-full rounded-lg border-slate-200 text-sm shadow-sm" placeholder="Contenuto, periodo, riferimenti operativi..."></textarea>
</div>
<div>
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Grandezza note</label>
<select wire:model.live="genericLabelForm.note_font_size" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($this->genericLabelFontSizeOptions as $sizeKey => $sizeLabel)
<option value="{{ $sizeKey }}">{{ $sizeLabel }}</option>
@endforeach
</select>
</div>
</div>
</div>
<div class="mt-4 flex flex-wrap gap-2 border-t border-slate-200 pt-4">
<button type="button" wire:click="saveGenericArchiveLabel" class="inline-flex items-center rounded-lg bg-slate-900 px-4 py-2 text-sm font-medium text-white shadow-sm transition hover:bg-slate-800">Crea etichetta</button>
</div>
</div>
<aside class="space-y-4 lg:sticky lg:top-6 lg:self-start">
<div class="rounded-xl border bg-white p-4">
<div class="flex items-center justify-between gap-3">
<div>
<div class="text-sm font-semibold text-slate-900">Anteprima live</div>
<div class="mt-1 text-xs text-slate-500">Questa colonna segue il form e resta sempre visibile sul desktop.</div>
</div>
<div class="flex flex-wrap items-center gap-2">
<div class="rounded-full bg-slate-100 px-3 py-1 text-xs font-semibold text-slate-700">{{ $this->genericLabelTemplateOptions[$templateName] ?? 'Template' }}</div>
<div class="rounded-full bg-sky-50 px-3 py-1 text-xs font-semibold text-sky-700">{{ $format === '99014' ? 'Preview 99014' : 'Preview 11354' }}</div>
</div>
</div>
<div class="mt-4 rounded-2xl border border-slate-300 bg-slate-50 p-4">
@if($isArchive99014)
<div class="mx-auto w-full max-w-[430px] overflow-hidden rounded-xl border-2 border-slate-900 bg-white shadow-sm">
<div class="grid min-h-[260px] grid-cols-[1fr_82px] gap-4 p-4">
<div class="min-w-0">
<div class="border-b-2 border-slate-900 pb-2 font-black uppercase tracking-[0.16em] text-slate-900" style="font-size: {{ $mnemonicFontPx }}px;">{{ $preview['mnemonic_code'] ?? ($this->mnemonicCodeHint ?? 'GER00079') }}</div>
<div class="mt-3 font-bold uppercase leading-tight text-slate-900" style="font-size: {{ $titleFontPx }}px;">{{ data_get($preview, 'slots.title') !== '' ? data_get($preview, 'slots.title') : 'Titolo etichetta' }}</div>
<div class="mt-2 font-medium leading-snug text-slate-700" style="font-size: {{ $subtitleFontPx }}px;">{{ data_get($preview, 'slots.subtitle') !== '' ? data_get($preview, 'slots.subtitle') : 'Seconda riga descrittiva' }}</div>
<div class="mt-4 space-y-2 leading-snug text-slate-700" style="font-size: {{ $linesFontPx }}px;">
@foreach(($preview['stable_lines'] ?? []) as $stableLine)
@if($stableLine === '__BLANK_LINE__')
<div class="h-5 border-b border-slate-400"></div>
@elseif($stableLine !== '')
<div>{{ $stableLine }}</div>
@endif
@endforeach
</div>
<div class="mt-4 space-y-2">
@foreach(($preview['blank_lines'] ?? []) as $blankLine)
<div class="h-5 border-b border-slate-400"></div>
@endforeach
</div>
@if(data_get($preview, 'slots.note') !== '')
<div class="mt-4 rounded-lg border border-dashed border-slate-300 px-3 py-2 leading-relaxed text-slate-600" style="font-size: {{ $noteFontPx }}px;">{{ data_get($preview, 'slots.note') }}</div>
@endif
</div>
<div class="flex flex-col items-center justify-end gap-3">
<div class="{{ $qrClass }} rounded-xl border border-slate-300 bg-[linear-gradient(135deg,#0f172a_16%,transparent_16%,transparent_34%,#0f172a_34%,#0f172a_50%,transparent_50%,transparent_66%,#0f172a_66%,#0f172a_84%,transparent_84%)] bg-[length:16px_16px] bg-white"></div>
<div class="text-center text-[10px] font-semibold uppercase tracking-[0.2em] text-slate-500">QR</div>
</div>
</div>
</div>
@else
<div class="relative mx-auto overflow-hidden rounded-xl border border-slate-900 bg-white shadow-sm {{ $isWideFormat ? 'min-h-[220px] max-w-[430px]' : 'min-h-[150px] max-w-[320px]' }}">
@if($templateName === 'band-top')
<div class="h-8 bg-gradient-to-r {{ $accentClass }}"></div>
@endif
<div class="relative flex h-full {{ $isBottomQr ? 'flex-col' : 'flex-row' }} gap-3 p-4 {{ $isWideFormat ? 'min-h-[220px]' : 'min-h-[150px]' }}">
<div class="min-w-0 flex-1">
<div class="font-semibold uppercase tracking-[0.25em] text-slate-500" style="font-size: {{ max(10, $mnemonicFontPx - 10) }}px;">{{ $preview['payload']['codice_univoco'] ?? 'AF-QR-PREVIEW' }}</div>
<div class="mt-2 font-bold leading-tight text-slate-900" style="font-size: {{ $titleFontPx }}px;">{{ data_get($preview, 'slots.title') !== '' ? data_get($preview, 'slots.title') : 'Titolo etichetta' }}</div>
@if(data_get($preview, 'slots.subtitle') !== '')
<div class="mt-2 font-medium text-slate-600" style="font-size: {{ $subtitleFontPx }}px;">{{ data_get($preview, 'slots.subtitle') }}</div>
@endif
@if(data_get($preview, 'slots.meta') !== '')
<div class="mt-3 leading-relaxed text-slate-500" style="font-size: {{ $linesFontPx }}px;">{{ data_get($preview, 'slots.meta') }}</div>
@endif
@if(($preview['stable_lines'] ?? []) !== [])
<div class="mt-3 space-y-1 leading-relaxed text-slate-600" style="font-size: {{ $linesFontPx }}px;">
@foreach(($preview['stable_lines'] ?? []) as $stableLine)
@if($stableLine === '__BLANK_LINE__')
<div class="h-5 border-b border-slate-300"></div>
@elseif($stableLine !== '')
<div>{{ $stableLine }}</div>
@endif
@endforeach
</div>
@endif
@if(data_get($preview, 'slots.note') !== '')
<div class="mt-3 rounded-lg border border-dashed border-slate-200 bg-slate-50 px-2 py-2 text-slate-500" style="font-size: {{ $noteFontPx }}px;">{{ data_get($preview, 'slots.note') }}</div>
@endif
<div class="mt-3 rounded-lg border border-slate-200 bg-white px-2 py-2 text-[11px] text-slate-500">
QR payload: {{ $preview['payload']['qr_payload'] ?? 'NGDOC|AF:AF-QR-PREVIEW|TIPO:SCATOLA|STB:0|PARENT:RADICE' }}
</div>
</div>
<div class="{{ $isBottomQr ? 'flex justify-center pt-1' : ($qrPosition === 'right-top' ? 'flex items-start justify-end' : 'flex items-center justify-end') }} shrink-0">
<div class="{{ $qrClass }} rounded-xl border border-slate-300 bg-[linear-gradient(135deg,#0f172a_16%,transparent_16%,transparent_34%,#0f172a_34%,#0f172a_50%,transparent_50%,transparent_66%,#0f172a_66%,#0f172a_84%,transparent_84%)] bg-[length:16px_16px] bg-white"></div>
</div>
</div>
</div>
@endif
</div>
<div class="mt-4 space-y-3 text-sm text-slate-600">
<div class="rounded-lg border border-slate-200 bg-slate-50 px-3 py-3">Il codice univoco viene generato automaticamente e diventa il nodo da scansionare e ristampare quando serve.</div>
<div class="rounded-lg border border-slate-200 bg-slate-50 px-3 py-3">Il QR codifica l'identità archivistica e la relazione col contenitore padre, non l'host o un URL pubblico.</div>
<div class="rounded-lg border border-slate-200 bg-slate-50 px-3 py-3">Template, binding campi DB e nodo della catena vengono salvati nell'etichetta, così la stampa reale segue il layout scelto.</div>
</div>
<div class="mt-4 rounded-xl border border-slate-200 bg-slate-50 p-4">
<div class="text-sm font-semibold text-slate-900">Payload XML e NFC</div>
<div class="mt-1 text-xs text-slate-500">Il QR stampato resta aperto e leggibile. Il profilo compresso è opzionale. L'NFC usa una variante minima pensata per il tag.</div>
<div class="mt-3 space-y-3">
<div>
<div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">QR XML aperto · {{ (int) data_get($preview, 'payload.qr_payload_length', 0) }} caratteri</div>
<textarea readonly rows="5" class="w-full rounded-lg border-slate-200 bg-white font-mono text-[11px] text-slate-700 shadow-sm">{{ data_get($preview, 'payload.qr_payload', '') }}</textarea>
</div>
<div>
<div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">QR XML compresso</div>
<textarea readonly rows="4" class="w-full rounded-lg border-slate-200 bg-white font-mono text-[11px] text-slate-700 shadow-sm">{{ data_get($preview, 'payload.qr_payload_zip', '') }}</textarea>
</div>
<div>
<div class="mb-1 text-[11px] font-semibold uppercase tracking-wide text-slate-500">NFC lite · {{ (int) data_get($preview, 'payload.nfc_payload_length', 0) }} caratteri</div>
<textarea readonly rows="4" class="w-full rounded-lg border-slate-200 bg-white font-mono text-[11px] text-slate-700 shadow-sm">{{ data_get($preview, 'payload.nfc_payload', '') }}</textarea>
</div>
</div>
</div>
</div>
</aside>
</div>
<div class="grid gap-4 xl:grid-cols-[minmax(0,0.9fr)_minmax(0,1.1fr)]">
<div class="rounded-xl border bg-white p-4">
<div class="flex items-center justify-between gap-3">
<div>
<div class="text-sm font-semibold text-slate-900">Template riusabili salvati</div>
<div class="mt-1 text-xs text-slate-500">Libreria separata dal builder, così la preview non finisce sotto il form.</div>
</div>
<div class="rounded-full bg-amber-50 px-3 py-1 text-xs font-semibold text-amber-700">Libreria template</div>
</div>
<div class="mt-4 space-y-3">
@forelse($this->genericLabelSavedTemplates as $savedTemplate)
<div class="rounded-lg border border-slate-200 bg-slate-50 px-3 py-3">
<div class="flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between">
<div>
<div class="text-sm font-semibold text-slate-900">{{ $savedTemplate['label'] }}</div>
<div class="mt-1 text-xs text-slate-500">{{ $savedTemplate['template_label'] }} · {{ $savedTemplate['modello'] }} · {{ \App\Models\DocumentoArchivioFisicoItem::TIPI[$savedTemplate['tipo_item']] ?? $savedTemplate['tipo_item'] }}</div>
</div>
<button type="button" wire:click="applyGenericLabelPreset('{{ $savedTemplate['key'] }}')" class="inline-flex items-center justify-center rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-medium text-slate-700 shadow-sm hover:bg-slate-100">Usa template</button>
</div>
</div>
@empty
<div class="rounded-lg border border-dashed border-slate-300 bg-slate-50 px-3 py-4 text-sm text-slate-500">Nessun template personalizzato salvato ancora. Prepara il layout nel builder, verifica la preview e poi usa “Memorizza template”.</div>
@endforelse
</div>
</div>
<div class="rounded-xl border bg-white p-4">
<div class="flex items-center justify-between gap-3">
<div class="text-sm font-semibold text-slate-900">Ultime etichette generiche</div>
<div class="text-xs text-slate-500">Scelta esplicita del formato di stampa</div>
</div>
<div class="mt-4 space-y-3">
@forelse($this->genericLabelRows as $row)
<div class="rounded-lg border border-slate-200 bg-slate-50 px-3 py-3">
<div class="flex flex-col gap-3 xl:flex-row xl:items-start xl:justify-between">
<div>
<div class="flex flex-wrap items-center gap-2">
<span class="rounded-full bg-slate-900 px-2.5 py-1 text-[11px] font-semibold text-white">{{ $row['codice_univoco'] }}</span>
<span class="rounded-full bg-white px-2.5 py-1 text-[11px] font-medium text-slate-700">{{ $row['tipo'] }}</span>
</div>
<div class="mt-2 text-sm font-semibold text-slate-900">{{ $row['titolo'] }}</div>
@if($row['linea_secondaria'] !== '')
<div class="mt-1 text-xs text-slate-500">{{ $row['linea_secondaria'] }}</div>
@endif
<div class="mt-1 text-[11px] text-sky-700">{{ $row['preset_label'] }} · {{ $row['template_label'] }}</div>
<div class="mt-1 text-xs text-slate-500">Percorso: {{ $row['percorso'] }}</div>
@if($row['ubicazione'] !== '')
<div class="mt-1 text-xs text-slate-500">Ubicazione: {{ $row['ubicazione'] }}</div>
@endif
@if($row['amazon_url'] !== '')
<div class="mt-2"><a href="{{ $row['amazon_url'] }}" target="_blank" class="text-xs font-medium text-sky-700 underline decoration-sky-300 underline-offset-2">Apri link acquisto</a></div>
@endif
</div>
<div class="w-full max-w-xs shrink-0" x-data="{ preset: @js($row['default_print']), options: @js($row['print_options']) }">
<label class="mb-1 block text-xs font-semibold uppercase tracking-wide text-slate-500">Cosa stampare</label>
<div class="flex gap-2">
<select x-model="preset" class="w-full rounded-lg border-slate-200 text-sm shadow-sm">
@foreach($row['print_options'] as $printKey => $printOption)
<option value="{{ $printKey }}">{{ $printOption['label'] }}</option>
@endforeach
</select>
<a :href="options[preset]?.url || '#'
" target="_blank" class="inline-flex shrink-0 items-center rounded-lg border border-slate-300 bg-white px-3 py-2 text-xs font-medium text-slate-700 shadow-sm hover:bg-slate-50">Stampa</a>
</div>
</div>
</div>
</div>
@empty
<div class="rounded-lg border border-dashed border-slate-300 bg-white px-4 py-6 text-sm text-slate-500">Nessuna etichetta generica creata ancora per lo stabile attivo.</div>
@endforelse
</div>
</div>
</div>
</div>
</x-filament::section>