Baseline adding a job to the schedule.

This commit is contained in:
Patrick Fic
2020-02-05 15:08:47 -08:00
parent 0714eb21a5
commit 1a14fb8da6
12 changed files with 149 additions and 6 deletions

View File

@@ -834,6 +834,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>schedule</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children> </children>
</folder_node> </folder_node>
<folder_node> <folder_node>

View File

@@ -18,9 +18,11 @@ export default function JobsDetailHeader({
job, job,
mutationConvertJob, mutationConvertJob,
refetch, refetch,
handleSubmit handleSubmit,
scheduleModalState
}) { }) {
const { t } = useTranslation(); const { t } = useTranslation();
const [scheduleModalVisible, setscheduleModalVisible] = scheduleModalState;
const tombstoneTitle = ( const tombstoneTitle = (
<div> <div>
@@ -58,6 +60,15 @@ export default function JobsDetailHeader({
); );
const menuExtra = [ const menuExtra = [
<Button
key="schedule"
//TODO: Enabled logic based on status.
onClick={() => {
setscheduleModalVisible(true);
}}
>
{t("jobs.actions.schedule")}
</Button>,
<Button <Button
key="convert" key="convert"
type="dashed" type="dashed"

View File

@@ -0,0 +1,35 @@
import React from "react";
import { Modal, Tabs, DatePicker, TimePicker } from "antd";
import moment from "moment";
export default function ScheduleJobModalComponent({
appData,
setAppData,
...props
}) {
return (
<Modal {...props} maskClosable={false}>
<Tabs defaultActiveKey="1">
<Tabs.TabPane tab="SMART Scheduling" key="auto">
Automatic Job Selection.
</Tabs.TabPane>
<Tabs.TabPane tab="Manual Scheduling" key="manual">
Manual Job Selection Scheduled Time
<DatePicker
value={appData.start}
onChange={e => {
setAppData({ ...appData, start: e });
}}
/>
<TimePicker
value={appData.start}
format={"HH:mm"}
minuteStep={15}
onChange={e => {
setAppData({ ...appData, start: e });
}}
/>
</Tabs.TabPane>
</Tabs>
</Modal>
);
}

View File

@@ -0,0 +1,34 @@
import React, { useState } from "react";
import ScheduleJobModalComponent from "./schedule-job-modal.component";
import { useMutation } from "react-apollo";
import { INSERT_APPOINTMENT } from "../../graphql/appointments.queries";
import moment from "moment";
export default function ScheduleJobModalContainer({
scheduleModalState,
jobId
}) {
const [scheduleModalVisible, setscheduleModalVisible] = scheduleModalState;
const [appData, setAppData] = useState({ jobid: jobId, start: null });
const [insertAppointment] = useMutation(INSERT_APPOINTMENT);
return (
<ScheduleJobModalComponent
appData={appData}
setAppData={setAppData}
//Spreadable Modal Props
visible={scheduleModalVisible}
onCancel={() => setscheduleModalVisible(false)}
onOk={() => {
//TODO: Customize the amount of minutes it will add.
insertAppointment({
variables: {
app: { ...appData, end: moment(appData.start).add(60, "minutes") }
}
}).then(r => {
setscheduleModalVisible(false);
});
}}
/>
);
}

View File

@@ -25,3 +25,13 @@ export const QUERY_ALL_APPOINTMENTS = gql`
} }
} }
`; `;
export const INSERT_APPOINTMENT = gql`
mutation INSERT_APPOINTMENT($app: [appointments_insert_input!]!) {
insert_appointments(objects: $app) {
returning {
id
}
}
}
`;

View File

@@ -16,13 +16,15 @@ import JobsDocumentsContainer from "../../components/jobs-documents/jobs-documen
import JobNotesContainer from "../../components/jobs-notes/jobs-notes.container"; import JobNotesContainer from "../../components/jobs-notes/jobs-notes.container";
import JobDetailFormContext from "./jobs-detail.page.context"; import JobDetailFormContext from "./jobs-detail.page.context";
import JobsDetailDatesComponent from "../../components/jobs-detail-dates/jobs-detail-dates.component"; import JobsDetailDatesComponent from "../../components/jobs-detail-dates/jobs-detail-dates.component";
import ScheduleJobModalContainer from "../../components/schedule-job-modal/schedule-job-modal.container";
export default function JobsDetailPage({ export default function JobsDetailPage({
job, job,
mutationUpdateJob, mutationUpdateJob,
mutationConvertJob, mutationConvertJob,
handleSubmit, handleSubmit,
refetch refetch,
scheduleModalState
}) { }) {
const { t } = useTranslation(); const { t } = useTranslation();
@@ -41,12 +43,18 @@ export default function JobsDetailPage({
return ( return (
<div> <div>
<ScheduleJobModalContainer
scheduleModalState={scheduleModalState}
jobId={job.id}
/>
<Form onSubmit={handleSubmit} {...formItemLayout} autoComplete={"off"}> <Form onSubmit={handleSubmit} {...formItemLayout} autoComplete={"off"}>
<JobsDetailHeader <JobsDetailHeader
job={job} job={job}
mutationConvertJob={mutationConvertJob} mutationConvertJob={mutationConvertJob}
refetch={refetch} refetch={refetch}
handleSubmit={handleSubmit} handleSubmit={handleSubmit}
scheduleModalState={scheduleModalState}
/> />
{isFieldsTouched() ? ( {isFieldsTouched() ? (

View File

@@ -1,5 +1,5 @@
import { Form, notification } from "antd"; import { Form, notification } from "antd";
import React, { useEffect } from "react"; import React, { useEffect, useState } from "react";
import { useMutation, useQuery } from "react-apollo"; import { useMutation, useQuery } from "react-apollo";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import AlertComponent from "../../components/alert/alert.component"; import AlertComponent from "../../components/alert/alert.component";
@@ -16,6 +16,8 @@ function JobsDetailPageContainer({ match, form }) {
const { jobId } = match.params; const { jobId } = match.params;
const { t } = useTranslation(); const { t } = useTranslation();
const scheduleModalState = useState(false);
const { loading, error, data, refetch } = useQuery(GET_JOB_BY_PK, { const { loading, error, data, refetch } = useQuery(GET_JOB_BY_PK, {
variables: { id: jobId }, variables: { id: jobId },
fetchPolicy: "network-only" fetchPolicy: "network-only"
@@ -71,6 +73,7 @@ function JobsDetailPageContainer({ match, form }) {
handleSubmit={handleSubmit} handleSubmit={handleSubmit}
getFieldDecorator={form.getFieldDecorator} getFieldDecorator={form.getFieldDecorator}
refetch={refetch} refetch={refetch}
scheduleModalState={scheduleModalState}
/> />
</JobDetailFormContext.Provider> </JobDetailFormContext.Provider>
) : ( ) : (

View File

@@ -66,7 +66,8 @@
"addNote": "Add Note", "addNote": "Add Note",
"convert": "Convert", "convert": "Convert",
"postInvoices": "Post Invoices", "postInvoices": "Post Invoices",
"printCenter": "Print Center" "printCenter": "Print Center",
"schedule": "Schedule"
}, },
"errors": { "errors": {
"creating": "Error encountered while creating job. {{error}}", "creating": "Error encountered while creating job. {{error}}",

View File

@@ -66,7 +66,8 @@
"addNote": "Añadir la nota", "addNote": "Añadir la nota",
"convert": "Convertir", "convert": "Convertir",
"postInvoices": "Contabilizar facturas", "postInvoices": "Contabilizar facturas",
"printCenter": "Centro de impresión" "printCenter": "Centro de impresión",
"schedule": "Programar"
}, },
"errors": { "errors": {
"creating": "", "creating": "",

View File

@@ -66,7 +66,8 @@
"addNote": "Ajouter une note", "addNote": "Ajouter une note",
"convert": "Convertir", "convert": "Convertir",
"postInvoices": "Poster des factures", "postInvoices": "Poster des factures",
"printCenter": "Centre d'impression" "printCenter": "Centre d'impression",
"schedule": "Programme"
}, },
"errors": { "errors": {
"creating": "", "creating": "",

View File

@@ -0,0 +1,6 @@
- args:
role: anonymous
table:
name: users
schema: public
type: drop_select_permission

View File

@@ -0,0 +1,12 @@
- args:
permission:
allow_aggregations: false
columns:
- authid
filter: {}
limit: null
role: anonymous
table:
name: users
schema: public
type: create_select_permission