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) {
|
foreach ($data->attendances as $att) {
|
||||||
if ($att->entered_at) {
|
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');
|
$month = $date->format('%B');
|
||||||
|
|
||||||
if (!isset($result[$month])) {
|
if (!isset($result[$month])) {
|
||||||
|
|||||||
@@ -39,4 +39,23 @@ class JalaliHelper
|
|||||||
|
|
||||||
return $jalali ? $jalali->format($format) : $fallback;
|
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>
|
<tbody>
|
||||||
@foreach($records as $row)
|
@foreach($records as $row)
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ Jalalian::fromCarbon(Carbon::parse($row->entered_at))->format('m/d') ?? '-' }}</td>
|
<td>{{ \App\Support\JalaliHelper::format($row->entered_at, 'm/d') }}</td>
|
||||||
<td>{{ Jalalian::fromCarbon(Carbon::parse($row->entered_at))->format('%A') ?? '-' }}</td>
|
<td>{{ \App\Support\JalaliHelper::format($row->entered_at, '%A') }}</td>
|
||||||
<td>{{ Carbon::parse($row->entered_at)->format('H:i') ?? '-' }}</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->exited_at)->format('H:i') : '-' }}</td>
|
||||||
<td>{{ $row->duration ? Carbon::parse($row->duration)->format('H:i') : '-' }}</td>
|
<td>{{ $row->duration ? Carbon::parse($row->duration)->format('H:i') : '-' }}</td>
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
<label class="pb-3">تاریخ تولد:</label>
|
<label class="pb-3">تاریخ تولد:</label>
|
||||||
<div class="flex flex-col gap-1">
|
<div class="flex flex-col gap-1">
|
||||||
<input type="text" id="birthday_display"
|
<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="اختیاری — انتخاب تاریخ"
|
placeholder="اختیاری — انتخاب تاریخ"
|
||||||
class="border border-gray-300 rounded-md text-center"
|
class="border border-gray-300 rounded-md text-center"
|
||||||
autocomplete="off" readonly>
|
autocomplete="off" readonly>
|
||||||
|
|||||||
@@ -52,8 +52,8 @@ foreach ($data as $month => $attendances) {
|
|||||||
<tbody>
|
<tbody>
|
||||||
@foreach($records as $row)
|
@foreach($records as $row)
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ Jalalian::fromCarbon(Carbon::parse($row->entered_at))->format('m/d') ?? '-' }}</td>
|
<td>{{ \App\Support\JalaliHelper::format($row->entered_at, 'm/d') }}</td>
|
||||||
<td>{{ Jalalian::fromCarbon(Carbon::parse($row->entered_at))->format('%A') ?? '-' }}</td>
|
<td>{{ \App\Support\JalaliHelper::format($row->entered_at, '%A') }}</td>
|
||||||
<td>{{ Carbon::parse($row->entered_at)->format('H:i') ?? '-' }}</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->exited_at)->format('H:i') : '-' }}</td>
|
||||||
<td>{{ $row->exited_at ? Carbon::parse($row->duration)->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))
|
@if(!empty($task?->start_date))
|
||||||
$('#start_date_gregorian').val(@json(\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(\Morilog\Jalali\Jalalian::fromCarbon(\Carbon\Carbon::parse($task->start_date))->format('Y/m/d')));
|
$('#start_date').val(@json(\App\Support\JalaliHelper::format($task->start_date, 'Y/m/d', '')));
|
||||||
@endif
|
@endif
|
||||||
@if(!empty($task?->target_date))
|
@if(!empty($task?->target_date))
|
||||||
$('#target_date_gregorian').val(@json(\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(\Morilog\Jalali\Jalalian::fromCarbon(\Carbon\Carbon::parse($task->target_date))->format('Y/m/d')));
|
$('#target_date').val(@json(\App\Support\JalaliHelper::format($task->target_date, 'Y/m/d', '')));
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
$('form').on('submit', function (e) {
|
$('form').on('submit', function (e) {
|
||||||
|
|||||||
@@ -584,10 +584,10 @@ $state = [
|
|||||||
<article class="task-card task-row {{ $task->active ? 'is-active' : '' }}"
|
<article class="task-card task-row {{ $task->active ? 'is-active' : '' }}"
|
||||||
data-task-id="{{ $task->id }}"
|
data-task-id="{{ $task->id }}"
|
||||||
data-assignee-ids='@json($task->assignee_ids ?? [])'
|
data-assignee-ids='@json($task->assignee_ids ?? [])'
|
||||||
data-start-date="{{ $task->start_date ? \Carbon\Carbon::parse($task->start_date)->format('Y-m-d') : '' }}"
|
data-start-date="{{ \App\Support\JalaliHelper::toGregorianDate($task->start_date) }}"
|
||||||
data-target-date="{{ $task->target_date ? \Carbon\Carbon::parse($task->target_date)->format('Y-m-d') : '' }}"
|
data-target-date="{{ \App\Support\JalaliHelper::toGregorianDate($task->target_date) }}"
|
||||||
data-finished-date="{{ $task->finished_at ? \Carbon\Carbon::parse($task->finished_at)->format('Y-m-d') : '' }}"
|
data-finished-date="{{ \App\Support\JalaliHelper::toGregorianDate($task->finished_at) }}"
|
||||||
data-created-date="{{ $task->created_at ? \Carbon\Carbon::parse($task->created_at)->format('Y-m-d') : '' }}"
|
data-created-date="{{ \App\Support\JalaliHelper::toGregorianDate($task->created_at) }}"
|
||||||
onclick="openTaskDetailsModal({{ $task->id }})"
|
onclick="openTaskDetailsModal({{ $task->id }})"
|
||||||
role="button"
|
role="button"
|
||||||
tabindex="0"
|
tabindex="0"
|
||||||
@@ -626,7 +626,7 @@ $state = [
|
|||||||
@else
|
@else
|
||||||
<div class="task-card-field">
|
<div class="task-card-field">
|
||||||
<dt class="task-card-label">مهلت</dt>
|
<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>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user