Improved Landing page
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
);
|
||||
|
||||
@@ -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
|
||||
|
||||
BIN
client/src/assets/banner-logo.png
Normal file
BIN
client/src/assets/banner-logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 37 KiB |
BIN
client/src/assets/banner1.jpeg
Normal file
BIN
client/src/assets/banner1.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 272 KiB |
BIN
client/src/assets/banner2.jpeg
Normal file
BIN
client/src/assets/banner2.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 237 KiB |
BIN
client/src/assets/banner3.jpeg
Normal file
BIN
client/src/assets/banner3.jpeg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 177 KiB |
5
client/src/assets/icons/technology.svg
Normal file
5
client/src/assets/icons/technology.svg
Normal 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 |
@@ -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);
|
||||
// };
|
||||
// }, []);
|
||||
// };
|
||||
@@ -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
135
client/src/landing/Nav0.jsx
Normal 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;
|
||||
@@ -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>
|
||||
),
|
||||
},
|
||||
@@ -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 设计体系",
|
||||
// },
|
||||
// ],
|
||||
// },
|
||||
// },
|
||||
// ],
|
||||
@@ -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";
|
||||
@@ -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>
|
||||
);
|
||||
}
|
||||
14
client/src/landing/less/antMotionStyle.less
Normal file
14
client/src/landing/less/antMotionStyle.less
Normal 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';
|
||||
@@ -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;
|
||||
@@ -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,
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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": {
|
||||
|
||||
@@ -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
|
||||
},
|
||||
|
||||
46
client/src/utils/RegisterSw.js
Normal file
46
client/src/utils/RegisterSw.js
Normal 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 });
|
||||
Reference in New Issue
Block a user