IO-1222 Add preview to schedule view.

This commit is contained in:
Patrick Fic
2021-06-28 13:38:09 -07:00
parent f744acd131
commit 4b7bbe686a
7 changed files with 87 additions and 40 deletions

View File

@@ -301,6 +301,27 @@
</translation> </translation>
</translations> </translations>
</concept_node> </concept_node>
<concept_node>
<name>preview</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>
<concept_node> <concept_node>
<name>reschedule</name> <name>reschedule</name>
<definition_loaded>false</definition_loaded> <definition_loaded>false</definition_loaded>

View File

@@ -2,7 +2,7 @@ import { Button, Popover, Space } from "antd";
import React, { useState } from "react"; import React, { useState } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { connect } from "react-redux"; 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 { setModalContext } from "../../redux/modals/modals.actions";
import CurrencyFormatter from "../../utils/CurrencyFormatter"; import CurrencyFormatter from "../../utils/CurrencyFormatter";
import PhoneFormatter from "../../utils/PhoneFormatter"; import PhoneFormatter from "../../utils/PhoneFormatter";
@@ -11,6 +11,8 @@ import { TemplateList } from "../../utils/TemplateConstants";
import DataLabel from "../data-label/data-label.component"; import DataLabel from "../data-label/data-label.component";
import ScheduleAtChange from "./job-at-change.component"; import ScheduleAtChange from "./job-at-change.component";
import ScheduleEventColor from "./schedule-event.color.component"; import ScheduleEventColor from "./schedule-event.color.component";
import queryString from "query-string";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setScheduleContext: (context) => setScheduleContext: (context) =>
dispatch(setModalContext({ context: context, modal: "schedule" })), dispatch(setModalContext({ context: context, modal: "schedule" })),
@@ -24,6 +26,8 @@ export function ScheduleEventComponent({
}) { }) {
const { t } = useTranslation(); const { t } = useTranslation();
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const history = useHistory();
const searchParams = queryString.parse(useLocation().search);
const blockContent = ( const blockContent = (
<div> <div>
@@ -88,6 +92,20 @@ export function ScheduleEventComponent({
<Button>{t("appointments.actions.viewjob")}</Button> <Button>{t("appointments.actions.viewjob")}</Button>
</Link> </Link>
) : null} ) : null}
{event.job ? (
<Button
onClick={() => {
history.push({
search: queryString.stringify({
...searchParams,
selected: event.job.id,
}),
});
}}
>
{t("appointments.actions.preview")}
</Button>
) : null}
<Button <Button
onClick={() => { onClick={() => {
const Template = TemplateList("job").appointment_reminder; const Template = TemplateList("job").appointment_reminder;

View File

@@ -9,6 +9,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
import Event from "../job-at-change/schedule-event.container"; import Event from "../job-at-change/schedule-event.container";
import HeaderComponent from "./schedule-calendar-header.component"; import HeaderComponent from "./schedule-calendar-header.component";
import "./schedule-calendar.styles.scss"; import "./schedule-calendar.styles.scss";
import JobDetailCards from "../job-detail-cards/job-detail-cards.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
@@ -45,45 +46,48 @@ export function ScheduleCalendarWrapperComponent({
const selectedDate = new Date(date || moment(search.date) || Date.now()); const selectedDate = new Date(date || moment(search.date) || Date.now());
return ( return (
<Calendar <>
events={data} <JobDetailCards />
defaultView={search.view || defaultView || "week"} <Calendar
date={selectedDate} events={data}
onNavigate={(date, view, action) => { defaultView={search.view || defaultView || "week"}
search.date = date.toISOString().substr(0, 10); date={selectedDate}
history.push({ search: queryString.stringify(search) }); onNavigate={(date, view, action) => {
}} search.date = date.toISOString().substr(0, 10);
onRangeChange={(start, end) => { history.push({ search: queryString.stringify(search) });
if (setDateRangeCallback) setDateRangeCallback({ start, end }); }}
}} onRangeChange={(start, end) => {
onView={(view) => { if (setDateRangeCallback) setDateRangeCallback({ start, end });
search.view = view; }}
history.push({ search: queryString.stringify(search) }); onView={(view) => {
}} search.view = view;
step={15} history.push({ search: queryString.stringify(search) });
// timeslots={1} }}
showMultiDayTimes step={15}
localizer={localizer} // timeslots={1}
min={ showMultiDayTimes
bodyshop.schedule_start_time localizer={localizer}
? new Date(bodyshop.schedule_start_time) min={
: new Date("2020-01-01T06:00:00") bodyshop.schedule_start_time
} ? new Date(bodyshop.schedule_start_time)
max={ : new Date("2020-01-01T06:00:00")
bodyshop.schedule_end_time }
? new Date(bodyshop.schedule_end_time) max={
: new Date("2020-01-01T20:00:00") bodyshop.schedule_end_time
} ? new Date(bodyshop.schedule_end_time)
eventPropGetter={handleEventPropStyles} : new Date("2020-01-01T20:00:00")
components={{ }
event: (e) => eventPropGetter={handleEventPropStyles}
Event({ bodyshop: bodyshop, event: e.event, refetch: refetch }), components={{
header: (p) => ( event: (e) =>
<HeaderComponent {...p} events={data} refetch={refetch} /> Event({ bodyshop: bodyshop, event: e.event, refetch: refetch }),
), header: (p) => (
}} <HeaderComponent {...p} events={data} refetch={refetch} />
{...otherProps} ),
/> }}
{...otherProps}
/>
</>
); );
} }

View File

@@ -9,6 +9,7 @@ export default function ScheduleCalendarComponent({ data, refetch }) {
return ( return (
<Row gutter={[16, 16]}> <Row gutter={[16, 16]}>
<ScheduleModal /> <ScheduleModal />
<Col span={24}> <Col span={24}>
<PageHeader <PageHeader
extra={ extra={

View File

@@ -24,6 +24,7 @@
"cancel": "Cancel", "cancel": "Cancel",
"intake": "Intake", "intake": "Intake",
"new": "New Appointment", "new": "New Appointment",
"preview": "Preview",
"reschedule": "Reschedule", "reschedule": "Reschedule",
"sendreminder": "Send Reminder", "sendreminder": "Send Reminder",
"viewjob": "View Job" "viewjob": "View Job"

View File

@@ -24,6 +24,7 @@
"cancel": "Cancelar", "cancel": "Cancelar",
"intake": "Consumo", "intake": "Consumo",
"new": "Nueva cita", "new": "Nueva cita",
"preview": "",
"reschedule": "Reprogramar", "reschedule": "Reprogramar",
"sendreminder": "", "sendreminder": "",
"viewjob": "Ver trabajo" "viewjob": "Ver trabajo"

View File

@@ -24,6 +24,7 @@
"cancel": "annuler", "cancel": "annuler",
"intake": "Admission", "intake": "Admission",
"new": "Nouveau rendez-vous", "new": "Nouveau rendez-vous",
"preview": "",
"reschedule": "Replanifier", "reschedule": "Replanifier",
"sendreminder": "", "sendreminder": "",
"viewjob": "Voir le travail" "viewjob": "Voir le travail"