diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index fbcd25a81..922f4c878 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -301,6 +301,27 @@ + + preview + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + reschedule false diff --git a/client/src/components/job-at-change/schedule-event.component.jsx b/client/src/components/job-at-change/schedule-event.component.jsx index 41bdb24d6..6e1b0b11d 100644 --- a/client/src/components/job-at-change/schedule-event.component.jsx +++ b/client/src/components/job-at-change/schedule-event.component.jsx @@ -2,7 +2,7 @@ import { Button, Popover, Space } from "antd"; import React, { useState } from "react"; import { useTranslation } from "react-i18next"; import { connect } from "react-redux"; -import { Link } from "react-router-dom"; +import { Link, useHistory, useLocation } from "react-router-dom"; import { setModalContext } from "../../redux/modals/modals.actions"; import CurrencyFormatter from "../../utils/CurrencyFormatter"; import PhoneFormatter from "../../utils/PhoneFormatter"; @@ -11,6 +11,8 @@ import { TemplateList } from "../../utils/TemplateConstants"; import DataLabel from "../data-label/data-label.component"; import ScheduleAtChange from "./job-at-change.component"; import ScheduleEventColor from "./schedule-event.color.component"; +import queryString from "query-string"; + const mapDispatchToProps = (dispatch) => ({ setScheduleContext: (context) => dispatch(setModalContext({ context: context, modal: "schedule" })), @@ -24,6 +26,8 @@ export function ScheduleEventComponent({ }) { const { t } = useTranslation(); const [visible, setVisible] = useState(false); + const history = useHistory(); + const searchParams = queryString.parse(useLocation().search); const blockContent = ( @@ -88,6 +92,20 @@ export function ScheduleEventComponent({ {t("appointments.actions.viewjob")} ) : null} + {event.job ? ( + { + history.push({ + search: queryString.stringify({ + ...searchParams, + selected: event.job.id, + }), + }); + }} + > + {t("appointments.actions.preview")} + + ) : null} { const Template = TemplateList("job").appointment_reminder; diff --git a/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx b/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx index 6e0d6c83d..1f38fa348 100644 --- a/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx +++ b/client/src/components/schedule-calendar-wrapper/scheduler-calendar-wrapper.component.jsx @@ -9,6 +9,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors"; import Event from "../job-at-change/schedule-event.container"; import HeaderComponent from "./schedule-calendar-header.component"; import "./schedule-calendar.styles.scss"; +import JobDetailCards from "../job-detail-cards/job-detail-cards.component"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, @@ -45,45 +46,48 @@ export function ScheduleCalendarWrapperComponent({ const selectedDate = new Date(date || moment(search.date) || Date.now()); return ( - { - search.date = date.toISOString().substr(0, 10); - history.push({ search: queryString.stringify(search) }); - }} - onRangeChange={(start, end) => { - if (setDateRangeCallback) setDateRangeCallback({ start, end }); - }} - onView={(view) => { - search.view = view; - history.push({ search: queryString.stringify(search) }); - }} - step={15} - // timeslots={1} - showMultiDayTimes - localizer={localizer} - min={ - bodyshop.schedule_start_time - ? new Date(bodyshop.schedule_start_time) - : new Date("2020-01-01T06:00:00") - } - max={ - bodyshop.schedule_end_time - ? new Date(bodyshop.schedule_end_time) - : new Date("2020-01-01T20:00:00") - } - eventPropGetter={handleEventPropStyles} - components={{ - event: (e) => - Event({ bodyshop: bodyshop, event: e.event, refetch: refetch }), - header: (p) => ( - - ), - }} - {...otherProps} - /> + <> + + { + search.date = date.toISOString().substr(0, 10); + history.push({ search: queryString.stringify(search) }); + }} + onRangeChange={(start, end) => { + if (setDateRangeCallback) setDateRangeCallback({ start, end }); + }} + onView={(view) => { + search.view = view; + history.push({ search: queryString.stringify(search) }); + }} + step={15} + // timeslots={1} + showMultiDayTimes + localizer={localizer} + min={ + bodyshop.schedule_start_time + ? new Date(bodyshop.schedule_start_time) + : new Date("2020-01-01T06:00:00") + } + max={ + bodyshop.schedule_end_time + ? new Date(bodyshop.schedule_end_time) + : new Date("2020-01-01T20:00:00") + } + eventPropGetter={handleEventPropStyles} + components={{ + event: (e) => + Event({ bodyshop: bodyshop, event: e.event, refetch: refetch }), + header: (p) => ( + + ), + }} + {...otherProps} + /> + > ); } diff --git a/client/src/components/schedule-calendar/schedule-calendar.component.jsx b/client/src/components/schedule-calendar/schedule-calendar.component.jsx index 05c58437b..fd03af182 100644 --- a/client/src/components/schedule-calendar/schedule-calendar.component.jsx +++ b/client/src/components/schedule-calendar/schedule-calendar.component.jsx @@ -9,6 +9,7 @@ export default function ScheduleCalendarComponent({ data, refetch }) { return ( +