- PR Change Requests (Progress)
Signed-off-by: Dave Richer <dave@imexsystems.ca>
This commit is contained in:
@@ -0,0 +1,48 @@
|
|||||||
|
import { DatePicker } from "antd";
|
||||||
|
import dayjs from "../../utils/day.js";
|
||||||
|
import React, { useRef } from "react";
|
||||||
|
|
||||||
|
import { connect } from "react-redux";
|
||||||
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import { selectBodyshop } from "../../redux/user/user.selectors.js";
|
||||||
|
|
||||||
|
const mapStateToProps = createStructuredSelector({
|
||||||
|
bodyshop: selectBodyshop
|
||||||
|
});
|
||||||
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
|
//setUserLanguage: language => dispatch(setUserLanguage(language))
|
||||||
|
});
|
||||||
|
export default connect(mapStateToProps, mapDispatchToProps)(FormDateTimePickerEnhanced);
|
||||||
|
|
||||||
|
const dateFormat = "MM/DD/YYYY h:mm a";
|
||||||
|
|
||||||
|
export function FormDateTimePickerEnhanced({
|
||||||
|
bodyshop,
|
||||||
|
value,
|
||||||
|
onBlur,
|
||||||
|
onlyFuture,
|
||||||
|
onlyToday,
|
||||||
|
isDateOnly = true,
|
||||||
|
...restProps
|
||||||
|
}) {
|
||||||
|
const ref = useRef();
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<DatePicker
|
||||||
|
ref={ref}
|
||||||
|
value={value ? dayjs(value) : null}
|
||||||
|
format={dateFormat}
|
||||||
|
onBlur={onBlur}
|
||||||
|
showToday={false}
|
||||||
|
disabledDate={(d) => {
|
||||||
|
if (onlyToday) {
|
||||||
|
return !dayjs().isSame(d, "day");
|
||||||
|
} else if (onlyFuture) {
|
||||||
|
return dayjs().subtract(1, "day").isAfter(d);
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
{...restProps}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -7,23 +7,21 @@ import { GET_JOB_LINE_ORDERS } from "../../graphql/jobs.queries";
|
|||||||
import CurrencyFormatter from "../../utils/CurrencyFormatter";
|
import CurrencyFormatter from "../../utils/CurrencyFormatter";
|
||||||
import { DateFormatter } from "../../utils/DateFormatter";
|
import { DateFormatter } from "../../utils/DateFormatter";
|
||||||
import AlertComponent from "../alert/alert.component";
|
import AlertComponent from "../alert/alert.component";
|
||||||
|
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import { QUERY_JOBLINE_TASKS_PAGINATED } from "../../graphql/tasks.queries.js";
|
import { QUERY_JOBLINE_TASKS_PAGINATED } from "../../graphql/tasks.queries.js";
|
||||||
import TaskListContainer from "../task-list/task-list.container.jsx";
|
import TaskListContainer from "../task-list/task-list.container.jsx";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop
|
||||||
currentUser: selectCurrentUser
|
|
||||||
});
|
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
|
||||||
//setUserLanguage: language => dispatch(setUserLanguage(language))
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const mapDispatchToProps = (dispatch) => ({});
|
||||||
|
|
||||||
export default connect(mapStateToProps, mapDispatchToProps)(JobLinesExpander);
|
export default connect(mapStateToProps, mapDispatchToProps)(JobLinesExpander);
|
||||||
|
|
||||||
export function JobLinesExpander({ jobline, jobid, bodyshop, currentUser }) {
|
export function JobLinesExpander({ jobline, jobid, bodyshop }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { loading, error, data } = useQuery(GET_JOB_LINE_ORDERS, {
|
const { loading, error, data } = useQuery(GET_JOB_LINE_ORDERS, {
|
||||||
fetchPolicy: "network-only",
|
fetchPolicy: "network-only",
|
||||||
@@ -133,8 +131,6 @@ export function JobLinesExpander({ jobline, jobid, bodyshop, currentUser }) {
|
|||||||
</Col>
|
</Col>
|
||||||
<Col md={24} lg={24}>
|
<Col md={24} lg={24}>
|
||||||
<TaskListContainer
|
<TaskListContainer
|
||||||
currentUser={currentUser}
|
|
||||||
bodyshop={bodyshop}
|
|
||||||
parentJobId={jobid}
|
parentJobId={jobid}
|
||||||
relationshipType={"joblineid"}
|
relationshipType={"joblineid"}
|
||||||
relationshipId={jobline.id}
|
relationshipId={jobline.id}
|
||||||
|
|||||||
@@ -334,19 +334,24 @@ export function JobLinesComponent({
|
|||||||
>
|
>
|
||||||
<EditFilled />
|
<EditFilled />
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
</>
|
||||||
title={t("tasks.buttons.create")}
|
)}
|
||||||
onClick={() => {
|
|
||||||
setTaskUpsertContext({
|
<Button
|
||||||
context: {
|
title={t("tasks.buttons.create")}
|
||||||
jobid: job.id,
|
onClick={() => {
|
||||||
joblineid: record.id
|
setTaskUpsertContext({
|
||||||
}
|
context: {
|
||||||
});
|
jobid: job.id,
|
||||||
}}
|
joblineid: record.id
|
||||||
>
|
}
|
||||||
<FaTasks />
|
});
|
||||||
</Button>
|
}}
|
||||||
|
>
|
||||||
|
<FaTasks />
|
||||||
|
</Button>
|
||||||
|
{(record.manual_line || jobIsPrivate) && (
|
||||||
|
<>
|
||||||
<Button
|
<Button
|
||||||
disabled={jobRO}
|
disabled={jobRO}
|
||||||
onClick={async () => {
|
onClick={async () => {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import {
|
|||||||
PlusCircleFilled,
|
PlusCircleFilled,
|
||||||
SyncOutlined
|
SyncOutlined
|
||||||
} from "@ant-design/icons";
|
} from "@ant-design/icons";
|
||||||
import { DateFormatter } from "../../utils/DateFormatter.jsx";
|
import { DateFormatter, DateTimeFormatter } from "../../utils/DateFormatter.jsx";
|
||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import { setModalContext } from "../../redux/modals/modals.actions";
|
import { setModalContext } from "../../redux/modals/modals.actions";
|
||||||
|
|
||||||
@@ -33,12 +33,26 @@ const DueDateRecord = ({ dueDate }) => {
|
|||||||
const isBeforeToday = dueDateDayjs.isBefore(dayjs());
|
const isBeforeToday = dueDateDayjs.isBefore(dayjs());
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div title={relativeDueDate} style={{ color: isBeforeToday ? "red" : "black" }}>
|
<div title={relativeDueDate} style={isBeforeToday ? { color: "red" } : {}}>
|
||||||
<DateFormatter>{dueDate}</DateFormatter>
|
<DateFormatter>{dueDate}</DateFormatter>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const RemindAtRecord = ({ remindAt }) => {
|
||||||
|
if (!remindAt) return <></>;
|
||||||
|
|
||||||
|
const remindAtDayjs = dayjs(remindAt);
|
||||||
|
const relativeRemindAtDate = remindAtDayjs.fromNow();
|
||||||
|
const isBeforeToday = remindAtDayjs.isBefore(dayjs());
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div title={relativeRemindAtDate} style={isBeforeToday ? { color: "red" } : {}}>
|
||||||
|
<DateTimeFormatter>{remindAt}</DateTimeFormatter>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Priority Label Component
|
* Priority Label Component
|
||||||
* @param priority
|
* @param priority
|
||||||
@@ -68,7 +82,7 @@ const PriorityLabel = ({ priority }) => {
|
|||||||
default:
|
default:
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
None <ExclamationCircleFilled style={{ marginLeft: "5px", color: "black" }} />
|
None <ExclamationCircleFilled style={{ marginLeft: "5px" }} />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -79,9 +93,7 @@ const mapDispatchToProps = (dispatch) => ({
|
|||||||
setTaskUpsertContext: (context) => dispatch(setModalContext({ context, modal: "taskUpsert" }))
|
setTaskUpsertContext: (context) => dispatch(setModalContext({ context, modal: "taskUpsert" }))
|
||||||
});
|
});
|
||||||
|
|
||||||
const mapStateToProps = (state) => ({
|
const mapStateToProps = (state) => ({});
|
||||||
// Existing state props...
|
|
||||||
});
|
|
||||||
|
|
||||||
export default connect(mapStateToProps, mapDispatchToProps)(TaskListComponent);
|
export default connect(mapStateToProps, mapDispatchToProps)(TaskListComponent);
|
||||||
|
|
||||||
@@ -99,6 +111,7 @@ function TaskListComponent({
|
|||||||
relationshipId,
|
relationshipId,
|
||||||
onlyMine,
|
onlyMine,
|
||||||
parentJobId,
|
parentJobId,
|
||||||
|
query,
|
||||||
showRo = true
|
showRo = true
|
||||||
}) {
|
}) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
@@ -111,6 +124,17 @@ function TaskListComponent({
|
|||||||
const history = useNavigate();
|
const history = useNavigate();
|
||||||
const columns = [];
|
const columns = [];
|
||||||
|
|
||||||
|
columns.push({
|
||||||
|
title: t("tasks.fields.created_at"),
|
||||||
|
dataIndex: "created_at",
|
||||||
|
key: "created_at",
|
||||||
|
width: "8%",
|
||||||
|
defaultSortOrder: "ascend",
|
||||||
|
sorter: true,
|
||||||
|
sortOrder: sortcolumn === "created_at" && sortorder,
|
||||||
|
render: (text, record) => <DateTimeFormatter>{record.created_at}</DateTimeFormatter>
|
||||||
|
});
|
||||||
|
|
||||||
if (!onlyMine) {
|
if (!onlyMine) {
|
||||||
columns.push({
|
columns.push({
|
||||||
title: t("tasks.fields.assigned_to"),
|
title: t("tasks.fields.assigned_to"),
|
||||||
@@ -204,7 +228,7 @@ function TaskListComponent({
|
|||||||
sorter: true,
|
sorter: true,
|
||||||
sortOrder: sortcolumn === "remind_at" && sortorder,
|
sortOrder: sortcolumn === "remind_at" && sortorder,
|
||||||
width: "8%",
|
width: "8%",
|
||||||
render: (text, record) => <DueDateRecord dueDate={record.remind_at} />
|
render: (text, record) => <RemindAtRecord remindAt={record.remind_at} />
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: t("tasks.fields.priority"),
|
title: t("tasks.fields.priority"),
|
||||||
@@ -226,7 +250,8 @@ function TaskListComponent({
|
|||||||
onClick={() => {
|
onClick={() => {
|
||||||
setTaskUpsertContext({
|
setTaskUpsertContext({
|
||||||
context: {
|
context: {
|
||||||
existingTask: record
|
existingTask: record,
|
||||||
|
query
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}}
|
}}
|
||||||
@@ -252,10 +277,11 @@ function TaskListComponent({
|
|||||||
actions: {},
|
actions: {},
|
||||||
context: {
|
context: {
|
||||||
jobid: parentJobId,
|
jobid: parentJobId,
|
||||||
[relationshipType]: relationshipId
|
[relationshipType]: relationshipId,
|
||||||
|
query
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}, [parentJobId, relationshipId, relationshipType, setTaskUpsertContext]);
|
}, [parentJobId, relationshipId, relationshipType, setTaskUpsertContext, query]);
|
||||||
|
|
||||||
const handleTableChange = (pagination, filters, sorter) => {
|
const handleTableChange = (pagination, filters, sorter) => {
|
||||||
search.page = pagination.current;
|
search.page = pagination.current;
|
||||||
|
|||||||
@@ -8,11 +8,22 @@ import React from "react";
|
|||||||
import TaskListComponent from "./task-list.component.jsx";
|
import TaskListComponent from "./task-list.component.jsx";
|
||||||
import { notification } from "antd";
|
import { notification } from "antd";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { useDispatch } from "react-redux";
|
import { connect, useDispatch } from "react-redux";
|
||||||
import { insertAuditTrail } from "../../redux/application/application.actions.js";
|
import { insertAuditTrail } from "../../redux/application/application.actions.js";
|
||||||
import AuditTrailMapping from "../../utils/AuditTrailMappings.js";
|
import AuditTrailMapping from "../../utils/AuditTrailMappings.js";
|
||||||
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors.js";
|
||||||
|
|
||||||
export default function TaskListContainer({
|
const mapStateToProps = createStructuredSelector({
|
||||||
|
bodyshop: selectBodyshop,
|
||||||
|
currentUser: selectCurrentUser
|
||||||
|
});
|
||||||
|
|
||||||
|
const mapDispatchToProps = (dispatch) => ({});
|
||||||
|
|
||||||
|
export default connect(mapStateToProps, mapDispatchToProps)(TaskListContainer);
|
||||||
|
|
||||||
|
export function TaskListContainer({
|
||||||
bodyshop,
|
bodyshop,
|
||||||
titleTranslation,
|
titleTranslation,
|
||||||
query,
|
query,
|
||||||
@@ -140,7 +151,6 @@ export default function TaskListContainer({
|
|||||||
|
|
||||||
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}
|
||||||
@@ -153,6 +163,8 @@ export default function TaskListContainer({
|
|||||||
onlyMine={onlyMine}
|
onlyMine={onlyMine}
|
||||||
showRo={showRo}
|
showRo={showRo}
|
||||||
parentJobId={parentJobId}
|
parentJobId={parentJobId}
|
||||||
|
bodyshop={bodyshop}
|
||||||
|
query={query}
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import { Col, DatePicker, Form, Input, Row, Select, Switch } from "antd";
|
import { Col, Form, Input, Row, Select, Switch } from "antd";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { useTranslation } from "react-i18next";
|
import { useTranslation } from "react-i18next";
|
||||||
import { FormDatePicker } from "../form-date-picker/form-date-picker.component.jsx";
|
import { FormDatePicker } from "../form-date-picker/form-date-picker.component.jsx";
|
||||||
@@ -9,6 +9,7 @@ import dayjs from "../../utils/day";
|
|||||||
import { connect } from "react-redux";
|
import { connect } from "react-redux";
|
||||||
import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component.jsx";
|
import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component.jsx";
|
||||||
import JobSearchSelectComponent from "../job-search-select/job-search-select.component.jsx";
|
import JobSearchSelectComponent from "../job-search-select/job-search-select.component.jsx";
|
||||||
|
import { FormDateTimePickerEnhanced } from "../form-date-time-picker-enhanced/form-date-time-picker-enhanced.component.jsx";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
@@ -194,12 +195,12 @@ export function TaskUpsertModalComponent({
|
|||||||
</Col>
|
</Col>
|
||||||
<Col span={8}>
|
<Col span={8}>
|
||||||
<Form.Item label={t("tasks.fields.due_date")} name="due_date">
|
<Form.Item label={t("tasks.fields.due_date")} name="due_date">
|
||||||
<FormDatePicker format="MM/DD/YYYY" presets={datePickerPresets} />
|
<FormDatePicker onlyFuture format="MM/DD/YYYY" presets={datePickerPresets} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={8}>
|
<Col span={8}>
|
||||||
<Form.Item label={t("tasks.fields.remind_at")} name="remind_at">
|
<Form.Item label={t("tasks.fields.remind_at")} name="remind_at">
|
||||||
<DatePicker showTime minuteStep={15} format="MM/DD/YYYY h:mm a" presets={datePickerPresets} />
|
<FormDateTimePickerEnhanced onlyFuture showTime minuteStep={15} presets={datePickerPresets} />
|
||||||
</Form.Item>
|
</Form.Item>
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ export function TaskUpsertModalContainer({ bodyshop, currentUser, taskUpsert, to
|
|||||||
const [insertTask] = useMutation(MUTATION_INSERT_NEW_TASK);
|
const [insertTask] = useMutation(MUTATION_INSERT_NEW_TASK);
|
||||||
const [updateTask] = useMutation(MUTATION_UPDATE_TASK);
|
const [updateTask] = useMutation(MUTATION_UPDATE_TASK);
|
||||||
const { open, context, actions } = taskUpsert;
|
const { open, context, actions } = taskUpsert;
|
||||||
const { jobid, joblineid, billid, partsorderid, taskId, existingTask } = context;
|
const { jobid, joblineid, billid, partsorderid, taskId, existingTask, query } = context;
|
||||||
const { refetch } = actions;
|
const { refetch } = actions;
|
||||||
const [form] = Form.useForm();
|
const [form] = Form.useForm();
|
||||||
const [selectedJobId, setSelectedJobId] = useState(null);
|
const [selectedJobId, setSelectedJobId] = useState(null);
|
||||||
@@ -54,7 +54,6 @@ export function TaskUpsertModalContainer({ bodyshop, currentUser, taskUpsert, to
|
|||||||
variables: { id: taskId },
|
variables: { id: taskId },
|
||||||
skip: !taskId
|
skip: !taskId
|
||||||
});
|
});
|
||||||
|
|
||||||
// Use Effect to hydrate existing task if only a taskid is provided
|
// Use Effect to hydrate existing task if only a taskid is provided
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!taskLoading && !taskError && taskData && taskData?.tasks_by_pk) {
|
if (!taskLoading && !taskError && taskData && taskData?.tasks_by_pk) {
|
||||||
@@ -113,12 +112,19 @@ export function TaskUpsertModalContainer({ bodyshop, currentUser, taskUpsert, to
|
|||||||
const handleExistingTask = async (values) => {
|
const handleExistingTask = async (values) => {
|
||||||
const isAssignedToDirty = values.assigned_to !== existingTask.assigned_to;
|
const isAssignedToDirty = values.assigned_to !== existingTask.assigned_to;
|
||||||
|
|
||||||
const taskData = await updateTask({
|
const taskObject = {
|
||||||
variables: {
|
variables: {
|
||||||
taskId: existingTask.id,
|
taskId: existingTask.id,
|
||||||
task: replaceUndefinedWithNull(values)
|
task: replaceUndefinedWithNull(values)
|
||||||
}
|
},
|
||||||
});
|
refetchQueries: ["GET_JOB_BY_PK"]
|
||||||
|
};
|
||||||
|
|
||||||
|
if (query && Object.keys(query).length) {
|
||||||
|
taskObject.refetchQueries.push(Object.keys(query)[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const taskData = await updateTask(taskObject);
|
||||||
|
|
||||||
if (!taskData.errors) {
|
if (!taskData.errors) {
|
||||||
const oldTask = taskData?.data?.update_tasks?.returning[0];
|
const oldTask = taskData?.data?.update_tasks?.returning[0];
|
||||||
@@ -164,7 +170,7 @@ export function TaskUpsertModalContainer({ bodyshop, currentUser, taskUpsert, to
|
|||||||
};
|
};
|
||||||
|
|
||||||
const handleNewTask = async (values) => {
|
const handleNewTask = async (values) => {
|
||||||
const newTaskData = await insertTask({
|
const newTaskObject = {
|
||||||
variables: {
|
variables: {
|
||||||
taskInput: [
|
taskInput: [
|
||||||
{
|
{
|
||||||
@@ -174,16 +180,27 @@ export function TaskUpsertModalContainer({ bodyshop, currentUser, taskUpsert, to
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
update(cache, { data }) {
|
refetchQueries: ["GET_JOB_BY_PK"]
|
||||||
cache.modify({
|
// update(cache, { data }) {
|
||||||
fields: {
|
// cache.modify({
|
||||||
tasks(cached) {
|
// fields: {
|
||||||
return [...data?.insert_tasks?.returning, ...cached];
|
// tasks(cached) {
|
||||||
}
|
// const newTasks = data?.insert_tasks?.returning.map(task => cache.writeFragment({
|
||||||
}
|
// data: task,
|
||||||
});
|
// fragment: PARTIAL_TASK_FIELDS_WRAPPER
|
||||||
}
|
// }));
|
||||||
});
|
// return [...cached, ...newTasks];
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
};
|
||||||
|
|
||||||
|
if (query && Object.keys(query).length) {
|
||||||
|
newTaskObject.refetchQueries.push(Object.keys(query)[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const newTaskData = await insertTask(newTaskObject);
|
||||||
|
|
||||||
const newTask = newTaskData?.data?.insert_tasks?.returning[0];
|
const newTask = newTaskData?.data?.insert_tasks?.returning[0];
|
||||||
const newTaskID = newTask?.id;
|
const newTaskID = newTask?.id;
|
||||||
@@ -237,6 +254,7 @@ export function TaskUpsertModalContainer({ bodyshop, currentUser, taskUpsert, to
|
|||||||
*/
|
*/
|
||||||
const handleFinish = async (formValues) => {
|
const handleFinish = async (formValues) => {
|
||||||
const { ...values } = formValues;
|
const { ...values } = formValues;
|
||||||
|
|
||||||
if (existingTask) {
|
if (existingTask) {
|
||||||
await handleExistingTask(values);
|
await handleExistingTask(values);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import { gql } from "@apollo/client";
|
import { gql } from "@apollo/client";
|
||||||
|
|
||||||
const PARTIAL_TASK_FIELDS = gql`
|
export const PARTIAL_TASK_FIELDS = gql`
|
||||||
fragment TaskFields on tasks {
|
fragment TaskFields on tasks {
|
||||||
id
|
id
|
||||||
created_at
|
created_at
|
||||||
@@ -63,6 +63,10 @@ const PARTIAL_TASK_FIELDS = gql`
|
|||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
export const PARTIAL_TASK_FIELDS_WRAPPER = gql`
|
||||||
|
${PARTIAL_TASK_FIELDS}
|
||||||
|
`;
|
||||||
|
|
||||||
export const QUERY_GET_TASK_BY_ID = gql`
|
export const QUERY_GET_TASK_BY_ID = gql`
|
||||||
${PARTIAL_TASK_FIELDS}
|
${PARTIAL_TASK_FIELDS}
|
||||||
query QUERY_GET_TASK_BY_ID($id: uuid!) {
|
query QUERY_GET_TASK_BY_ID($id: uuid!) {
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ import ScheduleJobModalContainer from "../../components/schedule-job-modal/sched
|
|||||||
import { insertAuditTrail } from "../../redux/application/application.actions";
|
import { insertAuditTrail } from "../../redux/application/application.actions";
|
||||||
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
import { selectJobReadOnly } from "../../redux/application/application.selectors";
|
||||||
import { setModalContext } from "../../redux/modals/modals.actions";
|
import { setModalContext } from "../../redux/modals/modals.actions";
|
||||||
import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors";
|
import { selectBodyshop } from "../../redux/user/user.selectors";
|
||||||
import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
import AuditTrailMapping from "../../utils/AuditTrailMappings";
|
||||||
import UndefinedToNull from "../../utils/undefinedtonull";
|
import UndefinedToNull from "../../utils/undefinedtonull";
|
||||||
import _ from "lodash";
|
import _ from "lodash";
|
||||||
@@ -58,8 +58,7 @@ import { QUERY_JOB_TASKS_PAGINATED } from "../../graphql/tasks.queries.js";
|
|||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({
|
||||||
bodyshop: selectBodyshop,
|
bodyshop: selectBodyshop,
|
||||||
jobRO: selectJobReadOnly,
|
jobRO: selectJobReadOnly
|
||||||
currentUser: selectCurrentUser
|
|
||||||
});
|
});
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
setPrintCenterContext: (context) =>
|
setPrintCenterContext: (context) =>
|
||||||
@@ -85,8 +84,6 @@ export function JobsDetailPage({
|
|||||||
jobRO,
|
jobRO,
|
||||||
job,
|
job,
|
||||||
mutationUpdateJob,
|
mutationUpdateJob,
|
||||||
handleSubmit,
|
|
||||||
currentUser,
|
|
||||||
insertAuditTrail,
|
insertAuditTrail,
|
||||||
refetch
|
refetch
|
||||||
}) {
|
}) {
|
||||||
@@ -394,8 +391,6 @@ export function JobsDetailPage({
|
|||||||
),
|
),
|
||||||
children: (
|
children: (
|
||||||
<TaskListContainer
|
<TaskListContainer
|
||||||
currentUser={currentUser}
|
|
||||||
bodyshop={bodyshop}
|
|
||||||
relationshipType={"jobid"}
|
relationshipType={"jobid"}
|
||||||
relationshipId={job.id}
|
relationshipId={job.id}
|
||||||
query={{ QUERY_JOB_TASKS_PAGINATED }}
|
query={{ QUERY_JOB_TASKS_PAGINATED }}
|
||||||
|
|||||||
@@ -7,15 +7,11 @@ import { connect } from "react-redux";
|
|||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/application.actions";
|
import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/application.actions";
|
||||||
import InstanceRenderManager from "../../utils/instanceRenderMgr.js";
|
import InstanceRenderManager from "../../utils/instanceRenderMgr.js";
|
||||||
import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors.js";
|
|
||||||
import TaskPageTypes from "./taskPageTypes.jsx";
|
import TaskPageTypes from "./taskPageTypes.jsx";
|
||||||
import { setModalContext } from "../../redux/modals/modals.actions.js";
|
import { setModalContext } from "../../redux/modals/modals.actions.js";
|
||||||
import { useLocation } from "react-router-dom";
|
import { useLocation } from "react-router-dom";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({});
|
||||||
bodyshop: selectBodyshop,
|
|
||||||
currentUser: selectCurrentUser
|
|
||||||
});
|
|
||||||
|
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
||||||
@@ -23,13 +19,7 @@ const mapDispatchToProps = (dispatch) => ({
|
|||||||
setTaskUpsertContext: (context) => dispatch(setModalContext({ context, modal: "taskUpsert" }))
|
setTaskUpsertContext: (context) => dispatch(setModalContext({ context, modal: "taskUpsert" }))
|
||||||
});
|
});
|
||||||
|
|
||||||
export function AllTasksPageContainer({
|
export function AllTasksPageContainer({ setBreadcrumbs, setSelectedHeader, setTaskUpsertContext }) {
|
||||||
bodyshop,
|
|
||||||
currentUser,
|
|
||||||
setBreadcrumbs,
|
|
||||||
setSelectedHeader,
|
|
||||||
setTaskUpsertContext
|
|
||||||
}) {
|
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const searchParams = queryString.parse(useLocation().search);
|
const searchParams = queryString.parse(useLocation().search);
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@@ -64,7 +54,7 @@ export function AllTasksPageContainer({
|
|||||||
}
|
}
|
||||||
}, [setTaskUpsertContext, searchParams]);
|
}, [setTaskUpsertContext, searchParams]);
|
||||||
|
|
||||||
return <TasksPageComponent type={TaskPageTypes.ALL_TASKS} currentUser={currentUser} bodyshop={bodyshop} />;
|
return <TasksPageComponent type={TaskPageTypes.ALL_TASKS} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default connect(mapStateToProps, mapDispatchToProps)(AllTasksPageContainer);
|
export default connect(mapStateToProps, mapDispatchToProps)(AllTasksPageContainer);
|
||||||
|
|||||||
@@ -6,20 +6,16 @@ import { connect } from "react-redux";
|
|||||||
import { createStructuredSelector } from "reselect";
|
import { createStructuredSelector } from "reselect";
|
||||||
import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/application.actions";
|
import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/application.actions";
|
||||||
import InstanceRenderManager from "../../utils/instanceRenderMgr.js";
|
import InstanceRenderManager from "../../utils/instanceRenderMgr.js";
|
||||||
import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selectors.js";
|
|
||||||
import TaskPageTypes from "./taskPageTypes.jsx";
|
import TaskPageTypes from "./taskPageTypes.jsx";
|
||||||
|
|
||||||
const mapStateToProps = createStructuredSelector({
|
const mapStateToProps = createStructuredSelector({});
|
||||||
bodyshop: selectBodyshop,
|
|
||||||
currentUser: selectCurrentUser
|
|
||||||
});
|
|
||||||
|
|
||||||
const mapDispatchToProps = (dispatch) => ({
|
const mapDispatchToProps = (dispatch) => ({
|
||||||
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
|
||||||
setSelectedHeader: (key) => dispatch(setSelectedHeader(key))
|
setSelectedHeader: (key) => dispatch(setSelectedHeader(key))
|
||||||
});
|
});
|
||||||
|
|
||||||
export function MyTasksPageContainer({ bodyshop, currentUser, setBreadcrumbs, setSelectedHeader }) {
|
export function MyTasksPageContainer({ setBreadcrumbs, setSelectedHeader }) {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
document.title = t("titles.my_tasks", {
|
document.title = t("titles.my_tasks", {
|
||||||
@@ -38,7 +34,7 @@ export function MyTasksPageContainer({ bodyshop, currentUser, setBreadcrumbs, se
|
|||||||
]);
|
]);
|
||||||
}, [t, setBreadcrumbs, setSelectedHeader]);
|
}, [t, setBreadcrumbs, setSelectedHeader]);
|
||||||
|
|
||||||
return <TasksPageComponent type={TaskPageTypes.MY_TASKS} currentUser={currentUser} bodyshop={bodyshop} />;
|
return <TasksPageComponent type={TaskPageTypes.MY_TASKS} />;
|
||||||
}
|
}
|
||||||
|
|
||||||
export default connect(mapStateToProps, mapDispatchToProps)(MyTasksPageContainer);
|
export default connect(mapStateToProps, mapDispatchToProps)(MyTasksPageContainer);
|
||||||
|
|||||||
@@ -2,8 +2,15 @@ import React from "react";
|
|||||||
import TaskListContainer from "../../components/task-list/task-list.container.jsx";
|
import TaskListContainer from "../../components/task-list/task-list.container.jsx";
|
||||||
import { QUERY_ALL_TASKS_PAGINATED, QUERY_MY_TASKS_PAGINATED } from "../../graphql/tasks.queries.js";
|
import { QUERY_ALL_TASKS_PAGINATED, QUERY_MY_TASKS_PAGINATED } from "../../graphql/tasks.queries.js";
|
||||||
import taskPageTypes from "./taskPageTypes.jsx";
|
import taskPageTypes from "./taskPageTypes.jsx";
|
||||||
|
import { createStructuredSelector } from "reselect";
|
||||||
|
import { selectCurrentUser } from "../../redux/user/user.selectors.js";
|
||||||
|
|
||||||
export default function TasksPageComponent({ bodyshop, currentUser, type }) {
|
const mapStateToProps = createStructuredSelector({
|
||||||
|
currentUser: selectCurrentUser
|
||||||
|
});
|
||||||
|
const mapDispatchToProps = (dispatch) => ({});
|
||||||
|
|
||||||
|
export default function TasksPageComponent({ currentUser, type }) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case taskPageTypes.MY_TASKS:
|
case taskPageTypes.MY_TASKS:
|
||||||
return (
|
return (
|
||||||
@@ -12,20 +19,11 @@ export default function TasksPageComponent({ bodyshop, currentUser, type }) {
|
|||||||
relationshipId={currentUser.email}
|
relationshipId={currentUser.email}
|
||||||
relationshipType={"user"}
|
relationshipType={"user"}
|
||||||
query={{ QUERY_MY_TASKS_PAGINATED }}
|
query={{ QUERY_MY_TASKS_PAGINATED }}
|
||||||
bodyshop={bodyshop}
|
|
||||||
titleTranslation={"tasks.titles.my_tasks"}
|
titleTranslation={"tasks.titles.my_tasks"}
|
||||||
currentUser={currentUser}
|
|
||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
case taskPageTypes.ALL_TASKS:
|
case taskPageTypes.ALL_TASKS:
|
||||||
return (
|
return <TaskListContainer query={{ QUERY_ALL_TASKS_PAGINATED }} titleTranslation={"tasks.titles.all_tasks"} />;
|
||||||
<TaskListContainer
|
|
||||||
query={{ QUERY_ALL_TASKS_PAGINATED }}
|
|
||||||
bodyshop={bodyshop}
|
|
||||||
titleTranslation={"tasks.titles.all_tasks"}
|
|
||||||
currentUser={currentUser}
|
|
||||||
/>
|
|
||||||
);
|
|
||||||
default:
|
default:
|
||||||
return <></>;
|
return <></>;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2205,6 +2205,7 @@
|
|||||||
"medium": "Medium",
|
"medium": "Medium",
|
||||||
"high": "High"
|
"high": "High"
|
||||||
},
|
},
|
||||||
|
"created_at": "Created At",
|
||||||
"jobline": "Job Line",
|
"jobline": "Job Line",
|
||||||
"parts_order": "Parts Order",
|
"parts_order": "Parts Order",
|
||||||
"bill": "Bill",
|
"bill": "Bill",
|
||||||
|
|||||||
@@ -2199,6 +2199,7 @@
|
|||||||
"assigned_to": ""
|
"assigned_to": ""
|
||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
|
"created_at": "" ,
|
||||||
"jobline": "",
|
"jobline": "",
|
||||||
"parts_order": "",
|
"parts_order": "",
|
||||||
"bill": "",
|
"bill": "",
|
||||||
|
|||||||
@@ -2199,6 +2199,7 @@
|
|||||||
"assigned_to": ""
|
"assigned_to": ""
|
||||||
},
|
},
|
||||||
"fields": {
|
"fields": {
|
||||||
|
"created_at": "",
|
||||||
"jobline": "",
|
"jobline": "",
|
||||||
"parts_order": "",
|
"parts_order": "",
|
||||||
"bill": "",
|
"bill": "",
|
||||||
|
|||||||
Reference in New Issue
Block a user