diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 8d596ee75..b33247202 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -4977,6 +4977,27 @@ + + selectdate + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + unknown false diff --git a/client/package.json b/client/package.json index 8a90e2dc3..147409805 100644 --- a/client/package.json +++ b/client/package.json @@ -30,6 +30,7 @@ "react-apollo": "^3.1.5", "react-barcode": "^1.4.0", "react-big-calendar": "^0.24.6", + "react-datepicker": "^2.16.0", "react-dom": "^16.13.1", "react-drag-listview": "^0.1.6", "react-ga": "^2.7.0", diff --git a/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx b/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx new file mode 100644 index 000000000..58c55e1ea --- /dev/null +++ b/client/src/components/form-date-time-picker/form-date-time-picker.component.jsx @@ -0,0 +1,33 @@ +import React from "react"; +import DatePicker from "react-datepicker"; +import "react-datepicker/dist/react-datepicker.css"; +import { useTranslation } from "react-i18next"; + +//To be used as a form element only. + +const DateTimePicker = ({ value, onChange, onBlur }) => { + const { t } = useTranslation(); + + const handleChange = (value) => { + if (onChange) { + onChange(value); + } + }; + + return ( + + ); +}; + +export default DateTimePicker; diff --git a/client/src/components/job-intake/components/job-intake-form/job-intake-form.component.jsx b/client/src/components/job-intake/components/job-intake-form/job-intake-form.component.jsx index 406c13ebf..c3afeb7e1 100644 --- a/client/src/components/job-intake/components/job-intake-form/job-intake-form.component.jsx +++ b/client/src/components/job-intake/components/job-intake-form/job-intake-form.component.jsx @@ -12,6 +12,7 @@ import { createStructuredSelector } from "reselect"; import { useHistory } from "react-router-dom"; import queryString from "query-string"; import { useLocation } from "react-router-dom"; +import DateTimePicker from '../../../form-date-time-picker/form-date-time-picker.component' const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -102,12 +103,12 @@ export function JobIntakeForm({ formItems, bodyshop }) { message: t("general.validation.required"), }, ]}> - + - + diff --git a/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx b/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx index e2c033f05..fe6355e23 100644 --- a/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx +++ b/client/src/components/jobs-detail-dates/jobs-detail-dates.component.jsx @@ -1,78 +1,61 @@ import { DatePicker, Form } from "antd"; import React from "react"; import { useTranslation } from "react-i18next"; +import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component"; export default function JobsDetailDatesComponent({ job }) { const { t } = useTranslation(); - // initialValue: job.loss_date ? moment(job.loss_date) : null - // initialValue: job.date_estimated ? moment(job.date_estimated) : null - // initialValue: job.date_open ? moment(job.date_open) : null - // initialValue: job.date_scheduled ? moment(job.date_scheduled) : null - // initialValue: job.scheduled_in ? moment(job.scheduled_in) : null - // initialValue: job.actual_in ? moment(job.actual_in) : null - // initialValue: job.scheduled_completion ? moment(job.scheduled_completion) : null - // initialValue: job.actual_completion ? moment(job.actual_completion) : null - // initialValue: job.scheduled_delivery ? moment(job.scheduled_delivery) : null - // initialValue: job.actual_delivery ? moment(job.actual_delivery) : null - // initialValue: job.date_invoiced ? moment(job.date_invoiced) : null - // initialValue: job.date_closed ? moment(job.date_closed) : null - // initialValue: job.date_exported ? moment(job.date_exported) : null - return (
- + CAA # seems not correct based on field mapping Class seems not correct based on field mapping - - + + - - + + - - + + - - + + - - + + - + name='scheduled_completion'> + - + name='actual_completion'> + - + name='scheduled_delivery'> + - + name='actual_delivery'> + - - + + - - + + - - + +
); diff --git a/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx b/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx index 51c62a7af..2e3366152 100644 --- a/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx +++ b/client/src/components/schedule-job-modal/schedule-job-modal.component.jsx @@ -3,40 +3,35 @@ import React from "react"; import { useTranslation } from "react-i18next"; import ScheduleDayViewContainer from "../schedule-day-view/schedule-day-view.container"; import ScheduleExistingAppointmentsList from "../schedule-existing-appointments-list/schedule-existing-appointments-list.component"; +import DateTimePicker from "../form-date-time-picker/form-date-time-picker.component"; export default function ScheduleJobModalComponent({ existingAppointments, appData, setAppData, formData, - setFormData + setFormData, }) { const { t } = useTranslation(); //TODO Existing appointments list only refreshes sometimes after modal close. May have to do with the container class. return ( - - + + Automatic Job Selection. - + Manual Job Selection Scheduled Time - { - setAppData({ ...appData, start: e }); - }} - /> - { - setAppData({ ...appData, start: e }); - }} - /> +
+ { + setAppData({ ...appData, start: e }); + }} + /> +
@@ -48,10 +43,9 @@ export default function ScheduleJobModalComponent({ } + onChange={(e) => setFormData({ ...formData, notifyCustomer: e.target.checked }) - } - > + }> {t("jobs.labels.appointmentconfirmation")} diff --git a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx index 415927527..86762d7fc 100644 --- a/client/src/pages/jobs-detail/jobs-detail.page.component.jsx +++ b/client/src/pages/jobs-detail/jobs-detail.page.component.jsx @@ -142,30 +142,6 @@ export function JobsDetailPage({ initialValues={{ ...job, loss_date: job.loss_date ? moment(job.loss_date) : null, - date_estimated: job.date_estimated - ? moment(job.date_estimated) - : null, - date_open: job.date_open ? moment(job.date_open) : null, - date_scheduled: job.date_scheduled - ? moment(job.date_scheduled) - : null, - scheduled_in: job.scheduled_in ? moment(job.scheduled_in) : null, - actual_in: job.actual_in ? moment(job.actual_in) : null, - scheduled_completion: job.scheduled_completion - ? moment(job.scheduled_completion) - : null, - actual_completion: job.actual_completion - ? moment(job.actual_completion) - : null, - scheduled_delivery: job.scheduled_delivery - ? moment(job.scheduled_delivery) - : null, - actual_delivery: job.actual_delivery - ? moment(job.actual_delivery) - : null, - date_invoiced: job.date_invoiced ? moment(job.date_invoiced) : null, - date_closed: job.date_closed ? moment(job.date_closed) : null, - date_exported: job.date_exported ? moment(job.date_exported) : null, }}> state.user.fingerprint); if (snapshot.data().fingerprint === fingerprint) { - yield delay(30000); + yield delay(5 * 60 * 1000); yield put(checkInstanceId(uid)); } else { console.log("ERROR: Fingerprints do not match. Conflict detected."); diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index fcb05f066..f21c316fb 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -333,6 +333,7 @@ "no": "No", "out": "Out", "search": "Search...", + "selectdate": "Select date", "unknown": "Unknown", "yes": "Yes" }, diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 0982b7d80..b20c8011d 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -333,6 +333,7 @@ "no": "", "out": "Afuera", "search": "Buscar...", + "selectdate": "", "unknown": "Desconocido", "yes": "" }, diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index b07c1c8aa..48ffb4618 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -333,6 +333,7 @@ "no": "", "out": "En dehors", "search": "Chercher...", + "selectdate": "", "unknown": "Inconnu", "yes": "" }, diff --git a/client/yarn.lock b/client/yarn.lock index a3279f8d5..631fd89e4 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -4327,6 +4327,14 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-react-context@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.3.0.tgz#546dede9dc422def0d3fc2fe03afe0bc0f4f7d8c" + integrity sha512-dNldIoSuNSvlTJ7slIKC/ZFGKexBMBrrcc+TTe1NdmROnaASuLPvqpwj9v4XS4uXZ8+YPu0sNmShX2rXI5LNsw== + dependencies: + gud "^1.0.0" + warning "^4.0.3" + cross-spawn@7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.1.tgz#0ab56286e0f7c24e153d04cc2aa027e43a9a5d14" @@ -4723,6 +4731,11 @@ date-arithmetic@^4.0.1: resolved "https://registry.yarnpkg.com/date-arithmetic/-/date-arithmetic-4.1.0.tgz#e5d6434e9deb71f79760a37b729e4a515e730ddf" integrity sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg== +date-fns@^2.0.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.14.0.tgz#359a87a265bb34ef2e38f93ecf63ac453f9bc7ba" + integrity sha512-1zD+68jhFgDIM0rF05rcwYO8cExdNqxjq4xP1QKM60Q45mnO6zaMWB4tOzrIr4M4GSLntsKeE4c9Bdl2jhL/yw== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -4766,7 +4779,7 @@ deep-diff@^0.3.5: resolved "https://registry.yarnpkg.com/deep-diff/-/deep-diff-0.3.8.tgz#c01de63efb0eec9798801d40c7e0dae25b582c84" integrity sha1-wB3mPvsO7JeYgB1Ax+Da4ltYLIQ= -deep-equal@^1.0.1: +deep-equal@^1.0.1, deep-equal@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== @@ -6339,6 +6352,11 @@ growly@^1.3.0: resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE= +gud@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" + integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== + gzip-size@5.1.1, gzip-size@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" @@ -9554,7 +9572,7 @@ pnp-webpack-plugin@1.6.4: dependencies: ts-pnp "^1.1.6" -popper.js@^1.15.0: +popper.js@^1.14.4, popper.js@^1.15.0: version "1.16.1" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== @@ -10979,6 +10997,17 @@ react-click-outside@tj/react-click-outside: version "1.1.1" resolved "https://codeload.github.com/tj/react-click-outside/tar.gz/a833ddc5be47490307f9fcc6ed09d8c353108510" +react-datepicker@^2.16.0: + version "2.16.0" + resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-2.16.0.tgz#6bd68de94f5fb38c8f6a4370f3c612837c700e4e" + integrity sha512-TvcmSY27rn0JKvuJuIXNNS+niGQNdgtuG/CsBttVYhPOA9KmSw7c2PvQBPVEvzkyV+QPNJ8jN/KVJNj9uvopqA== + dependencies: + classnames "^2.2.6" + date-fns "^2.0.1" + prop-types "^15.7.2" + react-onclickoutside "^6.9.0" + react-popper "^1.3.4" + react-dev-utils@^10.2.1: version "10.2.1" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-10.2.1.tgz#f6de325ae25fa4d546d09df4bb1befdc6dd19c19" @@ -11139,6 +11168,11 @@ react-number-format@^4.4.1: dependencies: prop-types "^15.7.2" +react-onclickoutside@^6.9.0: + version "6.9.0" + resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.9.0.tgz#a54bc317ae8cf6131a5d78acea55a11067f37a1f" + integrity sha512-8ltIY3bC7oGhj2nPAvWOGi+xGFybPNhJM0V1H8hY/whNcXgmDeaeoCMPPd8VatrpTsUWjb/vGzrmu6SrXVty3A== + react-overlays@^2.0.0-0: version "2.1.1" resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-2.1.1.tgz#ffe2090c4a10da6b8947a1c7b1a67d0457648a0d" @@ -11163,6 +11197,19 @@ react-popopo@^2.1.9: react-dom ">= 16.3" styled-components ">= 4.0" +react-popper@^1.3.4: + version "1.3.7" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-1.3.7.tgz#f6a3471362ef1f0d10a4963673789de1baca2324" + integrity sha512-nmqYTx7QVjCm3WUZLeuOomna138R1luC4EqkW3hxJUrAe+3eNz3oFCLYdnPwILfn0mX1Ew2c3wctrjlUMYYUww== + dependencies: + "@babel/runtime" "^7.1.2" + create-react-context "^0.3.0" + deep-equal "^1.1.1" + popper.js "^1.14.4" + prop-types "^15.6.1" + typed-styles "^0.0.7" + warning "^4.0.2" + react-prop-toggle@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/react-prop-toggle/-/react-prop-toggle-1.0.2.tgz#8b0b7e74653606b1427cfcf6c4eaa9198330568e" @@ -13178,6 +13225,11 @@ type@^2.0.0: resolved "https://registry.yarnpkg.com/type/-/type-2.0.0.tgz#5f16ff6ef2eb44f260494dae271033b29c09a9c3" integrity sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow== +typed-styles@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.7.tgz#93392a008794c4595119ff62dde6809dbc40a3d9" + integrity sha512-pzP0PWoZUhsECYjABgCGQlRGL1n7tOHsgwYv3oIiEpJwGhFTuty/YNeduxQYzXXa3Ge5BdT6sHYIQYpl4uJ+5Q== + typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" @@ -13471,7 +13523,7 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" -warning@^4.0.1, warning@^4.0.3, warning@~4.0.3: +warning@^4.0.1, warning@^4.0.2, warning@^4.0.3, warning@~4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==