Improved Landing page

This commit is contained in:
Patrick Fic
2021-06-29 13:12:53 -07:00
parent 00f71eba77
commit d9d3c899a1
51 changed files with 1161 additions and 488 deletions

View File

@@ -24132,6 +24132,304 @@
<folder_node>
<name>landing</name>
<children>
<folder_node>
<name>bigfeature</name>
<children>
<concept_node>
<name>subtitle</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>title</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children>
</folder_node>
<folder_node>
<name>footer</name>
<children>
<folder_node>
<name>company</name>
<children>
<concept_node>
<name>about</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>contact</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>disclaimers</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>name</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>privacypolicy</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children>
</folder_node>
<folder_node>
<name>io</name>
<children>
<concept_node>
<name>help</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>name</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>status</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children>
</folder_node>
<concept_node>
<name>slogan</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children>
</folder_node>
<folder_node>
<name>hero</name>
<children>
<concept_node>
<name>button</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>title</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children>
</folder_node>
<folder_node>
<name>labels</name>
<children>
@@ -24200,6 +24498,241 @@
</concept_node>
</children>
</folder_node>
<folder_node>
<name>pricing</name>
<children>
<folder_node>
<name>basic</name>
<children>
<concept_node>
<name>name</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>sub</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children>
</folder_node>
<folder_node>
<name>essentials</name>
<children>
<concept_node>
<name>name</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>sub</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children>
</folder_node>
<concept_node>
<name>pricingtitle</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<folder_node>
<name>pro</name>
<children>
<concept_node>
<name>name</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>sub</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children>
</folder_node>
<concept_node>
<name>title</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<folder_node>
<name>unlimited</name>
<children>
<concept_node>
<name>name</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
<concept_node>
<name>sub</name>
<definition_loaded>false</definition_loaded>
<description></description>
<comment></comment>
<default_text></default_text>
<translations>
<translation>
<language>en-US</language>
<approved>false</approved>
</translation>
<translation>
<language>es-MX</language>
<approved>false</approved>
</translation>
<translation>
<language>fr-CA</language>
<approved>false</approved>
</translation>
</translations>
</concept_node>
</children>
</folder_node>
</children>
</folder_node>
</children>
</folder_node>
<folder_node>

View File

@@ -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 <script></script> 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 (
<ApolloProvider client={client}>
<ConfigProvider
@@ -46,7 +30,6 @@ export default function AppContainer() {
>
<GlobalLoadingBar />
<App />
<JiraSupportComponent />
</ConfigProvider>
</ApolloProvider>
);

View File

@@ -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 }) {
<Route exact path="/csi/:surveyId" component={CsiPage} />
</ErrorBoundary>
<ErrorBoundary>
<Route exact path="/about" component={AboutPage} />
<Route exact path="/disclaimer" component={DisclaimerPage} />
</ErrorBoundary>
<ErrorBoundary>
<Route

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 272 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 237 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 177 KiB

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" ?><svg style="enable-background:new 0 0 128 128;" version="1.1" viewBox="0 0 128 128" xml:space="preserve" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><style type="text/css">
.st0{fill:none;stroke:#000000;stroke-width:8;stroke-miterlimit:10;}
.st1{display:none;}
.st2{display:inline;opacity:0.25;fill:#F45EFD;}
</style><g id="_x31_2_3D_Printing"/><g id="_x31_1_VR_Gear"/><g id="_x31_0_Virtual_reality"/><g id="_x39__Augmented_reality"/><g id="_x38__Teleport"/><g id="_x37__Glassess"/><g id="_x36__Folding_phone"/><g id="_x35__Drone"/><g id="_x34__Retina_scan"/><g id="_x33__Smartwatch"/><g id="_x32__Bionic_Arm"/><g id="_x31__Chip"><g><path d="M108,40c-5.2,0-9.6,3.3-11.3,8H84V32h-8V20h-8v12h-8V20h-8v12h-8v16H24v-8.7c4.7-1.7,8-6.1,8-11.3c0-6.6-5.4-12-12-12 S8,21.4,8,28c0,5.2,3.3,9.6,8,11.3V56h28v8H16v16.7c-4.7,1.7-8,6.1-8,11.3c0,6.6,5.4,12,12,12s12-5.4,12-12c0-5.2-3.3-9.6-8-11.3 V72h20v16h8v12h8V88h8v12h8V88h8V72h8v16.7c-4.7,1.7-8,6.1-8,11.3c0,6.6,5.4,12,12,12s12-5.4,12-12c0-5.2-3.3-9.6-8-11.3V64H84v-8 h12.7c1.7,4.7,6.1,8,11.3,8c6.6,0,12-5.4,12-12S114.6,40,108,40z M20,32c-2.2,0-4-1.8-4-4s1.8-4,4-4s4,1.8,4,4S22.2,32,20,32z M20,96c-2.2,0-4-1.8-4-4s1.8-4,4-4s4,1.8,4,4S22.2,96,20,96z M76,80H52V40h24V80z M96,96c2.2,0,4,1.8,4,4s-1.8,4-4,4s-4-1.8-4-4 S93.8,96,96,96z M108,56c-2.2,0-4-1.8-4-4s1.8-4,4-4s4,1.8,4,4S110.2,56,108,56z"/><rect height="8" width="8" x="56" y="64"/></g></g><g class="st1" id="Guide"><path class="st2" d="M120,8v112H8V8H120 M128,0H0v128h128V0L128,0z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,28 +0,0 @@
import React from "react";
export default function JiraSupportComponent() {
//useScript();
return <div></div>;
}
// 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);
// };
// }, []);
// };

View File

@@ -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 = (
<Space flex>
<Button
onClick={async () => {
window.open("https://imex-online.noticeable.news/", "_blank");
}}
>
{i18n.t("general.actions.viewreleasenotes")}
</Button>
<Button
type="primary"
onClick={async () => {
if (registration && registration.waiting) {
await registration.unregister();
// Makes Workbox call skipWaiting()
registration.waiting.postMessage({ type: "SKIP_WAITING" });
// Once the service worker is unregistered, we can reload the page to let
// the browser download a fresh copy of our app (invalidating the cache)
window.location.reload();
}
}}
>
{i18n.t("general.actions.refresh")}
</Button>
</Space>
);
notification.open({
icon: <AlertOutlined />,
message: i18n.t("general.messages.newversiontitle"),
description: i18n.t("general.messages.newversionmessage"),
duration: 0,
btn,
key: "updateavailable",
});
};
// const btn = (
// <Space flex>
// <Button
// onClick={async () => {
// window.open("https://imex-online.noticeable.news/", "_blank");
// }}
// >
// {i18n.t("general.actions.viewreleasenotes")}
// </Button>
// <Button
// type="primary"
// onClick={async () => {
// if (registration && registration.waiting) {
// await registration.unregister();
// // Makes Workbox call skipWaiting()
// registration.waiting.postMessage({ type: "SKIP_WAITING" });
// // Once the service worker is unregistered, we can reload the page to let
// // the browser download a fresh copy of our app (invalidating the cache)
// window.location.reload();
// }
// }}
// >
// {i18n.t("general.actions.refresh")}
// </Button>
// </Space>
// );
// notification.open({
// icon: <AlertOutlined />,
// 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();

135
client/src/landing/Nav0.jsx Normal file
View File

@@ -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 (
<SubMenu
key={item.name}
{...itemProps}
title={
<div
{...a}
className={`header0-item-block ${a.className}`.trim()}
>
{a.children.map(getChildrenToRender)}
</div>
}
popupClassName="header0-item-child"
>
{subItem.map(($item, ii) => {
const { children: childItem } = $item;
const child = childItem.href ? (
<a {...childItem}>
{childItem.children.map(getChildrenToRender)}
</a>
) : (
<div {...childItem}>
{childItem.children.map(getChildrenToRender)}
</div>
);
return (
<Item key={$item.name || ii.toString()} {...$item}>
{child}
</Item>
);
})}
</SubMenu>
);
}
return (
<Item key={item.name} {...itemProps}>
<a {...a} className={`header0-item-block ${a.className}`.trim()}>
{a.children.map(getChildrenToRender)}
</a>
</Item>
);
});
const moment = phoneOpen === undefined ? 300 : null;
return (
<TweenOne
component="header"
animation={{ opacity: 0, type: 'from' }}
{...dataSource.wrapper}
{...props}
>
<div
{...dataSource.page}
className={`${dataSource.page.className}${phoneOpen ? ' open' : ''}`}
>
<TweenOne
animation={{ x: -30, type: 'from', ease: 'easeOutQuad' }}
{...dataSource.logo}
>
<img width="100%" src={dataSource.logo.children} alt="img" />
</TweenOne>
{isMobile && (
<div
{...dataSource.mobileMenu}
onClick={() => {
this.phoneClick();
}}
>
<em />
<em />
<em />
</div>
)}
<TweenOne
{...dataSource.Menu}
animation={
isMobile
? {
height: 0,
duration: 300,
onComplete: (e) => {
if (this.state.phoneOpen) {
e.target.style.height = 'auto';
}
},
ease: 'easeInOutQuad',
}
: null
}
moment={moment}
reverse={!!phoneOpen}
>
<Menu
mode={isMobile ? 'inline' : 'horizontal'}
defaultSelectedKeys={['sub0']}
theme="dark"
>
{navChildren}
</Menu>
</TweenOne>
</div>
</TweenOne>
);
}
}
export default Header;

View File

@@ -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: (
<img alt="" style={{ width: "100%" }} src={ImexOnlineBannerLogo} />
),
},
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: (
<img alt="" style={{ width: "100%" }} src={ImexOnlineLogoDark} />
),
},
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: (
<span>
©2018 by <a href="https://motion.ant.design">Ant Motion</a> All Rights
Reserved
©2021 <a href="http://imexsystems.ca">ImEX Systems</a> used under
license.
</span>
),
},

View File

@@ -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 (
<TweenOne
component="header"
animation={{ opacity: 0, type: "from" }}
className="header0 home-page-wrapper"
// {...props}
>
<div
//{...dataSource.page}
className={`home-page ${dataSource.page.className}${
phoneOpen ? " open" : ""
}`}
>
<TweenOne
animation={{ x: -30, type: "from", ease: "easeOutQuad" }}
className="header0-logo"
// {...dataSource.logo}
>
<img width="100%" src={ImexOnlineLogoLight} alt="img" />
</TweenOne>
{isMobile && (
//Unknown what this menu does.
<div
{...dataSource.mobileMenu}
onClick={() => {
phoneClick();
}}
>
<em />
<em />
<em />
</div>
)}
<TweenOne
// {...dataSource.Menu}
className="header0-menu"
animation={
isMobile
? {
height: 0,
duration: 300,
onComplete: (e) => {
if (state.phoneOpen) {
e.target.style.height = "auto";
}
},
ease: "easeInOutQuad",
}
: null
}
moment={moment}
reverse={!!phoneOpen}
>
<Menu
mode={isMobile ? "inline" : "horizontal"}
defaultSelectedKeys={["sub0"]}
theme="dark"
>
<Item className="header0-item">
<Link to={{ hash: "#features" }} className={`header0-item-block`}>
{t("landing.labels.features")}
</Link>
</Item>
<Item className="header0-item">
<Link to={{ hash: "#pricing" }} className={`header0-item-block`}>
{t("landing.labels.pricing")}
</Link>
</Item>
<Item className="header0-item">
<Link to={`/manage`} className={`header0-item-block`}>
{t("landing.labels.managemyshop")}
</Link>
</Item>
</Menu>
</TweenOne>
</div>
</TweenOne>
);
}
// <SubMenu
// key={item.name}
// {...itemProps}
// title={
// <div {...a} className={`header0-item-block ${a.className}`.trim()}>
// {a.children.map(getChildrenToRender)}
// </div>
// }
// popupClassName="header0-item-child"
// >
// {subItem.map(($item, ii) => {
// const { children: childItem } = $item;
// const child = childItem.href ? (
// <a {...childItem}>
// {childItem.children.map(getChildrenToRender)}
// </a>
// ) : (
// <div {...childItem}>
// {childItem.children.map(getChildrenToRender)}
// </div>
// );
// return (
// <Item key={$item.name || ii.toString()} {...$item}>
// {child}
// </Item>
// );
// })}
// </SubMenu>
// 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 设计体系",
// },
// ],
// },
// },
// ],

View File

@@ -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";

View File

@@ -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 = [
<LandingNavigator
<Nav0
id="Nav0_0"
key="Nav0_0"
dataSource={Nav00DataSource}
@@ -76,10 +74,16 @@ export default class Home extends React.Component {
dataSource={Banner00DataSource}
isMobile={this.state.isMobile}
/>,
<Content4
id="Content4_0"
key="Content4_0"
dataSource={Content40DataSource}
// <Content4
// id="Content4_0"
// key="Content4_0"
// dataSource={Content40DataSource}
// isMobile={this.state.isMobile}
// />,
<Content1
id="Content1_0"
key="Content1_0"
dataSource={Content10DataSource}
isMobile={this.state.isMobile}
/>,
<Content0
@@ -88,36 +92,30 @@ export default class Home extends React.Component {
dataSource={Content00DataSource}
isMobile={this.state.isMobile}
/>,
<Content1
id="Content1_0"
key="Content1_0"
dataSource={Content10DataSource}
isMobile={this.state.isMobile}
/>,
<Pricing2
id="Pricing2_0"
key="Pricing2_0"
dataSource={Pricing20DataSource}
isMobile={this.state.isMobile}
/>,
<Pricing1
id="Pricing1_1"
key="Pricing1_1"
dataSource={Pricing11DataSource}
isMobile={this.state.isMobile}
/>,
<Content3
id="Content3_0"
key="Content3_0"
dataSource={Content30DataSource}
isMobile={this.state.isMobile}
/>,
<Content12
id="Content12_0"
key="Content12_0"
dataSource={Content120DataSource}
isMobile={this.state.isMobile}
/>,
// <Pricing1
// id="Pricing1_1"
// key="Pricing1_1"
// dataSource={Pricing11DataSource}
// isMobile={this.state.isMobile}
// />,
// <Content3
// id="Content3_0"
// key="Content3_0"
// dataSource={Content30DataSource}
// isMobile={this.state.isMobile}
// />,
// <Content12
// id="Content12_0"
// key="Content12_0"
// dataSource={Content120DataSource}
// isMobile={this.state.isMobile}
// />,
<Footer1
id="Footer1_0"
key="Footer1_0"
@@ -132,10 +130,9 @@ export default class Home extends React.Component {
this.dom = d;
}}
>
<Anchor>
{this.state.show && children}
{/* 如果不是 dva 2.0 替换成 {children} end */}
</Anchor>
{/* 如果不是 dva 2.0 替换成 {children} start */}
{this.state.show && children}
{/* 如果不是 dva 2.0 替换成 {children} end */}
</div>
);
}

View File

@@ -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';

View File

@@ -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;

View File

@@ -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,

View File

@@ -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 }) {
</div>
<div id="noticeable-widget" style={{ marginLeft: "1rem" }} />
</div>
<Link to="/about" target="_blank" style={{ color: "#ccc" }}>
<Link to="/disclaimer" target="_blank" style={{ color: "#ccc" }}>
Disclaimer & Notices
</Link>
<JiraSupportComponent />
</div>
</Footer>
</Content>

View File

@@ -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)),

View File

@@ -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,

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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": {

View File

@@ -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
},

View File

@@ -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 = (
<Space flex>
<Button
onClick={async () => {
window.open("https://imex-online.noticeable.news/", "_blank");
}}
>
{i18n.t("general.actions.viewreleasenotes")}
</Button>
<Button
type="primary"
onClick={async () => {
if (registration && registration.waiting) {
await registration.unregister();
// Makes Workbox call skipWaiting()
registration.waiting.postMessage({ type: "SKIP_WAITING" });
// Once the service worker is unregistered, we can reload the page to let
// the browser download a fresh copy of our app (invalidating the cache)
window.location.reload();
}
}}
>
{i18n.t("general.actions.refresh")}
</Button>
</Space>
);
notification.open({
icon: <AlertOutlined />,
message: i18n.t("general.messages.newversiontitle"),
description: i18n.t("general.messages.newversionmessage"),
duration: 0,
btn,
key: "updateavailable",
});
};
serviceWorkerRegistration.register({ onUpdate: onServiceWorkerUpdate });