@@ -176,11 +176,6 @@ export function JobsList({ bodyshop, setJoyRideSteps }) {
|
||||
[],
|
||||
onFilter: (value, record) => value.includes(record.status)
|
||||
},
|
||||
{
|
||||
title: t('jobs.fields.active_tasks'),
|
||||
key: 'activetasks',
|
||||
render: (text, record) => <span>{record.tasks_aggregate.aggregate.count}</span>,
|
||||
},
|
||||
{
|
||||
title: t("jobs.fields.vehicle"),
|
||||
dataIndex: "vehicle",
|
||||
|
||||
@@ -26,20 +26,17 @@ import {setModalContext} from '../../redux/modals/modals.actions';
|
||||
* @constructor
|
||||
*/
|
||||
const DueDateRecord = ({dueDate}) => {
|
||||
if (dueDate) {
|
||||
const dueDateDayjs = dayjs(dueDate);
|
||||
const relativeDueDate = dueDateDayjs.fromNow();
|
||||
const today = dayjs();
|
||||
if (!dueDate) return <></>;
|
||||
|
||||
if (dueDateDayjs.isBefore(today)) {
|
||||
return <div title={relativeDueDate} style={{color: 'red'}}>
|
||||
<DateFormatter>{dueDate}</DateFormatter></div>;
|
||||
} else {
|
||||
return <div title={relativeDueDate}><DateFormatter>{dueDate}</DateFormatter></div>;
|
||||
}
|
||||
} else {
|
||||
return <div>N/A</div>;
|
||||
}
|
||||
const dueDateDayjs = dayjs(dueDate);
|
||||
const relativeDueDate = dueDateDayjs.fromNow();
|
||||
const isBeforeToday = dueDateDayjs.isBefore(dayjs());
|
||||
|
||||
return (
|
||||
<div title={relativeDueDate} style={{color: isBeforeToday ? 'red' : 'black'}}>
|
||||
<DateFormatter>{dueDate}</DateFormatter>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -81,6 +78,7 @@ const mapStateToProps = (state) => ({
|
||||
export default connect(mapStateToProps, mapDispatchToProps)(TaskListComponent);
|
||||
|
||||
function TaskListComponent({
|
||||
bodyshop,
|
||||
loading,
|
||||
tasks,
|
||||
total,
|
||||
@@ -117,9 +115,13 @@ function TaskListComponent({
|
||||
title: t("tasks.fields.assigned_to"),
|
||||
dataIndex: "assigned_to",
|
||||
key: "assigned_to",
|
||||
width: '10%',
|
||||
width: '8%',
|
||||
sorter: true,
|
||||
sortOrder: sortcolumn === "assigned_to" && sortorder,
|
||||
render: (text, record) => {
|
||||
const employee = bodyshop?.employees?.find(e => e.user_email === record.assigned_to);
|
||||
return employee ? `${ employee.first_name} ${ employee.last_name}` : t("general.labels.na");
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -129,12 +131,46 @@ function TaskListComponent({
|
||||
title: t("tasks.fields.job.ro_number"),
|
||||
dataIndex: ["job", "ro_number"],
|
||||
key: "job.ro_number",
|
||||
width: '5%',
|
||||
render: (text, record) => (
|
||||
<Link to={`/manage/jobs/${record.job.id}`}>
|
||||
{record.job.ro_number}
|
||||
</Link>
|
||||
),
|
||||
width: '8%',
|
||||
render: (text, record) =>
|
||||
record.job
|
||||
? <Link to={`/manage/jobs/${record.job.id}`}>{record.job.ro_number || t("general.labels.na")}</Link>
|
||||
: t("general.labels.na")
|
||||
},
|
||||
{
|
||||
title: t("tasks.fields.jobline"),
|
||||
dataIndex: ["jobline", "id"],
|
||||
key: "jobline.id",
|
||||
width: '8%',
|
||||
render: (text, record) => record?.jobline?.line_desc || ''
|
||||
},
|
||||
{
|
||||
title: t("tasks.fields.parts_order"),
|
||||
dataIndex: ["parts_order", "id"],
|
||||
key: "part_order.id",
|
||||
width: '8%',
|
||||
render: (text, record) =>
|
||||
record.parts_order
|
||||
? <Link to={`/manage/jobs/${record.job.id}?partsorderid=${record.parts_order.id}&tab=partssublet`}>
|
||||
{record.parts_order.order_number && record.parts_order.vendor && record.parts_order.vendor.name
|
||||
? `${record.parts_order.order_number} - ${record.parts_order.vendor.name}`
|
||||
: t("general.labels.na")}
|
||||
</Link>
|
||||
: ''
|
||||
},
|
||||
{
|
||||
title: t("tasks.fields.bill"),
|
||||
dataIndex: ["bill", "id"],
|
||||
key: "bill.id",
|
||||
width: '8%',
|
||||
render: (text, record) =>
|
||||
record.bill
|
||||
? <Link to={`/manage/jobs/${record.job.id}?billid=${record.bill.id}&tab=partssublet`}>
|
||||
{record.bill.invoice_number && record.bill.vendor && record.bill.vendor.name
|
||||
? `${record.bill.invoice_number} - ${record.bill.vendor.name}`
|
||||
: t("general.labels.na")}
|
||||
</Link>
|
||||
: ''
|
||||
},
|
||||
{
|
||||
title: t("tasks.fields.title"),
|
||||
@@ -143,13 +179,6 @@ function TaskListComponent({
|
||||
sorter: true,
|
||||
sortOrder: sortcolumn === "title" && sortorder,
|
||||
},
|
||||
{
|
||||
title: t("tasks.fields.description"),
|
||||
dataIndex: "description",
|
||||
key: "description",
|
||||
sorter: true,
|
||||
sortOrder: sortcolumn === "description" && sortorder,
|
||||
},
|
||||
{
|
||||
title: t("tasks.fields.due_date"),
|
||||
dataIndex: "due_date",
|
||||
@@ -159,6 +188,15 @@ function TaskListComponent({
|
||||
width: '8%',
|
||||
render: (text, record) => <DueDateRecord dueDate={record.due_date} />,
|
||||
},
|
||||
{
|
||||
title: t("tasks.fields.remind_at"),
|
||||
dataIndex: "remind_at",
|
||||
key: "remind_at",
|
||||
sorter: true,
|
||||
sortOrder: sortcolumn === "remind_at" && sortorder,
|
||||
width: '8%',
|
||||
render: (text, record) => <DueDateRecord dueDate={record.remind_at} />,
|
||||
},
|
||||
{
|
||||
title: t("tasks.fields.priority"),
|
||||
dataIndex: "priority",
|
||||
@@ -229,6 +267,12 @@ function TaskListComponent({
|
||||
}
|
||||
history({search: queryString.stringify(search)});
|
||||
};
|
||||
|
||||
const expandableRow = (record) => {
|
||||
return <Card title={t('tasks.fields.description')} size='small'>
|
||||
{record.description}
|
||||
</Card>
|
||||
};
|
||||
|
||||
/**
|
||||
* Extra actions for the tasks
|
||||
@@ -279,16 +323,21 @@ function TaskListComponent({
|
||||
<Table
|
||||
loading={loading}
|
||||
pagination={{
|
||||
position: "top",
|
||||
pageSize: pageLimit,
|
||||
current: parseInt(page || 1),
|
||||
total: total,
|
||||
responsive: true,
|
||||
showQuickJumper: true,
|
||||
}}
|
||||
columns={columns}
|
||||
rowKey="id"
|
||||
scroll={{x: true}}
|
||||
dataSource={tasks}
|
||||
onChange={handleTableChange}
|
||||
expandable={{
|
||||
expandedRowRender: expandableRow,
|
||||
rowExpandable: record => record.description,
|
||||
}}
|
||||
/>
|
||||
</Card>
|
||||
);
|
||||
|
||||
@@ -136,6 +136,7 @@ export default function TaskListContainer({bodyshop, titleTranslation ,query, r
|
||||
|
||||
return (
|
||||
<TaskListComponent
|
||||
bodyshop={bodyshop}
|
||||
loading={loading}
|
||||
tasks={data ? data.tasks : null}
|
||||
total={data ? data.tasks_aggregate.aggregate.count : 0}
|
||||
|
||||
@@ -84,7 +84,7 @@ export function TaskUpsertModalComponent({
|
||||
<Form.Item
|
||||
label={t("tasks.fields.priority")}
|
||||
name="priority"
|
||||
initialValue={1}
|
||||
initialValue={3}
|
||||
>
|
||||
<Select
|
||||
options={[
|
||||
|
||||
@@ -40,8 +40,26 @@ const PARTIAL_TASK_FIELDS = gql`
|
||||
}
|
||||
}
|
||||
jobid
|
||||
jobline {
|
||||
id
|
||||
line_desc
|
||||
}
|
||||
joblineid
|
||||
parts_order {
|
||||
id
|
||||
vendor {
|
||||
name
|
||||
}
|
||||
order_number
|
||||
}
|
||||
partsorderid
|
||||
bill {
|
||||
id
|
||||
vendor {
|
||||
name
|
||||
}
|
||||
invoice_number
|
||||
}
|
||||
billid
|
||||
}
|
||||
`;
|
||||
|
||||
@@ -32,7 +32,7 @@ export function MyTasksPageContainer({bodyshop, currentUser, setBreadcrumbs, se
|
||||
setSelectedHeader("all_tasks");
|
||||
setBreadcrumbs([
|
||||
{
|
||||
link: "/manage/alltasks",
|
||||
link: "/manage/tasks/alltasks",
|
||||
label: t("titles.bc.all_tasks"),
|
||||
},]);
|
||||
}, [t, setBreadcrumbs, setSelectedHeader]);
|
||||
|
||||
@@ -32,7 +32,7 @@ export function MyTasksPageContainer({bodyshop, currentUser, setBreadcrumbs, se
|
||||
setSelectedHeader("my_tasks");
|
||||
setBreadcrumbs([
|
||||
{
|
||||
link: "/manage/mytasks",
|
||||
link: "/manage/tasks/mytasks",
|
||||
label: t("titles.bc.my_tasks"),
|
||||
},]);
|
||||
}, [t, setBreadcrumbs, setSelectedHeader]);
|
||||
|
||||
@@ -12,7 +12,7 @@ export default function TasksPageComponent({bodyshop, currentUser, type}) {
|
||||
currentUser={currentUser}/>
|
||||
case taskPageTypes.ALL_TASKS:
|
||||
return <TaskListContainer query={QUERY_ALL_TASKS_PAGINATED} bodyshop={bodyshop}
|
||||
titleTranslation={'tasks.titles.my_tasks'}
|
||||
titleTranslation={'tasks.titles.all_tasks'}
|
||||
currentUser={currentUser}/>
|
||||
}
|
||||
|
||||
|
||||
@@ -2122,6 +2122,7 @@
|
||||
"edit": "Edit Task"
|
||||
},
|
||||
"titles": {
|
||||
"all_tasks": "All Tasks",
|
||||
"job_tasks": "Job Tasks",
|
||||
"mine": "My Tasks",
|
||||
"my_tasks": "My Tasks",
|
||||
@@ -2151,6 +2152,9 @@
|
||||
"medium": "Medium",
|
||||
"high": "High"
|
||||
},
|
||||
"jobline": "Job Line",
|
||||
"parts_order": "Parts Order",
|
||||
"bill": "Bill",
|
||||
"title": "Title",
|
||||
"joblineid": "Job Line",
|
||||
"jobid": "Job",
|
||||
|
||||
@@ -2122,8 +2122,10 @@
|
||||
"edit": ""
|
||||
},
|
||||
"titles": {
|
||||
"all_tasks": "",
|
||||
"job_tasks": "",
|
||||
"ny_tasks": "",
|
||||
"mine": "",
|
||||
"my_tasks": "",
|
||||
"completed": "",
|
||||
"deleted": ""
|
||||
},
|
||||
@@ -2145,6 +2147,9 @@
|
||||
"assigned_to": ""
|
||||
},
|
||||
"fields": {
|
||||
"jobline": "",
|
||||
"parts_order": "",
|
||||
"bill": "",
|
||||
"priorities": {
|
||||
"low": "",
|
||||
"medium":"",
|
||||
|
||||
@@ -2122,8 +2122,10 @@
|
||||
"edit": ""
|
||||
},
|
||||
"titles": {
|
||||
"all_tasks": "",
|
||||
"job_tasks": "",
|
||||
"ny_tasks": "",
|
||||
"mine": "",
|
||||
"my_tasks": "",
|
||||
"completed": "",
|
||||
"deleted": ""
|
||||
},
|
||||
@@ -2145,6 +2147,9 @@
|
||||
"assigned_to": ""
|
||||
},
|
||||
"fields": {
|
||||
"jobline": "",
|
||||
"parts_order": "",
|
||||
"bill": "",
|
||||
"priorities": {
|
||||
"low": "",
|
||||
"medium":"",
|
||||
|
||||
Reference in New Issue
Block a user