Merged in feature/IO-3067-implement-learn-more-link-for-rome-upsells (pull request #2034)

Feature/IO-3067 implement learn more link for rome upsells
This commit is contained in:
Patrick Fic
2025-01-01 23:09:58 +00:00
38 changed files with 350 additions and 244 deletions

View File

@@ -18,7 +18,7 @@ import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
import LockerWrapperComponent from "../lock-wrapper/lock-wrapper.component"; import LockerWrapperComponent from "../lock-wrapper/lock-wrapper.component";
import PrintWrapperComponent from "../print-wrapper/print-wrapper.component"; import PrintWrapperComponent from "../print-wrapper/print-wrapper.component";
import UpsellComponent from "../upsell/upsell.component"; import UpsellComponent from "../upsell/upsell.component";
import { upsellEnum } from "../upsell/upsell.component"; import { UpsellEnum } from "../upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
jobRO: selectJobReadOnly, jobRO: selectJobReadOnly,
@@ -240,7 +240,7 @@ export function BillsListTableComponent({
onChange={handleTableChange} onChange={handleTableChange}
locale={{ locale={{
...(!hasBillsAccess && { ...(!hasBillsAccess && {
emptyText: <UpsellComponent upsell={upsellEnum().bills.general} /> emptyText: <UpsellComponent upsell={UpsellEnum().bills.general} />
}) })
}} }}
/> />

View File

@@ -10,7 +10,7 @@ import { selectBodyshop, selectCurrentUser } from "../../redux/user/user.selecto
import { DateTimeFormatter } from "../../utils/DateFormatter"; import { DateTimeFormatter } from "../../utils/DateFormatter";
import BlurWrapperComponent from "../feature-wrapper/blur-wrapper.component"; import BlurWrapperComponent from "../feature-wrapper/blur-wrapper.component";
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
currentUser: selectCurrentUser, currentUser: selectCurrentUser,
@@ -147,7 +147,7 @@ export function JobAuditTrail({ bodyshop, currentUser, jobId }) {
{!hasAuditAccess && ( {!hasAuditAccess && (
<Col span={24}> <Col span={24}>
<Card> <Card>
<UpsellComponent upsell={upsellEnum().audit.general} disableMask /> <UpsellComponent upsell={UpsellEnum().audit.general} disableMask />
</Card> </Card>
</Col> </Col>
)} )}

View File

@@ -7,7 +7,7 @@ import AlertComponent from "../alert/alert.component";
import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component"; import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component";
import "./job-bills-total.styles.scss"; import "./job-bills-total.styles.scss";
import BlurWrapperComponent from "../feature-wrapper/blur-wrapper.component"; import BlurWrapperComponent from "../feature-wrapper/blur-wrapper.component";
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../upsell/upsell.component";
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
@@ -336,7 +336,7 @@ export function JobBillsTotalComponent({
{!hasBillsAccess && ( {!hasBillsAccess && (
<Col span={6}> <Col span={6}>
<Card style={{ height: "100%" }}> <Card style={{ height: "100%" }}>
<UpsellComponent upsell={upsellEnum().bills.autoreconcile} disableMask /> <UpsellComponent upsell={UpsellEnum().bills.autoreconcile} disableMask />
</Card> </Card>
</Col> </Col>
)} )}

View File

@@ -3,7 +3,7 @@ import React from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { GenerateThumbUrl } from "../jobs-documents-gallery/job-documents.utility"; import { GenerateThumbUrl } from "../jobs-documents-gallery/job-documents.utility";
import CardTemplate from "./job-detail-cards.template.component"; import CardTemplate from "./job-detail-cards.template.component";
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../upsell/upsell.component";
export default function JobDetailCardsDocumentsComponent({ loading, data }) { export default function JobDetailCardsDocumentsComponent({ loading, data }) {
const { t } = useTranslation(); const { t } = useTranslation();
@@ -21,7 +21,7 @@ export default function JobDetailCardsDocumentsComponent({ loading, data }) {
title={t("jobs.labels.cards.documents")} title={t("jobs.labels.cards.documents")}
extraLink={`/manage/jobs/${data.id}?tab=documents`} extraLink={`/manage/jobs/${data.id}?tab=documents`}
> >
<UpsellComponent disableMask upsell={upsellEnum().media.general}> <UpsellComponent disableMask upsell={UpsellEnum().media.general}>
{data.documents.length > 0 ? ( {data.documents.length > 0 ? (
<Carousel autoplay> <Carousel autoplay>
{data.documents.map((item) => ( {data.documents.map((item) => (

View File

@@ -9,7 +9,7 @@ import { useTranslation } from "react-i18next";
import "./job-lifecycle.styles.scss"; import "./job-lifecycle.styles.scss";
import BlurWrapperComponent from "../feature-wrapper/blur-wrapper.component"; import BlurWrapperComponent from "../feature-wrapper/blur-wrapper.component";
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../upsell/upsell.component";
// show text on bar if text can fit // show text on bar if text can fit
export function JobLifecycleComponent({ job, statuses, ...rest }) { export function JobLifecycleComponent({ job, statuses, ...rest }) {
@@ -144,7 +144,7 @@ export function JobLifecycleComponent({ job, statuses, ...rest }) {
style={{ width: "100%" }} style={{ width: "100%" }}
> >
<Card type="inner" style={{ marginTop: "10px" }}> <Card type="inner" style={{ marginTop: "10px" }}>
<UpsellComponent upsell={upsellEnum().lifecycle.general} /> <UpsellComponent upsell={UpsellEnum().lifecycle.general} />
</Card> </Card>
<BlurWrapperComponent featureName="lifecycle" bypass> <BlurWrapperComponent featureName="lifecycle" bypass>
<div <div

View File

@@ -18,7 +18,7 @@ import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop bodyshop: selectBodyshop
}); });
@@ -133,7 +133,7 @@ function JobsDocumentsComponent({
{!hasMediaAccess && ( {!hasMediaAccess && (
<Col span={24}> <Col span={24}>
<Card> <Card>
<UpsellComponent disableMask upsell={upsellEnum().media.general} /> <UpsellComponent disableMask upsell={UpsellEnum().media.general} />
</Card> </Card>
</Col> </Col>
)} )}
@@ -152,7 +152,7 @@ function JobsDocumentsComponent({
{hasMediaAccess && !hasMobileAccess && ( {hasMediaAccess && !hasMobileAccess && (
<Col span={24}> <Col span={24}>
<Card> <Card>
<UpsellComponent upsell={upsellEnum().media.mobile} /> <UpsellComponent upsell={UpsellEnum().media.mobile} />
</Card> </Card>
</Col> </Col>
)} )}

View File

@@ -18,7 +18,7 @@ import JobsDocumentsLocalGallerySelectAllComponent from "./jobs-documents-local-
import Lightbox from "react-image-lightbox"; import Lightbox from "react-image-lightbox";
import "react-image-lightbox/style.css"; import "react-image-lightbox/style.css";
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
@@ -117,7 +117,7 @@ export function JobsDocumentsLocalGallery({
{!hasMediaAccess && ( {!hasMediaAccess && (
<Col span={24}> <Col span={24}>
<Card> <Card>
<UpsellComponent disableMask upsell={upsellEnum().media.general} /> <UpsellComponent disableMask upsell={UpsellEnum().media.general} />
</Card> </Card>
</Col> </Col>
)} )}

View File

@@ -13,7 +13,7 @@ import LaborAllocationsAdjustmentEdit from "../labor-allocations-adjustment-edit
import "./labor-allocations-table.styles.scss"; import "./labor-allocations-table.styles.scss";
import { CalculateAllocationsTotals } from "./labor-allocations-table.utility"; import { CalculateAllocationsTotals } from "./labor-allocations-table.utility";
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
technician: selectTechnician technician: selectTechnician
@@ -206,7 +206,7 @@ export function LaborAllocationsTable({
...(!hasTimeTicketAccess && { ...(!hasTimeTicketAccess && {
emptyText: ( emptyText: (
<Card> <Card>
<UpsellComponent upsell={upsellEnum().timetickets.allocations} /> <UpsellComponent upsell={UpsellEnum().timetickets.allocations} />
</Card> </Card>
) )
}) })
@@ -249,7 +249,7 @@ export function LaborAllocationsTable({
...(!hasTimeTicketAccess && { ...(!hasTimeTicketAccess && {
emptyText: ( emptyText: (
<Card> <Card>
<UpsellComponent upsell={upsellEnum().timetickets.allocations} /> <UpsellComponent upsell={UpsellEnum().timetickets.allocations} />
</Card> </Card>
) )
}) })

View File

@@ -11,7 +11,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
import CurrencyFormatter from "../../utils/CurrencyFormatter"; import CurrencyFormatter from "../../utils/CurrencyFormatter";
import "./labor-allocations-table.styles.scss"; import "./labor-allocations-table.styles.scss";
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../upsell/upsell.component";
import LockWrapperComponent from "../lock-wrapper/lock-wrapper.component"; import LockWrapperComponent from "../lock-wrapper/lock-wrapper.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -269,7 +269,7 @@ export function PayrollLaborAllocationsTable({
...(!hasTimeTicketAccess && { ...(!hasTimeTicketAccess && {
emptyText: ( emptyText: (
<Card> <Card>
<UpsellComponent upsell={upsellEnum().timetickets.allocations} /> <UpsellComponent upsell={UpsellEnum().timetickets.allocations} />
</Card> </Card>
) )
}) })

View File

@@ -7,7 +7,7 @@ import { Legend, PolarAngleAxis, PolarGrid, PolarRadiusAxis, Radar, RadarChart,
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import BlurWrapperComponent from "../feature-wrapper/blur-wrapper.component"; import BlurWrapperComponent from "../feature-wrapper/blur-wrapper.component";
import { UpsellMaskWrapper, upsellEnum } from "../upsell/upsell.component"; import { UpsellMaskWrapper, UpsellEnum } from "../upsell/upsell.component";
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -75,7 +75,7 @@ export function ScheduleCalendarHeaderGraph({ bodyshop, loadData }) {
{hasSmartSchedulingAccess ? ( {hasSmartSchedulingAccess ? (
chartContents chartContents
) : ( ) : (
<UpsellMaskWrapper upsell={upsellEnum().smartscheduling.general}>{chartContents}</UpsellMaskWrapper> <UpsellMaskWrapper upsell={UpsellEnum().smartscheduling.general}>{chartContents}</UpsellMaskWrapper>
)} )}
</BlurWrapperComponent> </BlurWrapperComponent>
</div> </div>

View File

@@ -17,7 +17,7 @@ import LoadingSkeleton from "../loading-skeleton/loading-skeleton.component";
import OwnerNameDisplay from "../owner-name-display/owner-name-display.component"; import OwnerNameDisplay from "../owner-name-display/owner-name-display.component";
import ScheduleBlockDay from "../schedule-block-day/schedule-block-day.component"; import ScheduleBlockDay from "../schedule-block-day/schedule-block-day.component";
import ScheduleCalendarHeaderGraph from "./schedule-calendar-header-graph.component"; import ScheduleCalendarHeaderGraph from "./schedule-calendar-header-graph.component";
import UpsellComponent, { upsellEnum, UpsellMaskWrapper } from "../upsell/upsell.component"; import UpsellComponent, { UpsellEnum, UpsellMaskWrapper } from "../upsell/upsell.component";
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -93,7 +93,7 @@ export function ScheduleCalendarHeaderComponent({
</table> </table>
{!hasSmartSchedulingAccess && ( {!hasSmartSchedulingAccess && (
<Card style={{ maxWidth: "30rem" }}> <Card style={{ maxWidth: "30rem" }}>
<UpsellComponent size="small" upsell={upsellEnum().smartscheduling.hrsdelta} /> <UpsellComponent size="small" upsell={UpsellEnum().smartscheduling.hrsdelta} />
</Card> </Card>
)} )}
</div> </div>
@@ -135,7 +135,7 @@ export function ScheduleCalendarHeaderComponent({
)} )}
{!hasSmartSchedulingAccess && ( {!hasSmartSchedulingAccess && (
<Card style={{ maxWidth: "30rem" }}> <Card style={{ maxWidth: "30rem" }}>
<UpsellComponent size="small" upsell={upsellEnum().smartscheduling.hrsdelta} /> <UpsellComponent size="small" upsell={UpsellEnum().smartscheduling.hrsdelta} />
</Card> </Card>
)} )}
</tbody> </tbody>

View File

@@ -17,7 +17,7 @@ import ScheduleExistingAppointmentsList from "../schedule-existing-appointments-
import "./schedule-job-modal.scss"; import "./schedule-job-modal.scss";
import LockWrapperComponent from "../lock-wrapper/lock-wrapper.component"; import LockWrapperComponent from "../lock-wrapper/lock-wrapper.component";
import BlurWrapper from "../feature-wrapper/blur-wrapper.component"; import BlurWrapper from "../feature-wrapper/blur-wrapper.component";
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop bodyshop: selectBodyshop
@@ -139,7 +139,7 @@ export function ScheduleJobModalComponent({
</Button> </Button>
))} ))}
{!smartOptions.length > 1 && hasSmartSchedulingAccess && ( {!smartOptions.length > 1 && hasSmartSchedulingAccess && (
<UpsellComponent upsell={upsellEnum().smartscheduling.general} /> <UpsellComponent upsell={UpsellEnum().smartscheduling.general} />
)} )}
</Space> </Space>
</> </>

View File

@@ -16,7 +16,7 @@ import { HasRbacAccess } from "../rbac-wrapper/rbac-wrapper.component";
import TimeTicketEnterButton from "../time-ticket-enter-button/time-ticket-enter-button.component"; import TimeTicketEnterButton from "../time-ticket-enter-button/time-ticket-enter-button.component";
import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component"; import { HasFeatureAccess } from "../feature-wrapper/feature-wrapper.component";
import LockWrapperComponent from "../lock-wrapper/lock-wrapper.component"; import LockWrapperComponent from "../lock-wrapper/lock-wrapper.component";
import UpsellComponent, { upsellEnum } from "../upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
@@ -364,7 +364,7 @@ export function TimeTicketList({
...(!hasTimeTicketsAccess && { ...(!hasTimeTicketsAccess && {
emptyText: ( emptyText: (
<Card> <Card>
<UpsellComponent upsell={upsellEnum().timetickets.general} /> <UpsellComponent upsell={UpsellEnum().timetickets.general} />
</Card> </Card>
) )
}) })

View File

@@ -14,10 +14,14 @@ import i18n from "i18next";
import React, { useEffect, useRef } from "react"; import React, { useEffect, useRef } from "react";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import "./upsell.styles.scss"; import "./upsell.styles.scss";
import InstanceRenderManager from "../../utils/instanceRenderMgr.js";
import { store } from "../../redux/store.js";
import { Link } from "react-router-dom";
import { useSelector } from "react-redux";
export default function UpsellComponent({ featureName, subFeatureName, upsell, disableMask }) { export default function UpsellComponent({ featureName, subFeatureName, upsell, disableMask }) {
const { t } = useTranslation(); const { t } = useTranslation();
const resultProps = upsell || upsellEnum[featureName][subFeatureName]; const resultProps = upsell || UpsellEnum[featureName][subFeatureName];
const componentRef = useRef(null); const componentRef = useRef(null);
@@ -52,7 +56,7 @@ export default function UpsellComponent({ featureName, subFeatureName, upsell, d
} }
//Kept in the same function as the result props line must mirror and doesnt warrant a separate function. //Kept in the same function as the result props line must mirror and doesnt warrant a separate function.
export function UpsellMaskWrapper({ children, upsell, featureName, subFeatureName }) { export function UpsellMaskWrapper({ children, upsell, featureName, subFeatureName }) {
const resultProps = upsell || upsellEnum[featureName][subFeatureName]; const resultProps = upsell || UpsellEnum[featureName][subFeatureName];
return ( return (
<div className="mask-wrapper"> <div className="mask-wrapper">
<div className="mask-content">{children}</div> <div className="mask-content">{children}</div>
@@ -65,173 +69,275 @@ export function UpsellMaskWrapper({ children, upsell, featureName, subFeatureNam
); );
} }
//This is kept in this function as pulling it out into it's own util/enum prevents passing JSX as an `extra` prop //This is kept in this function as pulling it out into it's own util/enum prevents passing JSX as an `extra` prop
export const upsellEnum = () => ({ export const UpsellEnum = () => {
bills: { //Had to use the selector hook as accessing store with store.getState() was causing issues when hot reloading.
autoreconcile: { const currentUser = useSelector((state) => state.user.currentUser);
//icon: null, const bodyshop = useSelector((state) => state.user.bodyshop);
title: i18n.t("upsell.messages.bills.autoreconcile.title"),
subTitle: i18n.t("upsell.messages.bills.autoreconcile.subtitle"), const [first_name, ...last_name] = currentUser?.displayName ? currentUser.displayName.split(" ") : [];
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button> const LearnMoreLink = encodeURI(
//status: null InstanceRenderManager({
imex: `https://imexsystems.ca/schedule-a-demo/`,
rome: `https://forms.zohopublic.com/rometech/form/ROLearnMore/formperma/0G29z8LgLlvKK8nno-b7s-GHgNXwIFlrMeE0mC394L4?first_name=${first_name || ""}&last_name=${last_name.join(" ") || ""}&shop_name=${bodyshop?.shopname || ""}&email=${currentUser?.email || ""}&shop_phone=${bodyshop?.phone || ""}`
})
);
return {
bills: {
autoreconcile: {
//icon: null,
title: i18n.t("upsell.messages.bills.autoreconcile.title"),
subTitle: i18n.t("upsell.messages.bills.autoreconcile.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
//status: null
},
general: {
//icon: null,
title: i18n.t("upsell.messages.bills.general.title"),
subTitle: i18n.t("upsell.messages.bills.general.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
//status: null
}
}, },
general: { checklist: {
//icon: null, general: {
title: i18n.t("upsell.messages.bills.general.title"), //icon: null,
subTitle: i18n.t("upsell.messages.bills.general.subtitle"), title: i18n.t("upsell.messages.checklist.general.title"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button> subTitle: i18n.t("upsell.messages.checklist.general.subtitle"),
//status: null extra: (
} <Link to={LearnMoreLink} target="_blank">
}, <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
checklist: { </Link>
general: { )
//icon: null, //status: null
title: i18n.t("upsell.messages.checklist.general.title"), }
subTitle: i18n.t("upsell.messages.checklist.general.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
//status: null
}
},
payments: {
general: {
//icon: null,
title: i18n.t("upsell.messages.payments.general.title"),
subTitle: i18n.t("upsell.messages.payments.general.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
//status: null
}
},
audit: {
general: {
//icon: null,
title: i18n.t("upsell.messages.audit.general.title"),
subTitle: i18n.t("upsell.messages.audit.general.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
//status: null
}
},
lifecycle: {
general: {
//icon: null,
title: i18n.t("upsell.messages.lifecycle.general.title"),
subTitle: i18n.t("upsell.messages.lifecycle.general.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
//status: null }
}
},
media: {
general: {
//icon: null,
title: i18n.t("upsell.messages.media.general.title"),
subTitle: i18n.t("upsell.messages.media.general.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
//status: null }
},
mobile: {
icon: <MobileOutlined />,
title: i18n.t("upsell.messages.media.mobile.title"),
subTitle: i18n.t("upsell.messages.media.mobile.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
//status: null }
}
},
timetickets: {
allocations: {
title: i18n.t("upsell.messages.timetickets.allocations.title"),
subTitle: i18n.t("upsell.messages.timetickets.allocations.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
},
general: {
title: i18n.t("upsell.messages.timetickets.general.title"),
subTitle: i18n.t("upsell.messages.timetickets.general.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
}
},
smartscheduling: {
general: {
icon: <CalendarOutlined />,
title: i18n.t("upsell.messages.smartscheduling.general.title"),
subTitle: i18n.t("upsell.messages.smartscheduling.general.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
},
hrsdelta: {
icon: <CarOutlined />,
title: i18n.t("upsell.messages.smartscheduling.hrsdelta.title"),
subTitle: i18n.t("upsell.messages.smartscheduling.hrsdelta.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
},
datepicker: {
icon: <CarOutlined />,
title: i18n.t("upsell.messages.smartscheduling.datepicker.title"),
subTitle: i18n.t("upsell.messages.smartscheduling.datepicker.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
}
},
accounting: {
payables: {
icon: <DollarOutlined />,
title: i18n.t("upsell.messages.accounting.payables.title"),
subTitle: i18n.t("upsell.messages.accounting.payables.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
},
receivables: {
icon: <DollarOutlined />,
title: i18n.t("upsell.messages.accounting.receivables.title"),
subTitle: i18n.t("upsell.messages.accounting.receivables.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
}, },
payments: { payments: {
icon: <DollarOutlined />, general: {
title: i18n.t("upsell.messages.accounting.payments.title"), //icon: null,
subTitle: i18n.t("upsell.messages.accounting.payments.subtitle"), title: i18n.t("upsell.messages.payments.general.title"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button> subTitle: i18n.t("upsell.messages.payments.general.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
//status: null
}
},
audit: {
general: {
//icon: null,
title: i18n.t("upsell.messages.audit.general.title"),
subTitle: i18n.t("upsell.messages.audit.general.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
//status: null
}
},
lifecycle: {
general: {
//icon: null,
title: i18n.t("upsell.messages.lifecycle.general.title"),
subTitle: i18n.t("upsell.messages.lifecycle.general.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
//status: null }
}
},
media: {
general: {
//icon: null,
title: i18n.t("upsell.messages.media.general.title"),
subTitle: i18n.t("upsell.messages.media.general.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
//status: null }
},
mobile: {
icon: <MobileOutlined />,
title: i18n.t("upsell.messages.media.mobile.title"),
subTitle: i18n.t("upsell.messages.media.mobile.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
//status: null }
}
},
timetickets: {
allocations: {
title: i18n.t("upsell.messages.timetickets.allocations.title"),
subTitle: i18n.t("upsell.messages.timetickets.allocations.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
},
general: {
title: i18n.t("upsell.messages.timetickets.general.title"),
subTitle: i18n.t("upsell.messages.timetickets.general.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
}
},
smartscheduling: {
general: {
icon: <CalendarOutlined />,
title: i18n.t("upsell.messages.smartscheduling.general.title"),
subTitle: i18n.t("upsell.messages.smartscheduling.general.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
},
hrsdelta: {
icon: <CarOutlined />,
title: i18n.t("upsell.messages.smartscheduling.hrsdelta.title"),
subTitle: i18n.t("upsell.messages.smartscheduling.hrsdelta.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
},
datepicker: {
icon: <CarOutlined />,
title: i18n.t("upsell.messages.smartscheduling.datepicker.title"),
subTitle: i18n.t("upsell.messages.smartscheduling.datepicker.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
}
},
accounting: {
payables: {
icon: <DollarOutlined />,
title: i18n.t("upsell.messages.accounting.payables.title"),
subTitle: i18n.t("upsell.messages.accounting.payables.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
},
receivables: {
icon: <DollarOutlined />,
title: i18n.t("upsell.messages.accounting.receivables.title"),
subTitle: i18n.t("upsell.messages.accounting.receivables.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
},
payments: {
icon: <DollarOutlined />,
title: i18n.t("upsell.messages.accounting.payments.title"),
subTitle: i18n.t("upsell.messages.accounting.payments.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
}
},
courtesycars: {
general: {
icon: <CarOutlined />,
title: i18n.t("upsell.messages.courtesycars.general.title"),
subTitle: i18n.t("upsell.messages.courtesycars.general.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
}
},
dashboard: {
general: {
icon: <DashboardOutlined />,
title: i18n.t("upsell.messages.dashboard.general.title"),
subTitle: i18n.t("upsell.messages.dashboard.general.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
}
},
visualboard: {
general: {
icon: <BuildOutlined />,
title: i18n.t("upsell.messages.visualboard.general.title"),
subTitle: i18n.t("upsell.messages.visualboard.general.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
}
},
scoreboard: {
general: {
icon: <LineChartOutlined />,
title: i18n.t("upsell.messages.scoreboard.general.title"),
subTitle: i18n.t("upsell.messages.scoreboard.general.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
}
},
techconsole: {
general: {
icon: <LineChartOutlined />,
title: i18n.t("upsell.messages.techconsole.general.title"),
subTitle: i18n.t("upsell.messages.techconsole.general.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
}
},
csi: {
general: {
icon: <StarOutlined />,
title: i18n.t("upsell.messages.csi.general.title"),
subTitle: i18n.t("upsell.messages.csi.general.subtitle"),
extra: (
<Link to={LearnMoreLink} target="_blank">
<Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
</Link>
)
}
} }
}, };
courtesycars: { };
general: {
icon: <CarOutlined />,
title: i18n.t("upsell.messages.courtesycars.general.title"),
subTitle: i18n.t("upsell.messages.courtesycars.general.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
}
},
dashboard: {
general: {
icon: <DashboardOutlined />,
title: i18n.t("upsell.messages.dashboard.general.title"),
subTitle: i18n.t("upsell.messages.dashboard.general.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
}
},
visualboard: {
general: {
icon: <BuildOutlined />,
title: i18n.t("upsell.messages.visualboard.general.title"),
subTitle: i18n.t("upsell.messages.visualboard.general.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
}
},
scoreboard: {
general: {
icon: <LineChartOutlined />,
title: i18n.t("upsell.messages.scoreboard.general.title"),
subTitle: i18n.t("upsell.messages.scoreboard.general.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
}
},
techconsole: {
general: {
icon: <LineChartOutlined />,
title: i18n.t("upsell.messages.techconsole.general.title"),
subTitle: i18n.t("upsell.messages.techconsole.general.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
}
},
csi: {
general: {
icon: <StarOutlined />,
title: i18n.t("upsell.messages.csi.general.title"),
subTitle: i18n.t("upsell.messages.csi.general.subtitle"),
extra: <Button type="primary">{i18n.t("upsell.cta.learnmore")}</Button>
}
}
});

View File

@@ -13,7 +13,7 @@ import { selectPartnerVersion } from "../../redux/application/application.select
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
import { Card } from "antd"; import { Card } from "antd";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -63,7 +63,7 @@ export function AccountingPayablesContainer({ bodyshop, setBreadcrumbs, setSelec
featureName="export" featureName="export"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().accounting.payables} /> <UpsellComponent upsell={UpsellEnum().accounting.payables} />
</Card> </Card>
} }
> >

View File

@@ -13,7 +13,7 @@ import { checkPartnerStatus } from "../../components/partner-ping/partner-ping.c
import { selectPartnerVersion } from "../../redux/application/application.selectors"; import { selectPartnerVersion } from "../../redux/application/application.selectors";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
import { Card } from "antd"; import { Card } from "antd";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -61,7 +61,7 @@ export function AccountingPaymentsContainer({ bodyshop, setBreadcrumbs, setSelec
featureName="export" featureName="export"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().accounting.payments} /> <UpsellComponent upsell={UpsellEnum().accounting.payments} />
</Card> </Card>
} }
> >

View File

@@ -14,7 +14,7 @@ import { selectPartnerVersion } from "../../redux/application/application.select
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import { Card } from "antd"; import { Card } from "antd";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop, bodyshop: selectBodyshop,
@@ -66,7 +66,7 @@ export function AccountingReceivablesContainer({ bodyshop, setBreadcrumbs, setSe
featureName="export" featureName="export"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().accounting.receivables} /> <UpsellComponent upsell={UpsellEnum().accounting.receivables} />
</Card> </Card>
} }
> >

View File

@@ -14,7 +14,7 @@ import { pageLimit } from "../../utils/config";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import { Card } from "antd"; import { Card } from "antd";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -59,7 +59,7 @@ export function BillsPageContainer({ setBreadcrumbs, setSelectedHeader }) {
featureName="bills" featureName="bills"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().bills.general} /> <UpsellComponent upsell={UpsellEnum().bills.general} />
</Card> </Card>
} }
> >

View File

@@ -13,7 +13,7 @@ import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/appli
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import ContractCreatePageComponent from "./contract-create.page.component"; import ContractCreatePageComponent from "./contract-create.page.component";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop bodyshop: selectBodyshop
@@ -125,7 +125,7 @@ export function ContractCreatePageContainer({ bodyshop, setBreadcrumbs, setSelec
featureName="courtesycars" featureName="courtesycars"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().courtesycars.general} /> <UpsellComponent upsell={UpsellEnum().courtesycars.general} />
</Card> </Card>
} }
> >

View File

@@ -16,7 +16,7 @@ import ContractDetailPageComponent from "./contract-detail.page.component";
import NotFound from "../../components/not-found/not-found.component"; import NotFound from "../../components/not-found/not-found.component";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -113,7 +113,7 @@ export function ContractDetailPageContainer({ setBreadcrumbs, addRecentItem, set
featureName="courtesycars" featureName="courtesycars"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().courtesycars.general} /> <UpsellComponent upsell={UpsellEnum().courtesycars.general} />
</Card> </Card>
} }
> >

View File

@@ -13,7 +13,7 @@ import { pageLimit } from "../../utils/config";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import { Card } from "antd"; import { Card } from "antd";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -62,7 +62,7 @@ export function ContractsPageContainer({ setBreadcrumbs, setSelectedHeader }) {
featureName="courtesycars" featureName="courtesycars"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().courtesycars.general} /> <UpsellComponent upsell={UpsellEnum().courtesycars.general} />
</Card> </Card>
} }
> >

View File

@@ -12,7 +12,7 @@ import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/appli
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop bodyshop: selectBodyshop
@@ -73,7 +73,7 @@ export function CourtesyCarCreateContainer({ bodyshop, setBreadcrumbs, setSelect
featureName="courtesycars" featureName="courtesycars"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().courtesycars.general} /> <UpsellComponent upsell={UpsellEnum().courtesycars.general} />
</Card> </Card>
} }
> >

View File

@@ -10,7 +10,7 @@ import CourtesyCarsPageComponent from "./courtesy-cars.page.component";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import { Card } from "antd"; import { Card } from "antd";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -40,7 +40,7 @@ export function CourtesyCarsPageContainer({ setBreadcrumbs, setSelectedHeader })
featureName="courtesycars" featureName="courtesycars"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().courtesycars.general} /> <UpsellComponent upsell={UpsellEnum().courtesycars.general} />
</Card> </Card>
} }
> >

View File

@@ -7,7 +7,7 @@ import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/appli
import FeatureWrapper from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapper from "../../components/feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import { Card } from "antd"; import { Card } from "antd";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -38,7 +38,7 @@ export function ExportsLogPageContainer({ setBreadcrumbs, setSelectedHeader }) {
featureName="dashboard" featureName="dashboard"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().dashboard.general} /> <UpsellComponent upsell={UpsellEnum().dashboard.general} />
</Card> </Card>
} }
> >

View File

@@ -7,7 +7,7 @@ import ExportLogsPage from "./export-logs.page.component";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import { Card } from "antd"; import { Card } from "antd";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapDispatchToProps = (dispatch) => ({ const mapDispatchToProps = (dispatch) => ({
setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)), setBreadcrumbs: (breadcrumbs) => dispatch(setBreadcrumbs(breadcrumbs)),
@@ -38,7 +38,7 @@ export function ExportsLogPageContainer({ setBreadcrumbs, setSelectedHeader }) {
featureName="export" featureName="export"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().accounting.receivables} /> <UpsellComponent upsell={UpsellEnum().accounting.receivables} />
</Card> </Card>
} }
> >

View File

@@ -15,7 +15,7 @@ import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/appli
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser //currentUser: selectCurrentUser
@@ -79,7 +79,7 @@ export function JobsChecklistViewContainer({ bodyshop, setBreadcrumbs, setSelect
featureName="checklist" featureName="checklist"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().checklist.general} /> <UpsellComponent upsell={UpsellEnum().checklist.general} />
</Card> </Card>
} }
> >

View File

@@ -14,7 +14,7 @@ import JobchecklistComponent from "../../components/job-checklist/job-checklist.
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import { Card } from "antd"; import { Card } from "antd";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser //currentUser: selectCurrentUser
@@ -66,7 +66,7 @@ export function JobsDeliverContainer({ bodyshop, setBreadcrumbs, setSelectedHead
featureName="checklist" featureName="checklist"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().checklist.general} /> <UpsellComponent upsell={UpsellEnum().checklist.general} />
</Card> </Card>
} }
> >

View File

@@ -14,7 +14,7 @@ import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import { Card, Result } from "antd"; import { Card, Result } from "antd";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
//currentUser: selectCurrentUser //currentUser: selectCurrentUser
@@ -69,7 +69,7 @@ export function JobsIntakeContainer({ bodyshop, setBreadcrumbs, setSelectedHeade
featureName="checklist" featureName="checklist"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().checklist.general} /> <UpsellComponent upsell={UpsellEnum().checklist.general} />
</Card> </Card>
} }
> >

View File

@@ -14,7 +14,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
import { pageLimit } from "../../utils/config"; import { pageLimit } from "../../utils/config";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
import { Card } from "antd"; import { Card } from "antd";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
@@ -64,7 +64,7 @@ export function AllJobs({ bodyshop, setBreadcrumbs, setSelectedHeader }) {
featureName="payments" featureName="payments"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().payments.general} /> <UpsellComponent upsell={UpsellEnum().payments.general} />
</Card> </Card>
} }
z z

View File

@@ -5,7 +5,7 @@ import { connect } from "react-redux";
import { createStructuredSelector } from "reselect"; import { createStructuredSelector } from "reselect";
import FeatureWrapper from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapper from "../../components/feature-wrapper/feature-wrapper.component";
import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component"; import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/application.actions"; import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
@@ -44,7 +44,7 @@ export function ProductionBoardContainer({ setBreadcrumbs, bodyshop, setSelected
featureName="visualboard" featureName="visualboard"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().visualboard.general} /> <UpsellComponent upsell={UpsellEnum().visualboard.general} />
</Card> </Card>
} }
> >

View File

@@ -15,7 +15,7 @@ import ScoreboardTimeTickets from "../../components/scoreboard-timetickets/score
import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/application.actions"; import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/application.actions";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
/** /**
* Mapping state to props * Mapping state to props
@@ -71,7 +71,7 @@ export function ScoreboardContainer({ setBreadcrumbs, setSelectedHeader }) {
featureName="scoreboard" featureName="scoreboard"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().scoreboard.general} /> <UpsellComponent upsell={UpsellEnum().scoreboard.general} />
</Card> </Card>
} }
> >

View File

@@ -3,7 +3,7 @@ import RbacWrapper from "../../components/rbac-wrapper/rbac-wrapper.component";
import TimeTicketShift from "../../components/time-ticket-shift/time-ticket-shift.container"; import TimeTicketShift from "../../components/time-ticket-shift/time-ticket-shift.container";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import { Card } from "antd"; import { Card } from "antd";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
export default function ShiftClock() { export default function ShiftClock() {
return ( return (
@@ -11,7 +11,7 @@ export default function ShiftClock() {
featureName="timetickets" featureName="timetickets"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().dashboard.general} /> <UpsellComponent upsell={UpsellEnum().dashboard.general} />
</Card> </Card>
} }
> >

View File

@@ -13,7 +13,7 @@ import { setBreadcrumbs, setSelectedHeader } from "../../redux/application/appli
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop bodyshop: selectBodyshop
@@ -56,7 +56,7 @@ export function ShopCsiContainer({ bodyshop, setBreadcrumbs, setSelectedHeader }
featureName="csi" featureName="csi"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().csi.general} /> <UpsellComponent upsell={UpsellEnum().csi.general} />
</Card> </Card>
} }
> >

View File

@@ -14,7 +14,7 @@ import UpdateAlert from "../../components/update-alert/update-alert.component";
import { selectTechnician } from "../../redux/tech/tech.selectors"; import { selectTechnician } from "../../redux/tech/tech.selectors";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import "./tech.page.styles.scss"; import "./tech.page.styles.scss";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component.jsx"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component.jsx";
const TimeTicketModalContainer = lazy(() => import("../../components/time-ticket-modal/time-ticket-modal.container")); const TimeTicketModalContainer = lazy(() => import("../../components/time-ticket-modal/time-ticket-modal.container"));
const EmailOverlayContainer = lazy(() => import("../../components/email-overlay/email-overlay.container.jsx")); const EmailOverlayContainer = lazy(() => import("../../components/email-overlay/email-overlay.container.jsx"));
@@ -87,7 +87,7 @@ export function TechPage({ technician }) {
featureName="techconsole" featureName="techconsole"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().techconsole.general} /> <UpsellComponent upsell={UpsellEnum().techconsole.general} />
</Card> </Card>
} }
> >

View File

@@ -9,7 +9,7 @@ import TemporaryDocsComponent from "./temporary-docs.component";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import { Card } from "antd"; import { Card } from "antd";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop bodyshop: selectBodyshop
@@ -44,7 +44,7 @@ export function TempDocumentsContainer({ setBreadcrumbs, setSelectedHeader }) {
featureName="media" featureName="media"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().media.general} /> <UpsellComponent upsell={UpsellEnum().media.general} />
</Card> </Card>
} }
> >

View File

@@ -20,7 +20,7 @@ import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wr
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import { useSplitTreatments } from "@splitsoftware/splitio-react"; import { useSplitTreatments } from "@splitsoftware/splitio-react";
import { selectBodyshop } from "../../redux/user/user.selectors"; import { selectBodyshop } from "../../redux/user/user.selectors";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop bodyshop: selectBodyshop
@@ -78,7 +78,7 @@ export function TimeTicketsContainer({ bodyshop, setBreadcrumbs, setSelectedHead
featureName="timetickets" featureName="timetickets"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().timetickets.general} /> <UpsellComponent upsell={UpsellEnum().timetickets.general} />
</Card> </Card>
} }
> >

View File

@@ -9,7 +9,7 @@ import { selectBodyshop } from "../../redux/user/user.selectors";
import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component"; import FeatureWrapperComponent from "../../components/feature-wrapper/feature-wrapper.component";
import InstanceRenderManager from "../../utils/instanceRenderMgr"; import InstanceRenderManager from "../../utils/instanceRenderMgr";
import { Card } from "antd"; import { Card } from "antd";
import UpsellComponent, { upsellEnum } from "../../components/upsell/upsell.component"; import UpsellComponent, { UpsellEnum } from "../../components/upsell/upsell.component";
const mapStateToProps = createStructuredSelector({ const mapStateToProps = createStructuredSelector({
bodyshop: selectBodyshop bodyshop: selectBodyshop
@@ -44,7 +44,7 @@ export function TtApprovalsPage({ setBreadcrumbs, setSelectedHeader }) {
featureName="timetickets" featureName="timetickets"
noauth={ noauth={
<Card> <Card>
<UpsellComponent upsell={upsellEnum().timetickets.general} /> <UpsellComponent upsell={UpsellEnum().timetickets.general} />
</Card> </Card>
} }
> >

View File

@@ -389,7 +389,7 @@ exports.postback = async (req, res) => {
if (decodedComment) { if (decodedComment) {
//Shifted the order to have this first to retain backwards compatibility for the old style of short link. //Shifted the order to have this first to retain backwards compatibility for the old style of short link.
//This has been triggered by IO and may have multiple jobs. //This has been triggered by IO and may have multiple jobs.
const parsedComment = JSON.parse(decodedComment); const parsedComment = decodedComment;
logger.log("intellipay-postback-parsed-comment", "DEBUG", req.user?.email, null, { logger.log("intellipay-postback-parsed-comment", "DEBUG", req.user?.email, null, {
parsedComment, parsedComment,