chore: stop tracking compiled blade cache
This commit is contained in:
@@ -227,11 +227,33 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Status keberadaan di cattery --}}
|
||||
<div class="rounded-[2rem] border border-slate-200 bg-white p-6 shadow-sm">
|
||||
<div class="mb-4">
|
||||
<h4 class="text-xs font-black uppercase tracking-widest text-slate-700">Status keberadaan</h4>
|
||||
<p class="mt-1 text-xs text-slate-500">Kucing teradopsi dan induk eksternal tetap tersimpan untuk riwayat/pedigree, tetapi tidak dihitung sebagai kucing aktif di cattery.</p>
|
||||
</div>
|
||||
<div class="grid gap-4 md:grid-cols-2">
|
||||
<label class="flex cursor-pointer items-start gap-3 rounded-2xl border border-emerald-100 bg-emerald-50/50 p-4">
|
||||
<input type="checkbox" id="is_adopted" name="is_adopted" value="1" {{ old('is_adopted') ? 'checked' : '' }} class="mt-1 rounded border-slate-300 text-emerald-600">
|
||||
<span><span class="block text-sm font-bold text-emerald-800">Kucing teradopsi</span><span class="mt-1 block text-xs text-emerald-700/80">Tandai bila kucing sudah keluar dari cattery karena adopsi.</span></span>
|
||||
</label>
|
||||
<label class="flex cursor-pointer items-start gap-3 rounded-2xl border border-amber-100 bg-amber-50/50 p-4">
|
||||
<input type="checkbox" id="is_external_parent" name="is_external_parent" value="1" {{ old('is_external_parent') ? 'checked' : '' }} class="mt-1 rounded border-slate-300 text-amber-600">
|
||||
<span><span class="block text-sm font-bold text-amber-800">Induk eksternal / tidak tinggal di cattery</span><span class="mt-1 block text-xs text-amber-700/80">Gunakan untuk sire/dam yang hanya dibutuhkan pada silsilah dan pembiakan.</span></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="mt-4 grid gap-4 md:grid-cols-2">
|
||||
<div><label class="text-[10px] font-bold uppercase text-slate-400">Tanggal adopsi</label><input type="date" name="adopted_at" value="{{ old('adopted_at') }}" class="mt-1 w-full rounded-xl border-slate-200 bg-slate-50 text-sm"></div>
|
||||
<div><label class="text-[10px] font-bold uppercase text-slate-400">Catatan adopsi / keberadaan</label><input type="text" name="adoption_notes" value="{{ old('adoption_notes') }}" class="mt-1 w-full rounded-xl border-slate-200 bg-slate-50 text-sm" placeholder="Opsional"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Action Button --}}
|
||||
<div class="pt-4">
|
||||
<button type="submit" class="w-full py-6 bg-indigo-600 text-white text-xs font-black rounded-[2.5rem] shadow-2xl shadow-indigo-100 hover:bg-indigo-700 hover:-translate-y-1 transition-all active:scale-[0.98] flex items-center justify-center gap-4 group">
|
||||
<i class="fas fa-save text-xl group-hover:rotate-12 transition-transform"></i>
|
||||
<span class="tracking-[0.2em] uppercase">Simpan Record Baru Ilycats</span>
|
||||
<span class="tracking-[0.2em] uppercase">Simpan Data Kucing Baru</span>
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
@@ -265,6 +287,16 @@
|
||||
handleSearchableDatalist('sire_search', 'sire_list', 'induk_jantan_id');
|
||||
handleSearchableDatalist('dam_search', 'dam_list', 'induk_betina_id');
|
||||
|
||||
// Status teradopsi dan induk eksternal bersifat saling eksklusif.
|
||||
const adoptedCheckbox = document.getElementById('is_adopted');
|
||||
const externalParentCheckbox = document.getElementById('is_external_parent');
|
||||
adoptedCheckbox?.addEventListener('change', () => {
|
||||
if (adoptedCheckbox.checked && externalParentCheckbox) externalParentCheckbox.checked = false;
|
||||
});
|
||||
externalParentCheckbox?.addEventListener('change', () => {
|
||||
if (externalParentCheckbox.checked && adoptedCheckbox) adoptedCheckbox.checked = false;
|
||||
});
|
||||
|
||||
// Preview Foto
|
||||
function previewImage(event) {
|
||||
const reader = new FileReader();
|
||||
|
||||
@@ -231,6 +231,28 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Status keberadaan di cattery --}}
|
||||
<div class="rounded-[2rem] border border-slate-200 bg-white p-6 shadow-sm">
|
||||
<div class="mb-4">
|
||||
<h4 class="text-xs font-black uppercase tracking-widest text-slate-700">Status keberadaan</h4>
|
||||
<p class="mt-1 text-xs text-slate-500">Kucing teradopsi dan induk eksternal tetap tersimpan untuk riwayat/pedigree, tetapi tidak dihitung sebagai kucing aktif di cattery.</p>
|
||||
</div>
|
||||
<div class="grid gap-4 md:grid-cols-2">
|
||||
<label class="flex cursor-pointer items-start gap-3 rounded-2xl border border-emerald-100 bg-emerald-50/50 p-4">
|
||||
<input type="checkbox" id="is_adopted" name="is_adopted" value="1" {{ old('is_adopted', ($cat->cattery_status ?? 'active') === 'adopted') ? 'checked' : '' }} class="mt-1 rounded border-slate-300 text-emerald-600">
|
||||
<span><span class="block text-sm font-bold text-emerald-800">Kucing teradopsi</span><span class="mt-1 block text-xs text-emerald-700/80">Tandai bila kucing sudah keluar dari cattery karena adopsi.</span></span>
|
||||
</label>
|
||||
<label class="flex cursor-pointer items-start gap-3 rounded-2xl border border-amber-100 bg-amber-50/50 p-4">
|
||||
<input type="checkbox" id="is_external_parent" name="is_external_parent" value="1" {{ old('is_external_parent', ($cat->cattery_status ?? 'active') === 'external_parent') ? 'checked' : '' }} class="mt-1 rounded border-slate-300 text-amber-600">
|
||||
<span><span class="block text-sm font-bold text-amber-800">Induk eksternal / tidak tinggal di cattery</span><span class="mt-1 block text-xs text-amber-700/80">Gunakan untuk sire/dam yang hanya dibutuhkan pada silsilah dan pembiakan.</span></span>
|
||||
</label>
|
||||
</div>
|
||||
<div class="mt-4 grid gap-4 md:grid-cols-2">
|
||||
<div><label class="text-[10px] font-bold uppercase text-slate-400">Tanggal adopsi</label><input type="date" name="adopted_at" value="{{ old('adopted_at', $cat->adopted_at?->format('Y-m-d')) }}" class="mt-1 w-full rounded-xl border-slate-200 bg-slate-50 text-sm"></div>
|
||||
<div><label class="text-[10px] font-bold uppercase text-slate-400">Catatan adopsi / keberadaan</label><input type="text" name="adoption_notes" value="{{ old('adoption_notes', $cat->adoption_notes) }}" class="mt-1 w-full rounded-xl border-slate-200 bg-slate-50 text-sm" placeholder="Opsional"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{{-- Action Button --}}
|
||||
<button type="submit" class="w-full py-6 bg-indigo-600 text-white text-xs font-black rounded-[2.5rem] shadow-2xl hover:bg-indigo-700 hover:shadow-indigo-200 transition-all active:scale-[0.98] flex items-center justify-center gap-4 group">
|
||||
<i class="fas fa-save text-lg group-hover:rotate-12 transition-transform"></i>
|
||||
@@ -263,6 +285,16 @@
|
||||
handleSearchableDatalist('sire_search', 'sire_list', 'induk_jantan_id');
|
||||
handleSearchableDatalist('dam_search', 'dam_list', 'induk_betina_id');
|
||||
|
||||
// Status teradopsi dan induk eksternal bersifat saling eksklusif.
|
||||
const adoptedCheckbox = document.getElementById('is_adopted');
|
||||
const externalParentCheckbox = document.getElementById('is_external_parent');
|
||||
adoptedCheckbox?.addEventListener('change', () => {
|
||||
if (adoptedCheckbox.checked && externalParentCheckbox) externalParentCheckbox.checked = false;
|
||||
});
|
||||
externalParentCheckbox?.addEventListener('change', () => {
|
||||
if (externalParentCheckbox.checked && adoptedCheckbox) adoptedCheckbox.checked = false;
|
||||
});
|
||||
|
||||
// Preview Foto saat dipilih
|
||||
function previewImage(event) {
|
||||
const reader = new FileReader();
|
||||
|
||||
@@ -3,44 +3,80 @@
|
||||
$currentSort=request('sort','created_at'); $currentDir=request('direction','desc'); $nextDir=$currentDir==='asc'?'desc':'asc';
|
||||
$sortIcon=function($field)use($currentSort,$currentDir){return $currentSort!==$field?'fa-sort text-slate-300':($currentDir==='asc'?'fa-sort-up text-indigo-600':'fa-sort-down text-indigo-600');};
|
||||
@endphp
|
||||
|
||||
<div class="mb-6 flex flex-col gap-4 lg:flex-row lg:items-end lg:justify-between">
|
||||
<div><h1 class="text-2xl font-bold text-slate-900">Data kucing</h1><p class="mt-1 text-sm text-slate-500">Profil, silsilah, pedigree, berat badan, dan jadwal perawatan.</p></div>
|
||||
<div class="flex flex-wrap gap-2">@can('check-access',['cats','update'])<a href="{{ route('cats.bulk-weight') }}" class="border border-slate-300 bg-white px-4 py-2.5 text-sm font-semibold text-slate-700 hover:bg-slate-50"><i class="fas fa-weight-scale mr-2"></i>Input berat massal</a>@endcan @can('check-access',['cats','create'])<a href="{{ route('cats.create') }}" class="bg-indigo-600 px-4 py-2.5 text-sm font-semibold text-white hover:bg-indigo-700"><i class="fas fa-plus mr-2"></i>Tambah kucing</a>@endcan</div>
|
||||
<div>
|
||||
<h1 class="text-2xl font-bold text-slate-900">Data kucing</h1>
|
||||
<p class="mt-1 text-sm text-slate-500">Kucing aktif, kucing teradopsi, induk eksternal, silsilah, pedigree, dan pemantauan kesehatan.</p>
|
||||
</div>
|
||||
<div class="flex flex-wrap gap-2">
|
||||
@can('check-access',['cats','update'])
|
||||
<a href="{{ route('cats.bulk-weight') }}" class="rounded-xl border border-slate-300 bg-white px-4 py-2.5 text-sm font-semibold text-slate-700 hover:bg-slate-50"><i class="fas fa-weight-scale mr-2"></i>Input berat massal</a>
|
||||
@endcan
|
||||
@can('check-access',['cats','create'])
|
||||
<a href="{{ route('cats.create') }}" class="rounded-xl bg-indigo-600 px-4 py-2.5 text-sm font-semibold text-white hover:bg-indigo-700"><i class="fas fa-plus mr-2"></i>Tambah kucing / induk eksternal</a>
|
||||
@endcan
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-5 grid gap-3 sm:grid-cols-3">
|
||||
<div class="border border-slate-200 bg-white p-4"><p class="text-xs text-slate-500">Total kucing</p><p class="mt-1 text-2xl font-bold text-slate-900">{{ $totalCats }}</p></div>
|
||||
<div class="border border-slate-200 bg-white p-4"><p class="text-xs text-slate-500">Sehat</p><p class="mt-1 text-2xl font-bold text-emerald-700">{{ max(0,$totalCats-$sickCats) }}</p></div>
|
||||
<div class="border border-slate-200 bg-white p-4"><p class="text-xs text-slate-500">Dalam perawatan</p><p class="mt-1 text-2xl font-bold text-rose-600">{{ $sickCats }}</p></div>
|
||||
<div class="mb-5 grid gap-3 sm:grid-cols-2 xl:grid-cols-4">
|
||||
<a href="{{ route('cats.index',['list_scope'=>'active']) }}" class="rounded-2xl border {{ $listScope==='active'?'border-indigo-300 bg-indigo-50/60':'border-slate-200 bg-white' }} p-4 hover:border-indigo-300">
|
||||
<p class="text-xs font-semibold text-slate-500">Kucing aktif di cattery</p><p class="mt-1 text-2xl font-bold text-slate-900">{{ $activeCats }}</p>
|
||||
</a>
|
||||
<a href="{{ route('cats.index',['list_scope'=>'adopted']) }}" class="rounded-2xl border {{ $listScope==='adopted'?'border-emerald-300 bg-emerald-50/60':'border-slate-200 bg-white' }} p-4 hover:border-emerald-300">
|
||||
<p class="text-xs font-semibold text-slate-500">Kucing teradopsi</p><p class="mt-1 text-2xl font-bold text-emerald-700">{{ $adoptedCats }}</p>
|
||||
</a>
|
||||
<a href="{{ route('cats.index',['list_scope'=>'external_parent']) }}" class="rounded-2xl border {{ $listScope==='external_parent'?'border-amber-300 bg-amber-50/60':'border-slate-200 bg-white' }} p-4 hover:border-amber-300">
|
||||
<p class="text-xs font-semibold text-slate-500">Induk eksternal</p><p class="mt-1 text-2xl font-bold text-amber-700">{{ $externalParentCats }}</p>
|
||||
</a>
|
||||
<a href="{{ route('cats.index',['list_scope'=>'active','filter_health'=>'treatment']) }}" class="rounded-2xl border border-slate-200 bg-white p-4 hover:border-rose-300">
|
||||
<p class="text-xs font-semibold text-slate-500">Dalam perawatan</p><p class="mt-1 text-2xl font-bold text-rose-600">{{ $sickCats }}</p>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<section class="border border-slate-200 bg-white">
|
||||
<div class="flex flex-col gap-3 border-b border-slate-200 p-4 lg:flex-row lg:items-center lg:justify-between">
|
||||
<form method="GET" action="{{ route('cats.index') }}" class="flex w-full max-w-lg gap-2">
|
||||
<input type="hidden" name="status" value="{{ request('status') }}"><input type="hidden" name="sort" value="{{ request('sort') }}"><input type="hidden" name="direction" value="{{ request('direction') }}">
|
||||
<div class="relative flex-1"><i class="fas fa-search absolute left-3 top-1/2 -translate-y-1/2 text-sm text-slate-400"></i><input name="search" value="{{ request('search') }}" placeholder="Cari nama, EMS, microchip, ras, kandang..." class="field-input pl-9"></div><button class="border border-slate-300 px-4 text-sm font-semibold text-slate-700 hover:bg-slate-50">Cari</button>
|
||||
<section class="overflow-hidden rounded-2xl border border-slate-200 bg-white">
|
||||
<div class="flex flex-col gap-3 border-b border-slate-200 p-4 xl:flex-row xl:items-center xl:justify-between">
|
||||
<form method="GET" action="{{ route('cats.index') }}" class="flex w-full max-w-xl gap-2">
|
||||
<input type="hidden" name="list_scope" value="{{ $listScope }}">
|
||||
<input type="hidden" name="status" value="{{ request('status') }}">
|
||||
<input type="hidden" name="sort" value="{{ request('sort') }}">
|
||||
<input type="hidden" name="direction" value="{{ request('direction') }}">
|
||||
<div class="relative flex-1"><i class="fas fa-search absolute left-3 top-1/2 -translate-y-1/2 text-sm text-slate-400"></i><input name="search" value="{{ request('search') }}" placeholder="Cari nama, EMS, microchip, ras, kandang..." class="field-input rounded-xl pl-9"></div>
|
||||
<button class="rounded-xl border border-slate-300 px-4 text-sm font-semibold text-slate-700 hover:bg-slate-50">Cari</button>
|
||||
</form>
|
||||
<div class="flex flex-wrap gap-1 text-sm">@foreach([''=>'Semua','Dewasa'=>'Dewasa','Junior'=>'Junior','Kitten'=>'Kitten'] as $value=>$label)<a href="{{ route('cats.index',array_merge(request()->except('page','status'),$value?['status'=>$value]:[])) }}" class="px-3 py-2 {{ request('status','')===$value?'bg-slate-900 text-white':'text-slate-600 hover:bg-slate-100' }}">{{ $label }}</a>@endforeach</div>
|
||||
<div class="flex flex-wrap gap-1 text-sm">
|
||||
@foreach([''=>'Semua usia','Dewasa'=>'Dewasa','Junior'=>'Junior','Kitten'=>'Kitten'] as $value=>$label)
|
||||
<a href="{{ route('cats.index',array_merge(request()->except('page','status'),$value?['status'=>$value]:[])) }}" class="rounded-lg px-3 py-2 {{ request('status','')===$value?'bg-slate-900 text-white':'text-slate-600 hover:bg-slate-100' }}">{{ $label }}</a>
|
||||
@endforeach
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="overflow-x-auto">
|
||||
<table class="min-w-full divide-y divide-slate-200 text-sm">
|
||||
<thead class="bg-slate-50 text-left text-xs font-semibold text-slate-500"><tr>
|
||||
<th class="px-4 py-3"><a class="flex items-center gap-2" href="{{ request()->fullUrlWithQuery(['sort'=>'nama_kucing','direction'=>$nextDir]) }}">Kucing <i class="fas {{ $sortIcon('nama_kucing') }}"></i></a></th>
|
||||
<th class="px-4 py-3">Identitas & pedigree</th><th class="px-4 py-3">Silsilah</th>
|
||||
<th class="px-4 py-3">Status cattery</th>
|
||||
<th class="px-4 py-3">Identitas & pedigree</th>
|
||||
<th class="px-4 py-3">Silsilah</th>
|
||||
<th class="px-4 py-3"><a class="flex items-center gap-2" href="{{ request()->fullUrlWithQuery(['sort'=>'berat_badan','direction'=>$nextDir]) }}">Berat <i class="fas {{ $sortIcon('berat_badan') }}"></i></a></th>
|
||||
<th class="px-4 py-3"><a class="flex items-center gap-2" href="{{ request()->fullUrlWithQuery(['sort'=>'lokasi_kandang','direction'=>$nextDir]) }}">Kandang <i class="fas {{ $sortIcon('lokasi_kandang') }}"></i></a></th>
|
||||
<th class="px-4 py-3 text-right">Aksi</th>
|
||||
</tr></thead>
|
||||
<tbody class="divide-y divide-slate-100">
|
||||
@forelse($cats as $cat)
|
||||
@php
|
||||
$statusStyle = match($cat->cattery_status ?: 'active') {
|
||||
'adopted' => 'bg-emerald-50 text-emerald-700 border-emerald-100',
|
||||
'external_parent' => 'bg-amber-50 text-amber-700 border-amber-100',
|
||||
default => 'bg-indigo-50 text-indigo-700 border-indigo-100',
|
||||
};
|
||||
@endphp
|
||||
<tr class="hover:bg-slate-50">
|
||||
<td class="px-4 py-3"><div class="flex min-w-52 items-center gap-3"><img src="{{ $cat->foto_url }}" alt="{{ $cat->nama_kucing }}" class="h-11 w-11 rounded-lg border border-slate-200 object-cover"><div><a href="{{ route('cats.show',$cat) }}" class="font-semibold text-slate-900 hover:text-indigo-600">{{ $cat->nama_kucing }}</a><p class="mt-0.5 text-xs text-slate-500">{{ $cat->jenis_kelamin }} · {{ $cat->ras }}</p></div></div></td>
|
||||
<td class="px-4 py-3"><div class="space-y-1"><p class="text-xs text-slate-600"><span class="text-slate-400">EMS:</span> {{ $cat->kode_ems ?: '-' }}</p><p class="text-xs text-slate-600"><span class="text-slate-400">Microchip:</span> {{ $cat->microchip ?: '-' }}</p><div class="flex flex-wrap gap-1">@forelse($cat->registrations as $reg)<span class="border border-slate-200 bg-slate-50 px-1.5 py-0.5 text-[11px] font-semibold text-slate-600">{{ $reg->association->code }}{{ $reg->is_primary?' · utama':'' }}</span>@empty<span class="text-xs text-slate-400">Belum ada registrasi</span>@endforelse</div></div></td>
|
||||
<td class="px-4 py-3"><p class="text-xs text-slate-600">{{ $cat->age }}</p><p class="mt-1 text-xs text-slate-500">Jantan: {{ $cat->sire->nama_kucing ?? '-' }}</p><p class="text-xs text-slate-500">Betina: {{ $cat->dam->nama_kucing ?? '-' }}</p></td>
|
||||
<td class="px-4 py-3"><p class="font-semibold text-slate-800">{{ number_format((float)($cat->berat_badan ?? $cat->berat_terakhir ?? 0),2) }} kg</p><p class="text-xs {{ $cat->treatment_status==1?'text-rose-600':'text-emerald-600' }}">{{ $cat->treatment_status==1?'Dalam perawatan':'Sehat' }}</p></td>
|
||||
<td class="px-4 py-3"><p class="text-slate-700">{{ $cat->lokasi_kandang ?: '-' }}</p><p class="text-xs text-slate-500">{{ $cat->pic->name ?? '-' }}</p></td>
|
||||
<td class="px-4 py-3"><div class="flex justify-end gap-1"><a href="{{ route('cats.show',$cat) }}" class="p-2 text-slate-500 hover:bg-slate-100" title="Lihat"><i class="fas fa-eye"></i></a><a href="{{ route('cats.pedigree',$cat) }}" class="p-2 text-slate-500 hover:bg-slate-100" title="Pedigree"><i class="fas fa-file-lines"></i></a>@can('check-access',['cats','update'])<a href="{{ route('cats.edit',$cat) }}" class="p-2 text-slate-500 hover:bg-slate-100" title="Ubah"><i class="fas fa-pen"></i></a>@endcan @can('check-access',['cats','delete'])<form id="delete-cat-{{ $cat->id }}" method="POST" action="{{ route('cats.destroy',$cat) }}">@csrf @method('DELETE')<button type="button" onclick="confirmDelete('delete-cat-{{ $cat->id }}','{{ addslashes($cat->nama_kucing) }}')" class="p-2 text-rose-500 hover:bg-rose-50" title="Hapus"><i class="fas fa-trash"></i></button></form>@endcan</div></td>
|
||||
<td class="px-4 py-3"><div class="flex min-w-52 items-center gap-3"><img src="{{ $cat->foto_url }}" alt="{{ $cat->nama_kucing }}" class="h-11 w-11 rounded-xl border border-slate-200 object-cover"><div><a href="{{ route('cats.show',$cat) }}" class="font-semibold text-slate-900 hover:text-indigo-600">{{ $cat->nama_kucing }}</a><p class="mt-0.5 text-xs text-slate-500">{{ $cat->jenis_kelamin }} · {{ $cat->ras }}</p></div></div></td>
|
||||
<td class="px-4 py-3"><span class="inline-flex rounded-full border px-2.5 py-1 text-xs font-semibold {{ $statusStyle }}">{{ $cat->cattery_status_label }}</span>@if($cat->adopted_at)<p class="mt-1 text-xs text-slate-400">Sejak {{ $cat->adopted_at->format('d-m-Y') }}</p>@endif</td>
|
||||
<td class="px-4 py-3"><div class="space-y-1"><p class="text-xs text-slate-600"><span class="text-slate-400">EMS:</span> {{ $cat->kode_ems ?: '-' }}</p><p class="text-xs text-slate-600"><span class="text-slate-400">Microchip:</span> {{ $cat->microchip ?: '-' }}</p><div class="flex flex-wrap gap-1">@forelse($cat->registrations as $reg)<span class="rounded border border-slate-200 bg-slate-50 px-1.5 py-0.5 text-[11px] font-semibold text-slate-600">{{ $reg->association->code }}{{ $reg->is_primary?' · utama':'' }}</span>@empty<span class="text-xs text-slate-400">Belum ada registrasi</span>@endforelse</div></div></td>
|
||||
<td class="px-4 py-3"><p class="text-xs text-slate-600">{{ $cat->age }}</p><p class="mt-1 text-xs text-slate-500">Sire: {{ $cat->sire->nama_kucing ?? '-' }}</p><p class="text-xs text-slate-500">Dam: {{ $cat->dam->nama_kucing ?? '-' }}</p></td>
|
||||
<td class="px-4 py-3"><p class="font-semibold text-slate-800">{{ number_format((float)($cat->berat_badan ?? $cat->berat_terakhir ?? 0),2) }} kg</p>@if(($cat->cattery_status ?: 'active')==='active')<p class="text-xs {{ $cat->treatment_status==1?'text-rose-600':'text-emerald-600' }}">{{ $cat->treatment_status==1?'Dalam perawatan':'Sehat' }}</p>@else<p class="text-xs text-slate-400">Tidak dihitung sebagai kucing aktif</p>@endif</td>
|
||||
<td class="px-4 py-3"><div class="flex justify-end gap-1"><a href="{{ route('cats.show',$cat) }}" class="rounded-lg p-2 text-slate-500 hover:bg-slate-100" title="Lihat"><i class="fas fa-eye"></i></a><a href="{{ route('cats.pedigree',$cat) }}" class="rounded-lg p-2 text-slate-500 hover:bg-slate-100" title="Pedigree"><i class="fas fa-file-lines"></i></a>@can('check-access',['cats','update'])<a href="{{ route('cats.edit',$cat) }}" class="rounded-lg p-2 text-slate-500 hover:bg-slate-100" title="Ubah"><i class="fas fa-pen"></i></a>@endcan @can('check-access',['cats','delete'])<form id="delete-cat-{{ $cat->id }}" method="POST" action="{{ route('cats.destroy',$cat) }}">@csrf @method('DELETE')<button type="button" onclick="confirmDelete('delete-cat-{{ $cat->id }}','{{ addslashes($cat->nama_kucing) }}')" class="rounded-lg p-2 text-rose-500 hover:bg-rose-50" title="Hapus"><i class="fas fa-trash"></i></button></form>@endcan</div></td>
|
||||
</tr>
|
||||
@empty<tr><td colspan="6" class="px-4 py-12 text-center text-sm text-slate-500">Data kucing tidak ditemukan.</td></tr>@endforelse
|
||||
</tbody>
|
||||
|
||||
@@ -1,51 +1,79 @@
|
||||
<x-app-layout>
|
||||
<div class="mb-6 flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
|
||||
<div><a href="{{ route('cats.show',$cat) }}" class="mb-2 inline-flex items-center gap-2 text-sm text-slate-500 hover:text-slate-800"><i class="fas fa-arrow-left"></i>Kembali ke profil</a><h1 class="text-2xl font-bold text-slate-900">Registrasi & pedigree</h1><p class="mt-1 text-sm text-slate-500">{{ $cat->nama_kucing }} dapat memiliki registrasi dan sertifikat dari lebih dari satu asosiasi.</p></div>
|
||||
<div>
|
||||
<a href="{{ route('cats.show',$cat) }}" class="mb-2 inline-flex items-center gap-2 text-sm text-slate-500 hover:text-slate-800"><i class="fas fa-arrow-left"></i>Kembali ke profil</a>
|
||||
<h1 class="text-2xl font-bold text-slate-900">Registrasi & pedigree</h1>
|
||||
<p class="mt-1 text-sm text-slate-500">{{ $cat->nama_kucing }} dapat memiliki registrasi dan sertifikat dari beberapa asosiasi.</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="grid gap-6 xl:grid-cols-[1fr_360px]">
|
||||
<div class="space-y-4">
|
||||
@forelse($cat->registrations as $registration)
|
||||
<section class="border border-slate-200 bg-white">
|
||||
<section class="overflow-hidden rounded-2xl border border-slate-200 bg-white">
|
||||
<div class="flex flex-wrap items-start justify-between gap-3 border-b border-slate-200 px-5 py-4">
|
||||
<div class="flex items-center gap-3"><div class="flex h-10 min-w-10 items-center justify-center bg-slate-100 px-2 text-sm font-bold text-slate-700">{{ $registration->association->code }}</div><div><h2 class="font-semibold text-slate-900">{{ $registration->association->name }}</h2><p class="text-xs text-slate-500">{{ $registration->is_primary ? 'Pedigree utama' : 'Registrasi tambahan' }}</p></div></div>
|
||||
<div class="flex items-center gap-3">
|
||||
<div class="flex h-10 min-w-10 items-center justify-center rounded-xl bg-slate-100 px-2 text-sm font-bold text-slate-700">{{ $registration->association->code }}</div>
|
||||
<div><h2 class="font-semibold text-slate-900">{{ $registration->association->name }}</h2><p class="text-xs text-slate-500">{{ $registration->is_primary ? 'Pedigree utama' : 'Registrasi tambahan' }}</p></div>
|
||||
</div>
|
||||
@can('check-access',['cats','update'])
|
||||
<form action="{{ route('cats.registrations.destroy',[$cat,$registration]) }}" method="POST" onsubmit="return confirm('Hapus registrasi ini beserta dokumennya?')">@csrf @method('DELETE')<button class="text-sm font-medium text-rose-600 hover:text-rose-700">Hapus</button></form>
|
||||
@endcan
|
||||
</div>
|
||||
|
||||
<form action="{{ route('cats.registrations.update',[$cat,$registration]) }}" method="POST" class="grid gap-4 p-5 sm:grid-cols-2 lg:grid-cols-3">@csrf @method('PUT')
|
||||
<div><label class="field-label">Nomor registrasi</label><input name="registration_number" value="{{ $registration->registration_number }}" class="field-input"></div>
|
||||
<div><label class="field-label">Nomor pedigree</label><input name="pedigree_number" value="{{ $registration->pedigree_number }}" class="field-input"></div>
|
||||
<div><label class="field-label">Nomor sertifikat</label><input name="certificate_number" value="{{ $registration->certificate_number }}" class="field-input"></div>
|
||||
<div><label class="field-label">Tanggal terbit</label><input type="date" name="issue_date" value="{{ $registration->issue_date?->format('Y-m-d') }}" class="field-input"></div>
|
||||
<div><label class="field-label">Gelar / title</label><input name="title" value="{{ $registration->title }}" class="field-input" placeholder="Contoh: CH, GCH"></div>
|
||||
<div><label class="field-label">Status kepemilikan</label><select name="ownership_status" class="field-input"><option value="">-</option>@foreach(['milik_sendiri'=>'Milik sendiri','co_own'=>'Co-own','transfer'=>'Transfer','lainnya'=>'Lainnya'] as $v=>$l)<option value="{{ $v }}" @selected($registration->ownership_status===$v)>{{ $l }}</option>@endforeach</select></div>
|
||||
<div class="sm:col-span-2 lg:col-span-3"><label class="field-label">Catatan</label><textarea name="notes" rows="2" class="field-input">{{ $registration->notes }}</textarea></div>
|
||||
<div><label class="field-label">Nomor registrasi</label><input name="registration_number" value="{{ $registration->registration_number }}" class="field-input rounded-xl"></div>
|
||||
<div><label class="field-label">Nomor pedigree</label><input name="pedigree_number" value="{{ $registration->pedigree_number }}" class="field-input rounded-xl"></div>
|
||||
<div><label class="field-label">Nomor sertifikat</label><input name="certificate_number" value="{{ $registration->certificate_number }}" class="field-input rounded-xl"></div>
|
||||
<div><label class="field-label">Tanggal terbit</label><input type="date" name="issue_date" value="{{ $registration->issue_date?->format('Y-m-d') }}" class="field-input rounded-xl"></div>
|
||||
<div><label class="field-label">Gelar / title</label><input name="title" value="{{ $registration->title }}" class="field-input rounded-xl" placeholder="Contoh: CH, GCH"></div>
|
||||
<div><label class="field-label">Status kepemilikan</label><select name="ownership_status" class="field-input rounded-xl"><option value="">-</option>@foreach(['milik_sendiri'=>'Milik sendiri','co_own'=>'Co-own','transfer'=>'Transfer','lainnya'=>'Lainnya'] as $v=>$l)<option value="{{ $v }}" @selected($registration->ownership_status===$v)>{{ $l }}</option>@endforeach</select></div>
|
||||
<div class="sm:col-span-2 lg:col-span-3"><label class="field-label">Catatan</label><textarea name="notes" rows="2" class="field-input rounded-xl">{{ $registration->notes }}</textarea></div>
|
||||
<label class="flex items-center gap-2 text-sm text-slate-700"><input type="hidden" name="is_primary" value="0"><input type="checkbox" name="is_primary" value="1" @checked($registration->is_primary) class="rounded border-slate-300 text-indigo-600">Jadikan pedigree utama</label>
|
||||
<div class="sm:col-span-2 flex justify-end"><button class="border border-slate-300 bg-white px-4 py-2 text-sm font-semibold text-slate-700 hover:bg-slate-50">Simpan perubahan</button></div>
|
||||
@can('check-access',['cats','update'])<div class="sm:col-span-2 lg:col-span-3"><button class="rounded-xl bg-slate-800 px-4 py-2 text-sm font-semibold text-white hover:bg-slate-900">Simpan perubahan registrasi</button></div>@endcan
|
||||
</form>
|
||||
<div class="border-t border-slate-200 p-5">
|
||||
<div class="mb-3 flex items-center justify-between"><h3 class="text-sm font-semibold text-slate-800">Dokumen</h3><span class="text-xs text-slate-500">PDF/JPG/PNG, maks. 10 MB</span></div>
|
||||
<div class="mb-4 grid gap-2">@forelse($registration->documents as $document)<div class="flex items-center justify-between gap-3 border border-slate-200 p-3"><div class="min-w-0"><a href="{{ Storage::url($document->file_path) }}" target="_blank" class="truncate text-sm font-medium text-indigo-600 hover:underline">{{ $document->label }}</a><p class="text-xs text-slate-500">{{ ucfirst($document->document_type) }}{{ $document->issued_at ? ' · '.$document->issued_at->format('d-m-Y') : '' }}</p></div><form action="{{ route('cats.registrations.documents.destroy',[$cat,$registration,$document]) }}" method="POST">@csrf @method('DELETE')<button class="text-xs font-medium text-rose-600">Hapus</button></form></div>@empty<p class="text-sm text-slate-500">Belum ada dokumen pada registrasi ini.</p>@endforelse</div>
|
||||
<form action="{{ route('cats.registrations.documents.store',[$cat,$registration]) }}" method="POST" enctype="multipart/form-data" class="grid gap-3 md:grid-cols-[1fr_180px_180px_auto]">@csrf<input type="file" name="document" required class="field-input py-2"><select name="document_type" class="field-input"><option value="pedigree">Pedigree</option><option value="registration">Registrasi</option><option value="ownership">Kepemilikan</option><option value="title">Gelar</option><option value="other">Lainnya</option></select><input name="label" class="field-input" placeholder="Nama dokumen"><button class="bg-slate-800 px-4 py-2 text-sm font-semibold text-white hover:bg-slate-900">Tambah dokumen</button></form>
|
||||
|
||||
<div class="border-t border-slate-200 bg-slate-50/50 p-5">
|
||||
<div class="mb-3 flex items-center justify-between"><h3 class="text-sm font-semibold text-slate-800">Dokumen pedigree</h3><span class="text-xs text-slate-500">PDF/JPG/PNG, maks. 10 MB</span></div>
|
||||
<div class="mb-4 grid gap-2">
|
||||
@forelse($registration->documents as $document)
|
||||
<div class="flex flex-col gap-3 rounded-xl border border-slate-200 bg-white p-3 sm:flex-row sm:items-center sm:justify-between">
|
||||
<div class="min-w-0"><p class="truncate text-sm font-semibold text-slate-800">{{ $document->label }}</p><p class="text-xs text-slate-500">{{ ucfirst($document->document_type) }}{{ $document->issued_at ? ' · '.$document->issued_at->format('d-m-Y') : '' }}</p></div>
|
||||
<div class="flex flex-wrap gap-2">
|
||||
<a href="{{ route('cats.registrations.documents.show',[$cat,$registration,$document]) }}" target="_blank" rel="noopener" class="rounded-lg border border-indigo-200 bg-indigo-50 px-3 py-2 text-xs font-semibold text-indigo-700 hover:bg-indigo-100"><i class="fas fa-eye mr-1"></i>Lihat</a>
|
||||
<a href="{{ route('cats.registrations.documents.download',[$cat,$registration,$document]) }}" class="rounded-lg border border-slate-200 bg-white px-3 py-2 text-xs font-semibold text-slate-700 hover:bg-slate-50"><i class="fas fa-download mr-1"></i>Unduh</a>
|
||||
@can('check-access',['cats','update'])<form action="{{ route('cats.registrations.documents.destroy',[$cat,$registration,$document]) }}" method="POST" onsubmit="return confirm('Hapus dokumen ini?')">@csrf @method('DELETE')<button class="rounded-lg border border-rose-200 bg-rose-50 px-3 py-2 text-xs font-semibold text-rose-700 hover:bg-rose-100"><i class="fas fa-trash mr-1"></i>Hapus</button></form>@endcan
|
||||
</div>
|
||||
</div>
|
||||
@empty
|
||||
<p class="rounded-xl border border-dashed border-slate-300 bg-white p-5 text-center text-sm text-slate-500">Belum ada dokumen pada registrasi ini.</p>
|
||||
@endforelse
|
||||
</div>
|
||||
@can('check-access',['cats','update'])
|
||||
<form action="{{ route('cats.registrations.documents.store',[$cat,$registration]) }}" method="POST" enctype="multipart/form-data" class="grid gap-3 md:grid-cols-[1fr_180px_180px_auto]">@csrf<input type="file" name="document" required class="field-input rounded-xl py-2"><select name="document_type" class="field-input rounded-xl"><option value="pedigree">Pedigree</option><option value="registration">Registrasi</option><option value="ownership">Kepemilikan</option><option value="title">Gelar</option><option value="other">Lainnya</option></select><input name="label" class="field-input rounded-xl" placeholder="Nama dokumen"><button class="rounded-xl bg-slate-800 px-4 py-2 text-sm font-semibold text-white hover:bg-slate-900">Tambah dokumen</button></form>
|
||||
@endcan
|
||||
</div>
|
||||
</section>
|
||||
@empty
|
||||
<div class="border border-dashed border-slate-300 bg-white p-10 text-center"><i class="fas fa-file-lines mb-3 text-3xl text-slate-300"></i><p class="font-medium text-slate-700">Belum ada registrasi pedigree</p><p class="mt-1 text-sm text-slate-500">Tambahkan asosiasi dari formulir di sebelah kanan.</p></div>
|
||||
<div class="rounded-2xl border border-dashed border-slate-300 bg-white p-10 text-center"><i class="fas fa-file-lines mb-3 text-3xl text-slate-300"></i><p class="font-medium text-slate-700">Belum ada registrasi pedigree</p><p class="mt-1 text-sm text-slate-500">Tambahkan asosiasi dari formulir di sebelah kanan.</p></div>
|
||||
@endforelse
|
||||
</div>
|
||||
|
||||
<aside class="h-fit border border-slate-200 bg-white p-5" x-data="{custom:false}">
|
||||
@can('check-access',['cats','update'])
|
||||
<aside class="h-fit rounded-2xl border border-slate-200 bg-white p-5" x-data="{custom:false}">
|
||||
<h2 class="font-semibold text-slate-900">Tambah registrasi</h2><p class="mt-1 text-sm text-slate-500">Satu asosiasi dapat ditambahkan satu kali untuk setiap kucing.</p>
|
||||
<form action="{{ route('cats.registrations.store',$cat) }}" method="POST" enctype="multipart/form-data" class="mt-5 space-y-4">@csrf
|
||||
<div><label class="field-label">Asosiasi</label><select name="association_id" required class="field-input" @change="custom=$event.target.value==='custom'"><option value="">Pilih asosiasi</option>@foreach($associations as $association)<option value="{{ $association->id }}">{{ $association->code }} - {{ $association->name }}</option>@endforeach<option value="custom">Asosiasi lain…</option></select></div>
|
||||
<template x-if="custom"><div class="space-y-3"><div><label class="field-label">Kode asosiasi</label><input name="association_code" class="field-input" placeholder="Contoh: TICA"></div><div><label class="field-label">Nama asosiasi</label><input name="association_name" class="field-input"></div></div></template>
|
||||
<div><label class="field-label">Nomor registrasi</label><input name="registration_number" class="field-input"></div>
|
||||
<div><label class="field-label">Nomor pedigree</label><input name="pedigree_number" class="field-input"></div>
|
||||
<div><label class="field-label">Nomor sertifikat</label><input name="certificate_number" class="field-input"></div>
|
||||
<div class="grid grid-cols-2 gap-3"><div><label class="field-label">Tanggal terbit</label><input type="date" name="issue_date" class="field-input"></div><div><label class="field-label">Gelar</label><input name="title" class="field-input"></div></div>
|
||||
<div><label class="field-label">File sertifikat</label><input type="file" name="certificate_file" accept=".pdf,.jpg,.jpeg,.png" class="field-input py-2"></div>
|
||||
<div><label class="field-label">Asosiasi</label><select name="association_id" required class="field-input rounded-xl" @change="custom=$event.target.value==='custom'"><option value="">Pilih asosiasi</option>@foreach($associations as $association)<option value="{{ $association->id }}">{{ $association->code }} - {{ $association->name }}</option>@endforeach<option value="custom">Asosiasi lain…</option></select></div>
|
||||
<template x-if="custom"><div class="space-y-3"><div><label class="field-label">Kode asosiasi</label><input name="association_code" class="field-input rounded-xl" placeholder="Contoh: TICA"></div><div><label class="field-label">Nama asosiasi</label><input name="association_name" class="field-input rounded-xl"></div></div></template>
|
||||
<div><label class="field-label">Nomor registrasi</label><input name="registration_number" class="field-input rounded-xl"></div>
|
||||
<div><label class="field-label">Nomor pedigree</label><input name="pedigree_number" class="field-input rounded-xl"></div>
|
||||
<div><label class="field-label">Nomor sertifikat</label><input name="certificate_number" class="field-input rounded-xl"></div>
|
||||
<div class="grid grid-cols-2 gap-3"><div><label class="field-label">Tanggal terbit</label><input type="date" name="issue_date" class="field-input rounded-xl"></div><div><label class="field-label">Gelar</label><input name="title" class="field-input rounded-xl"></div></div>
|
||||
<div><label class="field-label">File sertifikat</label><input type="file" name="certificate_file" accept=".pdf,.jpg,.jpeg,.png" class="field-input rounded-xl py-2"></div>
|
||||
<label class="flex items-center gap-2 text-sm text-slate-700"><input type="hidden" name="is_primary" value="0"><input type="checkbox" name="is_primary" value="1" class="rounded border-slate-300 text-indigo-600">Jadikan pedigree utama</label>
|
||||
<button class="w-full bg-indigo-600 px-4 py-2.5 text-sm font-semibold text-white hover:bg-indigo-700">Simpan registrasi</button>
|
||||
<button class="w-full rounded-xl bg-indigo-600 px-4 py-2.5 text-sm font-semibold text-white hover:bg-indigo-700">Simpan registrasi</button>
|
||||
</form>
|
||||
</aside>
|
||||
@endcan
|
||||
</div>
|
||||
</x-app-layout>
|
||||
|
||||
@@ -367,7 +367,6 @@
|
||||
</div>
|
||||
|
||||
@push('scripts')
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const ctx = document.getElementById('weightChart');
|
||||
|
||||
Reference in New Issue
Block a user