shoc-frontend-new/src/pages/workorders/api.js
Adam Moussa 62bc2f058c Add checklist UI to dispatch workflow
- Task List Template picker in dispatch modal
- Checklist section in dispatch detail modal with toggleable items
- Shows completion count, completed by user name + timestamp
- Strikethrough styling on completed items
- fetchTaskTemplates, updateChecklistItem, addChecklistItem API functions
2026-04-17 15:28:52 -04:00

170 lines
5.9 KiB
JavaScript

import { workOrderApi } from "../../services/api";
import { post } from "../../apiUtil";
import { API_URL } from "../../constants";
export const getWorkOrders = async (params = {}) => {
try {
const response = await workOrderApi.getAll(params);
const workOrders = response.data || response;
return Array.isArray(workOrders) ? workOrders : [];
} catch (error) {
console.error("Error fetching work orders:", error);
throw error;
}
};
export const getWorkOrderById = async (id) => {
try {
const wo = await workOrderApi.getById(id);
return {
id: wo.id,
internalWONumber: wo.internalWONumber ?? "",
workOrderNumber: wo.workerOrderNumber ?? wo.workOrderNumber ?? "",
title: wo.title ?? wo.workerOrderTitle ?? "",
location: wo.location ?? "",
locationId: wo.locationId != null ? String(wo.locationId) : "",
locationZip: wo.locationZip ?? "",
assignedTo: wo.assignee ?? wo.assignedTo ?? "",
dueDate: wo.dueDate ? wo.dueDate.split("T")[0] : "",
createdDate: wo.createdDate ? wo.createdDate.split("T")[0] : "",
createdDateFull: wo.createdDate ?? "",
description: wo.description ?? "",
priority: wo.priority ?? "",
status: wo.status ?? "Open",
po: wo.po ?? "",
tt: wo.tt ?? "",
problem: wo.problem ?? "",
trade: wo.trade ?? "",
subTrade: wo.subTrade ?? "",
vendorNTE: wo.vendorNTE != null ? String(wo.vendorNTE) : "",
scheduledDate: wo.scheduledDate ? wo.scheduledDate.split("T")[0] : "",
completedDate: wo.completedDate ? wo.completedDate.split("T")[0] : "",
source: wo.source ?? "",
comments: wo.comments ?? [],
auditLog: wo.auditLog ?? [],
dispatches: wo.dispatches ?? [],
};
} catch (error) {
console.error("Error fetching work order:", error);
throw error;
}
};
export const addWorkOrder = async (workOrder) => {
try {
return await workOrderApi.create(workOrder);
} catch (error) {
console.error("Error creating work order:", error);
throw error;
}
};
export const editWorkOrder = async (workOrder) => {
try {
return await workOrderApi.update(workOrder.id, {
Id: workOrder.id,
WorkerOrderNumber: workOrder.workOrderNumber,
WorkerOrderTitle: workOrder.title,
Description: workOrder.description,
PO: workOrder.po,
TT: workOrder.tt,
AssignTo: workOrder.assignedTo || null,
DueDate: workOrder.dueDate || null,
Priority: workOrder.priority || null,
Status: workOrder.status,
LocationId: workOrder.locationId ? parseInt(workOrder.locationId) : null,
Problem: workOrder.problem || null,
Trade: workOrder.trade || null,
SubTrade: workOrder.subTrade || null,
VendorNTE: workOrder.vendorNTE ? parseFloat(workOrder.vendorNTE) : null,
ScheduledDate: workOrder.scheduledDate || null,
CompletedDate: workOrder.completedDate || null,
Source: workOrder.source || null,
});
} catch (error) {
console.error("Error updating work order:", error);
throw error;
}
};
export const addComment = async (workOrderId, text, commentType = "internal") => {
return post(`${API_URL}/WorkOrder/AddCommentJson`, {
WorkorderId: workOrderId,
Text: text,
CommentType: commentType,
});
};
export const changeWorkOrderAssignment = async (id, assignTo) => {
return post(`${API_URL}/WorkOrder/ChangeAssignment?id=${id}&assignTo=${encodeURIComponent(assignTo || "")}`);
};
export const fetchUsers = async () => {
const { get: apiGet } = await import("../../apiUtil");
const data = await apiGet(`${API_URL}/User`);
return (data || []).map((u) => ({ id: u.id ?? u.Id, name: u.name ?? u.Name ?? u.userName ?? "" }));
};
export const fetchDropdownOptions = async (category, parent) => {
const { get: apiGet } = await import("../../apiUtil");
let url = `${API_URL}/DropdownOptions/ByCategory/${encodeURIComponent(category)}`;
if (parent) url += `?parent=${encodeURIComponent(parent)}`;
return (await apiGet(url)) || [];
};
export const fetchVendorsDropdown = async (trade, siteZip) => {
const { get: apiGet } = await import("../../apiUtil");
const params = new URLSearchParams();
if (trade) params.append("trade", trade);
if (siteZip) params.append("siteZip", siteZip);
const qs = params.toString();
return (await apiGet(`${API_URL}/Vendor/Dropdown${qs ? `?${qs}` : ""}`)) || [];
};
export const fetchTaskTemplates = async () => {
const { get: apiGet } = await import("../../apiUtil");
return (await apiGet(`${API_URL}/TaskListTemplate`)) || [];
};
export const updateChecklistItem = async (id, isCompleted, completedBy) => {
return post(`${API_URL}/WorkOrder/UpdateChecklistItem`, { Id: id, IsCompleted: isCompleted, CompletedBy: completedBy });
};
export const addChecklistItem = async (dispatchId, itemText, workOrderId) => {
return post(`${API_URL}/WorkOrder/AddChecklistItem`, { DispatchId: dispatchId, ItemText: itemText, WorkOrderId: workOrderId });
};
export const getDispatchById = async (id) => {
const { get: apiGet } = await import("../../apiUtil");
return apiGet(`${API_URL}/WorkOrder/GetDispatch/${id}`);
};
export const updateDispatch = async (payload) => {
return post(`${API_URL}/WorkOrder/UpdateDispatch`, payload);
};
export const addDispatchComment = async (dispatchId, text, sendEmail = true) => {
return post(`${API_URL}/WorkOrder/AddDispatchComment`, {
DispatchId: dispatchId,
Text: text,
SendEmail: sendEmail,
});
};
export const dispatchToVendor = async (payload) => {
return post(`${API_URL}/WorkOrder/DispatchToVendor`, payload);
};
export const changeWorkOrderStatus = async (id, status) => {
return post(`${API_URL}/WorkOrder/ChangeStatus?id=${id}&status=${encodeURIComponent(status)}`);
};
export const deleteWorkOrder = async (id) => {
try {
await workOrderApi.delete(id);
return true;
} catch (error) {
console.error("Error deleting work order:", error);
throw error;
}
};