290 lines
13 KiB
PHP
290 lines
13 KiB
PHP
@extends('base.layout')
|
|
|
|
@push('styles')
|
|
<style>
|
|
.bio-summary-card {
|
|
border-left: 4px solid #188ae2;
|
|
}
|
|
.cabinet-visual {
|
|
border: 2px solid #2d3e50;
|
|
border-radius: 12px;
|
|
background: #f7fbff;
|
|
padding: 15px;
|
|
margin-bottom: 18px;
|
|
}
|
|
.rack-grid {
|
|
display: grid;
|
|
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
|
gap: 12px;
|
|
}
|
|
.rack-box {
|
|
border: 1px solid #d7e3ef;
|
|
border-radius: 10px;
|
|
background: #ffffff;
|
|
padding: 12px;
|
|
min-height: 180px;
|
|
}
|
|
.rack-header {
|
|
font-weight: 700;
|
|
color: #1b3a57;
|
|
margin-bottom: 6px;
|
|
}
|
|
.specimen-preview {
|
|
margin: 0;
|
|
padding-left: 15px;
|
|
font-size: 12px;
|
|
}
|
|
.specimen-preview li {
|
|
margin-bottom: 4px;
|
|
}
|
|
.oldest-highlight {
|
|
border: 1px solid #ffd58f;
|
|
background: #fff8ea;
|
|
border-radius: 10px;
|
|
padding: 12px;
|
|
}
|
|
</style>
|
|
@endpush
|
|
|
|
@section('content')
|
|
<div class="wrapper">
|
|
<div class="container-fluid">
|
|
<div class="row">
|
|
<div class="col-sm-12">
|
|
<div class="page-title-box">
|
|
<div class="btn-group pull-right">
|
|
<ol class="breadcrumb hide-phone p-0 m-0">
|
|
<li class="breadcrumb-item active">Biorepository</li>
|
|
</ol>
|
|
</div>
|
|
<h4 class="page-title">Biorepository Lab Mikrobiologi</h4>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
@if(session('success'))
|
|
<div class="row">
|
|
<div class="col-lg-12">
|
|
<div class="alert alert-success">{{ session('success') }}</div>
|
|
</div>
|
|
</div>
|
|
@endif
|
|
|
|
@if($errors->any())
|
|
<div class="row">
|
|
<div class="col-lg-12">
|
|
<div class="alert alert-danger">
|
|
@foreach($errors->all() as $err)
|
|
<div>{{ $err }}</div>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endif
|
|
|
|
<div class="row">
|
|
<div class="col-md-4">
|
|
<div class="card-box bio-summary-card">
|
|
<h5>Total Lemari</h5>
|
|
<h3>{{ $totalCabinets }}</h3>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<div class="card-box bio-summary-card">
|
|
<h5>Total Rack</h5>
|
|
<h3>{{ $totalRacks }}</h3>
|
|
</div>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<div class="card-box bio-summary-card">
|
|
<h5>Total Spesimen</h5>
|
|
<h3>{{ $totalSpecimens }}</h3>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-lg-4">
|
|
<div class="card-box ribbon-box">
|
|
<div class="ribbon ribbon-primary">Tambah Lemari</div>
|
|
<p class="m-b-0"></p>
|
|
<form method="POST" action="{{ route('biorepository.storeCabinet') }}">
|
|
@csrf
|
|
<div class="form-group">
|
|
<label>Kode Lemari</label>
|
|
<input type="text" name="code" class="form-control" placeholder="LMR-A01" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Nama Lemari</label>
|
|
<input type="text" name="name" class="form-control" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Lokasi</label>
|
|
<input type="text" name="location" class="form-control" placeholder="Ruang kultur 1">
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Catatan</label>
|
|
<textarea name="notes" class="form-control" rows="2"></textarea>
|
|
</div>
|
|
<button class="btn btn-custom btn-block" type="submit">Simpan Lemari</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-4">
|
|
<div class="card-box ribbon-box">
|
|
<div class="ribbon ribbon-info">Tambah Rack</div>
|
|
<p class="m-b-0"></p>
|
|
<form method="POST" action="{{ route('biorepository.storeRack') }}">
|
|
@csrf
|
|
<div class="form-group">
|
|
<label>Pilih Lemari</label>
|
|
<select name="cabinet_id" class="form-control" required>
|
|
<option value="">-- Pilih --</option>
|
|
@foreach($cabinetOptions as $cab)
|
|
<option value="{{ $cab->id }}">{{ $cab->code }} - {{ $cab->name }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Kode Rack</label>
|
|
<input type="text" name="code" class="form-control" placeholder="R01" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Nama Rack</label>
|
|
<input type="text" name="name" class="form-control" required>
|
|
</div>
|
|
<div class="form-row">
|
|
<div class="form-group col-6">
|
|
<label>Level</label>
|
|
<input type="number" name="level" class="form-control" min="1" value="1" required>
|
|
</div>
|
|
<div class="form-group col-6">
|
|
<label>Kapasitas</label>
|
|
<input type="number" name="capacity" class="form-control" min="0" value="0">
|
|
</div>
|
|
</div>
|
|
<button class="btn btn-info btn-block" type="submit">Simpan Rack</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-lg-4">
|
|
<div class="card-box ribbon-box">
|
|
<div class="ribbon ribbon-success">Tambah Spesimen</div>
|
|
<p class="m-b-0"></p>
|
|
<form method="POST" action="{{ route('biorepository.storeSpecimen') }}">
|
|
@csrf
|
|
<div class="form-group">
|
|
<label>Pilih Rack</label>
|
|
<select name="rack_id" class="form-control" required>
|
|
<option value="">-- Pilih --</option>
|
|
@foreach($rackOptions as $rack)
|
|
<option value="{{ $rack->id }}">{{ $rack->cabinet->code ?? '-' }} | {{ $rack->code }} - {{ $rack->name }}</option>
|
|
@endforeach
|
|
</select>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Kode Spesimen</label>
|
|
<input type="text" name="specimen_code" class="form-control" placeholder="SP-0001" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Nama Spesimen</label>
|
|
<input type="text" name="specimen_name" class="form-control" placeholder="Darah, sputum, urin" required>
|
|
</div>
|
|
<div class="form-group">
|
|
<label>Nama Pasien (Opsional)</label>
|
|
<input type="text" name="patient_name" class="form-control">
|
|
</div>
|
|
<div class="form-row">
|
|
<div class="form-group col-6">
|
|
<label>Tanggal Ambil</label>
|
|
<input type="date" name="collected_at" class="form-control">
|
|
</div>
|
|
<div class="form-group col-6">
|
|
<label>Tanggal Simpan</label>
|
|
<input type="date" name="stored_at" class="form-control" required>
|
|
</div>
|
|
</div>
|
|
<div class="form-row">
|
|
<div class="form-group col-6">
|
|
<label>Volume</label>
|
|
<input type="text" name="volume" class="form-control" placeholder="2 ml">
|
|
</div>
|
|
<div class="form-group col-6">
|
|
<label>Kondisi Simpan</label>
|
|
<input type="text" name="storage_condition" class="form-control" placeholder="-20 C">
|
|
</div>
|
|
</div>
|
|
<button class="btn btn-success btn-block" type="submit">Simpan Spesimen</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-lg-12">
|
|
<div class="card-box">
|
|
<h4 class="m-b-15">Spesimen dengan Waktu Simpan Paling Lama</h4>
|
|
@if($oldestSpecimen)
|
|
<div class="oldest-highlight">
|
|
<strong>{{ $oldestSpecimen->specimen_code }}</strong> - {{ $oldestSpecimen->specimen_name }}<br>
|
|
Lemari: {{ $oldestSpecimen->cabinet->name ?? '-' }} | Rack: {{ $oldestSpecimen->rack->name ?? '-' }}<br>
|
|
Disimpan sejak: {{ $oldestSpecimen->stored_at }} ({{ $oldestStorageDays }} hari)
|
|
</div>
|
|
@else
|
|
<div class="alert alert-warning m-b-0">Belum ada data spesimen.</div>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-lg-12">
|
|
<div class="card-box">
|
|
<h4 class="m-b-20">Visualisasi Lemari dan Rack</h4>
|
|
|
|
@forelse($cabinets as $cabinet)
|
|
<div class="cabinet-visual">
|
|
<h5 class="m-b-15">{{ $cabinet->code }} - {{ $cabinet->name }} <small class="text-muted">({{ $cabinet->location ?? 'Lokasi belum diisi' }})</small></h5>
|
|
<div class="rack-grid">
|
|
@forelse($cabinet->racks as $rack)
|
|
<div class="rack-box">
|
|
<div class="rack-header">{{ $rack->code }} - {{ $rack->name }} (Lv. {{ $rack->level }})</div>
|
|
<div>Kapasitas: {{ $rack->capacity }}</div>
|
|
<div>Total spesimen: {{ $rack->specimens->count() }}</div>
|
|
|
|
@if($rack->specimens->count() > 0)
|
|
@php
|
|
$oldestRackSpecimen = $rack->specimens->first();
|
|
$preview = $rack->specimens->take(4);
|
|
@endphp
|
|
<div class="text-muted" style="font-size:12px; margin-top:4px;">Terlama di rack ini: {{ $oldestRackSpecimen->specimen_code }} ({{ $oldestRackSpecimen->storage_days }} hari)</div>
|
|
<div style="margin-top:6px; font-size:12px;"><strong>Preview spesimen:</strong></div>
|
|
<ul class="specimen-preview">
|
|
@foreach($preview as $sp)
|
|
<li>
|
|
{{ $sp->specimen_code }} - {{ $sp->specimen_name }}<br>
|
|
<span class="text-muted">Simpan {{ $sp->stored_at }} ({{ $sp->storage_days }} hari)</span>
|
|
</li>
|
|
@endforeach
|
|
</ul>
|
|
@else
|
|
<div class="text-muted" style="margin-top:8px;">Belum ada spesimen pada rack ini.</div>
|
|
@endif
|
|
</div>
|
|
@empty
|
|
<div class="alert alert-light m-b-0">Belum ada rack pada lemari ini.</div>
|
|
@endforelse
|
|
</div>
|
|
</div>
|
|
@empty
|
|
<div class="alert alert-warning">Belum ada data lemari biorepository.</div>
|
|
@endforelse
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endsection
|