first
This commit is contained in:
29
resources/views/admin/prizes/edit.blade.php
Normal file
29
resources/views/admin/prizes/edit.blade.php
Normal file
@@ -0,0 +1,29 @@
|
||||
@extends('layouts.app')
|
||||
@section('title', 'Kemaskini Hadiah')
|
||||
|
||||
@section('content')
|
||||
<div class="row justify-content-center"><div class="col-lg-7">
|
||||
<div class="card"><div class="card-body">
|
||||
<form method="POST" action="{{ route('admin.prizes.update', $prize) }}">
|
||||
@csrf @method('PUT')
|
||||
<div class="row g-3">
|
||||
<div class="col-md-8"><label class="form-label">Nama Hadiah *</label>
|
||||
<input name="nama_hadiah" class="form-control @error('nama_hadiah') is-invalid @enderror" value="{{ old('nama_hadiah', $prize->nama_hadiah) }}" required>
|
||||
@error('nama_hadiah')<div class="invalid-feedback">{{ $message }}</div>@enderror</div>
|
||||
<div class="col-md-4"><label class="form-label">Susunan Cabutan *</label>
|
||||
<input type="number" name="draw_order" class="form-control" value="{{ old('draw_order', $prize->draw_order) }}" required></div>
|
||||
<div class="col-md-4"><label class="form-label">Kod</label>
|
||||
<input name="kod_hadiah" class="form-control" value="{{ old('kod_hadiah', $prize->kod_hadiah) }}"></div>
|
||||
<div class="col-md-4"><label class="form-label">Kategori</label>
|
||||
<input name="kategori" class="form-control" value="{{ old('kategori', $prize->kategori) }}"></div>
|
||||
<div class="col-md-4"><label class="form-label">Nilai Anggaran (RM)</label>
|
||||
<input type="number" step="0.01" name="nilai_anggaran" class="form-control" value="{{ old('nilai_anggaran', $prize->nilai_anggaran) }}"></div>
|
||||
</div>
|
||||
<div class="mt-4 d-flex gap-2">
|
||||
<button class="btn btn-teal"><i class="bi bi-save"></i> Simpan</button>
|
||||
<a href="{{ route('admin.prizes.index') }}" class="btn btn-light">Kembali</a>
|
||||
</div>
|
||||
</form>
|
||||
</div></div>
|
||||
</div></div>
|
||||
@endsection
|
||||
51
resources/views/admin/prizes/import.blade.php
Normal file
51
resources/views/admin/prizes/import.blade.php
Normal file
@@ -0,0 +1,51 @@
|
||||
@extends('layouts.app')
|
||||
@section('title', 'Import Hadiah')
|
||||
|
||||
@section('content')
|
||||
@php $result = session('import_result') ? \App\Models\ImportLog::find(session('import_result')) : null; @endphp
|
||||
<div class="row g-3">
|
||||
<div class="col-lg-5">
|
||||
<div class="card"><div class="card-body">
|
||||
<h5 class="fw-bold"><i class="bi bi-upload text-teal"></i> Muat Naik Fail</h5>
|
||||
<p class="text-muted small">Format CSV atau XLSX. Lajur: <code>kod_hadiah, nama_hadiah, kategori, nilai_anggaran, susunan_cabutan, kuantiti</code>.
|
||||
Jika <b>kuantiti > 1</b>, sistem akan jana beberapa item berasingan (cth Hamper #1 … #5).</p>
|
||||
<form method="POST" action="{{ route('admin.prizes.import.store') }}" enctype="multipart/form-data">
|
||||
@csrf
|
||||
<input type="file" name="file" class="form-control mb-2 @error('file') is-invalid @enderror" accept=".csv,.xlsx,.xls" required>
|
||||
@error('file')<div class="invalid-feedback">{{ $message }}</div>@enderror
|
||||
<button class="btn btn-teal w-100"><i class="bi bi-cloud-upload"></i> Import Sekarang</button>
|
||||
</form>
|
||||
<a href="{{ asset('samples/contoh-hadiah.csv') }}" class="btn btn-sm btn-link mt-2"><i class="bi bi-download"></i> Muat turun templat contoh</a>
|
||||
</div></div>
|
||||
</div>
|
||||
<div class="col-lg-7">
|
||||
@if($result)
|
||||
<div class="card mb-3 border-start border-4 border-success"><div class="card-body">
|
||||
<h6 class="fw-bold">Ringkasan Import: {{ $result->filename }}</h6>
|
||||
<div class="row text-center g-2 my-2">
|
||||
<div class="col"><div class="stat-card bg-teal py-2"><div class="value fs-4">{{ $result->total_rows }}</div><div class="label">Baris</div></div></div>
|
||||
<div class="col"><div class="stat-card bg-green py-2"><div class="value fs-4">{{ $result->success_count }}</div><div class="label">Item Dijana</div></div></div>
|
||||
<div class="col"><div class="stat-card bg-red py-2"><div class="value fs-4">{{ $result->failed_count }}</div><div class="label">Gagal</div></div></div>
|
||||
</div>
|
||||
@if($result->errors)
|
||||
<details><summary class="text-danger">Lihat {{ count($result->errors) }} isu</summary>
|
||||
<ul class="small mt-2 mb-0">@foreach($result->errors as $e)<li>{{ $e }}</li>@endforeach</ul></details>
|
||||
@endif
|
||||
</div></div>
|
||||
@endif
|
||||
<div class="card"><div class="card-body">
|
||||
<h6 class="fw-bold"><i class="bi bi-clock-history"></i> Log Import Terkini</h6>
|
||||
<table class="table table-sm align-middle">
|
||||
<thead><tr><th>Fail</th><th>Item</th><th>Gagal</th><th>Oleh</th><th>Masa</th></tr></thead>
|
||||
<tbody>
|
||||
@forelse($logs as $log)
|
||||
<tr><td>{{ $log->filename }}</td><td class="text-success">{{ $log->success_count }}</td>
|
||||
<td class="text-danger">{{ $log->failed_count }}</td><td>{{ $log->importedBy?->name ?? '-' }}</td>
|
||||
<td><small>{{ $log->created_at->format('d/m H:i') }}</small></td></tr>
|
||||
@empty<tr><td colspan="5" class="text-center text-muted">Belum ada import.</td></tr>@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div></div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
42
resources/views/admin/prizes/index.blade.php
Normal file
42
resources/views/admin/prizes/index.blade.php
Normal file
@@ -0,0 +1,42 @@
|
||||
@extends('layouts.app')
|
||||
@section('title', 'Urus Hadiah')
|
||||
|
||||
@section('content')
|
||||
<div class="d-flex justify-content-between align-items-center mb-3">
|
||||
<div class="text-muted">Susunan cabutan mengikut <code>draw_order</code>.</div>
|
||||
<a href="{{ route('admin.prizes.import') }}" class="btn btn-outline-teal"><i class="bi bi-upload"></i> Import Hadiah</a>
|
||||
</div>
|
||||
|
||||
<div class="card"><div class="card-body">
|
||||
<div class="table-responsive">
|
||||
<table class="table table-koipb table-hover align-middle">
|
||||
<thead><tr><th>Susunan</th><th>Kod</th><th>Hadiah</th><th>Kategori</th><th>Nilai (RM)</th><th>Status</th><th>Pemenang</th><th></th></tr></thead>
|
||||
<tbody>
|
||||
@forelse($prizes as $p)
|
||||
@php $pill = ['belum_dicabut'=>'pill-belum','sedang_dicabut'=>'pill-sedang','disahkan'=>'pill-disahkan','redraw_required'=>'pill-redraw'][$p->status]; @endphp
|
||||
<tr>
|
||||
<td><span class="badge bg-dark2">#{{ $p->draw_order }}</span></td>
|
||||
<td>{{ $p->kod_hadiah ?? '-' }}</td>
|
||||
<td class="fw-semibold">{{ $p->nama_hadiah }}</td>
|
||||
<td>{{ $p->kategori ?? '-' }}</td>
|
||||
<td>{{ $p->nilai_anggaran ? number_format($p->nilai_anggaran, 2) : '-' }}</td>
|
||||
<td><span class="pill {{ $pill }}">{{ $p->statusLabel() }}</span>
|
||||
@if($p->redraw_count) <small class="text-muted">({{ $p->redraw_count }}x redraw)</small>@endif</td>
|
||||
<td>{{ $p->drawResults->firstWhere('status','confirmed')?->member?->nama ?? '-' }}</td>
|
||||
<td class="text-end">
|
||||
<a href="{{ route('admin.prizes.edit', $p) }}" class="btn btn-sm btn-outline-secondary"><i class="bi bi-pencil"></i></a>
|
||||
<form action="{{ route('admin.prizes.destroy', $p) }}" method="POST" class="d-inline" onsubmit="return confirm('Padam hadiah ini?')">
|
||||
@csrf @method('DELETE')
|
||||
<button class="btn btn-sm btn-outline-danger" @disabled($p->status==='disahkan')><i class="bi bi-trash"></i></button>
|
||||
</form>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr><td colspan="8" class="text-center text-muted py-4">Tiada hadiah. Sila import senarai hadiah.</td></tr>
|
||||
@endforelse
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{{ $prizes->links() }}
|
||||
</div></div>
|
||||
@endsection
|
||||
Reference in New Issue
Block a user