MIF_E31231430/resources/views/admin/kamera_form.blade.php

132 lines
8.8 KiB
PHP

@extends('layouts.app')
@section('title', $formMode === 'create' ? 'Tambah Kamera' : 'Edit Kamera')
@section('hide_navbar', true)
@section('content')
<div class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8 space-y-6">
<div class="flex items-center justify-between gap-3 flex-wrap">
<div>
<h1 class="text-2xl font-bold text-gray-900">{{ $formMode === 'create' ? 'Tambah Kamera Baru' : 'Edit Data Kamera' }}</h1>
<p class="mt-1 text-sm text-gray-600">Perubahan data kamera di admin akan otomatis ikut terbaca di halaman user dan sistem rekomendasi TOPSIS.</p>
</div>
<a href="{{ route('dashboard') }}" class="inline-flex items-center rounded-lg border border-gray-200 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50">
Kembali ke Dashboard
</a>
</div>
@if($errors->any())
<div class="rounded-xl border border-red-200 bg-red-50 px-4 py-3 text-sm text-red-700">
{{ $errors->first() }}
</div>
@endif
<section class="surface-card rounded-[1.8rem] p-6">
@php
$previewPrice = old('harga_sewa', $kamera->harga_sewa ?? 0);
$previewIso = old('iso', $kamera->iso ?? 0);
$previewAfPoint = old('af_point', $kamera->af_point ?? 0);
$previewSensor = old('sensor', $kamera->sensor ?? 'APS-C');
@endphp
<form method="POST" action="{{ $formMode === 'create' ? route('dashboard.kameras.store') : route('dashboard.kameras.update', $kamera) }}" class="space-y-5">
@csrf
@if($formMode === 'edit')
@method('PATCH')
@endif
<div class="grid gap-4 md:grid-cols-3">
<div>
<label class="block text-sm font-medium text-gray-700">Kode Kamera</label>
<input value="{{ $kamera->kode_kamera ?? 'Otomatis dibuat setelah data kamera disimpan' }}" readonly class="mt-1 w-full rounded-lg border-gray-300 bg-gray-50 text-gray-500">
</div>
<div>
<label class="block text-sm font-medium text-gray-700">Nama Kamera</label>
<input name="nama" value="{{ old('nama', $kamera->nama) }}" required class="mt-1 w-full rounded-lg border-gray-300 focus:border-[#edc039] focus:ring-[#edc039]">
</div>
<div>
<label class="block text-sm font-medium text-gray-700">Merek</label>
<input name="merek" value="{{ old('merek', $kamera->merek) }}" required class="mt-1 w-full rounded-lg border-gray-300 focus:border-[#edc039] focus:ring-[#edc039]">
</div>
</div>
<div class="grid gap-4 md:grid-cols-2">
<div>
<label class="block text-sm font-medium text-gray-700">Harga Sewa per Hari</label>
<input type="number" name="harga_sewa" min="0" value="{{ old('harga_sewa', $kamera->harga_sewa) }}" required class="mt-1 w-full rounded-lg border-gray-300 focus:border-[#edc039] focus:ring-[#edc039]">
</div>
<div>
<label class="block text-sm font-medium text-gray-700">Sensor</label>
<select name="sensor" required class="mt-1 w-full rounded-lg border-gray-300 focus:border-[#edc039] focus:ring-[#edc039]">
@foreach($sensorOptions as $value => $label)
<option value="{{ $value }}" {{ $previewSensor === $value ? 'selected' : '' }}>{{ $label }}</option>
@endforeach
</select>
</div>
</div>
<div class="grid gap-4 md:grid-cols-2">
<div>
<label class="block text-sm font-medium text-gray-700">ISO</label>
<input type="number" name="iso" min="0" value="{{ old('iso', $kamera->iso) }}" required class="mt-1 w-full rounded-lg border-gray-300 focus:border-[#edc039] focus:ring-[#edc039]">
</div>
<div>
<label class="block text-sm font-medium text-gray-700">AF Point</label>
<input type="number" name="af_point" min="0" value="{{ old('af_point', $kamera->af_point) }}" required class="mt-1 w-full rounded-lg border-gray-300 focus:border-[#edc039] focus:ring-[#edc039]">
</div>
</div>
<div class="rounded-2xl border border-[#dceceb] bg-[#f7fbfa] p-4">
<p class="text-sm font-semibold text-gray-800">Metodologi Input Kamera</p>
<ul class="mt-2 space-y-2 text-sm text-gray-600">
<li>Admin hanya mengisi data objektif dari spesifikasi kamera: nama, merek, harga sewa, ISO, AF Point, dan jenis sensor.</li>
<li>`price` untuk TOPSIS diambil otomatis dari `harga_sewa`, sehingga kriteria cost tidak diisi manual.</li>
<li>`sensor_score` ditentukan otomatis dari kelas sensor dengan skala ordinal tetap: Full Frame = 10, APS-C = 8, Micro Four Thirds = 6, 1 Inch = 4, Lainnya = 3.</li>
<li>`low_light`, `portabilitas`, dan `af_speed` dihitung otomatis sebagai indikator turunan internal agar admin tidak memberi nilai secara bebas.</li>
<li>TOPSIS aktif pada aplikasi ini tetap memakai kriteria utama: Price, ISO, AF Point, dan Sensor.</li>
</ul>
</div>
<div class="grid gap-4 md:grid-cols-2 xl:grid-cols-5">
<div class="rounded-2xl border border-gray-200 bg-white p-4">
<p class="text-xs uppercase tracking-wide text-gray-400">Price TOPSIS</p>
<p class="mt-2 text-lg font-semibold text-gray-900">Rp {{ number_format((int) $previewPrice, 0, ',', '.') }}</p>
<p class="mt-1 text-xs text-gray-500">Otomatis sama dengan harga sewa per hari.</p>
</div>
<div class="rounded-2xl border border-gray-200 bg-white p-4">
<p class="text-xs uppercase tracking-wide text-gray-400">Sensor Score</p>
<p class="mt-2 text-lg font-semibold text-gray-900">{{ \App\Services\KameraScoringService::sensorScore($previewSensor) }}/10</p>
<p class="mt-1 text-xs text-gray-500">Ditetapkan otomatis dari jenis sensor.</p>
</div>
<div class="rounded-2xl border border-gray-200 bg-white p-4">
<p class="text-xs uppercase tracking-wide text-gray-400">Low Light</p>
<p class="mt-2 text-lg font-semibold text-gray-900">{{ number_format(\App\Services\KameraScoringService::lowLightScore((int) $previewIso, \App\Services\KameraScoringService::sensorScore($previewSensor)), 1) }}/10</p>
<p class="mt-1 text-xs text-gray-500">Otomatis dari ISO dan kelas sensor.</p>
</div>
<div class="rounded-2xl border border-gray-200 bg-white p-4">
<p class="text-xs uppercase tracking-wide text-gray-400">Portabilitas</p>
<p class="mt-2 text-lg font-semibold text-gray-900">{{ number_format(\App\Services\KameraScoringService::portabilityScore($previewSensor), 1) }}/10</p>
<p class="mt-1 text-xs text-gray-500">Otomatis dari kelas sensor sebagai indikator ukuran perangkat.</p>
</div>
<div class="rounded-2xl border border-gray-200 bg-white p-4">
<p class="text-xs uppercase tracking-wide text-gray-400">AF Speed</p>
<p class="mt-2 text-lg font-semibold text-gray-900">{{ number_format(\App\Services\KameraScoringService::afSpeedScore((int) $previewAfPoint), 1) }}/10</p>
<p class="mt-1 text-xs text-gray-500">Otomatis dari jumlah AF Point.</p>
</div>
</div>
<div class="rounded-2xl border border-[#dceceb] bg-[#f7fbfa] p-4 text-sm text-gray-600">
<p class="font-semibold text-gray-800">Catatan Akademik</p>
<p class="mt-1">Pendekatan ini mengikuti praktik umum TOPSIS/MCDM: data kuantitatif dimasukkan dari spesifikasi objektif, sedangkan atribut kualitatif dikonversi ke skala numerik yang tetap agar konsisten dan tidak bergantung pada penilaian bebas admin.</p>
</div>
<div class="flex flex-col gap-3 sm:flex-row sm:justify-end">
<a href="{{ route('dashboard') }}" class="inline-flex items-center justify-center rounded-lg border border-gray-200 px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50">
Batal
</a>
<button type="submit" class="btn-dark px-5 py-2.5 text-sm font-semibold">
{{ $formMode === 'create' ? 'Simpan Kamera' : 'Perbarui Kamera' }}
</button>
</div>
</form>
</section>
</div>
@endsection