diff --git a/bodyshop_translations.babel b/bodyshop_translations.babel index 122e04306..f63a4e31b 100644 --- a/bodyshop_translations.babel +++ b/bodyshop_translations.babel @@ -24132,6 +24132,304 @@ landing + + bigfeature + + + subtitle + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + title + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + + + footer + + + company + + + about + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + contact + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + disclaimers + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + name + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + privacypolicy + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + + + io + + + help + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + name + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + status + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + + + slogan + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + + + hero + + + button + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + title + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + labels @@ -24200,6 +24498,241 @@ + + pricing + + + basic + + + name + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + sub + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + + + essentials + + + name + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + sub + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + + + pricingtitle + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + pro + + + name + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + sub + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + + + title + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + unlimited + + + name + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + sub + false + + + + + + en-US + false + + + es-MX + false + + + fr-CA + false + + + + + + + diff --git a/client/src/App/App.container.jsx b/client/src/App/App.container.jsx index 0e73f8a07..e960e2143 100644 --- a/client/src/App/App.container.jsx +++ b/client/src/App/App.container.jsx @@ -6,7 +6,6 @@ import moment from "moment"; import React from "react"; import { useTranslation } from "react-i18next"; import GlobalLoadingBar from "../components/global-loading-bar/global-loading-bar.component"; -import JiraSupportComponent from "../components/jira-support-widget/jira-support-widget.component"; import client from "../utils/GraphQLClient"; import App from "./App"; moment.locale("en-US"); @@ -16,21 +15,6 @@ if (process.env.NODE_ENV === "production") LogRocket.init("gvfvfw/bodyshopapp"); export default function AppContainer() { const { t } = useTranslation(); - // useEffect(() => { - // // Include the Crisp code here, without the tags - // window.$crisp = []; - // window.CRISP_WEBSITE_ID = "36724f62-2eb0-4b29-9cdd-9905fb99913e"; - // var d = document; - // var s = d.createElement("script"); - // s.src = "https://client.crisp.chat/l.js"; - // s.async = 1; - // d.getElementsByTagName("head")[0].appendChild(s); - - // return () => { - // d.getElementsByTagName("head")[0].removeChild(s); - // }; - // }, []); - return ( - ); diff --git a/client/src/App/App.jsx b/client/src/App/App.jsx index fbaedfd0a..cab3be913 100644 --- a/client/src/App/App.jsx +++ b/client/src/App/App.jsx @@ -8,7 +8,7 @@ import DocumentEditorContainer from "../components/document-editor/document-edit import ErrorBoundary from "../components/error-boundary/error-boundary.component"; //Component Imports import LoadingSpinner from "../components/loading-spinner/loading-spinner.component"; -import AboutPage from "../pages/about/about.page"; +import DisclaimerPage from "../pages/disclaimer/disclaimer.page"; import TechPageContainer from "../pages/tech/tech.page.container"; import { setOnline } from "../redux/application/application.actions"; import { selectOnline } from "../redux/application/application.selectors"; @@ -17,7 +17,7 @@ import { selectCurrentUser } from "../redux/user/user.selectors"; import PrivateRoute from "../utils/private-route"; import "./App.styles.scss"; -const LandingPage = lazy(() => import("../pages/landing/landing.page")); +import LandingPage from "../pages/landing/landing.page"; const ResetPassword = lazy(() => import("../pages/reset-password/reset-password.component") ); @@ -100,7 +100,7 @@ export function App({ checkUserSession, currentUser, online, setOnline }) { - + \ No newline at end of file diff --git a/client/src/components/jira-support-widget/jira-support-widget.component.jsx b/client/src/components/jira-support-widget/jira-support-widget.component.jsx deleted file mode 100644 index e919a5f17..000000000 --- a/client/src/components/jira-support-widget/jira-support-widget.component.jsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from "react"; - -export default function JiraSupportComponent() { - //useScript(); - - return
; -} - -// const useScript = () => { -// useEffect(() => { -// const script = document.createElement("script"); -// script.src = "https://jsd-widget.atlassian.com/assets/embed.js"; -// script.setAttribute("data-jsd-embedded", true); -// script.setAttribute("data-key", "d69bb65c-1dd3-483f-b109-66a970d03f44"); -// script.setAttribute("data-base-url", "https://jsd-widget.atlassian.com"); -// //script.async = true; -// script.onload = () => { -// var DOMContentLoaded_event = document.createEvent("Event"); -// DOMContentLoaded_event.initEvent("DOMContentLoaded", true, true); -// window.document.dispatchEvent(DOMContentLoaded_event); -// }; -// document.head.appendChild(script); - -// return () => { -// document.head.removeChild(script); -// }; -// }, []); -// }; diff --git a/client/src/index.js b/client/src/index.js index a4050a370..3aea24aab 100644 --- a/client/src/index.js +++ b/client/src/index.js @@ -1,10 +1,7 @@ -import { AlertOutlined } from "@ant-design/icons"; import * as Sentry from "@sentry/react"; -import { Button, notification, Space } from "antd"; //import "antd/dist/antd.css"; import "antd/dist/antd.less"; import Dinero from "dinero.js"; -import i18n from "i18next"; import React from "react"; import ReactDOM from "react-dom"; import { Provider } from "react-redux"; @@ -15,7 +12,6 @@ import LoadingSpinner from "./components/loading-spinner/loading-spinner.compone import "./index.css"; import { persistor, store } from "./redux/store"; import reportWebVitals from "./reportWebVitals"; -import * as serviceWorkerRegistration from "./serviceWorkerRegistration"; import "./translations/i18n"; import "./utils/CleanAxios"; require("dotenv").config(); @@ -52,44 +48,44 @@ ReactDOM.render( document.getElementById("root") ); -const onServiceWorkerUpdate = (registration) => { - console.log("onServiceWorkerUpdate", registration); +// const onServiceWorkerUpdate = (registration) => { +// console.log("onServiceWorkerUpdate", registration); - const btn = ( - - - - - ); - notification.open({ - icon: , - message: i18n.t("general.messages.newversiontitle"), - description: i18n.t("general.messages.newversionmessage"), - duration: 0, - btn, - key: "updateavailable", - }); -}; +// const btn = ( +// +// +// +// +// ); +// notification.open({ +// icon: , +// message: i18n.t("general.messages.newversiontitle"), +// description: i18n.t("general.messages.newversionmessage"), +// duration: 0, +// btn, +// key: "updateavailable", +// }); +// }; -serviceWorkerRegistration.register({ onUpdate: onServiceWorkerUpdate }); +// serviceWorkerRegistration.register({ onUpdate: onServiceWorkerUpdate }); reportWebVitals(); diff --git a/client/src/landing/home/Banner0.jsx b/client/src/landing/Banner0.jsx similarity index 100% rename from client/src/landing/home/Banner0.jsx rename to client/src/landing/Banner0.jsx diff --git a/client/src/landing/home/Content0.jsx b/client/src/landing/Content0.jsx similarity index 100% rename from client/src/landing/home/Content0.jsx rename to client/src/landing/Content0.jsx diff --git a/client/src/landing/home/Content1.jsx b/client/src/landing/Content1.jsx similarity index 100% rename from client/src/landing/home/Content1.jsx rename to client/src/landing/Content1.jsx diff --git a/client/src/landing/home/Content12.jsx b/client/src/landing/Content12.jsx similarity index 100% rename from client/src/landing/home/Content12.jsx rename to client/src/landing/Content12.jsx diff --git a/client/src/landing/home/Content3.jsx b/client/src/landing/Content3.jsx similarity index 100% rename from client/src/landing/home/Content3.jsx rename to client/src/landing/Content3.jsx diff --git a/client/src/landing/home/Content4.jsx b/client/src/landing/Content4.jsx similarity index 100% rename from client/src/landing/home/Content4.jsx rename to client/src/landing/Content4.jsx diff --git a/client/src/landing/home/Footer1.jsx b/client/src/landing/Footer1.jsx similarity index 100% rename from client/src/landing/home/Footer1.jsx rename to client/src/landing/Footer1.jsx diff --git a/client/src/landing/Nav0.jsx b/client/src/landing/Nav0.jsx new file mode 100644 index 000000000..fdad914ed --- /dev/null +++ b/client/src/landing/Nav0.jsx @@ -0,0 +1,135 @@ +import React from 'react'; +import TweenOne from 'rc-tween-one'; +import { Menu } from 'antd'; +import { getChildrenToRender } from './utils'; + +const { Item, SubMenu } = Menu; + +class Header extends React.Component { + constructor(props) { + super(props); + this.state = { + phoneOpen: undefined, + }; + } + + phoneClick = () => { + const phoneOpen = !this.state.phoneOpen; + this.setState({ + phoneOpen, + }); + }; + + render() { + const { dataSource, isMobile, ...props } = this.props; + const { phoneOpen } = this.state; + const navData = dataSource.Menu.children; + const navChildren = navData.map((item) => { + const { children: a, subItem, ...itemProps } = item; + if (subItem) { + return ( + + {a.children.map(getChildrenToRender)} + + } + popupClassName="header0-item-child" + > + {subItem.map(($item, ii) => { + const { children: childItem } = $item; + const child = childItem.href ? ( + + {childItem.children.map(getChildrenToRender)} + + ) : ( +
+ {childItem.children.map(getChildrenToRender)} +
+ ); + return ( + + {child} + + ); + })} +
+ ); + } + return ( + + + {a.children.map(getChildrenToRender)} + + + ); + }); + const moment = phoneOpen === undefined ? 300 : null; + return ( + +
+ + img + + {isMobile && ( +
{ + this.phoneClick(); + }} + > + + + +
+ )} + { + if (this.state.phoneOpen) { + e.target.style.height = 'auto'; + } + }, + ease: 'easeInOutQuad', + } + : null + } + moment={moment} + reverse={!!phoneOpen} + > + + {navChildren} + + +
+
+ ); + } +} + +export default Header; diff --git a/client/src/landing/home/Pricing1.jsx b/client/src/landing/Pricing1.jsx similarity index 100% rename from client/src/landing/home/Pricing1.jsx rename to client/src/landing/Pricing1.jsx diff --git a/client/src/landing/home/Pricing2.jsx b/client/src/landing/Pricing2.jsx similarity index 100% rename from client/src/landing/home/Pricing2.jsx rename to client/src/landing/Pricing2.jsx diff --git a/client/src/landing/home/data.source.js b/client/src/landing/data.source.js similarity index 75% rename from client/src/landing/home/data.source.js rename to client/src/landing/data.source.js index 4033ddc07..ba003460f 100644 --- a/client/src/landing/home/data.source.js +++ b/client/src/landing/data.source.js @@ -1,80 +1,87 @@ import React from "react"; +import i18n from "../translations/i18n"; +import ImexOnlineLogoLight from "../assets/ImEX Online Logo.png"; +import ImexOnlineLogoDark from "../assets/ImEX Online Logo - Dark.png"; +import ImexOnlineBannerLogo from "../assets/banner-logo.png"; +import TechnologySvg from "../assets/icons/technology.svg"; export const Nav00DataSource = { wrapper: { className: "header0 home-page-wrapper" }, page: { className: "home-page" }, logo: { className: "header0-logo", - children: "https://os.alipayobjects.com/rmsportal/mlcYmsRilwraoAe.svg", + children: ImexOnlineLogoLight, }, Menu: { className: "header0-menu", children: [ - { - name: "item0", - className: "header0-item", - children: { - href: "#", - children: [{ children: "导航一", name: "text" }], - }, - subItem: [ - { - name: "sub0", - className: "item-sub", - children: { - className: "item-sub-item", - children: [ - { - name: "image0", - className: "item-image", - children: - "https://gw.alipayobjects.com/zos/rmsportal/ruHbkzzMKShUpDYMEmHM.svg", - }, - { - name: "title", - className: "item-title", - children: "Ant Design", - }, - { - name: "content", - className: "item-content", - children: "企业级 UI 设计体系", - }, - ], - }, - }, - { - name: "sub1", - className: "item-sub", - children: { - className: "item-sub-item", - children: [ - { - name: "image0", - className: "item-image", - children: - "https://gw.alipayobjects.com/zos/rmsportal/ruHbkzzMKShUpDYMEmHM.svg", - }, - { - name: "title", - className: "item-title", - children: "Ant Design", - }, - { - name: "content", - className: "item-content", - children: "企业级 UI 设计体系", - }, - ], - }, - }, - ], - }, + // { + // name: "item0", + // className: "header0-item", + // children: { + // href: "#", + // children: [{ children: "导航一", name: "text" }], + // }, + // subItem: [ + // { + // name: "sub0", + // className: "item-sub", + // children: { + // className: "item-sub-item", + // children: [ + // { + // name: "image0", + // className: "item-image", + // children: + // "https://gw.alipayobjects.com/zos/rmsportal/ruHbkzzMKShUpDYMEmHM.svg", + // }, + // { + // name: "title", + // className: "item-title", + // children: "Ant Design", + // }, + // { + // name: "content", + // className: "item-content", + // children: "企业级 UI 设计体系", + // }, + // ], + // }, + // }, + // { + // name: "sub1", + // className: "item-sub", + // children: { + // className: "item-sub-item", + // children: [ + // { + // name: "image0", + // className: "item-image", + // children: + // "https://gw.alipayobjects.com/zos/rmsportal/ruHbkzzMKShUpDYMEmHM.svg", + // }, + // { + // name: "title", + // className: "item-title", + // children: "Ant Design", + // }, + // { + // name: "content", + // className: "item-content", + // children: "企业级 UI 设计体系", + // }, + // ], + // }, + // }, + // ], + // }, { name: "item1", className: "header0-item", children: { href: "#", - children: [{ children: "导航二", name: "text" }], + children: [ + { children: i18n.t("landing.labels.features"), name: "text" }, + ], }, }, { @@ -82,34 +89,42 @@ export const Nav00DataSource = { className: "header0-item", children: { href: "#", - children: [{ children: "导航三", name: "text" }], + children: [ + { children: i18n.t("landing.labels.pricing"), name: "text" }, + ], }, }, { name: "item3", className: "header0-item", children: { - href: "#", - children: [{ children: "导航四", name: "text" }], + href: "/manage", + children: [ + { children: i18n.t("landing.labels.managemyshop"), name: "text" }, + ], }, }, ], }, mobileMenu: { className: "header0-mobile-menu" }, }; - export const Banner00DataSource = { wrapper: { className: "banner0" }, textWrapper: { className: "banner0-text-wrapper" }, title: { className: "banner0-title", - children: "https://zos.alipayobjects.com/rmsportal/HqnZZjBjWRbjyMr.png", + children: ( + + ), }, content: { className: "banner0-content", - children: "一个高效的页面动画解决方案", + children: i18n.t("landing.hero.title"), + }, + button: { + className: "banner0-button", + children: i18n.t("landing.hero.button"), }, - button: { className: "banner0-button", children: "Learn More" }, }; export const Content40DataSource = { wrapper: { className: "home-page-wrapper content4-wrapper" }, @@ -144,7 +159,7 @@ export const Content00DataSource = { OverPack: { playScale: 0.3, className: "" }, titleWrapper: { className: "title-wrapper", - children: [{ name: "title", children: "产品与服务" }], + children: [{ name: "title", children: "Feature Highlights" }], }, childWrapper: { className: "content0-block-wrapper", @@ -166,9 +181,9 @@ export const Content00DataSource = { { name: "title", className: "content0-block-title", - children: "一站式业务接入", + children: "Feature Highlight 1", }, - { name: "content", children: "支付、结算、核算接入产品效率翻四倍" }, + { name: "content", children: "Feature description for this item." }, ], }, }, @@ -189,11 +204,11 @@ export const Content00DataSource = { { name: "title", className: "content0-block-title", - children: "一站式事中风险监控", + children: "Feature Highlight 2", }, { name: "content", - children: "在所有需求配置环节事前风险控制和质量控制能力", + children: "Feature description for #2", }, ], }, @@ -215,11 +230,11 @@ export const Content00DataSource = { { name: "title", className: "content0-block-title", - children: "一站式数据运营", + children: "Feature Highlight 3", }, { name: "content", - children: "沉淀产品接入效率和运营小二工作效率数据", + children: "Feature description for 3.", }, ], }, @@ -232,14 +247,16 @@ export const Content10DataSource = { OverPack: { className: "home-page content1", playScale: 0.3 }, imgWrapper: { className: "content1-img", md: 10, xs: 24 }, img: { - children: "https://zos.alipayobjects.com/rmsportal/nLzbeGQLPyBJoli.png", + children: TechnologySvg, }, textWrapper: { className: "content1-text", md: 14, xs: 24 }, - title: { className: "content1-title", children: "企业资源管理" }, + title: { + className: "content1-title", + children: i18n.t("landing.bigfeature.title"), + }, content: { className: "content1-content", - children: - "云资源集中编排、弹性伸缩、持续发布和部署,高可用及容灾。云资源集中编排、弹性伸缩、持续发布和部署,高可用及容灾。云资源集中编排、弹性伸缩、持续发布和部署,高可用及容灾。", + children: i18n.t("landing.bigfeature.subtitle"), }, }; export const Pricing20DataSource = { @@ -249,7 +266,11 @@ export const Pricing20DataSource = { titleWrapper: { className: "pricing2-title-wrapper", children: [ - { name: "title", children: "价目表", className: "pricing2-title-h1" }, + { + name: "title", + children: i18n.t("landing.pricing.pricingtitle"), + className: "pricing2-title-h1", + }, ], }, Table: { @@ -270,23 +291,23 @@ export const Pricing20DataSource = { }, }, { - dataIndex: "free", - key: "free", - name: "free", + dataIndex: "essentials", + key: "essentials", + name: "essentials", childWrapper: { className: "pricing2-table-name-block", children: [ { name: "name", className: "pricing2-table-name", - children: "Free", + children: i18n.t("landing.pricing.essentials.name"), }, { name: "content", className: "pricing2-table-money", - children: "¥0", + children: i18n.t("landing.pricing.essentials.sub"), }, - { name: "button", children: { href: "#", children: "免费试用" } }, + // { name: "button", children: { href: "#", children: "免费试用" } }, ], }, }, @@ -300,14 +321,14 @@ export const Pricing20DataSource = { { name: "name", className: "pricing2-table-name", - children: "Basic", + children: i18n.t("landing.pricing.basic.name"), }, { name: "content", className: "pricing2-table-money", - children: "¥550", + children: i18n.t("landing.pricing.basic.sub"), }, - { name: "button", children: { href: "#", children: "立即购买" } }, + //{ name: "button", children: { href: "#", children: "立即购买" } }, ], }, }, @@ -321,17 +342,17 @@ export const Pricing20DataSource = { { name: "name", className: "pricing2-table-name", - children: "Pro", + children: i18n.t("landing.pricing.pro.name"), }, { name: "content", className: "pricing2-table-money", - children: "¥2,200", - }, - { - name: "button", - children: { href: "#", type: "primary", children: "立即购买" }, + children: i18n.t("landing.pricing.pro.sub"), }, + // { + // name: "button", + // children: { href: "#", type: "primary", children: "立即购买" }, + // }, ], }, }, @@ -345,14 +366,14 @@ export const Pricing20DataSource = { { name: "name", className: "pricing2-table-name", - children: "Unlimited", + children: i18n.t("landing.pricing.unlimited.name"), }, { name: "content", className: "pricing2-table-money", - children: "¥5,600", + children: i18n.t("landing.pricing.unlimited.sub"), }, - { name: "button", children: { href: "#", children: "立即购买" } }, + // { name: "button", children: { href: "#", children: "立即购买" } }, ], }, }, @@ -366,25 +387,29 @@ export const Pricing20DataSource = { { className: "pricing2-table-content-name", name: "name", - children: "实例系列1", + children: "Unlimited Vehicles, Customers, and Work Orders", }, { - children: "Limited", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", name: "content0", className: "pricing2-table-content", }, { - children: "Unlimited", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", name: "content1", className: "pricing2-table-content", }, { - children: "Unlimited", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", name: "content2", className: "pricing2-table-content", }, { - children: "Unlimited", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", name: "content3", className: "pricing2-table-content", }, @@ -396,25 +421,30 @@ export const Pricing20DataSource = { { className: "pricing2-table-content-name", name: "name", - children: "实例系列2", + children: + "Access your system from anywhere (Desktop, Mobile, and Native Mobile Apps)", }, { - children: "Limited", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", name: "content0", className: "pricing2-table-content", }, { - children: "Unlimited", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", name: "content1", className: "pricing2-table-content", }, { - children: "Unlimited", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", name: "content2", className: "pricing2-table-content", }, { - children: "Unlimited", + children: + "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", name: "content3", className: "pricing2-table-content", }, @@ -426,7 +456,7 @@ export const Pricing20DataSource = { { className: "pricing2-table-content-name", name: "name", - children: "固定宽带计费", + children: "Included Media Storage", }, { name: "content0", @@ -435,17 +465,17 @@ export const Pricing20DataSource = { }, { name: "content1", - children: "250GB", + children: "100GB", className: "pricing2-table-content", }, { name: "content2", - children: "600GB", + children: "175GB", className: "pricing2-table-content", }, { name: "content3", - children: "Unlimited", + children: "250GB", className: "pricing2-table-content", }, ], @@ -456,7 +486,7 @@ export const Pricing20DataSource = { { className: "pricing2-table-content-name", name: "name", - children: "闲置负载均衡", + children: "Mobile Image Sync", }, { children: "-", @@ -465,8 +495,7 @@ export const Pricing20DataSource = { }, { name: "content1", - children: - "https://gw.alipayobjects.com/zos/basement_prod/14ce3060-34e6-4b30-9a45-1a6b95542310.svg", + children: "-", className: "pricing2-table-content", }, { @@ -489,7 +518,7 @@ export const Pricing20DataSource = { { className: "pricing2-table-content-name", name: "name", - children: "4核", + children: "Integrated Text Messaging", }, { name: "content0", @@ -521,7 +550,7 @@ export const Pricing20DataSource = { { className: "pricing2-table-content-name", name: "name", - children: "系统盘(线性计费)", + children: "Integrated CSI", }, { name: "content0", @@ -550,6 +579,7 @@ export const Pricing20DataSource = { }, }, }; + export const Pricing11DataSource = { wrapper: { className: "home-page-wrapper pricing1-wrapper" }, page: { className: "home-page pricing1" }, @@ -943,44 +973,53 @@ export const Footer10DataSource = { className: "block", title: { className: "logo", - children: - "https://zos.alipayobjects.com/rmsportal/qqaimmXZVSwAhpL.svg", + children: ( + + ), }, childWrapper: { className: "slogan", children: [ { name: "content0", - children: "Animation specification and components of Ant Design.", + children: i18n.t("landing.footer.slogan"), }, ], }, }, - { - name: "block1", - xs: 24, - md: 6, - className: "block", - title: { children: "产品" }, - childWrapper: { - children: [ - { name: "link0", href: "#", children: "产品更新记录" }, - { name: "link1", href: "#", children: "API文档" }, - { name: "link2", href: "#", children: "快速入门" }, - { name: "link3", href: "#", children: "参考指南" }, - ], - }, - }, + // { + // name: "block1", + // xs: 24, + // md: 6, + // className: "block", + // title: { children: "产品" }, + // childWrapper: { + // children: [ + // { name: "link0", href: "#", children: "产品更新记录" }, + // { name: "link1", href: "#", children: "API文档" }, + // { name: "link2", href: "#", children: "快速入门" }, + // { name: "link3", href: "#", children: "参考指南" }, + // ], + // }, + // }, { name: "block2", xs: 24, md: 6, className: "block", - title: { children: "关于" }, + title: { children: i18n.t("landing.footer.io.name") }, childWrapper: { children: [ - { href: "#", name: "link0", children: "FAQ" }, - { href: "#", name: "link1", children: "联系我们" }, + { + href: "https://help.imex.online", + name: "link0", + children: i18n.t("landing.footer.io.help"), + }, + { + href: "https://status.imex.online", + name: "link1", + children: i18n.t("landing.footer.io.status"), + }, ], }, }, @@ -989,11 +1028,29 @@ export const Footer10DataSource = { xs: 24, md: 6, className: "block", - title: { children: "资源" }, + title: { children: i18n.t("landing.footer.company.name") }, childWrapper: { children: [ - { href: "#", name: "link0", children: "Ant Design" }, - { href: "#", name: "link1", children: "Ant Motion" }, + { + href: "/privacy", + name: "link0", + children: i18n.t("landing.footer.company.privacypolicy"), + }, + { + href: "/about", + name: "link1", + children: i18n.t("landing.footer.company.about"), + }, + { + href: "/disclaimer", + name: "link2", + children: i18n.t("landing.footer.company.disclaimers"), + }, + { + href: "https://thinkimex.com", + name: "link3", + children: i18n.t("landing.footer.company.contact"), + }, ], }, }, @@ -1005,8 +1062,8 @@ export const Footer10DataSource = { className: "copyright", children: ( - ©2018 by Ant Motion All Rights - Reserved + ©2021 ImEX Systems used under + license. ), }, diff --git a/client/src/landing/home/documentation.md b/client/src/landing/documentation.md similarity index 100% rename from client/src/landing/home/documentation.md rename to client/src/landing/documentation.md diff --git a/client/src/landing/home/LandingNavigator.jsx b/client/src/landing/home/LandingNavigator.jsx deleted file mode 100644 index 2c0a840ae..000000000 --- a/client/src/landing/home/LandingNavigator.jsx +++ /dev/null @@ -1,182 +0,0 @@ -import React, { useState } from "react"; -import TweenOne from "rc-tween-one"; -import { Anchor, Menu } from "antd"; -import { getChildrenToRender } from "./utils"; -import ImexOnlineLogoLight from "../../assets/ImEX Online Logo.png"; -import { Link } from "react-router-dom"; -import { useTranslation } from "react-i18next"; -const { Item, SubMenu } = Menu; - -export default function LandingNavigator({ dataSource, isMobile, ...props }) { - const [state, setState] = useState({ phoneOpen: undefined }); - const { t } = useTranslation(); - const { phoneOpen } = state; - - const phoneClick = () => { - const phoneOpen = !state.phoneOpen; - setState({ - phoneOpen, - }); - }; - - const moment = phoneOpen === undefined ? 300 : null; - return ( - -
- - img - - {isMobile && ( - //Unknown what this menu does. -
{ - phoneClick(); - }} - > - - - -
- )} - { - if (state.phoneOpen) { - e.target.style.height = "auto"; - } - }, - ease: "easeInOutQuad", - } - : null - } - moment={moment} - reverse={!!phoneOpen} - > - - - - {t("landing.labels.features")} - - - - - {t("landing.labels.pricing")} - - - - - {t("landing.labels.managemyshop")} - - - - -
-
- ); -} - -// -// {a.children.map(getChildrenToRender)} -// -// } -// popupClassName="header0-item-child" -// > -// {subItem.map(($item, ii) => { -// const { children: childItem } = $item; -// const child = childItem.href ? ( -// -// {childItem.children.map(getChildrenToRender)} -// -// ) : ( -//
-// {childItem.children.map(getChildrenToRender)} -//
-// ); -// return ( -// -// {child} -// -// ); -// })} -//
-// subItem: [ -// { -// name: "sub0", -// className: "item-sub", -// children: { -// className: "item-sub-item", -// children: [ -// { -// name: "image0", -// className: "item-image", -// children: -// "https://gw.alipayobjects.com/zos/rmsportal/ruHbkzzMKShUpDYMEmHM.svg", -// }, -// { -// name: "title", -// className: "item-title", -// children: "Ant Design", -// }, -// { -// name: "content", -// className: "item-content", -// children: "企业级 UI 设计体系", -// }, -// ], -// }, -// }, -// { -// name: "sub1", -// className: "item-sub", -// children: { -// className: "item-sub-item", -// children: [ -// { -// name: "image0", -// className: "item-image", -// children: -// "https://gw.alipayobjects.com/zos/rmsportal/ruHbkzzMKShUpDYMEmHM.svg", -// }, -// { -// name: "title", -// className: "item-title", -// children: "Ant Design", -// }, -// { -// name: "content", -// className: "item-content", -// children: "企业级 UI 设计体系", -// }, -// ], -// }, -// }, -// ], diff --git a/client/src/landing/home/less/antMotionStyle.less b/client/src/landing/home/less/antMotionStyle.less deleted file mode 100644 index f254f0346..000000000 --- a/client/src/landing/home/less/antMotionStyle.less +++ /dev/null @@ -1,14 +0,0 @@ -@import "./common.less"; -@import "./custom.less"; -@import "./content.less"; -@import "./LandingNavigator.less"; -@import "./banner0.less"; -@import "./content4.less"; -@import "./content0.less"; -@import "./content1.less"; -@import "./pricing2.less"; -@import "./pricing1.less"; -@import "./content3.less"; -@import "./content12.less"; -@import "./footer1.less"; -@import "./edit.less"; diff --git a/client/src/landing/home/index.jsx b/client/src/landing/index.jsx similarity index 67% rename from client/src/landing/home/index.jsx rename to client/src/landing/index.jsx index 2374e41c2..420629bd1 100644 --- a/client/src/landing/home/index.jsx +++ b/client/src/landing/index.jsx @@ -1,32 +1,30 @@ /* eslint no-undef: 0 */ /* eslint arrow-parens: 0 */ -import React from "react"; import { enquireScreen } from "enquire-js"; -import { Anchor } from "antd"; -import LandingNavigator from "./LandingNavigator"; +import React from "react"; import Banner0 from "./Banner0"; -import Content4 from "./Content4"; +// import Content4 from "./Content4"; import Content0 from "./Content0"; import Content1 from "./Content1"; -import Pricing2 from "./Pricing2"; -import Pricing1 from "./Pricing1"; -import Content3 from "./Content3"; -import Content12 from "./Content12"; -import Footer1 from "./Footer1"; - import { - Nav00DataSource, Banner00DataSource, - Content40DataSource, + // Content40DataSource, Content00DataSource, Content10DataSource, - Pricing20DataSource, - Pricing11DataSource, - Content30DataSource, - Content120DataSource, + // Pricing11DataSource, + // Content30DataSource, + // Content120DataSource, Footer10DataSource, + Nav00DataSource, + Pricing20DataSource, } from "./data.source"; +// import Pricing1 from "./Pricing1"; +// import Content3 from "./Content3"; +// import Content12 from "./Content12"; +import Footer1 from "./Footer1"; import "./less/antMotionStyle.less"; +import Nav0 from "./Nav0"; +import Pricing2 from "./Pricing2"; let isMobile; enquireScreen((b) => { @@ -64,7 +62,7 @@ export default class Home extends React.Component { render() { const children = [ - , - , + , , - , , - , - , - , + // , + // , + // , - - {this.state.show && children} - {/* 如果不是 dva 2.0 替换成 {children} end */} - + {/* 如果不是 dva 2.0 替换成 {children} start */} + {this.state.show && children} + {/* 如果不是 dva 2.0 替换成 {children} end */} ); } diff --git a/client/src/landing/less/antMotionStyle.less b/client/src/landing/less/antMotionStyle.less new file mode 100644 index 000000000..c47700518 --- /dev/null +++ b/client/src/landing/less/antMotionStyle.less @@ -0,0 +1,14 @@ +@import './common.less'; +@import './custom.less'; +@import './content.less'; +@import './nav0.less'; +@import './banner0.less'; +@import './content4.less'; +@import './content0.less'; +@import './content1.less'; +@import './pricing2.less'; +@import './pricing1.less'; +@import './content3.less'; +@import './content12.less'; +@import './footer1.less'; +@import './edit.less'; \ No newline at end of file diff --git a/client/src/landing/home/less/banner0.less b/client/src/landing/less/banner0.less similarity index 88% rename from client/src/landing/home/less/banner0.less rename to client/src/landing/less/banner0.less index 829bb9c4b..ad3fe7281 100644 --- a/client/src/landing/home/less/banner0.less +++ b/client/src/landing/less/banner0.less @@ -6,7 +6,7 @@ position: relative; text-align: center; border-color: #666; - background-image: url("https://zos.alipayobjects.com/rmsportal/gGlUMYGEIvjDOOw.jpg"); + background-image: url("../../assets/banner3.jpeg"); background-size: cover; background-attachment: fixed; background-position: center; @@ -20,13 +20,13 @@ font-size: 14px; color: @template-text-color-light; width: 550px; - >.queue-anim-leaving { + > .queue-anim-leaving { position: relative !important; } } & &-title { width: 350px; - left: 30px; + //left: 30px; min-height: 60px; margin: auto; display: inline-block; @@ -45,7 +45,7 @@ box-shadow: 0 0 0 transparent; font-size: 16px; height: 40px; - transition: background .45s @ease-out, box-shadow .45s @ease-out; + transition: background 0.45s @ease-out, box-shadow 0.45s @ease-out; &:hover { color: #fff; border-color: #fff; diff --git a/client/src/landing/home/less/common.less b/client/src/landing/less/common.less similarity index 100% rename from client/src/landing/home/less/common.less rename to client/src/landing/less/common.less diff --git a/client/src/landing/home/less/content.less b/client/src/landing/less/content.less similarity index 100% rename from client/src/landing/home/less/content.less rename to client/src/landing/less/content.less diff --git a/client/src/landing/home/less/content0.less b/client/src/landing/less/content0.less similarity index 100% rename from client/src/landing/home/less/content0.less rename to client/src/landing/less/content0.less diff --git a/client/src/landing/home/less/content1.less b/client/src/landing/less/content1.less similarity index 100% rename from client/src/landing/home/less/content1.less rename to client/src/landing/less/content1.less diff --git a/client/src/landing/home/less/content12.less b/client/src/landing/less/content12.less similarity index 100% rename from client/src/landing/home/less/content12.less rename to client/src/landing/less/content12.less diff --git a/client/src/landing/home/less/content3.less b/client/src/landing/less/content3.less similarity index 100% rename from client/src/landing/home/less/content3.less rename to client/src/landing/less/content3.less diff --git a/client/src/landing/home/less/content4.less b/client/src/landing/less/content4.less similarity index 100% rename from client/src/landing/home/less/content4.less rename to client/src/landing/less/content4.less diff --git a/client/src/landing/home/less/custom.less b/client/src/landing/less/custom.less similarity index 100% rename from client/src/landing/home/less/custom.less rename to client/src/landing/less/custom.less diff --git a/client/src/landing/home/less/edit.less b/client/src/landing/less/edit.less similarity index 100% rename from client/src/landing/home/less/edit.less rename to client/src/landing/less/edit.less diff --git a/client/src/landing/home/less/footer1.less b/client/src/landing/less/footer1.less similarity index 100% rename from client/src/landing/home/less/footer1.less rename to client/src/landing/less/footer1.less diff --git a/client/src/landing/home/less/LandingNavigator.less b/client/src/landing/less/nav0.less similarity index 100% rename from client/src/landing/home/less/LandingNavigator.less rename to client/src/landing/less/nav0.less diff --git a/client/src/landing/home/less/pricing1.less b/client/src/landing/less/pricing1.less similarity index 100% rename from client/src/landing/home/less/pricing1.less rename to client/src/landing/less/pricing1.less diff --git a/client/src/landing/home/less/pricing2.less b/client/src/landing/less/pricing2.less similarity index 100% rename from client/src/landing/home/less/pricing2.less rename to client/src/landing/less/pricing2.less diff --git a/client/src/landing/home/utils.js b/client/src/landing/utils.js similarity index 100% rename from client/src/landing/home/utils.js rename to client/src/landing/utils.js diff --git a/client/src/pages/about/about.page.jsx b/client/src/pages/disclaimer/disclaimer.page.jsx similarity index 100% rename from client/src/pages/about/about.page.jsx rename to client/src/pages/disclaimer/disclaimer.page.jsx diff --git a/client/src/pages/landing/landing.page.jsx b/client/src/pages/landing/landing.page.jsx index 4f98800fd..9677488e6 100644 --- a/client/src/pages/landing/landing.page.jsx +++ b/client/src/pages/landing/landing.page.jsx @@ -3,7 +3,7 @@ import { connect } from "react-redux"; import { Redirect } from "react-router-dom"; import { createStructuredSelector } from "reselect"; import { selectCurrentUser } from "../../redux/user/user.selectors"; -import LandingPageStatic from "../../landing/home/index"; +import LandingPageStatic from "../../landing/index"; const mapStateToProps = createStructuredSelector({ currentUser: selectCurrentUser, diff --git a/client/src/pages/manage/manage.page.component.jsx b/client/src/pages/manage/manage.page.component.jsx index e66aa2eee..55b51544a 100644 --- a/client/src/pages/manage/manage.page.component.jsx +++ b/client/src/pages/manage/manage.page.component.jsx @@ -15,7 +15,6 @@ import FcmNotification from "../../components/fcm-notification/fcm-notification. //import FooterComponent from "../../components/footer/footer.component"; //Component Imports import HeaderContainer from "../../components/header/header.container"; -import JiraSupportComponent from "../../components/jira-support-widget/jira-support-widget.component"; import LoadingSpinner from "../../components/loading-spinner/loading-spinner.component"; import PartnerPingComponent from "../../components/partner-ping/partner-ping.component"; import PrintCenterModalContainer from "../../components/print-center-modal/print-center-modal.container"; @@ -408,10 +407,9 @@ export function Manage({ match, conflict, bodyshop }) {
- + Disclaimer & Notices - diff --git a/client/src/pages/manage/manage.page.container.jsx b/client/src/pages/manage/manage.page.container.jsx index 047a2d4d3..aecb7f6d5 100644 --- a/client/src/pages/manage/manage.page.container.jsx +++ b/client/src/pages/manage/manage.page.container.jsx @@ -7,6 +7,7 @@ import LoadingSpinner from "../../components/loading-spinner/loading-spinner.com import { QUERY_BODYSHOP } from "../../graphql/bodyshop.queries"; import { setBodyshop } from "../../redux/user/user.actions"; import ManagePage from "./manage.page.component"; +import "../../utils/RegisterSw"; const mapDispatchToProps = (dispatch) => ({ setBodyshop: (bs) => dispatch(setBodyshop(bs)), diff --git a/client/src/pages/tech/tech.page.container.jsx b/client/src/pages/tech/tech.page.container.jsx index 5fb547cd4..4b4647cac 100644 --- a/client/src/pages/tech/tech.page.container.jsx +++ b/client/src/pages/tech/tech.page.container.jsx @@ -9,6 +9,7 @@ import LoadingSpinner from "../../components/loading-spinner/loading-spinner.com import { useTranslation } from "react-i18next"; import { selectBodyshop } from "../../redux/user/user.selectors"; import { createStructuredSelector } from "reselect"; +import "../../utils/RegisterSw"; const mapStateToProps = createStructuredSelector({ bodyshop: selectBodyshop, diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index ce6095b2b..260e47a2f 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -1424,10 +1424,53 @@ } }, "landing": { + "bigfeature": { + "subtitle": "ImEX Online is built using world class technology by experts in the collision repair industry. This translates to software that is tailor made for the unique challenges faced by repair facilities with no compromises. ", + "title": "Bringing the latest technology to the automotive repair industry. " + }, + "footer": { + "company": { + "about": "About Us", + "contact": "Contact", + "disclaimers": "Disclaimers", + "name": "Company", + "privacypolicy": "Privacy Policy" + }, + "io": { + "help": "Help", + "name": "ImEX Online", + "status": "System Status" + }, + "slogan": "The future of shop management systems. " + }, + "hero": { + "button": "Learn More", + "title": "Bringing the future to the collision repair process." + }, "labels": { "features": "Features", "managemyshop": "Manage my Shop", "pricing": "Pricing" + }, + "pricing": { + "basic": { + "name": "Basic", + "sub": "Best suited for shops looking to increase their volume." + }, + "essentials": { + "name": "Essentials", + "sub": "Best suited for small and low volume shops." + }, + "pricingtitle": "Features", + "pro": { + "name": "Pro", + "sub": "Empower your shop with the tools to operate at peak capacity." + }, + "title": "Features", + "unlimited": { + "name": "Unlimited", + "sub": "Everything you need and more for the high volume shop." + } } }, "menus": { diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 3b3b79188..485b97639 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -1424,10 +1424,53 @@ } }, "landing": { + "bigfeature": { + "subtitle": "", + "title": "" + }, + "footer": { + "company": { + "about": "", + "contact": "", + "disclaimers": "", + "name": "", + "privacypolicy": "" + }, + "io": { + "help": "", + "name": "", + "status": "" + }, + "slogan": "" + }, + "hero": { + "button": "", + "title": "" + }, "labels": { "features": "", "managemyshop": "", "pricing": "" + }, + "pricing": { + "basic": { + "name": "", + "sub": "" + }, + "essentials": { + "name": "", + "sub": "" + }, + "pricingtitle": "", + "pro": { + "name": "", + "sub": "" + }, + "title": "", + "unlimited": { + "name": "", + "sub": "" + } } }, "menus": { diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 44b471439..0e596494d 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -1424,10 +1424,53 @@ } }, "landing": { + "bigfeature": { + "subtitle": "", + "title": "" + }, + "footer": { + "company": { + "about": "", + "contact": "", + "disclaimers": "", + "name": "", + "privacypolicy": "" + }, + "io": { + "help": "", + "name": "", + "status": "" + }, + "slogan": "" + }, + "hero": { + "button": "", + "title": "" + }, "labels": { "features": "", "managemyshop": "", "pricing": "" + }, + "pricing": { + "basic": { + "name": "", + "sub": "" + }, + "essentials": { + "name": "", + "sub": "" + }, + "pricingtitle": "", + "pro": { + "name": "", + "sub": "" + }, + "title": "", + "unlimited": { + "name": "", + "sub": "" + } } }, "menus": { diff --git a/client/src/translations/i18n.js b/client/src/translations/i18n.js index 61863eb77..e9cbc3157 100644 --- a/client/src/translations/i18n.js +++ b/client/src/translations/i18n.js @@ -23,7 +23,9 @@ i18n debug: process.env.NODE_ENV === "production" ? false : true, //keySeparator: false, // we do not use keys in form messages.welcome - + react: { + wait: true, + }, interpolation: { escapeValue: false, // react already safes from xss }, diff --git a/client/src/utils/RegisterSw.js b/client/src/utils/RegisterSw.js new file mode 100644 index 000000000..8b2477b8e --- /dev/null +++ b/client/src/utils/RegisterSw.js @@ -0,0 +1,46 @@ +import { AlertOutlined } from "@ant-design/icons"; +import { Button, notification, Space } from "antd"; +import i18n from "i18next"; +import React from "react"; +import * as serviceWorkerRegistration from "../serviceWorkerRegistration"; + +const onServiceWorkerUpdate = (registration) => { + console.log("onServiceWorkerUpdate", registration); + + const btn = ( + + + + + ); + notification.open({ + icon: , + message: i18n.t("general.messages.newversiontitle"), + description: i18n.t("general.messages.newversionmessage"), + duration: 0, + btn, + key: "updateavailable", + }); +}; + +serviceWorkerRegistration.register({ onUpdate: onServiceWorkerUpdate });