115 lines
3.8 KiB
PHP
115 lines
3.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Livewire;
|
|
|
|
use Livewire\Component;
|
|
|
|
class Amount extends Component
|
|
{
|
|
public $amount;
|
|
public $hours;
|
|
public $minutes;
|
|
public $label;
|
|
public $maxLengthHoursInput = 3;
|
|
|
|
protected $listeners = ['resetForm'];
|
|
|
|
public function mount()
|
|
{
|
|
if ($this->amount != null) {
|
|
// Ensure hours is a positive integer or set to null
|
|
if (!is_null($this->hours) && (!is_numeric($this->hours) || $this->hours <= 0 || intval($this->hours) != $this->hours)) {
|
|
$this->hours = null;
|
|
}
|
|
|
|
// Ensure minutes is a positive integer or set to null
|
|
if (!is_null($this->minutes) && (!is_numeric($this->minutes) || $this->minutes < 0 || intval($this->minutes) != $this->minutes)) {
|
|
$this->minutes = null;
|
|
$this->calculateAmount();
|
|
} elseif (!is_null($this->minutes) && is_numeric($this->minutes)) {
|
|
$minutesInt = (int) $this->minutes;
|
|
|
|
// Handle minutes overflow (e.g., 65 minutes → 1 hour 5 minutes, 1230 minutes → 20 hours 30 minutes)
|
|
if ($minutesInt > 59) {
|
|
$additionalHours = intdiv($minutesInt, 60);
|
|
$remainingMinutes = $minutesInt % 60;
|
|
|
|
$this->hours = is_null($this->hours) || !is_numeric($this->hours) ? 0 : (int) $this->hours;
|
|
$this->hours += $additionalHours;
|
|
$this->minutes = $remainingMinutes;
|
|
}
|
|
|
|
// Add leading zero to minutes if less than 10
|
|
if (!is_null($this->minutes) && (int) $this->minutes < 10) {
|
|
$this->minutes = str_pad((int) $this->minutes, 2, '0', STR_PAD_LEFT);
|
|
}
|
|
|
|
$this->calculateAmount();
|
|
}
|
|
|
|
$this->amount = 0;
|
|
}
|
|
$this->amount = $this->amount;
|
|
}
|
|
|
|
public function resetForm()
|
|
{
|
|
$this->reset();
|
|
}
|
|
|
|
public function updatedHours()
|
|
{
|
|
$this->calculateAmount();
|
|
}
|
|
|
|
public function updatedMinutes()
|
|
{
|
|
// Handle minutes overflow (e.g., 65 minutes → 1 hour 5 minutes)
|
|
if (!is_null($this->minutes) && is_numeric($this->minutes)) {
|
|
$minutesInt = (int) $this->minutes;
|
|
|
|
if ($minutesInt > 59) {
|
|
// Calculate additional hours from overflow
|
|
$additionalHours = intdiv($minutesInt, 60);
|
|
$remainingMinutes = $minutesInt % 60;
|
|
|
|
// Add to hours (default to 0 if hours is null)
|
|
$this->hours = is_null($this->hours) || !is_numeric($this->hours) ? 0 : (int) $this->hours;
|
|
$this->hours += $additionalHours;
|
|
|
|
// Set remaining minutes with leading zero if needed
|
|
$this->minutes = $remainingMinutes < 10 ? str_pad($remainingMinutes, 2, '0', STR_PAD_LEFT) : $remainingMinutes;
|
|
} elseif ($minutesInt < 10 && $minutesInt >= 0) {
|
|
// Add leading zero to single digit minutes
|
|
$this->minutes = str_pad($minutesInt, 2, '0', STR_PAD_LEFT);
|
|
}
|
|
}
|
|
|
|
$this->calculateAmount();
|
|
}
|
|
|
|
protected function calculateAmount()
|
|
{
|
|
$hours = is_numeric($this->hours) ? (int) $this->hours : 0;
|
|
$minutes = is_numeric($this->minutes) ? (int) $this->minutes : 0;
|
|
$this->amount = $hours * 60 + $minutes;
|
|
$this->dispatch('amount', $this->amount);
|
|
// Format the inputs for empty values
|
|
if ($this->amount === 0) {
|
|
$this->reset(['hours', 'minutes']);
|
|
} else {
|
|
if ($this->amount < 60) {
|
|
$this->hours = 0;
|
|
}
|
|
if ($this->amount % 60 === 0) {
|
|
$this->minutes = '00';
|
|
}
|
|
}
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
return view('livewire.amount');
|
|
}
|
|
}
|