- Progress Commit

Signed-off-by: Dave Richer <dave@imexsystems.ca>
This commit is contained in:
Dave Richer
2024-04-02 15:01:51 -04:00
parent 282dbd0913
commit 90814f41a2
11 changed files with 116 additions and 39 deletions

View File

@@ -176,11 +176,6 @@ export function JobsList({ bodyshop, setJoyRideSteps }) {
[], [],
onFilter: (value, record) => value.includes(record.status) 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"), title: t("jobs.fields.vehicle"),
dataIndex: "vehicle", dataIndex: "vehicle",

View File

@@ -26,20 +26,17 @@ import {setModalContext} from '../../redux/modals/modals.actions';
* @constructor * @constructor
*/ */
const DueDateRecord = ({dueDate}) => { const DueDateRecord = ({dueDate}) => {
if (dueDate) { if (!dueDate) return <></>;
const dueDateDayjs = dayjs(dueDate);
const relativeDueDate = dueDateDayjs.fromNow();
const today = dayjs();
if (dueDateDayjs.isBefore(today)) { const dueDateDayjs = dayjs(dueDate);
return <div title={relativeDueDate} style={{color: 'red'}}> const relativeDueDate = dueDateDayjs.fromNow();
<DateFormatter>{dueDate}</DateFormatter></div>; const isBeforeToday = dueDateDayjs.isBefore(dayjs());
} else {
return <div title={relativeDueDate}><DateFormatter>{dueDate}</DateFormatter></div>; return (
} <div title={relativeDueDate} style={{color: isBeforeToday ? 'red' : 'black'}}>
} else { <DateFormatter>{dueDate}</DateFormatter>
return <div>N/A</div>; </div>
} );
} }
/** /**
@@ -81,6 +78,7 @@ const mapStateToProps = (state) => ({
export default connect(mapStateToProps, mapDispatchToProps)(TaskListComponent); export default connect(mapStateToProps, mapDispatchToProps)(TaskListComponent);
function TaskListComponent({ function TaskListComponent({
bodyshop,
loading, loading,
tasks, tasks,
total, total,
@@ -117,9 +115,13 @@ function TaskListComponent({
title: t("tasks.fields.assigned_to"), title: t("tasks.fields.assigned_to"),
dataIndex: "assigned_to", dataIndex: "assigned_to",
key: "assigned_to", key: "assigned_to",
width: '10%', width: '8%',
sorter: true, sorter: true,
sortOrder: sortcolumn === "assigned_to" && sortorder, 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"), title: t("tasks.fields.job.ro_number"),
dataIndex: ["job", "ro_number"], dataIndex: ["job", "ro_number"],
key: "job.ro_number", key: "job.ro_number",
width: '5%', width: '8%',
render: (text, record) => ( render: (text, record) =>
<Link to={`/manage/jobs/${record.job.id}`}> record.job
{record.job.ro_number} ? <Link to={`/manage/jobs/${record.job.id}`}>{record.job.ro_number || t("general.labels.na")}</Link>
</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"), title: t("tasks.fields.title"),
@@ -143,13 +179,6 @@ function TaskListComponent({
sorter: true, sorter: true,
sortOrder: sortcolumn === "title" && sortorder, 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"), title: t("tasks.fields.due_date"),
dataIndex: "due_date", dataIndex: "due_date",
@@ -159,6 +188,15 @@ function TaskListComponent({
width: '8%', width: '8%',
render: (text, record) => <DueDateRecord dueDate={record.due_date} />, 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"), title: t("tasks.fields.priority"),
dataIndex: "priority", dataIndex: "priority",
@@ -230,6 +268,12 @@ function TaskListComponent({
history({search: queryString.stringify(search)}); 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 * Extra actions for the tasks
* @type {Function} * @type {Function}
@@ -279,16 +323,21 @@ function TaskListComponent({
<Table <Table
loading={loading} loading={loading}
pagination={{ pagination={{
position: "top",
pageSize: pageLimit, pageSize: pageLimit,
current: parseInt(page || 1), current: parseInt(page || 1),
total: total, total: total,
responsive: true,
showQuickJumper: true,
}} }}
columns={columns} columns={columns}
rowKey="id" rowKey="id"
scroll={{x: true}} scroll={{x: true}}
dataSource={tasks} dataSource={tasks}
onChange={handleTableChange} onChange={handleTableChange}
expandable={{
expandedRowRender: expandableRow,
rowExpandable: record => record.description,
}}
/> />
</Card> </Card>
); );

View File

@@ -136,6 +136,7 @@ export default function TaskListContainer({bodyshop, titleTranslation ,query, r
return ( return (
<TaskListComponent <TaskListComponent
bodyshop={bodyshop}
loading={loading} loading={loading}
tasks={data ? data.tasks : null} tasks={data ? data.tasks : null}
total={data ? data.tasks_aggregate.aggregate.count : 0} total={data ? data.tasks_aggregate.aggregate.count : 0}

View File

@@ -84,7 +84,7 @@ export function TaskUpsertModalComponent({
<Form.Item <Form.Item
label={t("tasks.fields.priority")} label={t("tasks.fields.priority")}
name="priority" name="priority"
initialValue={1} initialValue={3}
> >
<Select <Select
options={[ options={[

View File

@@ -40,8 +40,26 @@ const PARTIAL_TASK_FIELDS = gql`
} }
} }
jobid jobid
jobline {
id
line_desc
}
joblineid joblineid
parts_order {
id
vendor {
name
}
order_number
}
partsorderid partsorderid
bill {
id
vendor {
name
}
invoice_number
}
billid billid
} }
`; `;

View File

@@ -32,7 +32,7 @@ export function MyTasksPageContainer({bodyshop, currentUser, setBreadcrumbs, se
setSelectedHeader("all_tasks"); setSelectedHeader("all_tasks");
setBreadcrumbs([ setBreadcrumbs([
{ {
link: "/manage/alltasks", link: "/manage/tasks/alltasks",
label: t("titles.bc.all_tasks"), label: t("titles.bc.all_tasks"),
},]); },]);
}, [t, setBreadcrumbs, setSelectedHeader]); }, [t, setBreadcrumbs, setSelectedHeader]);

View File

@@ -32,7 +32,7 @@ export function MyTasksPageContainer({bodyshop, currentUser, setBreadcrumbs, se
setSelectedHeader("my_tasks"); setSelectedHeader("my_tasks");
setBreadcrumbs([ setBreadcrumbs([
{ {
link: "/manage/mytasks", link: "/manage/tasks/mytasks",
label: t("titles.bc.my_tasks"), label: t("titles.bc.my_tasks"),
},]); },]);
}, [t, setBreadcrumbs, setSelectedHeader]); }, [t, setBreadcrumbs, setSelectedHeader]);

View File

@@ -12,7 +12,7 @@ export default function TasksPageComponent({bodyshop, currentUser, type}) {
currentUser={currentUser}/> currentUser={currentUser}/>
case taskPageTypes.ALL_TASKS: case taskPageTypes.ALL_TASKS:
return <TaskListContainer query={QUERY_ALL_TASKS_PAGINATED} bodyshop={bodyshop} return <TaskListContainer query={QUERY_ALL_TASKS_PAGINATED} bodyshop={bodyshop}
titleTranslation={'tasks.titles.my_tasks'} titleTranslation={'tasks.titles.all_tasks'}
currentUser={currentUser}/> currentUser={currentUser}/>
} }

View File

@@ -2122,6 +2122,7 @@
"edit": "Edit Task" "edit": "Edit Task"
}, },
"titles": { "titles": {
"all_tasks": "All Tasks",
"job_tasks": "Job Tasks", "job_tasks": "Job Tasks",
"mine": "My Tasks", "mine": "My Tasks",
"my_tasks": "My Tasks", "my_tasks": "My Tasks",
@@ -2151,6 +2152,9 @@
"medium": "Medium", "medium": "Medium",
"high": "High" "high": "High"
}, },
"jobline": "Job Line",
"parts_order": "Parts Order",
"bill": "Bill",
"title": "Title", "title": "Title",
"joblineid": "Job Line", "joblineid": "Job Line",
"jobid": "Job", "jobid": "Job",

View File

@@ -2122,8 +2122,10 @@
"edit": "" "edit": ""
}, },
"titles": { "titles": {
"all_tasks": "",
"job_tasks": "", "job_tasks": "",
"ny_tasks": "", "mine": "",
"my_tasks": "",
"completed": "", "completed": "",
"deleted": "" "deleted": ""
}, },
@@ -2145,6 +2147,9 @@
"assigned_to": "" "assigned_to": ""
}, },
"fields": { "fields": {
"jobline": "",
"parts_order": "",
"bill": "",
"priorities": { "priorities": {
"low": "", "low": "",
"medium":"", "medium":"",

View File

@@ -2122,8 +2122,10 @@
"edit": "" "edit": ""
}, },
"titles": { "titles": {
"all_tasks": "",
"job_tasks": "", "job_tasks": "",
"ny_tasks": "", "mine": "",
"my_tasks": "",
"completed": "", "completed": "",
"deleted": "" "deleted": ""
}, },
@@ -2145,6 +2147,9 @@
"assigned_to": "" "assigned_to": ""
}, },
"fields": { "fields": {
"jobline": "",
"parts_order": "",
"bill": "",
"priorities": { "priorities": {
"low": "", "low": "",
"medium":"", "medium":"",