446 lines
27 KiB
PHP
446 lines
27 KiB
PHP
<x-filament-panels::page>
|
|
<div class="grid grid-cols-1 gap-6 lg:grid-cols-3">
|
|
<div class="space-y-6 lg:col-span-2">
|
|
<div class="rounded-lg border p-4">
|
|
<div class="text-lg font-semibold">Fornitore</div>
|
|
<div class="mt-2 grid grid-cols-1 gap-2 md:grid-cols-2">
|
|
<div><span class="font-medium">Codice:</span> {{ $fornitore->codice_univoco ?? '-' }}</div>
|
|
<div><span class="font-medium">Ragione sociale:</span> {{ $fornitore->ragione_sociale ?? '-' }}</div>
|
|
<div><span class="font-medium">Nome:</span> {{ trim(($fornitore->nome ?? '') . ' ' . ($fornitore->cognome ?? '')) ?: '-' }}</div>
|
|
<div><span class="font-medium">Sito:</span> {{ $fornitore->sito_web ?? '-' }}</div>
|
|
<div><span class="font-medium">P.IVA:</span> {{ $fornitore->partita_iva ?? '-' }}</div>
|
|
<div><span class="font-medium">CF:</span> {{ $fornitore->codice_fiscale ?? '-' }}</div>
|
|
<div class="md:col-span-2"><span class="font-medium">Indirizzo:</span> {{ $fornitore->indirizzo_completo ?? '-' }}</div>
|
|
<div class="md:col-span-2"><span class="font-medium">Note:</span> {{ $this->cleanDisplayValue($fornitore->note) }}</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="rounded-lg border p-4">
|
|
<div class="text-lg font-semibold">Contatti</div>
|
|
|
|
<div class="mt-3 grid grid-cols-1 gap-4 md:grid-cols-2">
|
|
<div class="space-y-1">
|
|
<div class="text-sm font-medium text-gray-700">Fornitore</div>
|
|
<div><span class="font-medium">Email:</span> {{ $this->cleanDisplayValue($fornitore->email) }}</div>
|
|
<div><span class="font-medium">PEC:</span> {{ $this->cleanDisplayValue($fornitore->pec) }}</div>
|
|
<div><span class="font-medium">Telefono:</span> {{ $fornitore->telefono ?? '-' }}</div>
|
|
<div><span class="font-medium">Cellulare:</span> {{ $fornitore->cellulare ?? '-' }}</div>
|
|
</div>
|
|
|
|
<div class="space-y-1">
|
|
<div class="text-sm font-medium text-gray-700">Rubrica</div>
|
|
@if($fornitore->rubrica)
|
|
<div><span class="font-medium">Email:</span> {{ $fornitore->rubrica->email ?? '-' }}</div>
|
|
<div><span class="font-medium">PEC:</span> {{ $fornitore->rubrica->pec ?? '-' }}</div>
|
|
<div><span class="font-medium">Tel. ufficio:</span> {{ $fornitore->rubrica->telefono_ufficio ?? '-' }}</div>
|
|
<div><span class="font-medium">Tel. cellulare:</span> {{ $fornitore->rubrica->telefono_cellulare ?? '-' }}</div>
|
|
<div><span class="font-medium">Tel. casa:</span> {{ $fornitore->rubrica->telefono_casa ?? '-' }}</div>
|
|
<div><span class="font-medium">Fax:</span> {{ $fornitore->rubrica->fax ?? '-' }}</div>
|
|
@else
|
|
<div class="text-sm text-gray-600">Nessun collegamento presente.</div>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="rounded-lg border p-4">
|
|
<div class="text-lg font-semibold">Dipendenti e accessi fornitore</div>
|
|
<div class="mt-1 text-xs text-gray-500">La gestione accessi dei dipendenti fornitore e centralizzata qui.</div>
|
|
|
|
@if(filled($lastGeneratedPassword ?? null))
|
|
<div class="mt-3 rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-xs text-amber-900">
|
|
Ultima password temporanea generata: <span class="font-mono font-semibold">{{ $lastGeneratedPassword }}</span>
|
|
</div>
|
|
@endif
|
|
|
|
<div class="mt-3 grid grid-cols-1 gap-2 md:grid-cols-4">
|
|
<input type="text" wire:model.defer="nuovoDipendenteNome" class="rounded-md border-gray-300 text-xs" placeholder="Nome" />
|
|
<input type="text" wire:model.defer="nuovoDipendenteCognome" class="rounded-md border-gray-300 text-xs" placeholder="Cognome" />
|
|
<input type="email" wire:model.defer="nuovoDipendenteEmail" class="rounded-md border-gray-300 text-xs" placeholder="Email" />
|
|
<input type="text" wire:model.defer="nuovoDipendenteTelefono" class="rounded-md border-gray-300 text-xs" placeholder="Telefono" />
|
|
</div>
|
|
<div class="mt-2">
|
|
<x-filament::button size="sm" color="primary" type="button" wire:click="creaDipendenteFornitore">Aggiungi dipendente</x-filament::button>
|
|
</div>
|
|
|
|
<div class="mt-3 overflow-x-auto">
|
|
<table class="min-w-full border-collapse border text-xs">
|
|
<thead>
|
|
<tr class="bg-slate-100 text-slate-700">
|
|
<th class="border px-2 py-1.5 text-left">Dipendente</th>
|
|
<th class="border px-2 py-1.5 text-left">Email</th>
|
|
<th class="border px-2 py-1.5 text-left">Telefono</th>
|
|
<th class="border px-2 py-1.5 text-left">Utente collegato</th>
|
|
<th class="border px-2 py-1.5 text-left">Stato</th>
|
|
<th class="border px-2 py-1.5 text-left">Azioni</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
@forelse($dipendentiRows as $row)
|
|
<tr class="hover:bg-slate-50">
|
|
<td class="border px-2 py-1.5">{{ $row['nome'] }}</td>
|
|
<td class="border px-2 py-1.5">{{ $row['email'] !== '' ? $row['email'] : '-' }}</td>
|
|
<td class="border px-2 py-1.5">{{ $row['telefono'] !== '' ? $row['telefono'] : '-' }}</td>
|
|
<td class="border px-2 py-1.5">
|
|
@if((int) ($row['user_id'] ?? 0) > 0)
|
|
{{ $row['user_label'] }} (ID {{ (int) $row['user_id'] }})
|
|
@else
|
|
-
|
|
@endif
|
|
</td>
|
|
<td class="border px-2 py-1.5">
|
|
@if($row['attivo'])
|
|
<span class="rounded bg-emerald-100 px-1.5 py-0.5 text-[10px] font-semibold text-emerald-800">attivo</span>
|
|
@else
|
|
<span class="rounded bg-rose-100 px-1.5 py-0.5 text-[10px] font-semibold text-rose-800">non attivo</span>
|
|
@endif
|
|
</td>
|
|
<td class="border px-2 py-1.5">
|
|
<div class="flex flex-wrap gap-1">
|
|
<x-filament::button size="xs" color="primary" type="button" wire:click="abilitaAccessoDipendente({{ (int) $row['id'] }})">Abilita accesso</x-filament::button>
|
|
@if((int) ($row['user_id'] ?? 0) > 0)
|
|
<x-filament::button size="xs" color="warning" type="button" wire:click="resetPasswordDipendenteUser({{ (int) $row['user_id'] }})">Reset password</x-filament::button>
|
|
@endif
|
|
<x-filament::button size="xs" color="gray" type="button" wire:click="toggleDipendenteAttivo({{ (int) $row['id'] }})">Toggle attivo</x-filament::button>
|
|
</div>
|
|
</td>
|
|
</tr>
|
|
@empty
|
|
<tr>
|
|
<td colspan="6" class="border px-2 py-3 text-center text-gray-500">Nessun dipendente registrato per questo fornitore.</td>
|
|
</tr>
|
|
@endforelse
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="rounded-lg border p-4">
|
|
<div class="text-lg font-semibold">Pagamenti</div>
|
|
<div class="mt-2 grid grid-cols-1 gap-2 md:grid-cols-2">
|
|
<div><span class="font-medium">IBAN:</span> {{ $fornitore->iban ?? '-' }}</div>
|
|
<div><span class="font-medium">BIC:</span> {{ $fornitore->bic ?? '-' }}</div>
|
|
<div class="md:col-span-2"><span class="font-medium">Modalità predefinita:</span> {{ $fornitore->modalita_pagamento_predefinita ?? '-' }}</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="rounded-lg border p-4">
|
|
<div class="text-lg font-semibold">Anagrafica unica (Rubrica)</div>
|
|
@if($fornitore->rubrica)
|
|
<div class="mt-2 grid grid-cols-1 gap-2 md:grid-cols-2">
|
|
<div><span class="font-medium">Codice:</span> {{ $fornitore->rubrica->codice_univoco ?? '-' }}</div>
|
|
<div><span class="font-medium">Nominativo:</span> {{ $fornitore->rubrica->nome_completo ?? '-' }}</div>
|
|
<div><span class="font-medium">Categoria:</span> {{ $fornitore->rubrica->categoria ?? '-' }}</div>
|
|
<div><span class="font-medium">Stato:</span> {{ $fornitore->rubrica->stato ?? '-' }}</div>
|
|
</div>
|
|
@else
|
|
<div class="mt-2 text-sm text-gray-600">Nessun collegamento presente.</div>
|
|
@endif
|
|
</div>
|
|
|
|
<div class="rounded-lg border p-4" x-data="fornitoreTagsBox(@js($tagSuggestions))">
|
|
<div class="text-lg font-semibold">TAG Fornitore</div>
|
|
<div class="mt-1 text-xs text-gray-500">Digita tag separati da virgola. Premi TAB per accettare il suggerimento corrente e aggiungere automaticamente una virgola.</div>
|
|
|
|
<div class="mt-3">
|
|
<input
|
|
id="fornitore-tags-input"
|
|
type="text"
|
|
list="fornitore-tags-suggestions"
|
|
wire:model.defer="tagsInput"
|
|
autocomplete="off"
|
|
class="w-full rounded-lg border-gray-300 text-sm"
|
|
placeholder="es. idr, manut, assicur..."
|
|
x-on:input="updateSuggestion($event.target.value)"
|
|
x-on:keydown.tab.prevent="acceptSuggestion($event.target)"
|
|
x-on:keydown.comma="clearHint()"
|
|
/>
|
|
<datalist id="fornitore-tags-suggestions">
|
|
@foreach($tagSuggestions as $tag)
|
|
<option value="{{ $tag }}"></option>
|
|
@endforeach
|
|
</datalist>
|
|
<div class="mt-1 text-xs text-gray-500" x-show="hint !== ''" x-text="'Suggerimento: ' + hint"></div>
|
|
</div>
|
|
|
|
<div class="mt-3 flex flex-wrap gap-2">
|
|
<x-filament::button color="primary" type="button" wire:click="saveTags">Salva TAG</x-filament::button>
|
|
<x-filament::button color="gray" type="button" wire:click="importLegacyTags">Importa da legacy</x-filament::button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="space-y-6">
|
|
@php
|
|
$features = is_array($box['fornitore_features'] ?? null) ? $box['fornitore_features'] : [];
|
|
$acqua = is_array($features['acqua'] ?? null) ? $features['acqua'] : [];
|
|
$acquaEnabled = (bool) ($acqua['enabled'] ?? false);
|
|
$acquaScan = (bool) ($acqua['scan_enabled'] ?? false);
|
|
@endphp
|
|
|
|
<div class="rounded-lg border p-4">
|
|
<div class="text-base font-semibold">Automazioni / Consumi</div>
|
|
<div class="mt-1 text-sm text-gray-600">Configura acquisizione dati (PDF) e scansione massiva sulle FE già importate.</div>
|
|
|
|
<div class="mt-3 space-y-1 text-sm">
|
|
<div class="flex items-center justify-between">
|
|
<span class="font-medium">Acqua</span>
|
|
<span>{{ $acquaEnabled ? 'ATTIVA' : 'disattiva' }}</span>
|
|
</div>
|
|
<div class="flex items-center justify-between">
|
|
<span class="font-medium">Scansione batch</span>
|
|
<span>{{ $acquaScan ? 'ATTIVA' : 'disattiva' }}</span>
|
|
</div>
|
|
<div class="flex items-center justify-between">
|
|
<span class="font-medium">Righe FE</span>
|
|
<span>{{ (bool) ($fornitore->escludi_righe_fe ?? false) ? 'escluse' : 'incluse' }}</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mt-4 flex flex-col gap-2">
|
|
<x-filament::button type="button" color="gray" wire:click="mountAction('impostazioni_fe')">
|
|
Impostazioni FE
|
|
</x-filament::button>
|
|
<x-filament::button type="button" color="gray" wire:click="mountAction('acqua_config')">
|
|
Configura acqua
|
|
</x-filament::button>
|
|
<x-filament::button type="button" color="primary" wire:click="mountAction('acqua_scan')">
|
|
Scansiona FE acqua
|
|
</x-filament::button>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="rounded-lg border p-4">
|
|
<div class="flex items-start justify-between gap-4">
|
|
<div>
|
|
<div class="text-lg font-semibold">Fatture (stabile attivo)</div>
|
|
<div class="text-sm text-gray-600">Riepilogo AdE / FE / Contabilità / RA</div>
|
|
</div>
|
|
<a
|
|
class="text-sm font-medium text-primary-600 hover:underline"
|
|
href="{{ \App\Filament\Pages\Contabilita\FattureElettronicheP7mRicevute::getUrl(panel: 'admin-filament') }}"
|
|
>
|
|
Apri FE
|
|
</a>
|
|
</div>
|
|
|
|
<div class="mt-4 space-y-2 text-sm">
|
|
<div class="flex items-center justify-between">
|
|
<span class="font-semibold">Totale da pagare</span>
|
|
<span class="font-semibold">{{ number_format((float) ($box['da_pagare']['importo'] ?? 0), 2, ',', '.') }} €</span>
|
|
</div>
|
|
<div class="text-xs text-gray-600">
|
|
Fonte: {{ (string) ($box['da_pagare']['source'] ?? 'n/d') }}
|
|
</div>
|
|
<div class="border-t pt-2"></div>
|
|
<div class="flex items-center justify-between">
|
|
<span class="font-medium">AdE (staging)</span>
|
|
<span>{{ (int) ($box['ade']['count'] ?? 0) }} — {{ number_format((float) ($box['ade']['lordo'] ?? 0), 2, ',', '.') }} €</span>
|
|
</div>
|
|
<div class="flex items-center justify-between">
|
|
<span class="font-medium">FE importate</span>
|
|
<span>{{ (int) ($box['fe']['count'] ?? 0) }} — {{ number_format((float) ($box['fe']['totale'] ?? 0), 2, ',', '.') }} €</span>
|
|
</div>
|
|
<div class="flex items-center justify-between">
|
|
<span class="font-medium">FE contabilizzate</span>
|
|
<span>{{ (int) ($box['fe']['contabilizzate'] ?? 0) }}</span>
|
|
</div>
|
|
<div class="mt-2 border-t pt-2">
|
|
<div class="flex items-center justify-between">
|
|
<span class="font-medium">Da pagare (contabilità)</span>
|
|
<span>{{ (int) ($box['contabilita']['aperte_count'] ?? 0) }} — {{ number_format((float) ($box['contabilita']['aperte_netto'] ?? 0), 2, ',', '.') }} €</span>
|
|
</div>
|
|
<div class="flex items-center justify-between">
|
|
<span class="font-medium">Pagate (contabilità)</span>
|
|
<span>{{ (int) ($box['contabilita']['pagate_count'] ?? 0) }} — {{ number_format((float) ($box['contabilita']['pagate_netto'] ?? 0), 2, ',', '.') }} €</span>
|
|
</div>
|
|
</div>
|
|
<div class="mt-2 border-t pt-2">
|
|
<div class="flex items-center justify-between">
|
|
<span class="font-medium">RA da versare</span>
|
|
<span>{{ number_format((float) ($box['ra']['da_versare'] ?? 0), 2, ',', '.') }} €</span>
|
|
</div>
|
|
<div class="flex items-center justify-between">
|
|
<span class="font-medium">RA versata</span>
|
|
<span>{{ number_format((float) ($box['ra']['versata'] ?? 0), 2, ',', '.') }} €</span>
|
|
</div>
|
|
<div class="flex items-center justify-between">
|
|
<span class="font-medium">RA compensata</span>
|
|
<span>{{ number_format((float) ($box['ra']['compensata'] ?? 0), 2, ',', '.') }} €</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="rounded-lg border p-4">
|
|
<div class="text-base font-semibold">Anteprima AdE</div>
|
|
@if(!empty($anteprimaAde))
|
|
<div class="mt-3 space-y-2 text-sm">
|
|
@foreach($anteprimaAde as $r)
|
|
<div class="flex items-start justify-between gap-3">
|
|
<div class="min-w-0">
|
|
<div class="font-medium">{{ $r['data'] ?: '-' }} — {{ $r['numero'] ?: '-' }}</div>
|
|
<div class="truncate text-gray-600">SDI: {{ $r['sdi_file'] ?: '-' }}</div>
|
|
</div>
|
|
<div class="whitespace-nowrap">{{ number_format((float) ($r['lordo'] ?? 0), 2, ',', '.') }} €</div>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
@else
|
|
<div class="mt-2 text-sm text-gray-600">Nessuna fattura AdE trovata per questo fornitore.</div>
|
|
@endif
|
|
</div>
|
|
|
|
<div class="rounded-lg border p-4">
|
|
<div class="text-base font-semibold">Anteprima FE</div>
|
|
@if(!empty($anteprimaFe))
|
|
<div class="mt-3 space-y-2 text-sm">
|
|
@foreach($anteprimaFe as $r)
|
|
<a
|
|
class="block rounded-md px-2 py-1 hover:bg-gray-50"
|
|
href="{{ \App\Filament\Pages\Contabilita\FatturaElettronicaScheda::getUrl(['record' => (int) $r['id']], panel: 'admin-filament') }}"
|
|
>
|
|
<div class="flex items-start justify-between gap-3">
|
|
<div class="min-w-0">
|
|
<div class="font-medium">{{ $r['data'] ?: '-' }} — {{ $r['numero'] ?: '-' }}</div>
|
|
<div class="truncate text-gray-600">SDI: {{ $r['sdi_file'] ?: '-' }} @if(($r['stato'] ?? '') !== '') — {{ $r['stato'] }} @endif</div>
|
|
</div>
|
|
<div class="whitespace-nowrap">{{ number_format((float) ($r['totale'] ?? 0), 2, ',', '.') }} €</div>
|
|
</div>
|
|
</a>
|
|
@endforeach
|
|
</div>
|
|
@else
|
|
<div class="mt-2 text-sm text-gray-600">Nessuna FE importata trovata per questo fornitore.</div>
|
|
@endif
|
|
</div>
|
|
|
|
<div class="rounded-lg border p-4">
|
|
<div class="text-base font-semibold">Anteprima contabilità</div>
|
|
@if(!empty($anteprimaContabilita))
|
|
<div class="mt-3 space-y-2 text-sm">
|
|
@foreach($anteprimaContabilita as $r)
|
|
<a
|
|
class="block rounded-md px-2 py-1 hover:bg-gray-50"
|
|
href="{{ \App\Filament\Pages\Contabilita\FatturaFornitoreScheda::getUrl(['record' => (int) $r['id']], panel: 'admin-filament') }}"
|
|
>
|
|
<div class="flex items-start justify-between gap-3">
|
|
<div class="min-w-0">
|
|
<div class="font-medium">{{ $r['data'] ?: '-' }} — {{ $r['numero'] ?: '-' }}</div>
|
|
<div class="truncate text-gray-600">Stato: {{ $r['stato'] ?: '-' }}</div>
|
|
</div>
|
|
<div class="whitespace-nowrap">{{ number_format((float) ($r['netto'] ?? 0), 2, ',', '.') }} €</div>
|
|
</div>
|
|
</a>
|
|
@endforeach
|
|
</div>
|
|
@else
|
|
<div class="mt-2 text-sm text-gray-600">Nessuna registrazione contabile trovata per questo fornitore.</div>
|
|
@endif
|
|
</div>
|
|
|
|
<div class="rounded-lg border p-4">
|
|
<div class="text-base font-semibold">Fatture associate (fornitore)</div>
|
|
@if(!empty($fattureAssociate))
|
|
<div class="mt-3 space-y-2 text-sm">
|
|
@foreach($fattureAssociate as $r)
|
|
<a
|
|
class="block rounded-md px-2 py-1 hover:bg-gray-50"
|
|
href="{{ \App\Filament\Pages\Contabilita\FatturaFornitoreScheda::getUrl(['record' => (int) $r['id']], panel: 'admin-filament') }}"
|
|
>
|
|
<div class="flex items-start justify-between gap-3">
|
|
<div class="min-w-0">
|
|
<div class="font-medium">{{ $r['data'] ?: '-' }} — {{ $r['numero'] ?: '-' }}</div>
|
|
<div class="truncate text-gray-600">{{ $r['source'] }} @if(($r['stato'] ?? '') !== '') — {{ $r['stato'] }} @endif</div>
|
|
</div>
|
|
<div class="whitespace-nowrap text-right">
|
|
<div>{{ number_format((float) ($r['totale'] ?? 0), 2, ',', '.') }} €</div>
|
|
<div class="text-xs text-gray-500">Netto {{ number_format((float) ($r['netto'] ?? 0), 2, ',', '.') }} €</div>
|
|
</div>
|
|
</div>
|
|
</a>
|
|
@endforeach
|
|
</div>
|
|
@else
|
|
<div class="mt-2 text-sm text-gray-600">Nessuna fattura associata trovata per questo fornitore.</div>
|
|
@endif
|
|
</div>
|
|
|
|
<div class="rounded-lg border p-4">
|
|
<div class="text-base font-semibold">RA versate/compensate</div>
|
|
@if(!empty($raVersateRows))
|
|
<div class="mt-3 space-y-2 text-sm">
|
|
@foreach($raVersateRows as $ra)
|
|
<div class="rounded-md px-2 py-1">
|
|
<div class="flex items-start justify-between gap-3">
|
|
<div class="min-w-0">
|
|
<div class="font-medium">{{ $ra['data_versamento'] ?: '-' }} — {{ strtoupper($ra['stato'] ?: '-') }}</div>
|
|
<div class="truncate text-gray-600">Tributo {{ $ra['tributo'] ?: '1040' }} @if(($ra['f24'] ?? '') !== '') — F24 {{ $ra['f24'] }} @endif</div>
|
|
</div>
|
|
<div class="whitespace-nowrap">{{ number_format((float) ($ra['importo'] ?? 0), 2, ',', '.') }} €</div>
|
|
</div>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
@else
|
|
<div class="mt-2 text-sm text-gray-600">Nessuna RA versata/compensata trovata per questo fornitore.</div>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
function fornitoreTagsBox(suggestions) {
|
|
return {
|
|
hint: '',
|
|
suggestions: Array.isArray(suggestions) ? suggestions : [],
|
|
clearHint() {
|
|
this.hint = '';
|
|
},
|
|
updateSuggestion(value) {
|
|
const token = this.currentToken(value);
|
|
if (!token) {
|
|
this.hint = '';
|
|
return;
|
|
}
|
|
|
|
const lower = token.toLowerCase();
|
|
const found = this.suggestions.find((item) => item.toLowerCase().startsWith(lower));
|
|
this.hint = found && found.toLowerCase() !== lower ? found : '';
|
|
},
|
|
acceptSuggestion(inputEl) {
|
|
const value = inputEl.value || '';
|
|
const token = this.currentToken(value);
|
|
if (!token) {
|
|
inputEl.value = value.endsWith(',') ? value : value + ', ';
|
|
inputEl.dispatchEvent(new Event('input'));
|
|
this.hint = '';
|
|
return;
|
|
}
|
|
|
|
const lower = token.toLowerCase();
|
|
const found = this.suggestions.find((item) => item.toLowerCase().startsWith(lower));
|
|
if (!found) {
|
|
inputEl.value = value.endsWith(',') ? value : value + ', ';
|
|
inputEl.dispatchEvent(new Event('input'));
|
|
this.hint = '';
|
|
return;
|
|
}
|
|
|
|
const idx = value.lastIndexOf(',');
|
|
const prefix = idx >= 0 ? value.slice(0, idx + 1) : '';
|
|
const next = (prefix ? prefix + ' ' : '') + found + ', ';
|
|
inputEl.value = next;
|
|
inputEl.dispatchEvent(new Event('input'));
|
|
this.hint = '';
|
|
},
|
|
currentToken(value) {
|
|
const idx = value.lastIndexOf(',');
|
|
const token = idx >= 0 ? value.slice(idx + 1) : value;
|
|
return token.trim();
|
|
},
|
|
};
|
|
}
|
|
</script>
|
|
</x-filament-panels::page>
|