Fix Jalali year-0 crash on /tasks from invalid target_date.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+4
-1
@@ -107,7 +107,10 @@ class User extends Authenticatable
|
||||
|
||||
foreach ($data->attendances as $att) {
|
||||
if ($att->entered_at) {
|
||||
$date = \Morilog\Jalali\Jalalian::fromCarbon(\Carbon\Carbon::parse($att->entered_at));
|
||||
$date = \App\Support\JalaliHelper::fromDateTime($att->entered_at);
|
||||
if (!$date) {
|
||||
continue;
|
||||
}
|
||||
$month = $date->format('%B');
|
||||
|
||||
if (!isset($result[$month])) {
|
||||
|
||||
@@ -39,4 +39,23 @@ class JalaliHelper
|
||||
|
||||
return $jalali ? $jalali->format($format) : $fallback;
|
||||
}
|
||||
|
||||
/** تاریخ میلادی امن به صورت Y-m-d */
|
||||
public static function toGregorianDate($value, string $fallback = ''): string
|
||||
{
|
||||
if ($value === null || $value === '' || str_starts_with((string) $value, '0000-00-00')) {
|
||||
return $fallback;
|
||||
}
|
||||
|
||||
try {
|
||||
$carbon = $value instanceof Carbon ? $value->copy() : Carbon::parse($value);
|
||||
if ($carbon->year < 1000 || $carbon->year > 3000) {
|
||||
return $fallback;
|
||||
}
|
||||
|
||||
return $carbon->format('Y-m-d');
|
||||
} catch (Throwable $e) {
|
||||
return $fallback;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -307,8 +307,8 @@ foreach ($data as $employee) {
|
||||
<tbody>
|
||||
@foreach($records as $row)
|
||||
<tr>
|
||||
<td>{{ Jalalian::fromCarbon(Carbon::parse($row->entered_at))->format('m/d') ?? '-' }}</td>
|
||||
<td>{{ Jalalian::fromCarbon(Carbon::parse($row->entered_at))->format('%A') ?? '-' }}</td>
|
||||
<td>{{ \App\Support\JalaliHelper::format($row->entered_at, 'm/d') }}</td>
|
||||
<td>{{ \App\Support\JalaliHelper::format($row->entered_at, '%A') }}</td>
|
||||
<td>{{ Carbon::parse($row->entered_at)->format('H:i') ?? '-' }}</td>
|
||||
<td>{{ $row->exited_at ? Carbon::parse($row->exited_at)->format('H:i') : '-' }}</td>
|
||||
<td>{{ $row->duration ? Carbon::parse($row->duration)->format('H:i') : '-' }}</td>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<label class="pb-3">تاریخ تولد:</label>
|
||||
<div class="flex flex-col gap-1">
|
||||
<input type="text" id="birthday_display"
|
||||
value="{{ $user->birthday ? \Morilog\Jalali\Jalalian::fromCarbon($user->birthday)->format('Y/m/d') : '' }}"
|
||||
value="{{ $user->birthday ? \App\Support\JalaliHelper::format($user->birthday) : '' }}"
|
||||
placeholder="اختیاری — انتخاب تاریخ"
|
||||
class="border border-gray-300 rounded-md text-center"
|
||||
autocomplete="off" readonly>
|
||||
|
||||
@@ -52,8 +52,8 @@ foreach ($data as $month => $attendances) {
|
||||
<tbody>
|
||||
@foreach($records as $row)
|
||||
<tr>
|
||||
<td>{{ Jalalian::fromCarbon(Carbon::parse($row->entered_at))->format('m/d') ?? '-' }}</td>
|
||||
<td>{{ Jalalian::fromCarbon(Carbon::parse($row->entered_at))->format('%A') ?? '-' }}</td>
|
||||
<td>{{ \App\Support\JalaliHelper::format($row->entered_at, 'm/d') }}</td>
|
||||
<td>{{ \App\Support\JalaliHelper::format($row->entered_at, '%A') }}</td>
|
||||
<td>{{ Carbon::parse($row->entered_at)->format('H:i') ?? '-' }}</td>
|
||||
<td>{{ $row->exited_at ? Carbon::parse($row->exited_at)->format('H:i') : '-' }}</td>
|
||||
<td>{{ $row->exited_at ? Carbon::parse($row->duration)->format('H:i') : '-' }}</td>
|
||||
|
||||
@@ -246,12 +246,12 @@ if (isset($task)) {
|
||||
|
||||
// اگر مقدار اولیه از دیتابیس آمده، فیلد مخفی میلادی را هم پر کن
|
||||
@if(!empty($task?->start_date))
|
||||
$('#start_date_gregorian').val(@json(\Carbon\Carbon::parse($task->start_date)->format('Y-m-d')));
|
||||
$('#start_date').val(@json(\Morilog\Jalali\Jalalian::fromCarbon(\Carbon\Carbon::parse($task->start_date))->format('Y/m/d')));
|
||||
$('#start_date_gregorian').val(@json(\App\Support\JalaliHelper::toGregorianDate($task->start_date)));
|
||||
$('#start_date').val(@json(\App\Support\JalaliHelper::format($task->start_date, 'Y/m/d', '')));
|
||||
@endif
|
||||
@if(!empty($task?->target_date))
|
||||
$('#target_date_gregorian').val(@json(\Carbon\Carbon::parse($task->target_date)->format('Y-m-d')));
|
||||
$('#target_date').val(@json(\Morilog\Jalali\Jalalian::fromCarbon(\Carbon\Carbon::parse($task->target_date))->format('Y/m/d')));
|
||||
$('#target_date_gregorian').val(@json(\App\Support\JalaliHelper::toGregorianDate($task->target_date)));
|
||||
$('#target_date').val(@json(\App\Support\JalaliHelper::format($task->target_date, 'Y/m/d', '')));
|
||||
@endif
|
||||
|
||||
$('form').on('submit', function (e) {
|
||||
|
||||
@@ -584,10 +584,10 @@ $state = [
|
||||
<article class="task-card task-row {{ $task->active ? 'is-active' : '' }}"
|
||||
data-task-id="{{ $task->id }}"
|
||||
data-assignee-ids='@json($task->assignee_ids ?? [])'
|
||||
data-start-date="{{ $task->start_date ? \Carbon\Carbon::parse($task->start_date)->format('Y-m-d') : '' }}"
|
||||
data-target-date="{{ $task->target_date ? \Carbon\Carbon::parse($task->target_date)->format('Y-m-d') : '' }}"
|
||||
data-finished-date="{{ $task->finished_at ? \Carbon\Carbon::parse($task->finished_at)->format('Y-m-d') : '' }}"
|
||||
data-created-date="{{ $task->created_at ? \Carbon\Carbon::parse($task->created_at)->format('Y-m-d') : '' }}"
|
||||
data-start-date="{{ \App\Support\JalaliHelper::toGregorianDate($task->start_date) }}"
|
||||
data-target-date="{{ \App\Support\JalaliHelper::toGregorianDate($task->target_date) }}"
|
||||
data-finished-date="{{ \App\Support\JalaliHelper::toGregorianDate($task->finished_at) }}"
|
||||
data-created-date="{{ \App\Support\JalaliHelper::toGregorianDate($task->created_at) }}"
|
||||
onclick="openTaskDetailsModal({{ $task->id }})"
|
||||
role="button"
|
||||
tabindex="0"
|
||||
@@ -626,7 +626,7 @@ $state = [
|
||||
@else
|
||||
<div class="task-card-field">
|
||||
<dt class="task-card-label">مهلت</dt>
|
||||
<dd class="task-card-value">{{ $task->target_date ? Jalalian::fromCarbon(Carbon::parse($task->target_date))->format('Y/m/d') : '-' }}</dd>
|
||||
<dd class="task-card-value">{{ \App\Support\JalaliHelper::format($task->target_date) }}</dd>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user