converting reactjs codes to laravel php

This commit is contained in:
armiejean 2025-04-13 23:50:06 +08:00
parent 657c38c85a
commit dd7c51c9a4
19 changed files with 1863 additions and 105 deletions

View File

@ -0,0 +1,59 @@
<?php
namespace App\Livewire\StationLocator;
use Livewire\Component;
use Illuminate\Support\Facades\Http;
use Jantinnerezo\LivewireAlert\LivewireAlert;
class BranchList extends Component
{
use LivewireAlert;
public $branches = [];
public $updating = false;
public function mount()
{
$this->fetchBranches();
}
public function fetchBranches()
{
try {
$response = Http::get('https://api.example.com/branches');
if ($response->successful()) {
$this->branches = $response->json()['data'] ?? [];
} else {
$this->alert('error', 'Failed to fetch branches.');
}
} catch (\Exception $e) {
$this->alert('error', 'An error occurred: ' . $e->getMessage());
}
}
public function delete($id)
{
if (confirm('Are you sure you want to delete this branch?')) {
try {
$this->updating = true;
$response = Http::delete("https://api.example.com/branches/{$id}");
if ($response->successful()) {
$this->alert('success', 'Branch deleted successfully!');
$this->fetchBranches();
} else {
$this->alert('error', 'Failed to delete branch.');
}
} catch (\Exception $e) {
$this->alert('error', 'An error occurred: ' . $e->getMessage());
} finally {
$this->updating = false;
}
}
}
public function render()
{
return view('livewire.station-locator.branch-list')->layout('layouts.app', ['title' => 'Branch List']);
}
}

View File

@ -0,0 +1,69 @@
<?php
namespace App\Livewire\StationLocator;
use Livewire\Component;
use Illuminate\Support\Facades\Http;
use Jantinnerezo\LivewireAlert\LivewireAlert;
class CreateBranch extends Component
{
use LivewireAlert;
public $code = '';
public $name = '';
public $details = '';
public $loading = false;
public $title = 'Add Branch';
protected $rules = [
'code' => 'required|string|max:255',
'name' => 'required|string|max:255',
'details' => 'required|string|max:255',
];
protected $messages = [
'code.required' => 'Branch code is required',
'name.required' => 'Branch name is required!',
'details.required' => 'Branch details is required!',
];
public function save()
{
$this->validate();
$this->loading = true;
try {
$response = Http::post('https://api.example.com/branches/add', [
'code' => $this->code,
'name' => $this->name,
'details' => $this->details,
'created_by' => auth()->user()->name ?? 'user', // Adjust based on your auth
]);
if ($response->successful()) {
$this->alert('success', 'Branch created successfully! Don\'t forget to sync created branch to system parameters.');
return redirect('/branches');
} else {
$this->alert('error', 'Failed to create branch.');
}
} catch (\Exception $e) {
$this->alert('error', 'An error occurred: ' . $e->getMessage());
} finally {
$this->loading = false;
}
}
public function cancel()
{
if (confirm('Are you sure you want to discard changes?')) {
return redirect('/branches');
}
}
public function render()
{
return view('livewire.station-locator.create-branch')->layout('layouts.app', ['title' => $this->title]);
}
}

View File

@ -1,12 +1,11 @@
<?php <?php
namespace App\Livewire\StationLocator; namespace App\Livewire\StationLocator;
use Livewire\Component; use Livewire\Component;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
use Jantinnerezo\LivewireAlert\LivewireAlert; use Jantinnerezo\LivewireAlert\LivewireAlert;
class AddFuel extends Component class CreateFuel extends Component
{ {
use LivewireAlert; use LivewireAlert;
@ -22,11 +21,6 @@ class AddFuel extends Component
'name.required' => 'Fuel name is required!', 'name.required' => 'Fuel name is required!',
]; ];
public function mount()
{
// Initialize any default values if needed
}
public function save() public function save()
{ {
$this->validate(); $this->validate();
@ -34,15 +28,16 @@ class AddFuel extends Component
$this->loading = true; $this->loading = true;
try { try {
$response = Http::post('https://api.example.com/fuels', [ $response = Http::post('https://api.example.com/fuels/add', [
'name' => $this->name, 'name' => $this->name,
'created_by' => auth()->user()->name ?? 'user', // Adjust based on your auth
]); ]);
if ($response->successful()) { if ($response->successful()) {
$this->alert('success', 'Fuel saved successfully!'); $this->alert('success', 'Fuel created successfully! Don\'t forget to sync created fuel to system parameters.');
return redirect('/fuels'); return redirect('/fuels');
} else { } else {
$this->alert('error', 'Failed to save fuel. Please try again.'); $this->alert('error', 'Failed to create fuel.');
} }
} catch (\Exception $e) { } catch (\Exception $e) {
$this->alert('error', 'An error occurred: ' . $e->getMessage()); $this->alert('error', 'An error occurred: ' . $e->getMessage());
@ -60,6 +55,6 @@ class AddFuel extends Component
public function render() public function render()
{ {
return view('livewire.station-locator.add-fuel')->layout('layouts.app', ['title' => $this->title]); return view('livewire.station-locator.create-fuel')->layout('layouts.app', ['title' => $this->title]);
} }
} }

View File

@ -0,0 +1,95 @@
<?php
namespace App\Livewire\StationLocator;
use Livewire\Component;
use Illuminate\Support\Facades\Http;
use Jantinnerezo\LivewireAlert\LivewireAlert;
class EditBranch extends Component
{
use LivewireAlert;
public $id;
public $code = '';
public $name = '';
public $details = '';
public $loading = false;
public $title = 'Edit Branch';
protected $rules = [
'code' => 'required|string|max:255',
'name' => 'required|string|max:255',
'details' => 'required|string|max:255',
];
protected $messages = [
'code.required' => 'Branch code is required',
'name.required' => 'Branch name is required!',
'details.required' => 'Branch details is required!',
];
public function mount($id)
{
$this->id = $id;
$this->fetchBranch();
}
public function fetchBranch()
{
try {
$response = Http::get("https://api.example.com/branches/{$this->id}");
if ($response->successful()) {
$branch = $response->json();
$this->code = $branch['code'];
$this->name = $branch['name'];
$this->details = $branch['details'];
} else {
$this->alert('error', 'Failed to fetch branch data.');
return redirect('/branches');
}
} catch (\Exception $e) {
$this->alert('error', 'An error occurred: ' . $e->getMessage());
return redirect('/branches');
}
}
public function save()
{
$this->validate();
$this->loading = true;
try {
$response = Http::put("https://api.example.com/branches/{$this->id}", [
'code' => $this->code,
'name' => $this->name,
'details' => $this->details,
'modified_by' => auth()->user()->name ?? 'user', // Adjust based on your auth
]);
if ($response->successful()) {
$this->alert('success', 'Branch updated successfully! Don\'t forget to sync updated branch to system parameters.');
return redirect('/branches');
} else {
$this->alert('error', 'Failed to update branch.');
}
} catch (\Exception $e) {
$this->alert('error', 'An error occurred: ' . $e->getMessage());
} finally {
$this->loading = false;
}
}
public function cancel()
{
if (confirm('Are you sure you want to discard changes?')) {
return redirect('/branches');
}
}
public function render()
{
return view('livewire.station-locator.edit-branch')->layout('layouts.app', ['title' => $this->title]);
}
}

View File

@ -0,0 +1,85 @@
<?php
namespace App\Livewire\StationLocator;
use Livewire\Component;
use Illuminate\Support\Facades\Http;
use Jantinnerezo\LivewireAlert\LivewireAlert;
class EditFuel extends Component
{
use LivewireAlert;
public $id;
public $name = '';
public $loading = false;
public $title = 'Edit Fuel';
protected $rules = [
'name' => 'required|string|max:255',
];
protected $messages = [
'name.required' => 'Fuel name is required!',
];
public function mount($id)
{
$this->id = $id;
$this->fetchFuel();
}
public function fetchFuel()
{
try {
$response = Http::get("https://api.example.com/fuels/{$this->id}");
if ($response->successful()) {
$fuel = $response->json();
$this->name = $fuel['name'];
} else {
$this->alert('error', 'Failed to fetch fuel data.');
return redirect('/fuels');
}
} catch (\Exception $e) {
$this->alert('error', 'An error occurred: ' . $e->getMessage());
return redirect('/fuels');
}
}
public function save()
{
$this->validate();
$this->loading = true;
try {
$response = Http::put("https://api.example.com/fuels/{$this->id}", [
'name' => $this->name,
'modified_by' => auth()->user()->name ?? 'user', // Adjust based on your auth
]);
if ($response->successful()) {
$this->alert('success', 'Fuel updated successfully! Don\'t forget to sync updated fuel to system parameters.');
return redirect('/fuels');
} else {
$this->alert('error', 'Failed to update fuel.');
}
} catch (\Exception $e) {
$this->alert('error', 'An error occurred: ' . $e->getMessage());
} finally {
$this->loading = false;
}
}
public function cancel()
{
if (confirm('Are you sure you want to discard changes?')) {
return redirect('/fuels');
}
}
public function render()
{
return view('livewire.station-locator.edit-fuel')->layout('layouts.app', ['title' => $this->title]);
}
}

View File

@ -0,0 +1,58 @@
<?php
namespace App\Livewire\StationLocator;
use Livewire\Component;
use Illuminate\Support\Facades\Http;
use Jantinnerezo\LivewireAlert\LivewireAlert;
class FuelList extends Component
{
use LivewireAlert;
public $fuels = [];
public $updating = false;
public function mount()
{
$this->fetchFuels();
}
public function fetchFuels()
{
try {
$response = Http::get('https://api.example.com/fuels');
if ($response->successful()) {
$this->fuels = $response->json()['data'] ?? [];
} else {
$this->alert('error', 'Failed to fetch fuels.');
}
} catch (\Exception $e) {
$this->alert('error', 'An error occurred: ' . $e->getMessage());
}
}
public function delete($id)
{
if (confirm('Are you sure you want to delete this fuel?')) {
try {
$this->updating = true;
$response = Http::delete("https://api.example.com/fuels/{$id}");
if ($response->successful()) {
$this->alert('success', 'Fuel deleted successfully!');
$this->fetchFuels();
} else {
$this->alert('error', 'Failed to delete fuel.');
}
} catch (\Exception $e) {
$this->alert('error', 'An error occurred: ' . $e->getMessage());
} finally {
$this->updating = false;
}
}
}
public function render()
{
return view('livewire.station-locator.fuel-list')->layout('layouts.app', ['title' => 'Fuel List']);
}
}

View File

@ -1,5 +1,4 @@
<?php <?php
namespace App\Livewire\StationLocator; namespace App\Livewire\StationLocator;
use Livewire\Component; use Livewire\Component;
@ -16,9 +15,17 @@ class StationCreate extends Component
public $lat = ''; public $lat = '';
public $long = ''; public $long = '';
public $BranchId = ''; public $BranchId = '';
public $contact_number = []; public $contact_number = [''];
public $code = ''; public $code = '';
public $fuels = []; public $fuels = [];
public $fuelsData = [];
public $newFuel = [];
public $branches = [];
public $fuelModal = false;
public $removeModal = false;
public $fuelName = '';
public $fuelIndex = '';
public $selectedFuels = [];
public $loading = false; public $loading = false;
public $title = 'Add Station'; public $title = 'Add Station';
@ -30,7 +37,10 @@ class StationCreate extends Component
'long' => 'required|string', 'long' => 'required|string',
'BranchId' => 'required|string', 'BranchId' => 'required|string',
'contact_number' => 'required|array|min:1', 'contact_number' => 'required|array|min:1',
'contact_number.*' => 'regex:/^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\./0-9]*$/|min:7',
'code' => 'required|string', 'code' => 'required|string',
'fuels' => 'required|array|min:1',
'fuels.*.price' => 'required|numeric|gt:0',
]; ];
protected $messages = [ protected $messages = [
@ -41,7 +51,12 @@ class StationCreate extends Component
'long.required' => 'Long is required!', 'long.required' => 'Long is required!',
'BranchId.required' => 'Branch is required!', 'BranchId.required' => 'Branch is required!',
'contact_number.required' => 'Contact number is required!', 'contact_number.required' => 'Contact number is required!',
'contact_number.*.regex' => 'Please enter a valid contact number',
'contact_number.*.min' => 'Minimum character is 7',
'code.required' => 'Station code is required!', 'code.required' => 'Station code is required!',
'fuels.required' => 'At least one fuel is required!',
'fuels.*.price.required' => 'Fuel price is required!',
'fuels.*.price.gt' => 'Fuel price must be greater than 0!',
]; ];
public function mount() public function mount()
@ -52,20 +67,65 @@ class StationCreate extends Component
public function fetchBranches() public function fetchBranches()
{ {
$response = Http::get('https://api.example.com/branches/noLimit'); try {
if ($response->successful()) { $response = Http::get('https://api.example.com/branches/noLimit');
$this->branches = $response->json()['data']; if ($response->successful()) {
$this->branches = $response->json()['data'] ?? [];
} else {
$this->alert('error', 'Failed to fetch branches.');
}
} catch (\Exception $e) {
$this->alert('error', 'An error occurred: ' . $e->getMessage());
} }
} }
public function fetchFuels() public function fetchFuels()
{ {
$response = Http::get('https://api.example.com/fuels'); try {
if ($response->successful()) { $response = Http::get('https://api.example.com/fuels');
$this->fuelsData = $response->json()['data']; if ($response->successful()) {
$this->fuelsData = $response->json()['data'] ?? [];
$this->newFuel = $this->fuelsData;
} else {
$this->alert('error', 'Failed to fetch fuels.');
}
} catch (\Exception $e) {
$this->alert('error', 'An error occurred: ' . $e->getMessage());
} }
} }
public function updateFuelPrice($index, $price)
{
$this->fuels[$index]['price'] = $price;
}
public function addToStationFuel()
{
$newFuels = array_filter($this->fuelsData, fn($fuel) => in_array($fuel['id'], $this->selectedFuels));
$this->fuels = array_merge($this->fuels, array_map(fn($fuel) => [
'FuelId' => $fuel['id'],
'name' => $fuel['name'],
'price' => '0.00',
], $newFuels));
$this->newFuel = array_filter($this->newFuel, fn($fuel) => !in_array($fuel['id'], $this->selectedFuels));
$this->selectedFuels = [];
$this->fuelModal = false;
}
public function removeFuel($index, $name)
{
$this->fuelIndex = $index;
$this->fuelName = $name;
$this->removeModal = true;
}
public function confirmRemoveFuel()
{
$this->fuels = array_filter($this->fuels, fn($_, $i) => $i !== $this->fuelIndex, ARRAY_FILTER_USE_BOTH);
$this->removeModal = false;
$this->fetchFuels();
}
public function save() public function save()
{ {
$this->validate(); $this->validate();
@ -73,23 +133,27 @@ class StationCreate extends Component
$this->loading = true; $this->loading = true;
try { try {
$response = Http::post('https://api.example.com/stations', [ $response = Http::post('https://api.example.com/stations/add', [
'name' => $this->name, 'name' => $this->name,
'location' => $this->location, 'location' => $this->location,
'map_URL' => $this->map_URL, 'map_Url' => $this->map_URL,
'lat' => $this->lat, 'lat' => $this->lat,
'long' => $this->long, 'long' => $this->long,
'BranchId' => $this->BranchId,
'contact_number' => implode(',', $this->contact_number), 'contact_number' => implode(',', $this->contact_number),
'created_by' => auth()->user()->name ?? 'user', // Adjust based on your auth
'BranchId' => $this->BranchId,
'code' => $this->code, 'code' => $this->code,
'fuels' => $this->fuels, 'StationFuels' => array_map(fn($fuel) => [
'FuelId' => $fuel['FuelId'],
'price' => $fuel['price'],
], $this->fuels),
]); ]);
if ($response->successful()) { if ($response->successful()) {
$this->alert('success', 'Station saved successfully!'); $this->alert('success', 'Station created successfully!');
return redirect('/stations'); return redirect('/stations');
} else { } else {
$this->alert('error', 'Failed to save station. Please try again.'); $this->alert('error', 'Failed to create station.');
} }
} catch (\Exception $e) { } catch (\Exception $e) {
$this->alert('error', 'An error occurred: ' . $e->getMessage()); $this->alert('error', 'An error occurred: ' . $e->getMessage());
@ -105,11 +169,19 @@ class StationCreate extends Component
} }
} }
public function updateMap($lat, $long, $url = '')
{
$this->lat = $lat;
$this->long = $long;
$this->map_URL = $url ?: $this->map_URL;
}
public function render() public function render()
{ {
return view('livewire.station-locator.station-create', [ return view('livewire.station-locator.station-create', [
'branches' => $this->branches ?? [], 'branches' => $this->branches,
'fuelsData' => $this->fuelsData ?? [], 'fuelsData' => $this->fuelsData,
'newFuel' => $this->newFuel,
])->layout('layouts.app', ['title' => $this->title]); ])->layout('layouts.app', ['title' => $this->title]);
} }
} }

View File

@ -14,7 +14,8 @@
"laravel/tinker": "^2.9", "laravel/tinker": "^2.9",
"laravel/ui": "^4.6", "laravel/ui": "^4.6",
"livewire/livewire": "^3.6", "livewire/livewire": "^3.6",
"paragonie/sodium_compat": "^2.1" "paragonie/sodium_compat": "^2.1",
"yajra/laravel-datatables": "*"
}, },
"require-dev": { "require-dev": {
"fakerphp/faker": "^1.23", "fakerphp/faker": "^1.23",

1071
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,9 @@
<head> <head>
<!-- ... other meta tags --> <!-- ... other meta tags -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet"> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
<!-- ... other meta tags -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" rel="stylesheet">
</head> </head>
@if(app()->environment('local')) @if(app()->environment('local'))
<script> <script>

View File

@ -0,0 +1,47 @@
@extends('layouts.app')
@section('content')
<div class="container mt-4">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h4>Branch List</h4>
<a href="{{ route('branches.create') }}" class="btn btn-primary">Add Branch</a>
</div>
<div class="card-body">
<table class="table table-bordered">
<thead>
<tr>
<th>Branch Code</th>
<th>Branch Name</th>
<th>Details</th>
<th>Date Created</th>
<th>Created By</th>
<th>Date Modified</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@forelse ($branches as $branch)
<tr>
<td>{{ $branch['code'] }}</td>
<td>{{ $branch['name'] }}</td>
<td>{{ $branch['details'] }}</td>
<td>{{ \Carbon\Carbon::parse($branch['createdAt'])->format('M d, Y H:i') }}</td>
<td>{{ $branch['created_by'] ?? 'N/A' }}</td>
<td>{{ \Carbon\Carbon::parse($branch['updatedAt'])->format('M d, Y H:i') }}</td>
<td>
<a href="{{ route('branches.edit', $branch['id']) }}" class="btn btn-sm btn-warning">Edit</a>
<button class="btn btn-sm btn-danger" wire:click="delete({{ $branch['id'] }})" wire:loading.attr="disabled" wire:target="delete">Delete</button>
</td>
</tr>
@empty
<tr>
<td colspan="7" class="text-center">No branches found.</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,14 @@
@extends('layouts.app')
@section('content')
<div class="container mt-4">
<div class="card">
<div class="card-header">
<h4>{{ $title }}</h4>
</div>
<div class="card-body">
@include('partials.branch-form')
</div>
</div>
</div>
@endsection

View File

@ -11,8 +11,8 @@
<div class="row mb-3"> <div class="row mb-3">
<label for="name" class="col-sm-4 col-form-label">Fuel Name</label> <label for="name" class="col-sm-4 col-form-label">Fuel Name</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input type="text" class="form-control @error('name') is-invalid @enderror" id="name" wire:model="name" placeholder="Enter"> <input type="text" class="form-control @error('name') is-invalid @enderror" id="name" wire:model="name" placeholder="Enter Fuel Name">
@error('name') <div class="invalid-feedback">{{ $message }}</div> @endregion @error('name') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div> </div>
</div> </div>

View File

@ -0,0 +1,14 @@
@extends('layouts.app')
@section('content')
<div class="container mt-4">
<div class="card">
<div class="card-header">
<h4>{{ $title }}</h4>
</div>
<div class="card-body">
@include('partials.branch-form')
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,29 @@
@extends('layouts.app')
@section('content')
<div class="container mt-4">
<div class="card">
<div class="card-header">
<h4>{{ $title }}</h4>
</div>
<div class="card-body">
<form wire:submit.prevent="save" novalidate>
<div class="row mb-3">
<label for="name" class="col-sm-4 col-form-label">Fuel Name</label>
<div class="col-sm-8">
<input type="text" class="form-control @error('name') is-invalid @enderror" id="name" wire:model="name" placeholder="Enter Fuel Name">
@error('name') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
</div>
<div class="d-flex justify-content-end gap-2">
<button type="button" class="btn btn-secondary" wire:click="cancel">Cancel</button>
<button type="submit" class="btn btn-primary" wire:loading.attr="disabled" wire:target="save">
@if($loading) <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> Saving... @else Save @endif
</button>
</div>
</form>
</div>
</div>
</div>
@endsection

View File

@ -0,0 +1,41 @@
@extends('layouts.app')
@section('content')
<div class="container mt-4">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h4>Fuel List</h4>
<a href="{{ route('fuels.create') }}" class="btn btn-primary">Add Fuel</a>
</div>
<div class="card-body">
<table class="table table-bordered">
<thead>
<tr>
<th>Fuel Name</th>
<th>Date Created</th>
<th>Date Modified</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@forelse ($fuels as $fuel)
<tr>
<td>{{ $fuel['name'] }}</td>
<td>{{ \Carbon\Carbon::parse($fuel['createdAt'])->format('M d, Y H:i') }}</td>
<td>{{ \Carbon\Carbon::parse($fuel['updatedAt'])->format('M d, Y H:i') }}</td>
<td>
<a href="{{ route('fuels.edit', $fuel['id']) }}" class="btn btn-sm btn-warning">Edit</a>
<button class="btn btn-sm btn-danger" wire:click="delete({{ $fuel['id'] }})" wire:loading.attr="disabled" wire:target="delete">Delete</button>
</td>
</tr>
@empty
<tr>
<td colspan="4" class="text-center">No fuels found.</td>
</tr>
@endforelse
</tbody>
</table>
</div>
</div>
</div>
@endsection

View File

@ -8,6 +8,67 @@
</div> </div>
<div class="card-body"> <div class="card-body">
<form wire:submit.prevent="save" novalidate> <form wire:submit.prevent="save" novalidate>
<!-- Google Map -->
<div class="row mb-3">
<label class="col-sm-4 col-form-label">Map</label>
<div class="col-sm-8">
<div id="map" style="height: 400px; width: 100%; margin-bottom: 20px;"></div>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyARzdIELzb2Uvoly4-Er4B7-QzXKr4j3bg&libraries=places"></script>
<script>
function initMap() {
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: {{ $lat ?: 16.1505 }}, lng: {{ $long ?: 119.9856 }} },
zoom: 15,
});
const marker = new google.maps.Marker({
position: { lat: {{ $lat ?: 16.1505 }}, lng: {{ $long ?: 119.9856 }} },
map: map,
draggable: true,
});
google.maps.event.addListener(marker, 'dragend', function(event) {
@this.call('updateMap', event.latLng.lat(), event.latLng.lng());
});
}
window.initMap = initMap;
</script>
</div>
</div>
<!-- Form Fields -->
<div class="row mb-3">
<label for="map_URL" class="col-sm-4 col-form-label">Map URL</label>
<div class="col-sm-8">
<textarea class="form-control @error('map_URL') is-invalid @enderror" id="map_URL" wire:model="map_URL" placeholder="Enter Map URL"></textarea>
@error('map_URL') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
</div>
<div class="row mb-3">
<label for="lat" class="col-sm-4 col-form-label">Latitude</label>
<div class="col-sm-8">
<input type="text" class="form-control @error('lat') is-invalid @enderror" id="lat" wire:model="lat" placeholder="Latitude">
@error('lat') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
</div>
<div class="row mb-3">
<label for="long" class="col-sm-4 col-form-label">Longitude</label>
<div class="col-sm-8">
<input type="text" class="form-control @error('long') is-invalid @enderror" id="long" wire:model="long" placeholder="Longitude">
@error('long') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
</div>
<div class="row mb-3">
<label for="code" class="col-sm-4 col-form-label">Station Code</label>
<div class="col-sm-8">
<input type="text" class="form-control @error('code') is-invalid @enderror" id="code" wire:model="code" placeholder="Station Code">
@error('code') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
</div>
<div class="row mb-3"> <div class="row mb-3">
<label for="name" class="col-sm-4 col-form-label">Station Name</label> <label for="name" class="col-sm-4 col-form-label">Station Name</label>
<div class="col-sm-8"> <div class="col-sm-8">
@ -25,57 +86,47 @@
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label for="map_URL" class="col-sm-4 col-form-label">Map URL</label> <label for="contact_number" class="col-sm-4 col-form-label">Contact Number</label>
<div class="col-sm-8"> <div class="col-sm-8">
<textarea class="form-control @error('map_URL') is-invalid @enderror" id="map_URL" wire:model="map_URL" placeholder=""></textarea> <input type="text" class="form-control @error('contact_number.0') is-invalid @enderror" id="contact_number" wire:model="contact_number.0" placeholder="Contact Number">
@error('map_URL') <div class="invalid-feedback">{{ $message }}</div> @endregion @error('contact_number.*') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div> <small>Accepted formats: +(63)9*********, +639*********, (02)****-****, 6***-****</small>
</div>
<div class="row mb-3">
<label for="lat" class="col-sm-4 col-form-label">Latitude</label>
<div class="col-sm-8">
<input type="text" class="form-control @error('lat') is-invalid @endregion" id="lat" wire:model="lat" placeholder="">
@error('lat') <div class="invalid-feedback">{{ $message }}</div> @endregion
</div>
</div>
<div class="row mb-3">
<label for="long" class="col-sm-4 col-form-label">Longitude</label>
<div class="col-sm-8">
<input type="text" class="form-control @error('long') is-invalid @endregion" id="long" wire:model="long" placeholder="">
@error('long') <div class="invalid-feedback">{{ $message }}</div> @endregion
</div>
</div>
<div class="row mb-3">
<label for="code" class="col-sm-4 col-form-label">Station Code</label>
<div class="col-sm-8">
<input type="text" class="form-control @error('code') is-invalid @endregion" id="code" wire:model="code" placeholder="Station Code">
@error('code') <div class="invalid-feedback">{{ $message }}</div> @endregion
</div> </div>
</div> </div>
<div class="row mb-3"> <div class="row mb-3">
<label for="BranchId" class="col-sm-4 col-form-label">Branch</label> <label for="BranchId" class="col-sm-4 col-form-label">Branch</label>
<div class="col-sm-8"> <div class="col-sm-8">
<select class="form-control @error('BranchId') is-invalid @endregion" id="BranchId" wire:model="BranchId"> <select class="form-control @error('BranchId') is-invalid @enderror" id="BranchId" wire:model="BranchId">
<option value="">Select Branch</option>
@foreach ($branches as $branch) @foreach ($branches as $branch)
<option value="{{ $branch['id'] }}">{{ $branch['name'] }}</option> <option value="{{ $branch['id'] }}">{{ $branch['name'] }}</option>
@endforeach @endforeach
</select> </select>
@error('BranchId') <div class="invalid-feedback">{{ $message }}</div> @endregion @error('BranchId') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div> </div>
</div> </div>
<!-- Fuels -->
<div class="row mb-3"> <div class="row mb-3">
<label for="contact_number" class="col-sm-4 col-form-label">Contact Number</label> <label class="col-sm-4 col-form-label">Fuels</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input type="text" class="form-control @error('contact_number') is-invalid @endregion" id="contact_number" wire:model="contact_number" placeholder="Contact Number"> <button type="button" class="btn btn-primary mb-2" wire:click="$set('fuelModal', true)">Add Fuel</button>
@error('contact_number') <div class="invalid-feedback">{{ $message }}</div> @endregion @foreach($fuels as $index => $fuel)
<div class="input-group mb-2">
<span class="input-group-text">{{ $fuel['name'] }}</span>
<input type="number" class="form-control @error('fuels.' . $index . '.price') is-invalid @enderror" wire:model="fuels.{{ $index }}.price" placeholder="00.00">
<button type="button" class="btn btn-danger" wire:click="removeFuel({{ $index }}, '{{ $fuel['name'] }}')">
<i class="fas fa-trash"></i>
</button>
@error('fuels.' . $index . '.price') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
@endforeach
@error('fuels') <div class="text-danger">{{ $message }}</div> @enderror
</div> </div>
</div> </div>
<!-- Form Buttons -->
<div class="d-flex justify-content-end gap-2"> <div class="d-flex justify-content-end gap-2">
<button type="button" class="btn btn-secondary" wire:click="cancel">Cancel</button> <button type="button" class="btn btn-secondary" wire:click="cancel">Cancel</button>
<button type="submit" class="btn btn-primary" wire:loading.attr="disabled" wire:target="save"> <button type="submit" class="btn btn-primary" wire:loading.attr="disabled" wire:target="save">
@ -83,40 +134,51 @@
</button> </button>
</div> </div>
</form> </form>
<!-- Fuel Modal -->
@if($fuelModal)
<x-dialog-modal wire:model="fuelModal">
<x-slot name="title">
Add Fuel
</x-slot>
<x-slot name="content">
<select multiple class="form-control" wire:model="selectedFuels">
@foreach($newFuel as $fuel)
<option value="{{ $fuel['id'] }}">{{ $fuel['name'] }}</option>
@endforeach
</select>
</x-slot>
<x-slot name="footer">
<x-secondary-button wire:click="$set('fuelModal', false)">
Close
</x-secondary-button>
<x-button wire:click="addToStationFuel">
Add Fuel
</x-button>
</x-slot>
</x-dialog-modal>
@endif
<!-- Remove Fuel Modal -->
@if($removeModal)
<x-dialog-modal wire:model="removeModal">
<x-slot name="title">
Remove Fuel
</x-slot>
<x-slot name="content">
<p>Are you sure you want to remove {{ $fuelName }}?</p>
</x-slot>
<x-slot name="footer">
<x-secondary-button wire:click="$set('removeModal', false)">
Close
</x-secondary-button>
<x-button wire:click="confirmRemoveFuel">
Remove
</x-button>
</x-slot>
</x-dialog-modal>
@endif
</div> </div>
<!-- After the form fields, add this -->
<div class="row mb-3">
<label class="col-sm-4 col-form-label">Map</label>
<div class="col-sm-8">
<div id="map" style="height: 400px; width: 100%; margin-bottom: 20px;"></div>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyARzdIELzb2Uvoly4-Er4B7-QzXKr4j3bg&libraries=places"></script>
<script>
function initMap() {
const map = new google.maps.Map(document.getElementById("map"), {
center: { lat: 16.1505, lng: 119.9856 },
zoom: 15,
});
const marker = new google.maps.Marker({
position: { lat: 16.1505, lng: 119.9856 },
map: map,
draggable: true,
});
google.maps.event.addListener(marker, 'dragend', function(event) {
document.querySelector('[wire\\:model="lat"]').value = event.latLng.lat();
document.querySelector('[wire\\:model="long"]').value = event.latLng.lng();
@this.set('lat', event.latLng.lat());
@this.set('long', event.latLng.lng());
});
}
window.initMap = initMap;
</script>
</div>
</div>
</div> </div>
</div> </div>
@endsection @endsection

View File

@ -0,0 +1,32 @@
<form wire:submit.prevent="save" novalidate>
<div class="row mb-3">
<label for="code" class="col-sm-4 col-form-label">Branch Code</label>
<div class="col-sm-8">
<input type="text" class="form-control @error('code') is-invalid @enderror" id="code" wire:model="code" placeholder="Enter branch code">
@error('code') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
</div>
<div class="row mb-3">
<label for="name" class="col-sm-4 col-form-label">Branch Name</label>
<div class="col-sm-8">
<input type="text" class="form-control @error('name') is-invalid @enderror" id="name" wire:model="name" placeholder="Enter branch name">
@error('name') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
</div>
<div class="row mb-3">
<label for="details" class="col-sm-4 col-form-label">Details</label>
<div class="col-sm-8">
<input type="text" class="form-control @error('details') is-invalid @enderror" id="details" wire:model="details" placeholder="Enter branch details">
@error('details') <div class="invalid-feedback">{{ $message }}</div> @enderror
</div>
</div>
<div class="d-flex justify-content-end gap-2">
<button type="button" class="btn btn-secondary" wire:click="cancel">Cancel</button>
<button type="submit" class="btn btn-primary" wire:loading.attr="disabled" wire:target="save">
@if($loading) <span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span> Saving... @else Save @endif
</button>
</div>
</form>

View File

@ -47,16 +47,30 @@ use App\Livewire\FetchData;
use App\Livewire\Logout; use App\Livewire\Logout;
use App\Livewire\ErrorHandler; use App\Livewire\ErrorHandler;
use App\Livewire\StationLocator\AddFuel;
use App\Livewire\StationLocator\AddBranch;
use App\Livewire\StationLocator\FuelList;
use App\Livewire\StationLocator\CreateFuel;
use App\Livewire\StationLocator\EditFuel;
use App\Livewire\StationLocator\StationList; use App\Livewire\StationLocator\StationList;
use App\Livewire\StationLocator\StationCreate; use App\Livewire\StationLocator\StationCreate;
use App\Livewire\StationLocator\EditStation; use App\Livewire\StationLocator\EditStation;
use App\Livewire\StationLocator\BranchList;
use App\Livewire\StationLocator\CreateBranch;
use App\Livewire\StationLocator\EditBranch;
// Route::get('/fuels', FuelList::class)->name('fuels.list');
// Route::get('/fuels/create', CreateFuel::class)->name('fuels.create');
// Route::get('/fuels/view/{id}', EditFuel::class)->name('fuels.edit');
// Route::get('/stations', StationList::class)->name('stations.list');
// Route::get('/stations/create', StationCreate::class)->name('stations.create');
// Route::get('/stations/view/{id}', EditStation::class)->name('stations.edit');
// Route::get('/branches', BranchList::class)->name('branches.list');
// Route::get('/branches/create', CreateBranch::class)->name('branches.create');
// Route::get('/branches/add', CreateBranch::class)->name('branches.add');
// Route::get('/branches/view/{id}', EditBranch::class)->name('branches.edit');
Route::get('/stations', StationList::class)->name('stations.list');
Route::get('/stations/create', StationCreate::class)->name('stations.create');
Route::get('/stations/view/{id}', EditStation::class)->name('stations.edit');
Route::middleware(['auth'])->group(function () { Route::middleware(['auth'])->group(function () {
@ -84,8 +98,7 @@ Route::middleware(['auth'])->group(function () {
// }); // });
// Route::get('/fuels/add', AddFuel::class)->name('fuels.add');
// Route::get('/branches/add', AddBranch::class)->name('branches.add');