feat: auto-odabir i datum u dropdownu putnih naloga za taskove
- TaskCreateModal: auto-pretselektira jedini otvoreni nalog za danas pri otvaranju modala - Dropdown labele prikazuju datum naloga i oznacavaju danasnji nalog sa zvjezdicom (★) - Dodana napomena da vise taskova moze dijeliti isti putni nalog - TaskServiceRecordsModal: danasnji nalozi sortirani na vrh liste - Datum prikazan u dropdownu i u prikazu trenutno odabranog naloga Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -13,6 +13,17 @@ const INITIAL_FORM = {
|
||||
scheduled_date: '',
|
||||
};
|
||||
|
||||
function todayIso() {
|
||||
return new Date().toISOString().slice(0, 10);
|
||||
}
|
||||
|
||||
function formatWODate(dateStr) {
|
||||
if (!dateStr) return '';
|
||||
const d = new Date(dateStr);
|
||||
if (Number.isNaN(d.getTime())) return '';
|
||||
return d.toLocaleDateString('hr-HR');
|
||||
}
|
||||
|
||||
export default function TaskCreateModal({ open, workOrders = [], contextCrane = null, onClose, onSuccess }) {
|
||||
const [form, setForm] = useState(INITIAL_FORM);
|
||||
const [submitting, setSubmitting] = useState(false);
|
||||
@@ -40,8 +51,18 @@ export default function TaskCreateModal({ open, workOrders = [], contextCrane =
|
||||
setTemplateId('');
|
||||
setTemplates([]);
|
||||
setTemplateLoading(false);
|
||||
return;
|
||||
}
|
||||
}, [open]);
|
||||
// Auto-pre-select today's open work order if exactly one exists for this crane
|
||||
const today = todayIso();
|
||||
const todayOpen = workOrders.filter(
|
||||
(wo) => String(wo?.status || '').toLowerCase() !== 'closed'
|
||||
&& String(wo?.date || '').slice(0, 10) === today
|
||||
);
|
||||
if (todayOpen.length === 1) {
|
||||
setForm((prev) => ({ ...prev, work_order: String(todayOpen[0].id) }));
|
||||
}
|
||||
}, [open]); // eslint-disable-line react-hooks/exhaustive-deps
|
||||
|
||||
useEffect(() => {
|
||||
if (!selectedTemplate) return;
|
||||
@@ -254,12 +275,18 @@ export default function TaskCreateModal({ open, workOrders = [], contextCrane =
|
||||
className="rounded-lg border border-border-hairline bg-canvas-base px-3 py-2 text-text-main disabled:opacity-50"
|
||||
>
|
||||
<option value="">— Bez povezanog naloga —</option>
|
||||
{availableWorkOrders.map((workOrder) => (
|
||||
<option key={workOrder.id} value={String(workOrder.id)}>
|
||||
{formatWorkOrderDisplayCode(workOrder)} • {workOrder.craneLabel || workOrder.craneInfo?.registration_number || '-'} • {formatPurposeLabel(workOrder.purpose) || '-'}
|
||||
</option>
|
||||
))}
|
||||
{availableWorkOrders.map((workOrder) => {
|
||||
const isToday = String(workOrder.date || '').slice(0, 10) === todayIso();
|
||||
return (
|
||||
<option key={workOrder.id} value={String(workOrder.id)}>
|
||||
{isToday ? '★ ' : ''}{formatWorkOrderDisplayCode(workOrder)} • {formatWODate(workOrder.date)} • {workOrder.craneLabel || workOrder.craneInfo?.registration_number || '-'} • {formatPurposeLabel(workOrder.purpose) || '-'}
|
||||
</option>
|
||||
);
|
||||
})}
|
||||
</select>
|
||||
<span className="text-[11px] text-text-muted">
|
||||
Više zadataka može dijeliti isti putni nalog. Danas kreiran nalog označen je s ★.
|
||||
</span>
|
||||
{templateMode && (
|
||||
<span className="text-[11px] text-text-muted">
|
||||
Kod template unosa nalog nije obavezan i backend ga neće automatski povezati.
|
||||
|
||||
@@ -6,6 +6,10 @@ import { getTaskCraneDisplay, getTaskCraneOwner } from '../../lib/taskCraneDispl
|
||||
|
||||
const STATUS_OPTIONS = ['aktivan', 'servis', 'spreman_za_zavrsetak', 'zavrsen', 'neaktivan'];
|
||||
|
||||
function todayIso() {
|
||||
return new Date().toISOString().slice(0, 10);
|
||||
}
|
||||
|
||||
function formatDate(value) {
|
||||
if (!value) return '-';
|
||||
const parsed = new Date(value);
|
||||
@@ -79,10 +83,15 @@ export default function TaskServiceRecordsModal({
|
||||
[workOrders, task?.work_order, selectedWorkOrderId]
|
||||
);
|
||||
|
||||
const sortedWorkOrders = useMemo(
|
||||
() => [...workOrders].sort((a, b) => String(b.date || '').localeCompare(String(a.date || ''))),
|
||||
[workOrders]
|
||||
);
|
||||
const sortedWorkOrders = useMemo(() => {
|
||||
const today = todayIso();
|
||||
return [...workOrders].sort((a, b) => {
|
||||
const aToday = String(a.date || '').slice(0, 10) === today ? 1 : 0;
|
||||
const bToday = String(b.date || '').slice(0, 10) === today ? 1 : 0;
|
||||
if (bToday !== aToday) return bToday - aToday;
|
||||
return String(b.date || '').localeCompare(String(a.date || ''));
|
||||
});
|
||||
}, [workOrders]);
|
||||
|
||||
const effectiveWorkOrderId = task?.work_order ? String(task.work_order) : String(selectedWorkOrderId || '');
|
||||
|
||||
@@ -355,7 +364,7 @@ export default function TaskServiceRecordsModal({
|
||||
{currentWorkOrder && !showWorkOrderEditor ? (
|
||||
<div className="flex flex-wrap items-center justify-between gap-2 rounded border border-border-hairline bg-canvas-elevated px-3 py-2">
|
||||
<p className="text-sm text-text-main">
|
||||
{formatWorkOrderDisplayCode(currentWorkOrder)} • {currentWorkOrder.craneLabel || currentWorkOrder.craneInfo?.registration_number || '-'} • {currentWorkOrder.status || '-'}
|
||||
{formatWorkOrderDisplayCode(currentWorkOrder)} • {formatDate(currentWorkOrder.date)} • {currentWorkOrder.craneLabel || currentWorkOrder.craneInfo?.registration_number || '-'} • {currentWorkOrder.status || '-'}
|
||||
</p>
|
||||
<button
|
||||
type="button"
|
||||
@@ -374,14 +383,19 @@ export default function TaskServiceRecordsModal({
|
||||
className="w-full rounded-lg border border-border-hairline bg-canvas-elevated px-3 py-2 text-sm text-text-main disabled:opacity-60"
|
||||
>
|
||||
<option value="">— Odaberi putni nalog —</option>
|
||||
{sortedWorkOrders.map((workOrder) => (
|
||||
<option key={workOrder.id} value={String(workOrder.id)}>
|
||||
{formatWorkOrderDisplayCode(workOrder)} • {workOrder.craneLabel || workOrder.craneInfo?.registration_number || '-'} • {workOrder.status || '-'}
|
||||
</option>
|
||||
))}
|
||||
{sortedWorkOrders.map((workOrder) => {
|
||||
const isToday = String(workOrder.date || '').slice(0, 10) === todayIso();
|
||||
return (
|
||||
<option key={workOrder.id} value={String(workOrder.id)}>
|
||||
{isToday ? '★ ' : ''}{formatWorkOrderDisplayCode(workOrder)} • {formatDate(workOrder.date)} • {workOrder.craneLabel || workOrder.craneInfo?.registration_number || '-'} • {workOrder.status || '-'}
|
||||
</option>
|
||||
);
|
||||
})}
|
||||
</select>
|
||||
<p className="text-xs text-text-muted">
|
||||
{assigningWorkOrder ? 'Spremanje odabira putnog naloga...' : 'Odabir se automatski sprema u bazu.'}
|
||||
{assigningWorkOrder
|
||||
? 'Spremanje odabira putnog naloga...'
|
||||
: 'Isti putni nalog možete dodijeliti više zadataka. Danas (★) su prikazani prvo.'}
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user